|
|
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: /* privileged registers addresses */ ! 19: #include "prvreg.h" ! 20: ! 21: /* program status long word definition */ ! 22: #include "psl.h" ! 23: ! 24: /* page table entry definition */ ! 25: #include "pte.h" ! 26: ! 27: /* process control block offsets */ ! 28: #include "pcboffset.h" ! 29: ! 30: /* fundamental constants for globl use */ ! 31: #include "const.h" ! 32: ! 33: /* system control block offsets*/ ! 34: #include "scboffset.h" ! 35: /* SPT offsets */ ! 36: #include "sptoffset.h" ! 37: ! 38: /* trap numbers*/ ! 39: #include "trap.h" ! 40: ! 41: ! 42: #define P0SPACE 1 /* This test run in P0 space */ ! 43: #define TRUE 1 ! 44: #define V_TRAP 0 ! 45: #define V_SYSCALL 4 ! 46: ! 47: .set HIGH,0x1f /*mask for disabling all interrupts */ ! 48: .set MCKVEC,4 /*scb offset for machinecheck vector */ ! 49: .set NISP,2 /*no. of interrupt stack pages */ ! 50: .set DONE,255 /*user process done code */ ! 51: ! 52: .text ! 53: ! 54: #include "pstorage.s" /* PROCESSOR STORAGE AREA */ ! 55: ! 56: .globl _Entry ! 57: _Entry: ! 58: jmp start ! 59: .space (1024-6) ! 60: ! 61: ! 62: ! 63: /* globl dump buffer to be used for communication */ ! 64: /* between tests & interrupt handlers, & other misc. */ ! 65: /* purposes. */ ! 66: ! 67: /*physical page 3 */ ! 68: ! 69: .set NLWU,30 /*no. of longwords already used */ ! 70: /*this must be changed when you define */ ! 71: /*additional variables below before */ ! 72: /*_dbuf */ ! 73: .globl _restart ! 74: _restart: ! 75: .space 4 /*contains restart address for rastarting*/ ! 76: /*after power is restored (loaded by */ ! 77: /*power fail interrupt handler & used by*/ ! 78: /*CPU 2 */ ! 79: .globl _maxmem ! 80: _maxmem: ! 81: .space 4 /*memory size in no of bytes */ ! 82: ! 83: .globl _maxpages ! 84: _maxpages: ! 85: .space 4 /*memory size in no. of physical pages */ ! 86: ! 87: .globl _lastadd ! 88: _lastadd: ! 89: .space 4 /*address of the last long word */ ! 90: ! 91: .globl _unused ! 92: _unused: ! 93: .space 4 /*first unused page in system space */ ! 94: ! 95: .globl _ctlblk ! 96: _ctlblk: ! 97: .long 0 /* pointer to SCB */ ! 98: ! 99: .globl _savvec0 /*save vectors area */ ! 100: _savvec0: ! 101: .space 4 ! 102: ! 103: .globl _savvec1 /*save vectors area */ ! 104: _savvec1: ! 105: .space 4 ! 106: ! 107: .globl _savvec2 /*save vectors area */ ! 108: _savvec2: ! 109: .space 4 ! 110: ! 111: .globl _savvec3 /*save vectors area */ ! 112: _savvec3: ! 113: .space 4 ! 114: ! 115: .globl _savvec4 /*save vectors area */ ! 116: _savvec4: ! 117: .space 4 ! 118: ! 119: .globl _savvec5 /*save vectors area */ ! 120: _savvec5: ! 121: .space 4 ! 122: .globl _savvec6 /*save vectors area */ ! 123: _savvec6: ! 124: .space 4 ! 125: .globl _savvec7 /*save vectors area */ ! 126: _savvec7: ! 127: .space 4 ! 128: .globl _dbuf /*dump buffer left out of 1K */ ! 129: .globl _r_no ! 130: _r_no: ! 131: .long 0 ! 132: .globl _pt_base ! 133: _pt_base: ! 134: .long 0 ! 135: .globl _saved_psl ! 136: _saved_psl: ! 137: .long 0 ! 138: .globl _saved_sp ! 139: _saved_sp: ! 140: .long 0 ! 141: .globl _saved_fp ! 142: _saved_fp: ! 143: .long 0 ! 144: .globl _p_ptr ! 145: _p_ptr: ! 146: .long 0 ! 147: .globl _ret_adr ! 148: _ret_adr: ! 149: .long 0 ! 150: .globl _exp_par0 ! 151: _exp_par0: ! 152: .long 0 ! 153: .globl _exp_par1 ! 154: _exp_par1: ! 155: .long 0 ! 156: .globl _exp_par2 ! 157: _exp_par2: ! 158: .long 0 ! 159: .globl _exp_par3 ! 160: _exp_par3: ! 161: .long 0 ! 162: .globl _act_par0 ! 163: _act_par0: ! 164: .long 0 ! 165: .globl _act_par1 ! 166: _act_par1: ! 167: .long 0 ! 168: .globl _act_par2 ! 169: _act_par2: ! 170: .long 0 ! 171: .globl _act_par3 ! 172: _act_par3: ! 173: .long 0 ! 174: .globl _test_no ! 175: _test_no: ! 176: .long 0 ! 177: _dbuf: ! 178: .space NBPG - (NLWU *4) ! 179: edbuf: ! 180: ! 181: ! 182: .globl _intstack /* Interrupt stack */ ! 183: _intstack: /* Physical pages 4 & 5 */ ! 184: .space NISP*NBPG ! 185: eintstack: ! 186: ! 187: ! 188: .set SYSPTSIZE,512 /* No. of entries in SPT */ ! 189: ! 190: /* ! 191: System Page Table -- physical page 6 & 7 ! 192: */ ! 193: .align 2 ! 194: .globl _Sysmap ! 195: _Sysmap: ! 196: .space SYSPTSIZE*4 /* 512 max pages allowed for system */ ! 197: eSysmap: ! 198: .globl _Syssize ! 199: .set _Syssize,(eSysmap-_Sysmap)/4 /* should be SYSPTSIZE */ ! 200: ! 201: .globl _iomap /* Physical page 8 */ ! 202: _iomap: .space 1024 /* IOMAP - unused */ ! 203: .globl _eiomap ! 204: _eiomap: ! 205: ! 206: .globl _pcb0 /* Physical page 9 */ ! 207: _pcb0: .space 128 /*process control block 0 */ ! 208: .globl _pcb1 ! 209: _pcb1: .space 128 /*process control block 1 */ ! 210: .globl _pcb2 ! 211: _pcb2: .space 128 /*process control block 2 */ ! 212: .globl _pcb3 ! 213: _pcb3: .space 128 /*process control block 3 */ ! 214: .globl _pcb4 ! 215: _pcb4: .space 128 /*process control block 4 */ ! 216: .globl _pcb5 ! 217: _pcb5: .space 128 /*process control block 5 */ ! 218: .globl _pcb6 ! 219: _pcb6: .space 128 /*process control block 6 */ ! 220: .globl _pcb7 ! 221: _pcb7: .space 128 /*process control block 7 */ ! 222: ! 223: /* ! 224: *user #0 page tables -- P0PT, P1PT, P2PT ! 225: *physical memory -- page10, 11, & 12 respectively ! 226: */ ! 227: .align 2 ! 228: .globl _u0p0pt ! 229: _u0p0pt: ! 230: .space 1024 /*255 max pages for user #0 text */ ! 231: .globl _u0p1pt ! 232: _u0p1pt: ! 233: .space 1024 /*255 max pages for user #0 data */ ! 234: .globl _u0p2pt ! 235: _u0p2pt: ! 236: .space 1020 /*255 max pages for user #0 stack */ ! 237: eu0p2pt: ! 238: .space 4 ! 239: ! 240: /* ! 241: *user #1 page tables -- P0PT, P1PT, P2PT ! 242: *physical memory -- page13 ,14, & 15 respectively ! 243: */ ! 244: .align 2 ! 245: .globl _u1p0pt ! 246: _u1p0pt: ! 247: .space 1024 /*255 max pages for user #1 text */ ! 248: .globl _u1p1pt ! 249: _u1p1pt: ! 250: .space 1024 /*255 max pages for user #1 data */ ! 251: .globl _u1p2pt ! 252: _u1p2pt: ! 253: .space 1020 /*255 max pages for user #1 stack */ ! 254: eu1p2pt: ! 255: .space 4 ! 256: ! 257: ! 258: /* ! 259: *user #2 page tables -- P0PT, P1PT, P2PT ! 260: *physical memory -- page 16, 17 , & 18 respectively ! 261: */ ! 262: .align 2 ! 263: .globl _u2p0pt ! 264: _u2p0pt: ! 265: .space 1024 /*255 max pages for user #2 text */ ! 266: .globl _u2p1pt ! 267: _u2p1pt: ! 268: .space 1024 /*255 max pages for user #2 data */ ! 269: .globl _u2p2pt ! 270: _u2p2pt: ! 271: .space 1020 /*255 max pages for user #2 stack */ ! 272: eu2p2pt: ! 273: .space 4 ! 274: ! 275: ! 276: /* ! 277: *user #3 page tables -- P0PT, P1PT, P2PT ! 278: *physical memory -- page 19, 20 , & 21 respectively ! 279: */ ! 280: .align 2 ! 281: .globl _u3p0pt ! 282: _u3p0pt: ! 283: .space 1024 /*255 max pages for user #3 text */ ! 284: .globl _u3p1pt ! 285: _u3p1pt: ! 286: .space 1024 /*255 max pages for user #3 data */ ! 287: .globl _u3p2pt ! 288: _u3p2pt: ! 289: .space 1020 /*255 max pages for user #3 stack */ ! 290: eu3p2pt: ! 291: .space 4 ! 292: ! 293: /* ! 294: *user #4 thru 6 page tables ! 295: *physical memory -- pages 22 thru 30 ! 296: */ ! 297: .globl _u4p0pt ! 298: _u4p0pt: ! 299: .space (9*NBPG) - 4 ! 300: eu6p2pt: ! 301: .space 4 ! 302: ! 303: /* ! 304: *user #7 page tables -- P0PT, P1PT, P2PT ! 305: *physical memory -- page 31, 32 , & 33 respectively ! 306: */ ! 307: .align 2 ! 308: .globl _u7p0pt ! 309: _u7p0pt: ! 310: .space 1024 /*255 max pages for user #7 text */ ! 311: .globl _u7p1pt ! 312: _u7p1pt: ! 313: .space 1024 /*255 max pages for user #7 data */ ! 314: .globl _u7p2pt ! 315: _u7p2pt: ! 316: .space 1020 /*255 max pages for user #7 stack */ ! 317: eu7p2pt: ! 318: .space 4 ! 319: ! 320: .globl _iob0 /*io buffer 0 */ ! 321: _iob0: .space 1024 ! 322: .globl _iob1 /*io buffer 1 */ ! 323: _iob1: .space 1024 ! 324: .globl _iob2 /*io buffer 2 */ ! 325: _iob2: .space 1024 ! 326: .globl _iob3 /*io buffer 3 */ ! 327: _iob3: .space 1024 ! 328: .globl _iob4 /*io buffer 4 */ ! 329: _iob4: .space 1024 ! 330: .globl _iob5 /*io buffer 5 */ ! 331: _iob5: .space 1024 ! 332: .globl _iob6 /*io buffer 6 */ ! 333: _iob6: .space 1024 ! 334: esysdata: ! 335: ! 336: #include "scblock.s" /* SYSTEM CONTROL BLOCK */ ! 337: ! 338: ! 339: ! 340: ! 341: ! 342: ! 343: ! 344: #include "evthandlers.s" /*event handlers */ ! 345: ! 346: #define ACBL(_n1,_n2,_n3,_n4) \ ! 347: addl2 _n2,_n3;\ ! 348: cmpl _n3,_n1;\ ! 349: bleq _n4; ! 350: ! 351: ! 352: ! 353: /* ! 354: *INITIALIZATION CODE ! 355: * ! 356: * MME off; mode = k; IPL = 31; IS = 1 ! 357: * ! 358: */ ! 359: ! 360: .globl start ! 361: start: ! 362: mtpr $0,$MME /* Disable MME */ ! 363: movl r0,_tno /* R0 : Test no to run; 0 run all tests */ ! 364: movl r1,_option ! 365: movl r2,_Cycle /* R2 : Cycle count */ ! 366: ! 367: clrl _cycle ! 368: andl3 _option,$0x8,_ss1 /* Heading message sense switch */ ! 369: andl3 _option,$0x4,_Emsg /* Error message sense switch */ ! 370: clrl _lptest ! 371: ! 372: tstl _tno /* Set lptest if tno == XX and loop forever */ ! 373: beql mmtest ! 374: cmpl $-1,_Cycle ! 375: bneq mmtest ! 376: incl _lptest ! 377: mmtest: ! 378: movab _scb,r0 ! 379: mtpr r0,$SCBB /* Set SCBB */ ! 380: mtpr $0x1f,$IPL ! 381: ! 382: movpsl r1 ! 383: andl2 $0xffffff00,r1 /* Mask out flags */ ! 384: cmpl r1,$0x041f0000 /*IS on,modes =k & IPL = 31? */ ! 385: beql 1f ! 386: 2: movl $1,r0 ! 387: movl $0x041f0000,r2 ! 388: halt /* PSL not initialized as expected */ ! 389: 1: ! 390: mtpr $_intstack+NISP*NBPG,$ISP /* init. ISP */ ! 391: movl $_intstack+NISP*NBPG,sp /* in case we get exception */ ! 392: movab (sp),fp /* Initialize FP */ ! 393: ! 394: /* ! 395: Clear system data area all the way upto system code ! 396: this includes dump buffer,interrupt stack,spt,iomap,pcbs,user ! 397: page tables, & io buffer area. ! 398: */ ! 399: 3: ! 400: movab esysdata,r7 ! 401: movab _restart,r6 ! 402: 1: clrl (r6) ! 403: ACBL(r7,$4,r6,1b) ! 404: /* ! 405: Initialize System Page Table ! 406: */ ! 407: 5: ! 408: clrl r2 ! 409: movab esysdata,r1 /* R1 = Last address in system data area */ ! 410: andl2 $0x3fffffff,r1 /* Mask out bit 30,31 */ ! 411: shar $PGSHIFT,r1,r1 /* Get page no. of last system data addr */ ! 412: /* Map systm data area 1 to 1,kernel writable */ ! 413: 1: ! 414: movl r2,r11 ! 415: orl3 $PG_V|PG_KW,r11,_Sysmap[r2] ! 416: aoblss r1,r2,1b ! 417: /* ! 418: Map system text area 1 to 1, Kernel read/write. ! 419: For this to work, the label _etext must exist at the end ! 420: of system code; Add in 4 more pages for data area used in C ! 421: */ ! 422: movab _edata + 4*(NBPG-1),r1 /* Map text+data 1 to 1; Kernel R/W */ ! 423: /* movab _etext + 4*(NBPG-1), r1 */ ! 424: andl2 $0x3fffffff,r1 ! 425: shar $PGSHIFT,r1,r1 ! 426: 1: ! 427: movl r2,r11 ! 428: orl3 $PG_V|PG_KW,r11,_Sysmap[r2] /* Kernel Read/Write */ ! 429: aoblss r1,r2,1b ! 430: /* ! 431: Map from here (1st unused page) to page 512 : ! 432: * invalid,no access, & virtual = physical ! 433: */ ! 434: movl r2,_unused /* Save first unused physical page no */ ! 435: movl $LSP+1,r1 ! 436: 1: movl r2,_Sysmap[r2] ! 437: aoblss r1,r2,1b ! 438: ! 439: /* ! 440: Initialize SBR, SLR ! 441: *Following are some useful addresses for user 0 (in case you want ! 442: *to start user 0: ! 443: * ! 444: * p0br = $_u0p0pt (limit = 256 max) ! 445: * p1br = $_u0p1pt ( same limit) ! 446: * p2br = $0xbfc02c00 (funny) ! 447: * p2lr = $0x000ffff0 (funny) ! 448: * ! 449: *for other users, add NBPG*3 to above except for p2 area ! 450: * ! 451: * u0_user_sp = 0xbffffbfc ! 452: * u0_k_sp = 0xbfffe3fc ! 453: * u0_s_sp = 0xbfffcbfc ! 454: * u0_e_sp = 0xbfffcbfc ! 455: * ! 456: */ ! 457: ! 458: sysrdy: ! 459: cmpl $TRUE,$P0SPACE ! 460: bneq 0f ! 461: mtpr $_Sysmap,$SBR /* Physical mode */ ! 462: brb 1f ! 463: 0: mtpr $(_Sysmap-0xc0000000),$SBR /* Virtual mode version */ ! 464: 1: mtpr $_Syssize,$SLR ! 465: ! 466: /* ! 467: Double map the kernel into user addresses : ! 468: This will enable system to go to virtual mode the 1st time !! ! 469: */ ! 470: .globl _ready ! 471: mtpr $_Sysmap,$P0BR ! 472: mtpr $_Syssize,$P0LR ! 473: _ready: ! 474: cmpl $P0SPACE,$TRUE /* Run physical ? */ ! 475: beql pmode ! 476: ! 477: /* GO TO VIRTUAL MODE */ ! 478: mtpr $1,$DCK /* Set data cache key */ ! 479: mtpr $1,$DCR /* Enable data cache */ ! 480: mtpr $1,$PADC /* Purge all data cache */ ! 481: mtpr $1,$TBIA /* Purge all translation buffer */ ! 482: mtpr $1,$MME /* Turn on MME */ ! 483: jmp *$pmode /* Go .... */ ! 484: pmode: ! 485: mtpr $0,$P0LR /* Invalidate user map */ ! 486: mtpr $_pcb0,$PCBB /* Initialize PCBB */ ! 487: ! 488: tstl _ss1 ! 489: jeql 1f ! 490: pushl $M0 ! 491: callf $4+4,_writes ! 492: 1: ! 493: mtpr $2,$DCR /* Disable data cache */ ! 494: cmpl $0,_tno ! 495: beql t0 ! 496: cmpl $1,_tno ! 497: bneq nxt1 ! 498: t0: ! 499: calls $4,_vtest /* and fetching virtual in P0 */ ! 500: tstl _lptest ! 501: bneq t0 ! 502: nxt1: ! 503: mtpr $1,$DCR /* Enable data cache */ ! 504: mtpr $2,$DCK /* Set data cache key */ ! 505: mtpr $1,$PADC /* Purge all data cache */ ! 506: ! 507: cmpl $0,_tno ! 508: beql t1 ! 509: cmpl $2,_tno ! 510: bneq nxt2 ! 511: t1: ! 512: calls $4,_protect /* Test1 : access protection of PTE's */ ! 513: tstl _lptest ! 514: bneq t1 ! 515: nxt2: ! 516: cmpl $0,_tno ! 517: beql t2 ! 518: cmpl $3,_tno ! 519: bneq nxt3 ! 520: t2: ! 521: calls $4,_vl_test /* Test2 : valid bit and length check */ ! 522: tstl _lptest ! 523: bneq t2 ! 524: nxt3: ! 525: cmpl $0,_tno ! 526: beql t3 ! 527: cmpl $4,_tno ! 528: bneq nxt4 ! 529: t3: ! 530: calls $4,_mu_test /* Test3 : the M bit of PTE */ ! 531: tstl _lptest ! 532: bneq t3 ! 533: ! 534: nxt4: ! 535: cmpl $0,_tno ! 536: beql t4 ! 537: cmpl $5,_tno ! 538: bneq nxt5 ! 539: t4: /* Test4 : if protection fault detected */ ! 540: calls $4,_pv_test /* prior to translation fault */ ! 541: tstl _lptest ! 542: bneq t4 ! 543: ! 544: nxt5: ! 545: cmpl $0,_tno ! 546: beql t5 ! 547: cmpl $6,_tno ! 548: bneq last ! 549: t5: ! 550: calls $4,_ucbit_chk /* Test5 : Check the Noncachable bit */ ! 551: tstl _lptest ! 552: bneq t5 ! 553: last: ! 554: cmpl $-1,_Cycle /* If Cycle == -1 then loop forever */ ! 555: jeql mmtest ! 556: ! 557: incl _cycle ! 558: cmpl _cycle,_Cycle ! 559: jlss mmtest ! 560: ! 561: .globl passed ! 562: passed: ! 563: tstl _ss1 ! 564: jeql 1f ! 565: pushl $M2 /* Cycle count */ ! 566: callf $4+4,_writes ! 567: pushl _Cycle ! 568: callf $4+4,_writeh ! 569: pushl $M1 ! 570: callf $4+4,_writes ! 571: 1: ! 572: movl $0xcafebabe,r0 ! 573: halt /* Good halt : R0 == CAFE BABE */ ! 574: .space 40 /* Reserved some space */ ! 575: ! 576: ! 577: .align 2 ! 578: .globl _ss1 ! 579: _ss1: .long 0 /* Heading sense switch : 1 then donot print */ ! 580: .globl _tno ! 581: _tno: .long 0 /* If -1 run ALL tests, else run test "tno" */ ! 582: .globl _Cycle ! 583: _Cycle: .long 0 /* Cycle count */ ! 584: .globl _cycle ! 585: _cycle: .long 0 /* Cycle count */ ! 586: .globl _option ! 587: _option: ! 588: .long 0 ! 589: .globl _lptest ! 590: _lptest: ! 591: .long 0 /* Loop on test specified by tno */ ! 592: .globl _Emsg ! 593: _Emsg: ! 594: .long 0 ! 595: ! 596: .data 1 /* MESSAGE AREA */ ! 597: M0: .ascii "\n** Memory Management Test **\n\0" ! 598: M1: .ascii "\n** Passed ... \n\0" ! 599: M2: .ascii "\n** Cycle count : \0" ! 600:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.