|
|
1.1 ! root 1: ! 2: /* init.s */ ! 3: ! 4: ! 5: /* This file is a diagnostic version of locore.s. */ ! 6: /* It contains the following: */ ! 7: /* *system data area = scb, dump buffer, interrupt stack, */ ! 8: /* *system page table,user page tables,pcbs,iomap, & io buffers. */ ! 9: /* */ ! 10: /* *system code = interrupt vectors, initialization of system data,*/ ! 11: /* *memory size calculation,initialization of SPT, zeroing of */ ! 12: /* *unused memory, & loading of SBR & SLR. */ ! 13: /* * */ ! 14: /* *at the end of this code, you are ready to go to virtual mode. */ ! 15: /* * --- GOOD LUCK! */ ! 16: ! 17: ! 18: #include "conf.h" ! 19: /* privileged registers addresses */ ! 20: #include "prvreg.h" ! 21: ! 22: /* program status long word definition */ ! 23: #include "psl.h" ! 24: ! 25: /* page table entry definition */ ! 26: #include "pte.h" ! 27: ! 28: /* process control block offsets */ ! 29: #include "pcboffset.h" ! 30: ! 31: /* fundamental constants for globl use */ ! 32: #include "const.h" ! 33: ! 34: /* system control block offsets*/ ! 35: #include "scboffset.h" ! 36: /* SPT offsets */ ! 37: #include "sptoffset.h" ! 38: ! 39: /* trap numbers*/ ! 40: #include "trap.h" ! 41: ! 42: ! 43: #define V_TRAP 0 ! 44: #define V_SYSCALL 4 ! 45: ! 46: .set HIGH,0x1f /*mask for disabling all interrupts */ ! 47: .set MCKVEC,4 /*scb offset for machinecheck vector */ ! 48: .set NISP,2 /*no. of interrupt stack pages */ ! 49: .set DONE,255 /*user process done code */ ! 50: ! 51: .text ! 52: ! 53: #include "pstorage.s" /* PROCESSOR STORAGE AREA */ ! 54: ! 55: .globl _Entry ! 56: _Entry: ! 57: jmp start ! 58: .space (1024-6) ! 59: ! 60: ! 61: ! 62: /* globl dump buffer to be used for communication */ ! 63: /* between tests & interrupt handlers, & other misc. */ ! 64: /* purposes. */ ! 65: ! 66: /*physical page 3 */ ! 67: ! 68: .set NLWU,32 /*no. of longwords already used */ ! 69: /*this must be changed when you define */ ! 70: /*additional variables below before */ ! 71: /*_dbuf */ ! 72: .globl _restart ! 73: _restart: ! 74: .space 4 /*contains restart address for restarting*/ ! 75: /*after power is restored (loaded by */ ! 76: /*power fail interrupt handler & used by*/ ! 77: /*CPU 2 */ ! 78: /* ****************** */ ! 79: .globl _cyconf /* address : 0xc04 */ ! 80: _cyconf: /* Cypher configuration pointer : 0xc06 */ ! 81: .space 4 ! 82: .space 4 ! 83: /* ****************** */ ! 84: ! 85: .globl _lastadd ! 86: _lastadd: ! 87: .space 4 /*address of the last long word */ ! 88: ! 89: .globl _unused ! 90: _unused: ! 91: .space 4 /*first unused page in system space */ ! 92: ! 93: .globl _ctlblk ! 94: _ctlblk: ! 95: .long 0 /* pointer to SCB */ ! 96: ! 97: .globl _savvec0 /*save vectors area */ ! 98: _savvec0: ! 99: .space 4 ! 100: ! 101: .globl _savvec1 /*save vectors area */ ! 102: _savvec1: ! 103: .space 4 ! 104: ! 105: .globl _savvec2 /*save vectors area */ ! 106: _savvec2: ! 107: .space 4 ! 108: ! 109: .globl _savvec3 /*save vectors area */ ! 110: _savvec3: ! 111: .space 4 ! 112: ! 113: .globl _savvec4 /*save vectors area */ ! 114: _savvec4: ! 115: .space 4 ! 116: ! 117: .globl _savvec5 /*save vectors area */ ! 118: _savvec5: ! 119: .space 4 ! 120: .globl _savvec6 /*save vectors area */ ! 121: _savvec6: ! 122: .space 4 ! 123: .globl _savvec7 /*save vectors area */ ! 124: _savvec7: ! 125: .space 4 ! 126: ! 127: .globl _savvec8 /*save vectors area */ ! 128: _savvec8: ! 129: .space 4 ! 130: ! 131: testno: .long 0 ! 132: ! 133: .globl _dbuf /*dump buffer left out of 1K */ ! 134: .globl _r_no ! 135: _r_no: ! 136: .long 0 ! 137: .globl _pt_base ! 138: _pt_base: ! 139: .long 0 ! 140: .globl _saved_psl ! 141: _saved_psl: ! 142: .long 0 ! 143: .globl _saved_sp ! 144: _saved_sp: ! 145: .long 0 ! 146: .globl _saved_fp ! 147: _saved_fp: ! 148: .long 0 ! 149: .globl _p_ptr ! 150: _p_ptr: ! 151: .long 0 ! 152: .globl _ret_adr ! 153: _ret_adr: ! 154: .long 0 ! 155: .globl _exp_par0 ! 156: _exp_par0: ! 157: .long 0 ! 158: .globl _exp_par1 ! 159: _exp_par1: ! 160: .long 0 ! 161: .globl _exp_par2 ! 162: _exp_par2: ! 163: .long 0 ! 164: .globl _exp_par3 ! 165: _exp_par3: ! 166: .long 0 ! 167: .globl _act_par0 ! 168: _act_par0: ! 169: .long 0 ! 170: .globl _act_par1 ! 171: _act_par1: ! 172: .long 0 ! 173: ! 174: .globl _IOpage ! 175: _IOpage: ! 176: .long 0 /* Pointer 64K I/O pages */ ! 177: # ! 178: # ! 179: # ! 180: .globl _proc_no ! 181: _proc_no: ! 182: .long 0 ! 183: ! 184: .globl _clk_cnt ! 185: _clk_cnt: ! 186: .long 0 ! 187: _dbuf: ! 188: .space NBPG - (NLWU *4) ! 189: edbuf: ! 190: ! 191: ! 192: .globl _intstack /* Interrupt stack */ ! 193: _intstack: /* Physical pages 4 & 5 */ ! 194: .space NISP*NBPG ! 195: eintstack: ! 196: ! 197: ! 198: .set SYSPTSIZE,512 /* No. of entries in SPT */ ! 199: ! 200: /* ! 201: System Page Table -- physical page 6 & 7 ! 202: */ ! 203: .align 2 ! 204: .globl _Sysmap ! 205: _Sysmap: ! 206: .space SYSPTSIZE*4 /* 512 max pages allowed for system */ ! 207: eSysmap: ! 208: .globl _Syssize ! 209: .set _Syssize,(eSysmap-_Sysmap)/4 /* should be SYSPTSIZE */ ! 210: ! 211: .globl _iomap /* Physical page 8 */ ! 212: _iomap: .space 1024 /* IOMAP - unused */ ! 213: .globl _eiomap ! 214: _eiomap: ! 215: ! 216: .globl _pcb0 /* Physical page 9 */ ! 217: _pcb0: .space 128 /*process control block 0 */ ! 218: .globl _pcb1 ! 219: _pcb1: .space 128 /*process control block 1 */ ! 220: .globl _pcb2 ! 221: _pcb2: .space 128 /*process control block 2 */ ! 222: .globl _pcb3 ! 223: _pcb3: .space 128 /*process control block 3 */ ! 224: .globl _pcb4 ! 225: _pcb4: .space 128 /*process control block 4 */ ! 226: .globl _pcb5 ! 227: _pcb5: .space 128 /*process control block 5 */ ! 228: .globl _pcb6 ! 229: _pcb6: .space 128 /*process control block 6 */ ! 230: .globl _pcb7 ! 231: _pcb7: .space 128 /*process control block 7 */ ! 232: ! 233: /* ! 234: *user #0 page tables -- P0PT, P1PT, P2PT ! 235: *physical memory -- page10, 11, & 12 respectively ! 236: */ ! 237: .align 2 ! 238: .globl _u0p0pt ! 239: _u0p0pt: ! 240: .space 1024 /*255 max pages for user #0 text */ ! 241: .globl _u0p1pt ! 242: _u0p1pt: ! 243: .space 1024 /*255 max pages for user #0 data */ ! 244: .globl _u0p2pt ! 245: _u0p2pt: ! 246: .space 1020 /*255 max pages for user #0 stack */ ! 247: eu0p2pt: ! 248: .space 4 ! 249: ! 250: /* ! 251: *user #1 page tables -- P0PT, P1PT, P2PT ! 252: *physical memory -- page13 ,14, & 15 respectively ! 253: */ ! 254: .align 2 ! 255: .globl _u1p0pt ! 256: _u1p0pt: ! 257: .space 1024 /*255 max pages for user #1 text */ ! 258: .globl _u1p1pt ! 259: _u1p1pt: ! 260: .space 1024 /*255 max pages for user #1 data */ ! 261: .globl _u1p2pt ! 262: _u1p2pt: ! 263: .space 1020 /*255 max pages for user #1 stack */ ! 264: eu1p2pt: ! 265: .space 4 ! 266: ! 267: ! 268: /* ! 269: *user #2 page tables -- P0PT, P1PT, P2PT ! 270: *physical memory -- page 16, 17 , & 18 respectively ! 271: */ ! 272: .align 2 ! 273: .globl _u2p0pt ! 274: _u2p0pt: ! 275: .space 1024 /*255 max pages for user #2 text */ ! 276: .globl _u2p1pt ! 277: _u2p1pt: ! 278: .space 1024 /*255 max pages for user #2 data */ ! 279: .globl _u2p2pt ! 280: _u2p2pt: ! 281: .space 1020 /*255 max pages for user #2 stack */ ! 282: eu2p2pt: ! 283: .space 4 ! 284: ! 285: ! 286: /* ! 287: *user #3 page tables -- P0PT, P1PT, P2PT ! 288: *physical memory -- page 19, 20 , & 21 respectively ! 289: */ ! 290: .align 2 ! 291: .globl _u3p0pt ! 292: _u3p0pt: ! 293: .space 1024 /*255 max pages for user #3 text */ ! 294: .globl _u3p1pt ! 295: _u3p1pt: ! 296: .space 1024 /*255 max pages for user #3 data */ ! 297: .globl _u3p2pt ! 298: _u3p2pt: ! 299: .space 1020 /*255 max pages for user #3 stack */ ! 300: eu3p2pt: ! 301: .space 4 ! 302: ! 303: /* ! 304: *user #4 thru 6 page tables ! 305: *physical memory -- pages 22 thru 30 ! 306: */ ! 307: .globl _u4p0pt ! 308: _u4p0pt: ! 309: .space (9*NBPG) - 4 ! 310: eu6p2pt: ! 311: .space 4 ! 312: ! 313: /* ! 314: *user #7 page tables -- P0PT, P1PT, P2PT ! 315: *physical memory -- page 31, 32 , & 33 respectively ! 316: */ ! 317: .align 2 ! 318: .globl _u7p0pt ! 319: _u7p0pt: ! 320: .space 1024 /*255 max pages for user #7 text */ ! 321: .globl _u7p1pt ! 322: _u7p1pt: ! 323: .space 1024 /*255 max pages for user #7 data */ ! 324: .globl _u7p2pt ! 325: _u7p2pt: ! 326: .space 1020 /*255 max pages for user #7 stack */ ! 327: eu7p2pt: ! 328: .space 4 ! 329: ! 330: .globl _Ksp0 /* Page used for Kernel stack of user0 */ ! 331: _Ksp0: .space 1020 ! 332: _Eksp0: .long 0 ! 333: ! 334: .globl _Ksp1 /* Page used for Kernel stack of user1 */ ! 335: _Ksp1: .space 1020 ! 336: _Eksp1: .long 0 ! 337: ! 338: .globl _Ksp2 /* Page used for Kernel stack of user2 */ ! 339: _Ksp2: .space 1020 ! 340: _Eksp2: .long 0 ! 341: ! 342: .globl _Ksp3 /* Page used for Kernel stack of user3 */ ! 343: _Ksp3: .space 1020 ! 344: _Eksp3: .long 0 ! 345: ! 346: .globl _Ksp4 /* Page used for Kernel stack of user4 */ ! 347: _Ksp4: .space 1020 ! 348: _Eksp4: .long 0 ! 349: ! 350: .globl _Ksp5 /* Page used for Kernel stack of user5 */ ! 351: _Ksp5: .space 1020 ! 352: _Eksp5: .long 0 ! 353: ! 354: .globl _Ksp6 /* Page used for Kernel stack of user6 */ ! 355: _Ksp6: .space 1020 ! 356: _Eksp6: .long 0 ! 357: # ! 358: # I/O buffers ! 359: # ! 360: .globl _iob0 ! 361: _iob0: .space 1024 ! 362: .globl _iob1 ! 363: _iob1: .space 1024 ! 364: .globl _iob2 ! 365: _iob2: .space 1024 ! 366: .globl _iob3 ! 367: _iob3: .space 1024 ! 368: .globl _iob4 ! 369: _iob4: .space 1024 ! 370: .globl _iob5 ! 371: _iob5: .space 1024 ! 372: ! 373: esysdata: ! 374: ! 375: #include "scblock.s" /* SYSTEM CONTROL BLOCK */ ! 376: ! 377: ! 378: ! 379: ! 380: ! 381: ! 382: #include "evthandlers.s" /*event handlers */ ! 383: ! 384: #define ACBL(_n1,_n2,_n3,_n4) \ ! 385: addl2 _n2,_n3;\ ! 386: cmpl _n3,_n1;\ ! 387: bleq _n4; ! 388: ! 389: ! 390: ! 391: /* ! 392: *INITIALIZATION CODE ! 393: * ! 394: * MME off; mode = k; IPL = 31; IS = 1 ! 395: * ! 396: */ ! 397: ! 398: .globl start ! 399: start: ! 400: mtpr $0,$MME /* Disable MME */ ! 401: movl r0,tst_mask /* Save user options */ ! 402: movab _scb,r0 ! 403: andl2 $0x3ffffc00,r0 ! 404: mtpr r0,$SCBB /* Set SCBB */ ! 405: mtpr $0x1f,$IPL /* Set IPL to HIGH */ ! 406: ! 407: movpsl r1 ! 408: andl2 $0x001f0000,r1 /* Mask out flags */ ! 409: cmpl r1,$0x001f0000 /* modes = K & IPL = 31? */ ! 410: beql 1f ! 411: 2: movl $1,r0 ! 412: movl $0x041f0000,r2 ! 413: halt /* PSL not initialized as expected */ ! 414: 1: ! 415: movl $_intstack+NISP*NBPG,r0 ! 416: andl2 $0x3fffffff,r0 /* Mask out bit 30,31 */ ! 417: mtpr r0,$ISP /* init. ISP */ ! 418: movl r0,sp /* in case we get exception */ ! 419: movab (sp),fp /* Initialize FP */ ! 420: # ! 421: # Clear system data area all the way upto system code ! 422: # this includes dump buffer,interrupt stack,spt,iomap,pcbs,user ! 423: # page tables, & io buffer area. ! 424: # ! 425: 3: ! 426: movab esysdata,r7 ! 427: movab _restart,r6 ! 428: 1: clrl (r6) ! 429: ACBL(r7,$4,r6,1b) ! 430: # ! 431: # Initialize System Page Table ! 432: # ! 433: 5: ! 434: clrl r2 ! 435: movab _Ksp6,r1 /* R1 = Last address in Kernel stack area */ ! 436: andl2 $0x3fffffff,r1 /* Mask out bit 30,31 */ ! 437: shar $PGSHIFT,r1,r1 /* Get page no. of last page of Kstacks */ ! 438: 1: ! 439: movl r2,r11 /* Donot want to use orl3 */ ! 440: orl2 $PG_V|PG_KW,r11 ! 441: orl2 r11,_Sysmap[r2] ! 442: aobleq r1,r2,1b ! 443: ! 444: movab esysdata,r1 /* R1 = Last address in system data area */ ! 445: andl2 $0x3fffffff,r1 /* Mask out bit 30,31 */ ! 446: shar $PGSHIFT,r1,r1 /* Get page no. of last system data addr */ ! 447: 1: ! 448: movl r2,r11 /* Donot want to use orl3 */ ! 449: orl2 $PG_V|PG_KW|PG_NC,r11 /* Set I/O buffers non cachable */ ! 450: orl2 r11,_Sysmap[r2] ! 451: aoblss r1,r2,1b ! 452: # ! 453: # Map system text area 1 to 1, Kernel read/write. ! 454: # For this to work, the label _etext must exist at the end ! 455: # of system code; Add in 4 more pages for data area used in C ! 456: # ! 457: movab _end + (NBPG-1),r1 /* Map text+data 1 to 1; Kernel R/W */ ! 458: andl3 $0x3ffffc00,r1,_IOpage ! 459: addl2 $64*(1024),r1 ! 460: andl2 $0x3fffffff,r1 ! 461: shar $PGSHIFT,r1,r1 ! 462: 1: ! 463: movl r2,r11 ! 464: orl2 $PG_V|PG_KW|PG_NC,r11 /* Kernel Read/Write, non_cachable */ ! 465: orl2 r11,_Sysmap[r2] ! 466: aoblss r1,r2,1b ! 467: # ! 468: # Map from here (1st unused page) to page 512 : ! 469: # * invalid,no access, & virtual = physical ! 470: # ! 471: movl r2,_unused /* Save first unused physical page no */ ! 472: movl $LSP+1,r1 ! 473: 1: movl r2,_Sysmap[r2] ! 474: aoblss r1,r2,1b ! 475: ! 476: sysrdy: ! 477: movab _Sysmap,r0 ! 478: mtpr r0,$SBR /* Set SYSTEM BASE REG */ ! 479: mtpr $_Syssize,$SLR ! 480: orl2 $0xc0000000,r0 ! 481: mtpr r0,$P0BR /* Set P0BR */ ! 482: mtpr $_Syssize,$P0LR ! 483: ! 484: movl $CLOCK,r0 ! 485: movab _Xclock,_scb[r0] /* Set clock handler */ ! 486: ! 487: movl $BUSER,r0 ! 488: movab _Buser,_scb[r0] /* Set bus error handler */ ! 489: ! 490: clrl _bturn ! 491: clrl _bell ! 492: clrl _btime ! 493: mtpr $1,$IPL /* Allow clock interrupt */ ! 494: _bmore: ! 495: cmpl _btime,$0x5 ! 496: jeql 1f ! 497: jmp _bmore ! 498: 1: incl _bell /* No more bell */ ! 499: ! 500: .globl _ready ! 501: _ready: ! 502: clrl _proc_no ! 503: mtpr $1,$PACC ! 504: mtpr $1,$PADC ! 505: mtpr $1,$TBIA ! 506: mtpr $1,$CCK /* Set Code Cache Key = 1 */ ! 507: mtpr $1,$DCK /* Set Data Cache Key = 1 */ ! 508: mtpr $1,$MME /* Enable MME */ ! 509: jmp *$1f ! 510: 1: ! 511: movab _pcb0,r0 ! 512: movab _Eksp0,(r0) /* Set PCB0_KSP */ ! 513: mfpr $P0BR,PCB_P0BR(r0) /* Set PCB0_P0BR */ ! 514: mfpr $P0LR,PCB_P0LR(r0) /* Set PCB0_P0LR */ ! 515: mtpr r0,$PCBB /* Init PCBB to PCB_0 */ ! 516: ldpctx /* Just to switch to Kernel stack */ ! 517: mtpr $1,$IPL /* Drop IPL to 0 */ ! 518: movl (sp)+,r12 /* Pop unnecessary PC,PSL */ ! 519: movl (sp)+,r11 ! 520: /* ! 521: # Probe to see what devices are online ! 522: */ ! 523: incl _IOinit /* Set flag, so bus err won't print */ ! 524: clrl _Berr ! 525: callf $4,_tape /* Probe Tape master */ ! 526: cmpl $0,_Berr /* Get a bus error ? */ ! 527: jneq 2f ! 528: cmpl $1,r0 ! 529: jeql 1f ! 530: 2: ! 531: orl2 $1,tst_mask /* Disable Tape test */ ! 532: pushab tmsg ! 533: callf $8,_writes ! 534: clrl _tape_ON ! 535: 1: ! 536: # clrl _Berr ! 537: # callf $4,_vioc /* Probe VIOC */ ! 538: # cmpl $0,_Berr ! 539: # jneq 2f ! 540: # cmpl $1,r0 ! 541: # jeql 1f ! 542: 2: ! 543: orl2 $2,tst_mask /* Disable VIOC test */ ! 544: # pushab vmsg ! 545: # callf $8,_writes ! 546: # clrl _vioc_ON ! 547: 1: ! 548: clrl _Berr ! 549: callf $4,_vddc /* Probe VDDC */ ! 550: cmpl $0,_Berr ! 551: jneq 2f ! 552: cmpl $1,r0 ! 553: jeql 1f ! 554: 2: ! 555: orl2 $4,tst_mask ! 556: pushab vdmsg ! 557: callf $8,_writes ! 558: clrl _vddc_ON ! 559: ! 560: # ! 561: # The following tests are included : Tape, Vioc, Vddc. ! 562: # Bit 0-2 correspond to Tape, Vioc, Vddc test. To disable ! 563: # a particular test just set the corresponding bit to 1 before ! 564: # start. For example, if only Vddc test to be run, set R0=4. ! 565: # To run all, set R0 = 0. ! 566: # ! 567: 1: ! 568: clrl _IOinit /* Clear flag, so bus err will print */ ! 569: ! 570: clrl _Multi ! 571: andl3 $0x1,tst_mask,r0 ! 572: jneq 1f ! 573: callf $4,_tm_ex /* Test Tape master */ ! 574: 1: ! 575: # andl3 $0x2,tst_mask,r0 ! 576: # jneq 1f ! 577: # callf $4,_v_ex /* Test VIOC */ ! 578: 1: ! 579: andl3 $0x4,tst_mask,r0 ! 580: jneq 1f ! 581: callf $4,_vddc_ex /* Test VDDC */ ! 582: ! 583: 1: ! 584: orl3 _tape_ON,_vddc_ON,r0 ! 585: cmpl $1,r0 ! 586: jeql 1f ! 587: pushab mmsg ! 588: callf $4,_writes ! 589: brw 2f ! 590: 1: ! 591: callf $4,_multi ! 592: 2: ! 593: pushab emsg ! 594: callf $4,_writes ! 595: movl $0xcafebabe,r0 ! 596: halt ! 597: # ! 598: # Real time clock Handler ! 599: # ! 600: .align 2 ! 601: .globl _Xclock ! 602: _Xclock: ! 603: tstl _bell /* If set then just return */ ! 604: jneq 2f ! 605: incl _bturn ! 606: cmpl _bturn,$0x20 ! 607: jneq 2f ! 608: pushl $7 ! 609: callf $8,_writec /* Ring bell */ ! 610: incl _btime ! 611: clrl _bturn ! 612: 2: rei ! 613: ! 614: # ! 615: # Bus error handler ! 616: # ! 617: .align 2 ! 618: .globl _Buser ! 619: _Buser: ! 620: movab (sp),-(sp) /* Push pointer to error parameter */ ! 621: callf $8,_buserror ! 622: incl _Berr ! 623: movl (sp)+,r0 ! 624: movl (sp)+,r0 ! 625: rei ! 626: ! 627: ! 628: .align 2 ! 629: tst_mask: ! 630: .long 0 ! 631: _bell: .long 0 ! 632: _bturn: .long 0 ! 633: _btime: .long 0 ! 634: .globl _Multi ! 635: _Multi: .long 0 ! 636: .globl _Berr ! 637: _Berr: .long 0 ! 638: .globl _IOinit ! 639: _IOinit: .long 0 ! 640: .globl _tape_ON ! 641: _tape_ON: ! 642: .long 1 ! 643: .globl _vioc_ON ! 644: _vioc_ON: ! 645: .long 1 ! 646: .globl _vddc_ON ! 647: _vddc_ON: ! 648: .long 1 ! 649: .globl _xy_ON ! 650: _xy_ON: ! 651: .long 1 ! 652: ! 653: .align 1 ! 654: tmsg: .ascii "\nTape controller not found !\12\0" ! 655: vmsg: .ascii "\nVIOC controller not found !\12\0" ! 656: vdmsg: .ascii "\nVDDC controller not found !\12\0" ! 657: mmsg: .ascii "\nNot enough controllers for multiple interrupts test !\12\0" ! 658: emsg: .ascii "\nDone ...\12\0"
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.