|
|
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: .globl _dbuf /*dump buffer left out of 1K */ ! 132: .globl _r_no ! 133: _r_no: ! 134: .long 0 ! 135: .globl _pt_base ! 136: _pt_base: ! 137: .long 0 ! 138: .globl _saved_psl ! 139: _saved_psl: ! 140: .long 0 ! 141: .globl _saved_sp ! 142: _saved_sp: ! 143: .long 0 ! 144: .globl _saved_fp ! 145: _saved_fp: ! 146: .long 0 ! 147: .globl _p_ptr ! 148: _p_ptr: ! 149: .long 0 ! 150: .globl _ret_adr ! 151: _ret_adr: ! 152: .long 0 ! 153: .globl _exp_par0 ! 154: _exp_par0: ! 155: .long 0 ! 156: .globl _exp_par1 ! 157: _exp_par1: ! 158: .long 0 ! 159: .globl _exp_par2 ! 160: _exp_par2: ! 161: .long 0 ! 162: .globl _exp_par3 ! 163: _exp_par3: ! 164: .long 0 ! 165: .globl _act_par0 ! 166: _act_par0: ! 167: .long 0 ! 168: .globl _act_par1 ! 169: _act_par1: ! 170: .long 0 ! 171: ! 172: .globl _IOpage ! 173: _IOpage: ! 174: .long 0 /* Pointer 64K I/O pages */ ! 175: # ! 176: # ! 177: # ! 178: .globl _proc_no ! 179: _proc_no: ! 180: .long 0 ! 181: ! 182: .globl _clk_cnt ! 183: _clk_cnt: ! 184: .long 0 ! 185: _dbuf: ! 186: .set NN, (_dbuf - _restart) ! 187: .space 1024 - NN ! 188: edbuf: ! 189: ! 190: ! 191: .globl _intstack /* Interrupt stack */ ! 192: _intstack: /* Physical pages 4 & 5 */ ! 193: .space NISP*NBPG ! 194: eintstack: ! 195: ! 196: ! 197: .set SYSPTSIZE,512 /* No. of entries in SPT */ ! 198: ! 199: /* ! 200: System Page Table -- physical page 6 & 7 ! 201: */ ! 202: .align 2 ! 203: .globl _Sysmap ! 204: _Sysmap: ! 205: .space SYSPTSIZE*4 /* 512 max pages allowed for system */ ! 206: eSysmap: ! 207: .globl _Syssize ! 208: .set _Syssize,(eSysmap-_Sysmap)/4 /* should be SYSPTSIZE */ ! 209: ! 210: .globl _iomap /* Physical page 8 */ ! 211: _iomap: .space 1024 /* IOMAP - unused */ ! 212: .globl _eiomap ! 213: _eiomap: ! 214: ! 215: .globl _pcb0 /* Physical page 9 */ ! 216: _pcb0: .space 128 /*process control block 0 */ ! 217: .globl _pcb1 ! 218: _pcb1: .space 128 /*process control block 1 */ ! 219: .globl _pcb2 ! 220: _pcb2: .space 128 /*process control block 2 */ ! 221: .globl _pcb3 ! 222: _pcb3: .space 128 /*process control block 3 */ ! 223: .globl _pcb4 ! 224: _pcb4: .space 128 /*process control block 4 */ ! 225: .globl _pcb5 ! 226: _pcb5: .space 128 /*process control block 5 */ ! 227: .globl _pcb6 ! 228: _pcb6: .space 128 /*process control block 6 */ ! 229: .globl _pcb7 ! 230: _pcb7: .space 128 /*process control block 7 */ ! 231: ! 232: /* ! 233: *user #0 page tables -- P0PT, P1PT, P2PT ! 234: *physical memory -- page10, 11, & 12 respectively ! 235: */ ! 236: .align 2 ! 237: .globl _u0p0pt ! 238: _u0p0pt: ! 239: .space 1024 /*255 max pages for user #0 text */ ! 240: .globl _u0p1pt ! 241: _u0p1pt: ! 242: .space 1024 /*255 max pages for user #0 data */ ! 243: .globl _u0p2pt ! 244: _u0p2pt: ! 245: .space 1020 /*255 max pages for user #0 stack */ ! 246: eu0p2pt: ! 247: .space 4 ! 248: ! 249: /* ! 250: *user #1 page tables -- P0PT, P1PT, P2PT ! 251: *physical memory -- page13 ,14, & 15 respectively ! 252: */ ! 253: .align 2 ! 254: .globl _u1p0pt ! 255: _u1p0pt: ! 256: .space 1024 /*255 max pages for user #1 text */ ! 257: .globl _u1p1pt ! 258: _u1p1pt: ! 259: .space 1024 /*255 max pages for user #1 data */ ! 260: .globl _u1p2pt ! 261: _u1p2pt: ! 262: .space 1020 /*255 max pages for user #1 stack */ ! 263: eu1p2pt: ! 264: .space 4 ! 265: ! 266: ! 267: /* ! 268: *user #2 page tables -- P0PT, P1PT, P2PT ! 269: *physical memory -- page 16, 17 , & 18 respectively ! 270: */ ! 271: .align 2 ! 272: .globl _u2p0pt ! 273: _u2p0pt: ! 274: .space 1024 /*255 max pages for user #2 text */ ! 275: .globl _u2p1pt ! 276: _u2p1pt: ! 277: .space 1024 /*255 max pages for user #2 data */ ! 278: .globl _u2p2pt ! 279: _u2p2pt: ! 280: .space 1020 /*255 max pages for user #2 stack */ ! 281: eu2p2pt: ! 282: .space 4 ! 283: ! 284: ! 285: /* ! 286: *user #3 page tables -- P0PT, P1PT, P2PT ! 287: *physical memory -- page 19, 20 , & 21 respectively ! 288: */ ! 289: .align 2 ! 290: .globl _u3p0pt ! 291: _u3p0pt: ! 292: .space 1024 /*255 max pages for user #3 text */ ! 293: .globl _u3p1pt ! 294: _u3p1pt: ! 295: .space 1024 /*255 max pages for user #3 data */ ! 296: .globl _u3p2pt ! 297: _u3p2pt: ! 298: .space 1020 /*255 max pages for user #3 stack */ ! 299: eu3p2pt: ! 300: .space 4 ! 301: ! 302: /* ! 303: *user #4 thru 6 page tables ! 304: *physical memory -- pages 22 thru 30 ! 305: */ ! 306: .globl _u4p0pt ! 307: _u4p0pt: ! 308: .space (9*NBPG) - 4 ! 309: eu6p2pt: ! 310: .space 4 ! 311: ! 312: /* ! 313: *user #7 page tables -- P0PT, P1PT, P2PT ! 314: *physical memory -- page 31, 32 , & 33 respectively ! 315: */ ! 316: .align 2 ! 317: .globl _u7p0pt ! 318: _u7p0pt: ! 319: .space 1024 /*255 max pages for user #7 text */ ! 320: .globl _u7p1pt ! 321: _u7p1pt: ! 322: .space 1024 /*255 max pages for user #7 data */ ! 323: .globl _u7p2pt ! 324: _u7p2pt: ! 325: .space 1020 /*255 max pages for user #7 stack */ ! 326: eu7p2pt: ! 327: .space 4 ! 328: ! 329: .globl _Ksp0 /* Page used for Kernel stack of user0 */ ! 330: _Ksp0: .space 1020 ! 331: _Eksp0: .long 0 ! 332: ! 333: .globl _Ksp1 /* Page used for Kernel stack of user1 */ ! 334: _Ksp1: .space 1020 ! 335: _Eksp1: .long 0 ! 336: ! 337: .globl _Ksp2 /* Page used for Kernel stack of user2 */ ! 338: _Ksp2: .space 1020 ! 339: _Eksp2: .long 0 ! 340: ! 341: .globl _Ksp3 /* Page used for Kernel stack of user3 */ ! 342: _Ksp3: .space 1020 ! 343: _Eksp3: .long 0 ! 344: ! 345: .globl _Ksp4 /* Page used for Kernel stack of user4 */ ! 346: _Ksp4: .space 1020 ! 347: _Eksp4: .long 0 ! 348: ! 349: .globl _Ksp5 /* Page used for Kernel stack of user5 */ ! 350: _Ksp5: .space 1020 ! 351: _Eksp5: .long 0 ! 352: ! 353: .globl _Ksp6 /* Page used for Kernel stack of user6 */ ! 354: _Ksp6: .space 1020 ! 355: _Eksp6: .long 0 ! 356: # ! 357: # I/O buffers ! 358: # ! 359: .globl _iob0 ! 360: _iob0: .space 1024 ! 361: .globl _iob1 ! 362: _iob1: .space 1024 ! 363: .globl _iob2 ! 364: _iob2: .space 1024 ! 365: .globl _iob3 ! 366: _iob3: .space 1024 ! 367: .globl _iob4 ! 368: _iob4: .space 1024 ! 369: .globl _iob5 ! 370: _iob5: .space 1024 ! 371: ! 372: esysdata: ! 373: ! 374: #include "scblock.s" /* SYSTEM CONTROL BLOCK */ ! 375: ! 376: ! 377: ! 378: ! 379: ! 380: ! 381: #include "evthandlers.s" /*event handlers */ ! 382: ! 383: #define ACBL(_n1,_n2,_n3,_n4) \ ! 384: addl2 _n2,_n3;\ ! 385: cmpl _n3,_n1;\ ! 386: bleq _n4; ! 387: ! 388: ! 389: ! 390: /* ! 391: *INITIALIZATION CODE ! 392: * ! 393: * MME off; mode = k; IPL = 31; IS = 1 ! 394: * ! 395: */ ! 396: ! 397: .globl start ! 398: start: ! 399: mtpr $0x1f,$IPL /* Set IPL to HIGH */ ! 400: mtpr $0,$MME /* Disable MME */ ! 401: movab _scb,r1 ! 402: andl3 $0x000003ff, r1, r0 ! 403: tstl r0 /* does scb addr starts at pg boundary? */ ! 404: beql 1f ! 405: movl $0xffffffff,r0 /* scb address misaligned error */ ! 406: halt /* halt immediately */ ! 407: 1: ! 408: mtpr r1, $SCBB /* Set SCBB */ ! 409: ! 410: movpsl r1 ! 411: andl2 $0x001f0000,r1 /* Mask out flags */ ! 412: cmpl r1,$0x001f0000 /* modes = K & IPL = 31? */ ! 413: beql 1f ! 414: 2: movl $0xeeeeeeee,r0 ! 415: movl $0x041f0000,r2 ! 416: halt /* PSL not initialized as expected */ ! 417: 1: ! 418: movl $_intstack+NISP*NBPG,r0 ! 419: andl2 $0x3fffffff,r0 /* Mask out bit 30,31 */ ! 420: mtpr r0,$ISP /* init. ISP */ ! 421: movl r0,sp /* in case we get exception */ ! 422: movab (sp),fp /* Initialize FP */ ! 423: # ! 424: # Clear system data area all the way upto system code ! 425: # this includes dump buffer,interrupt stack,spt,iomap,pcbs,user ! 426: # page tables, & io buffer area. ! 427: # ! 428: 3: ! 429: movab esysdata,r7 ! 430: movab _restart,r6 ! 431: 1: clrl (r6) ! 432: ACBL(r7,$4,r6,1b) ! 433: # ! 434: # Initialize System Page Table ! 435: # ! 436: 5: ! 437: clrl r2 ! 438: movab _Ksp6,r1 /* R1 = Last address in Kernel stack area */ ! 439: andl2 $0x3fffffff,r1 /* Mask out bit 30,31 */ ! 440: shar $PGSHIFT,r1,r1 /* Get page no. of last page of Kstacks */ ! 441: 1: ! 442: movl r2,r11 /* Donot want to use orl3 */ ! 443: orl2 $PG_V|PG_KW,r11 ! 444: orl2 r11,_Sysmap[r2] ! 445: aobleq r1,r2,1b ! 446: ! 447: movab esysdata,r1 /* R1 = Last address in system data area */ ! 448: andl2 $0x3fffffff,r1 /* Mask out bit 30,31 */ ! 449: shar $PGSHIFT,r1,r1 /* Get page no. of last system data addr */ ! 450: 1: ! 451: movl r2,r11 /* Donot want to use orl3 */ ! 452: orl2 $PG_V|PG_KW|PG_NC,r11 /* Set I/O buffers non cachable */ ! 453: orl2 r11,_Sysmap[r2] ! 454: aoblss r1,r2,1b ! 455: # ! 456: # Map system text area 1 to 1, Kernel read/write. ! 457: # For this to work, the label _etext must exist at the end ! 458: # of system code; Add in 4 more pages for data area used in C ! 459: # ! 460: movab _end + (NBPG-1),r1 /* Map text+data 1 to 1; Kernel R/W */ ! 461: andl3 $0x3ffffc00,r1,_IOpage ! 462: addl2 $64*(1024),r1 ! 463: andl2 $0x3fffffff,r1 ! 464: shar $PGSHIFT,r1,r1 ! 465: 1: ! 466: movl r2,r11 ! 467: orl2 $PG_V|PG_KW|PG_NC,r11 /* Kernel Read/Write, non_cachable */ ! 468: orl2 r11,_Sysmap[r2] ! 469: aoblss r1,r2,1b ! 470: # ! 471: # Map from here (1st unused page) to page 512 : ! 472: # * invalid,no access, & virtual = physical ! 473: # ! 474: movl r2,_unused /* Save first unused physical page no */ ! 475: movl $LSP+1,r1 ! 476: 1: movl r2,_Sysmap[r2] ! 477: aoblss r1,r2,1b ! 478: ! 479: sysrdy: ! 480: movab _Sysmap,r0 ! 481: mtpr r0,$SBR /* Set SYSTEM BASE REG */ ! 482: mtpr $_Syssize,$SLR ! 483: orl2 $0xc0000000,r0 ! 484: mtpr r0,$P0BR /* Set P0BR */ ! 485: mtpr $_Syssize,$P0LR ! 486: ! 487: movl $CLOCK,r0 /* clock handler entry */ ! 488: movab _Xclock,_scb[r0] /* clk hndlr address */ ! 489: ! 490: movl $BUSER,r0 ! 491: movab _Buser,_scb[r0] /* Set bus error handler */ ! 492: ! 493: clrl _bturn ! 494: clrl _bell ! 495: clrl _btime ! 496: mtpr $1,$IPL /* Allow clock interrupt */ ! 497: # ! 498: # Probe for VEIUs ! 499: # ! 500: clrl _veius ! 501: callf $4,_chk_veiu_adr ! 502: movl r0,_veius ! 503: ! 504: .globl _ready ! 505: _ready: ! 506: clrl _proc_no ! 507: mtpr $1,$PACC ! 508: mtpr $1,$PADC ! 509: mtpr $1,$TBIA ! 510: mtpr $1,$CCK /* Set Code Cache Key = 1 */ ! 511: mtpr $1,$DCK /* Set Data Cache Key = 1 */ ! 512: mtpr $1,$MME /* Enable MME */ ! 513: jmp *$1f ! 514: 1: ! 515: movab _pcb0,r0 ! 516: movab _Eksp0,(r0) /* Set PCB0_KSP */ ! 517: mfpr $P0BR,PCB_P0BR(r0) /* Set PCB0_P0BR */ ! 518: mfpr $P0LR,PCB_P0LR(r0) /* Set PCB0_P0LR */ ! 519: mtpr r0,$PCBB /* Init PCBB to PCB_0 */ ! 520: ldpctx /* Just to switch to Kernel stack */ ! 521: mtpr $1,$IPL /* Drop IPL to 1 */ ! 522: movl (sp)+,r12 /* Pop unnecessary PC,PSL */ ! 523: movl (sp)+,r11 ! 524: # ! 525: 1: clrl _Multi ! 526: # ! 527: # VEIUs Test ! 528: # ! 529: tstl _veius /* Any VEIUs to test ? */ ! 530: beql 1f ! 531: callf $4,_init_veiu_vec /* Set up interrupt handlers for VEIUs */ ! 532: callf $4,_veiu /* VEIU test */ ! 533: # ! 534: # ! 535: 1: ! 536: movl $0xcafebabe,r0 ! 537: halt ! 538: # ! 539: # Real time clock Handler ! 540: # ! 541: .align 2 ! 542: .globl _Xclock ! 543: _Xclock: ! 544: rei ! 545: ! 546: # ! 547: # Bus error handler ! 548: # ! 549: .align 2 ! 550: .globl _Buser ! 551: _Buser: ! 552: movab (sp),-(sp) /* Push pointer to error parameter */ ! 553: callf $8,_buserror ! 554: incl _Berr ! 555: movl (sp)+,r0 ! 556: movl (sp)+,r0 ! 557: movl $0xeeeeeeee, r0 ! 558: rei ! 559: ! 560: # ! 561: # badaddr(addr, len) ! 562: # see if access addr with a len type instruction causes a machine check ! 563: # len is length of access (1=byte, 2=short, 4=long) ! 564: # r0 = 0 means good(exists); r0 =1 means does not exist. ! 565: # ! 566: .globl _badaddr ! 567: _badaddr: ! 568: .word 0x1c # Keep r4,r3,r2 ! 569: mfpr $IPL,r1 ! 570: mtpr $HIGH,$IPL ! 571: movl _scb+BEVEC,r2 ! 572: movl 4(fp),r3 ! 573: movl 8(fp),r4 ! 574: movab 9f,_scb+BEVEC ! 575: bbc $0,r4,1f ! 576: tstb (r3) ! 577: 1: bbc $1,r4,1f ! 578: tstw (r3) ! 579: 1: bbc $2,r4,1f ! 580: tstl (r3) ! 581: 1: clrl r0 # made it w/o machine checks ! 582: 2: movl r2,_scb+BEVEC ! 583: mtpr r1,$IPL ! 584: ret ! 585: ! 586: .align 2 ! 587: 9: # Here we catch buss error (if it comes) ! 588: andl3 4(sp),$0x7,r0 # check ERRCD ! 589: cmpl r0,$1 # check APE ! 590: jneq 1f ! 591: halt # Address parity error !!! ! 592: 1: cmpl r0,$5 # check VBE ! 593: jneq 1f ! 594: halt # Versabus error ! 595: 1: ! 596: movl $1,r0 # Anything else = bad address ! 597: movab 8(sp),sp # discard buss error trash ! 598: movab 2b,(sp) # new program counter on stack. ! 599: rei ! 600: # ! 601: # ! 602: # ! 603: .align 2 ! 604: _bell: .long 0 ! 605: _bturn: .long 0 ! 606: _btime: .long 0 ! 607: .globl _Multi ! 608: _Multi: .long 0 ! 609: .globl _Berr ! 610: _Berr: .long 0 ! 611: .globl _IOinit ! 612: _IOinit: .long 0 ! 613: .globl _tape_ON ! 614: _tape_ON: ! 615: .long 1 ! 616: .globl _vioc_ON ! 617: _vioc_ON: ! 618: .long 1 ! 619: .globl _vddc_ON ! 620: _vddc_ON: ! 621: .long 1 ! 622: .globl _viocs ! 623: _viocs: ! 624: .long 0 ! 625: .globl _veius ! 626: _veius: ! 627: .long 0 ! 628:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.