|
|
1.1 ! root 1: ! 2: /* privileged registers constants (addresses) */ ! 3: ! 4: ! 5: ! 6: .set SBR,0 /*system base register */ ! 7: .set SLR,1 /*system length reg */ ! 8: .set P0BR,2 /*p0 base reg */ ! 9: .set P0LR,3 /*p0 length reg */ ! 10: .set P1BR,4 /*p1 base reg */ ! 11: .set P1LR,5 /*p1 length reg */ ! 12: .set P2BR,6 /*p2 base reg */ ! 13: .set P2LR,7 /*p2 length reg */ ! 14: .set IPL,8 /*int priority level reg */ ! 15: .set MME,9 /*memory mgmt enable reg */ ! 16: .set TBIA,10 /*trans buf invalidate all */ ! 17: /*entries */ ! 18: .set TBIS,11 /*trans buf invalidate single */ ! 19: /*entry */ ! 20: .set DCK,12 /*data cache key */ ! 21: .set CCK,13 /*code cache key */ ! 22: .set PCBB,14 /*process control block base */ ! 23: .set ISP,15 /*interrupt stack pointer */ ! 24: .set SIRR,16 /*software int request reg */ ! 25: .set SISR,17 /*software int summary reg */ ! 26: .set SCBB,18 /*system control block base reg */ ! 27: .set KSP,19 /*kernel stack pointer reg */ ! 28: .set USP,20 /*user stack pointer */ ! 29: .set DCB,21 /*CPU2 DCB */ ! 30: .set PACC,23 /*purge (invalidate) all pages */ ! 31: /*of process in code cache */ ! 32: .set P1DC,24 /*purge one page of data cache */ ! 33: .set PADC,25 /*purge all the pages of */ ! 34: /*process in data cache */ ! 35: .set HISR,26 /* Hardware interrupt summary reg */ ! 36: .set DCR,27 /* Diagnostic control register */ ! 37: .set PDCS,28 /* Purge 1 data cache slot */ ! 38: ! 39: # ! 40: #TAHOE program status longword ! 41: # ! 42: ! 43: .set PSL_C,0x00000001 /* carry bit */ ! 44: .set PSL_V,0x00000002 /* overflow bit */ ! 45: .set PSL_Z,0x00000004 /* zero bit */ ! 46: .set Z,0x00000004 ! 47: .set PSL_N,0x00000008 /* negative bit */ ! 48: .set PSL_T,0x00000010 /* trace enable bit */ ! 49: .set PSL_I,0x00000020 /* integer overflow enable bit */ ! 50: .set PSL_EN_OVFL,0x20 /* integer overflow enable bit */ ! 51: .set PSL_EN_UNDFL,0x40 /* floating underflow enable */ ! 52: .set PSL_DBL,0x80 /* dbl precision Accumulator bit */ ! 53: .set PSL_IPL,0x001f0000 /* interrupt priority level */ ! 54: .set PSL_MOD,0x01000000 /* mode = 1 means user */ ! 55: .set PSL_IS,0x04000000 /* interrupt stack */ ! 56: .set PSL_TP,0x40000000 /* trace pending */ ! 57: ! 58: # ! 59: # TAHOE page table entry ! 60: #/ ! 61: .set PG_V,0x8000000 ! 62: .set PG_PROT,0x78000000 ! 63: .set PG_M,0x04000000 ! 64: .set PG_USED,0x02000000 ! 65: .set PG_NC,0x01000000 ! 66: .set PG_PFNUM,0x003fffff ! 67: ! 68: .set PG_NOACC,0 ! 69: .set PG_KR,0x40000000 ! 70: .set PG_KW,0x60000000 ! 71: .set PG_URKR,0x50000000 ! 72: .set PG_URKW,0x70000000 ! 73: .set PG_UW,0x78000000 ! 74: ! 75: #* PCB offsets & diagnostic extension to pcb */ ! 76: #* PCB is at pcb0 */ ! 77: ! 78: ! 79: .set PCB_SIZE, 24 ! 80: .set PCB_KSP, 0 ! 81: .set PCB_USP, 4 ! 82: .set PCB_R0, 8 ! 83: .set PCB_R1, 12 ! 84: .set PCB_R2, 16 ! 85: .set PCB_R3, 20 ! 86: .set PCB_R4, 24 ! 87: .set PCB_R5, 28 ! 88: .set PCB_R6, 32 ! 89: .set PCB_R7, 36 ! 90: .set PCB_R8, 40 ! 91: .set PCB_R9, 44 ! 92: .set PCB_R10, 48 ! 93: .set PCB_R11, 52 ! 94: .set PCB_R12, 56 ! 95: .set PCB_R13, 60 ! 96: .set PCB_PC, 64 ! 97: .set PCB_PSL, 68 ! 98: .set PCB_P0BR, 72 ! 99: .set PCB_P0LR, 76 ! 100: .set PCB_P1BR, 80 ! 101: .set PCB_P1LR, 84 ! 102: .set PCB_P2BR, 88 ! 103: .set PCB_P2LR, 92 ! 104: .set PCB_ACCM, 96 ! 105: .set PCB_ACCL, 100 ! 106: #* ! 107: # Diagnostic pcb extension ! 108: #/ ! 109: .set PCB_STAT, 104 /*process status,statistics,id,etc*/ ! 110: ! 111: ! 112: ! 113: #* fundamental constants */ ! 114: ! 115: #* ! 116: # fundamental constants of the implementation-- ! 117: # cannot be changed easily. ! 118: #/ ! 119: ! 120: .set NBPG,1024 ! 121: .set PGOFSET,(NBPG-1) /* byte offset into page */ ! 122: .set PGSHIFT,10 /* LOG2(NBPG) */ ! 123: .set HIGH,0x1f ! 124: ! 125: ! 126: #* SCB offsets */ ! 127: #* SCB is at scb */ ! 128: ! 129: .set PFVEC,1*4 /*power fail */ ! 130: .set PRVEC,2*4 /*power restore */ ! 131: .set CLOCKVEC,7*4 /*hard clock vector */ ! 132: .set CRVEC,0xa*4 /*console receive */ ! 133: .set CXVEC,44 /*console transmit */ ! 134: .set SIVEC1,0x1e*4 /*software int vec #1 */ ! 135: /*for 2,3,..15, sub 4,8,.. 56 */ ! 136: /*from SIVEC1 */ ! 137: .set BEVEC,0x20*4 /*bus error */ ! 138: .set SYSVEC,0x2b*4 /*system call (kcall) */ ! 139: .set PINSTVEC,0x2c*4 /*privileged instruction fault */ ! 140: .set PRIVSVEC,0x2c*4 /*privileged instruction fault */ ! 141: .set ROVEC,0x2d*4 /*reserved operand fault */ ! 142: .set RAVEC,0x2e*4 /*reserved addressing fault */ ! 143: .set PROTVEC,0x2f*4 /*access control violation */ ! 144: .set TRANS,0x30 /*translation fault vector */ ! 145: .set TRANSVEC,0x30*4 /*translation fault vector */ ! 146: .set KSPVEC,0x31*4 /*kernel stack not valid vector */ ! 147: .set TRACEVEC,0x32*4 /*trace vector */ ! 148: .set BPTVEC,0x33*4 /*break point fault */ ! 149: .set ARITHVEC,0x34*4 /*arithmetic trap */ ! 150: .set ALIGNVEC,0x35*4 /*alignment vector */ ! 151: .set FPMVEC,0x37*4 /*fpp emulation vector */ ! 152: .set IO14VEC,256 /*io vector, ipl #14 */ ! 153: .set IO15VEC,320 /*io vector, ipl #15 */ ! 154: .set IO16VEC,384 /*io vector, ipl #16 */ ! 155: .set IO17VEC,448 /*io vector, ipl #17 */ ! 156: ! 157: #* SPT (system page table) offsets */ ! 158: #* SPT is at Sysmap */ ! 159: ! 160: .set SCBPTE,8 /*system control block pte offset*/ ! 161: .set BUFPTE,12 /*buffer pte offset */ ! 162: .set ISPTE,16 /*interrupt stack page 0 */ ! 163: .set IS1PTE,20 /*interrupt stack page 1 */ ! 164: .set SPTPTE,20 /*system page table page 1 */ ! 165: .set SPT1PTE,20 /*system page table page 2 */ ! 166: .set IOMAPPTE,24 /*io map */ ! 167: .set PCBPTE,28 /*process control blocks pte */ ! 168: .set U0P0PTE,32 /*U0 p0pt pte */ ! 169: .set U0P1PTE,36 /*U0 p1pt pte */ ! 170: .set U0P2PTE,40 /*U0 p2pt pte */ ! 171: .set U1P0PTE,44 ! 172: .set U1P1PTE,48 ! 173: .set U1P2PTE,52 ! 174: .set U2P0PTE,56 ! 175: .set U2P1PTE,60 ! 176: .set U2P2PTE,64 ! 177: .set U3P0PTE,68 ! 178: .set U3P1PTE,72 ! 179: .set U3P2PTE,76 ! 180: .set U4P0PTE,80 ! 181: .set U4P1PTE,84 ! 182: .set U4P2PTE,88 ! 183: .set U5P0PTE,92 ! 184: .set U5P1PTE,96 ! 185: .set U5P2PTE,100 ! 186: .set U6P0PTE,104 ! 187: .set U6P1PTE,108 ! 188: .set U6P2PTE,112 ! 189: .set U7P0PTE,116 /*U7 p0pt pte */ ! 190: .set U7P1PTE,120 /*U7 p1pt pte */ ! 191: .set U7P2PTE,124 /*U7 p2pt pte */ ! 192: .set IOB0PTE,128 /*io buffer 0 pte */ ! 193: .set IOB1PTE,132 ! 194: .set IOB2PTE,136 ! 195: .set IOB3PTE,140 ! 196: .set IOB4PTE,144 ! 197: .set IOB5PTE,148 ! 198: .set IOB6PTE,152 ! 199: .set IOB7PTE,156 /*io buffer 7 pte */ ! 200: ! 201: ! 202: #* trap.h 4.6 81/03/03 */ ! 203: ! 204: #* ! 205: #* Trap type values ! 206: #/ ! 207: ! 208: .set RESADFLT,0 /* reserved addressing fault */ ! 209: .set PRIVINFLT,1 /* privileged instruction fault */ ! 210: .set RESOPFLT,2 /* reserved operand fault */ ! 211: .set BPTFLT,3 /* bpt instruction fault */ ! 212: .set ALIGNFLT,4 /* alignment fault */ ! 213: .set SYSCALL,5 /* kcall instruction (syscall trap) */ ! 214: .set ARITHTRAP,6 /* arithmetic trap */ ! 215: .set PROTFLT,7 /* protection fault */ ! 216: .set TRCTRAP,8 /* trace trap */ ! 217: .set TRANSFLT,9 /* translation not valid fault */ ! 218: .set DONE,255 ! 219: ! 220: # ! 221: # Event codes ! 222: # ! 223: .set RTCLOCK_CODE,7 /* real time clock event */ ! 224: .set RESOP_CODE,0x2d /* reserved operand fault */ ! 225: .set RESAD_CODE,0x2e /* reserved address fault */ ! 226: .set ARITH_CODE,0x34 /* arithmetic fault */ ! 227: .set FPM_CODE,0x37 /* fpp emulation trap */ ! 228: .set INTEGER_OVERFLOW,1 /* code for arith. fault */ ! 229: ! 230: # ! 231: # Arithmetic Event types ! 232: # ! 233: .set INT_OVFL_CODE,1 /* integer overflow */ ! 234: .set INT_0_DIV_CODE,2 /* integer divide by 0 */ ! 235: .set FLT_0_DIV_CODE,3 /* floating divide by 0 */ ! 236: .set FLT_OVFL_CODE,4 /* floating overflow */ ! 237: .set FLT_UNDFL_CODE,5 /* floating underflow */ ! 238: ! 239: # ! 240: # Floating Point Instruction Op-Codes ! 241: # ! 242: .set LDF_OP_CODE,0x06 /* sgl load acc. instr */ ! 243: .set LDD_OP_CODE,0x07 /* dbl load acc. instr */ ! 244: .set LNF_OP_CODE,0x16 /* sgl load-neg acc. instr */ ! 245: .set LND_OP_CODE,0x17 /* dbl load-neg acc. instr */ ! 246: .set STF_OP_CODE,0x26 /* sgl store acc. instr */ ! 247: .set STD_OP_CODE,0x27 /* dbl store acc. instr */ ! 248: .set CMPF_OP_CODE,0x36 /* sgl compare instr */ ! 249: .set CMPD_OP_CODE,0x37 /* dbl compare instr */ ! 250: .set CMPF2_OP_CODE,0x46 /* sgl compare 2 instr */ ! 251: .set CMPD2_OP_CODE,0x47 /* dbl compare 2 instr */ ! 252: .set TSTF_OP_CODE,0x56 /* sgl test acc. instr */ ! 253: .set TSTD_OP_CODE,0x57 /* dbl test acc. instr */ ! 254: .set PUSHD_OP_CODE,0x67 /* dbl push acc. instr */ ! 255: .set CVLF_OP_CODE,0x76 /* convert int to sgl instr */ ! 256: .set CVLD_OP_CODE,0x77 /* convert int to dbl instr */ ! 257: .set CVFL_OP_CODE,0x86 /* convert sgl to int instr */ ! 258: .set CVDL_OP_CODE,0x87 /* convert dbl to int instr */ ! 259: .set LDFD_OP_CODE,0x97 /* load sgl to dbl instr */ ! 260: .set CVDF_OP_CODE,0xa6 /* convert dbl to sgl instr */ ! 261: .set NEGF_OP_CODE,0xb6 /* negate sgl acc. instr */ ! 262: .set NEGD_OP_CODE,0xb7 /* negate dbl acc. instr */ ! 263: .set ADDF_OP_CODE,0xc6 /* sgl add instr */ ! 264: .set ADDD_OP_CODE,0xc7 /* dbl add instr */ ! 265: .set SUBF_OP_CODE,0xd6 /* sgl subtract instr */ ! 266: .set SUBD_OP_CODE,0xd7 /* dbl subtract instr */ ! 267: .set MULF_OP_CODE,0xe6 /* sgl multiply instr */ ! 268: .set MULD_OP_CODE,0xe7 /* dbl multiply instr */ ! 269: .set DIVF_OP_CODE,0xf6 /* sgl divide instr */ ! 270: .set DIVD_OP_CODE,0xf7 /* dbl divide instr */ ! 271: .set SINF_OP_CODE,0x05 /* sgl sine instr */ ! 272: .set COSF_OP_CODE,0x15 /* sgl cosine instr */ ! 273: .set ATANF_OP_CODE,0x25 /* sgl arc-tangent instr */ ! 274: .set LOGF_OP_CODE,0x35 /* sgl natural log instr */ ! 275: .set SQRTF_OP_CODE,0x45 /* sgl square root instr */ ! 276: .set EXPF_OP_CODE,0x55 /* sgl "e to the x" instr */ ! 277: .set MULL2_OP_CODE,0x4c /* integer multiply - 2 ops */ ! 278: .set MULL3_OP_CODE,0x5c /* integer multiply - 3 ops */ ! 279: ! 280: ! 281: # ! 282: # Addressing test constants - These must agree with "fpp_defs.h" ! 283: # ! 284: .set ADR_ABSOLUTE,1 /* absolute address */ ! 285: .set ADR_LITERAL,2 /* literal -short immediate byte */ ! 286: .set ADR_IM_B,3 /* immediate byte */ ! 287: .set ADR_IM_W,4 /* immediate word */ ! 288: .set ADR_IM_L,5 /* immediate long-word */ ! 289: .set ADR_B_DSP,6 /* byte displ relative */ ! 290: .set ADR_W_DSP,7 /* word displ relative */ ! 291: .set ADR_L_DSP,8 /* long-word displ relative */ ! 292: .set ADR_B_DSP_DEF,9 /* byte displ relative deferred */ ! 293: .set ADR_W_DSP_DEF,10 /* word displ relative deferred */ ! 294: .set ADR_L_DSP_DEF,11 /* L-word displ relative deferred */ ! 295: .set ADR_REG,12 /* direct register */ ! 296: .set ADR_REG_DEF,13 /* register deferred */ ! 297: .set ADR_FP_DEF,14 /* FP deferred */ ! 298: .set ADR_SP_DEF,15 /* SP deferred */ ! 299: .set ADR_PUSH,16 /* auto-decrement SP */ ! 300: .set ADR_POP,17 /* auto-increment SP */ ! 301: .set ADR_POP_DEF,18 /* auto-increment SP deferred */ ! 302: .set ADR_REG_B,19 /* register + byte displ */ ! 303: .set ADR_REG_W,20 /* register + word displ */ ! 304: .set ADR_REG_L,21 /* register + long-word displ */ ! 305: .set ADR_REG_B_DEF,22 /* register + byte displ deferred */ ! 306: .set ADR_REG_W_DEF,23 /* register + word displ deferred */ ! 307: .set ADR_REG_L_DEF,24 /* register + L-word displ deferred */ ! 308: .set ADR_I_FP_DEF,25 /* indexed (frame pointer deferred) */ ! 309: .set ADR_I_L,26 /* indexed (longword displacement) */ ! 310: ! 311: ! 312: #************************************************************************* ! 313: # ! 314: # Stuff for the Demand Paging , Events, & Addressing Tests ! 315: # ! 316: #************************************************************************/ ! 317: .set SGL,1 /* sgl precision data */ ! 318: .set DBL,2 /* dbl precision data */ ! 319: .set ENABLE_EVENTS,0x60 /* enable ovfl & undfl events */ ! 320: .set NONE,0 /* no operand flag */ ! 321: .set LOAD,1 /* read-the-operand flag */ ! 322: .set STORE,2 /* store-the-operand flag */ ! 323: ! 324: .set NO_EVT_HLT,1 /* halt code: did not Get event */ ! 325: .set EVT_MSK_HLT,2 /* halt code: got masked event */ ! 326: .set BAD_PSL_HLT,3 /* halt code: wrong PSL value */ ! 327: .set PUSH_CNT_HLT,4 /* halt code: wrong # ops on stk */ ! 328: .set PUSH_PSL_HLT,5 /* halt code: bad PSL on stack */ ! 329: .set PUSH_PC_HLT,6 /* halt code: bad PC on stack */ ! 330: .set BAD_REG_HLT,7 /* halt code: bad final register */ ! 331: .set BAD_ACC_HLT,8 /* halt code: bad final Acc. */ ! 332: ! 333: # ! 334: # set DMP_PG_0 to the 1st empty page ! 335: # ! 336: .set DMP_PG_0,0x36000 ! 337: .set DMP_PG_1,DMP_PG_0+0x400 ! 338: .set DMP_PG_2,DMP_PG_1+0x400 ! 339: .set DMP_PG_3,DMP_PG_2+0x400 ! 340: .set DMP_PG_4,DMP_PG_3+0x400 ! 341: .set DMP_PG_5,DMP_PG_4+0x400 ! 342: .set DMP_PG_6,DMP_PG_5+0x400 ! 343: .set DMP_PG_7,DMP_PG_6+0x400 ! 344: .set DMP_PG_8,DMP_PG_7+0x400 ! 345: .set DMP_PG_9,DMP_PG_8+0x400 ! 346: .set DMP_PG_10,DMP_PG_9+0x400 ! 347: .set DMP_PG_11,DMP_PG_10+0x400 ! 348: .set DMP_PG_12,DMP_PG_11+0x400 ! 349: .set DMP_PG_13,DMP_PG_12+0x400 ! 350: ! 351: # ! 352: # test code space for the address / demand page tests ! 353: # ! 354: .set START_OF_CODE,DMP_PG_1-20 /* 1st addr of test-code space */ ! 355: .set CODE_BUF_SIZE,40 /* # bytes in test-code space */ ! 356: .set END_OF_CODE,START_OF_CODE+CODE_BUF_SIZE ! 357: ! 358: # ! 359: # data locations used by the event and demand page tests ! 360: # ! 361: .set _dmp_byte_op_1,DMP_PG_1+0x30 /* 'byte offset' data */ ! 362: .set _dmp_byte_op_2,DMP_PG_1+0x50 /* 'byte offset' data */ ! 363: .set _dmp_byte_op_3,DMP_PG_1+0x70 /* 'byte offset' data */ ! 364: .set _dmp_op_1,DMP_PG_3-4 /* 1st data word */ ! 365: .set _dmp_op_1_ptr,DMP_PG_4+0x30 /* ptr to 1st data wd */ ! 366: .set _dmp_op_2_ptr,DMP_PG_5+0x30 /* ptr to 2nd data wd */ ! 367: .set _dmp_op_2,DMP_PG_7-4 /* 2nd data word */ ! 368: .set _dmp_op_3,DMP_PG_8 /* 3rd data word */ ! 369: .set _dmp_op_3_ptr,DMP_PG_9+0x30 /* ptr to 3rd data wd */ ! 370: .set _dmp_op_4,DMP_PG_10 /* 4th data (for pipes) */ ! 371: .set _dmp_op_5,DMP_PG_11 /* 5th data (for pipes) */ ! 372: .set _sp_minus,DMP_PG_13-4 /* SP for POPs */ ! 373: .set _sp_page,DMP_PG_13 /* SP page boundary */ ! 374: .set _sp_plus,DMP_PG_13+4 /* SP for PUSHs */ ! 375: ! 376: ! 377: /************************************************************************/ ! 378: /* Revision History */ ! 379: /* ---------- */ ! 380: /* Rev 1.0 1 Aug 85 */ ! 381: /* */ ! 382: /* Initial release of the diagnostic */ ! 383: /* */ ! 384: /************************************************************************/ ! 385: ! 386: # INIT.X for the Demand Pageing Tests ! 387: # ! 388: # This file is a diagnostic version of locore.s. ! 389: # It contains the following: ! 390: # *system data area = scb, dump buffer, interrupt stack, ! 391: # *system page table,user page tables,pcbs,iomap, & io buffers. ! 392: # ! 393: # *system code = interrupt vectors, initialization of system data, ! 394: # *memory size calculation,initialization of SPT, zeroing of ! 395: # *unused memory, & loading of SBR & SLR. ! 396: # * ! 397: # *at the end of this code, you are ready to go to virtual mode. ! 398: # * --- GOOD LUCK! ! 399: # ! 400: ########################################################################## ! 401: # ! 402: # 6-Mar-85 : changed to user mode execution ! 403: # 11-Mar-85 : moved mode changeing from here to RUN_CODE ! 404: # 17-Jul-85 : added "mtpr" test for fpp/no-fpp wcs ! 405: ########################################################################## ! 406: ! 407: ! 408: /* privileged registers addresses */ ! 409: #include "prvreg.h" ! 410: ! 411: /* program status long word definition */ ! 412: #include "psl.h" ! 413: ! 414: /* page table entry definition */ ! 415: #include "pte.h" ! 416: ! 417: /* process control block offsets */ ! 418: #include "pcboffset.h" ! 419: ! 420: /* fundamental constants for globl use */ ! 421: #include "const.h" ! 422: ! 423: /* system control block offsets*/ ! 424: #include "scboffset.h" ! 425: /* SPT offsets */ ! 426: #include "sptoffset.h" ! 427: ! 428: /* trap numbers*/ ! 429: #include "trap.h" ! 430: ! 431: ! 432: #define V_TRAP 0 ! 433: #define V_SYSCALL 4 ! 434: ! 435: .set HIGH,0x1f /*mask for disabling all interrupts */ ! 436: .set MCKVEC,4 /*scb offset for machinecheck vector */ ! 437: .set NISP,2 /*no. of interrupt stack pages */ ! 438: .set DONE,255 /*user process done code */ ! 439: .set TTRAP,0x32 ! 440: .set PRIVS,0x2c ! 441: ! 442: .text ! 443: ! 444: /* PROCESSOR STORAGE AREA */ ! 445: #include "pstorage.s" ! 446: ! 447: .globl _Entry ! 448: _Entry: ! 449: jmp start ! 450: .space (1024-6) ! 451: ! 452: /* globl dump buffer to be used for communication */ ! 453: /* between tests & interrupt handlers, & other misc. */ ! 454: /* purposes. */ ! 455: ! 456: /* Physical page 3 : Used for global variables */ ! 457: ! 458: .set NLWU,35 /*no. of longwords already used */ ! 459: /*this must be changed when you define */ ! 460: /*additional variables below before */ ! 461: /*_dbuf */ ! 462: .globl _Codek ! 463: _Codek: .long 0 /* Code cache key */ ! 464: ! 465: .globl _restart ! 466: _restart: ! 467: .space 4 /*contains restart address for restarting*/ ! 468: /*after power is restored (loaded by */ ! 469: /*power fail interrupt handler & used by*/ ! 470: /*CPU 2 */ ! 471: .globl _maxmem ! 472: _maxmem: ! 473: .space 4 /*memory size in no of bytes */ ! 474: ! 475: .globl _maxpages ! 476: _maxpages: ! 477: .space 4 /*memory size in no. of physical pages */ ! 478: ! 479: .globl _lastadd ! 480: _lastadd: ! 481: .space 4 /*address of the last long word */ ! 482: ! 483: .globl _unused ! 484: _unused: ! 485: .space 4 /*first unused page in system space */ ! 486: ! 487: .globl _ctlblk ! 488: _ctlblk: ! 489: .long 0 /* pointer to SCB */ ! 490: ! 491: .globl _savvec0 /*save vectors area */ ! 492: _savvec0: ! 493: .space 4 ! 494: ! 495: .globl _savvec1 /*save vectors area */ ! 496: _savvec1: ! 497: .space 4 ! 498: ! 499: .globl _savvec2 /*save vectors area */ ! 500: _savvec2: ! 501: .space 4 ! 502: ! 503: .globl _savvec3 /*save vectors area */ ! 504: _savvec3: ! 505: .space 4 ! 506: ! 507: .globl _savvec4 /*save vectors area */ ! 508: _savvec4: ! 509: .space 4 ! 510: ! 511: .globl _savvec5 /*save vectors area */ ! 512: _savvec5: ! 513: .space 4 ! 514: .globl _savvec6 /*save vectors area */ ! 515: _savvec6: ! 516: .space 4 ! 517: .globl _savvec7 /*save vectors area */ ! 518: _savvec7: ! 519: .space 4 ! 520: ! 521: .globl _savvec8 /*save vectors area */ ! 522: _savvec8: ! 523: .space 4 ! 524: ! 525: .globl _r_no ! 526: _r_no: ! 527: .long 0 ! 528: .globl _pt_base ! 529: _pt_base: ! 530: .long 0 ! 531: .globl _saved_psl ! 532: _saved_psl: ! 533: .long 0 ! 534: .globl _saved_sp ! 535: _saved_sp: ! 536: .long 0 ! 537: .globl _saved_fp ! 538: _saved_fp: ! 539: .long 0 ! 540: .globl _ret_adr ! 541: _ret_adr: ! 542: .long 0 ! 543: .globl _exp_par0 ! 544: _exp_par0: ! 545: .long 0 ! 546: .globl _exp_par1 ! 547: _exp_par1: ! 548: .long 0 ! 549: .globl _f_vaddr ! 550: _f_vaddr: ! 551: .long 0 /* VA that caused fault */ ! 552: ! 553: .globl _f_ptr ! 554: _f_ptr: ! 555: .long 0 /* Pointer to fault parameters */ ! 556: .globl _df_cnt ! 557: _df_cnt: ! 558: .long 0 /* Count of data fault */ ! 559: ! 560: .globl _if_cnt ! 561: _if_cnt: ! 562: .long 0 /* Count of Instruction fault */ ! 563: ! 564: .globl _newepc ! 565: _newepc: ! 566: .long 0 ! 567: ! 568: .globl _errcnt ! 569: _errcnt: ! 570: .long 0 ! 571: ! 572: .globl _clk_cnt ! 573: _clk_cnt: ! 574: .long 0 ! 575: ! 576: .globl _ttcnt ! 577: _ttcnt: ! 578: .long 0 /* Count of Trap exception */ ! 579: .globl _trcnt ! 580: _trcnt: ! 581: .long 0 /* Count of Translation fault */ ! 582: ! 583: .globl _Ufpte ! 584: _Ufpte: .long 0 ! 585: .globl _Ulpte ! 586: _Ulpte: .long 0 ! 587: ! 588: .globl _dbuf /*dump buffer left out of 1K */ ! 589: _dbuf: ! 590: .space NBPG - (NLWU *4) ! 591: edbuf: ! 592: ! 593: ! 594: .globl _intstack /* Interrupt stack */ ! 595: _intstack: /* Physical pages 4 & 5 */ ! 596: .space NISP*NBPG ! 597: eintstack: ! 598: ! 599: ! 600: .set SYSPTSIZE,512 /* No. of entries in SPT */ ! 601: ! 602: /* ! 603: System Page Table -- physical page 6 & 7 ! 604: */ ! 605: .align 2 ! 606: .globl _Sysmap ! 607: _Sysmap: ! 608: .space SYSPTSIZE*4 /* 512 max pages allowed for system */ ! 609: eSysmap: ! 610: .globl _Syssize ! 611: .set _Syssize,(eSysmap-_Sysmap)/4 /* should be SYSPTSIZE */ ! 612: ! 613: .globl _iomap /* Physical page 8 */ ! 614: _iomap: .space 1024 /* IOMAP - unused */ ! 615: .globl _eiomap ! 616: _eiomap: ! 617: ! 618: .globl _pcb0 /* Physical page 9 */ ! 619: _pcb0: .space 128 /*process control block 0 */ ! 620: .globl _pcb1 ! 621: _pcb1: .space 128 /*process control block 1 */ ! 622: .globl _pcb2 ! 623: _pcb2: .space 128 /*process control block 2 */ ! 624: .globl _pcb3 ! 625: _pcb3: .space 128 /*process control block 3 */ ! 626: .globl _pcb4 ! 627: _pcb4: .space 128 /*process control block 4 */ ! 628: .globl _pcb5 ! 629: _pcb5: .space 128 /*process control block 5 */ ! 630: .globl _pcb6 ! 631: _pcb6: .space 128 /*process control block 6 */ ! 632: .globl _pcb7 ! 633: _pcb7: .space 128 /*process control block 7 */ ! 634: ! 635: /* ! 636: *user #0 page tables -- P0PT, P1PT, P2PT ! 637: *physical memory -- page10, 11, & 12 respectively ! 638: */ ! 639: .align 2 ! 640: .globl _u0p0pt ! 641: _u0p0pt: ! 642: .space 1024 /*255 max pages for user #0 text */ ! 643: .globl _u0p1pt ! 644: _u0p1pt: ! 645: .space 1024 /*255 max pages for user #0 data */ ! 646: .globl _u0p2pt ! 647: _u0p2pt: ! 648: .space 1020 /*255 max pages for user #0 stack */ ! 649: eu0p2pt: ! 650: .space 4 ! 651: ! 652: /* ! 653: *user #1 page tables -- P0PT, P1PT, P2PT ! 654: *physical memory -- page13 ,14, & 15 respectively ! 655: */ ! 656: .align 2 ! 657: .globl _u1p0pt ! 658: _u1p0pt: ! 659: .space 1024 /*255 max pages for user #1 text */ ! 660: .globl _u1p1pt ! 661: _u1p1pt: ! 662: .space 1024 /*255 max pages for user #1 data */ ! 663: .globl _u1p2pt ! 664: _u1p2pt: ! 665: .space 1020 /*255 max pages for user #1 stack */ ! 666: eu1p2pt: ! 667: .space 4 ! 668: ! 669: ! 670: /* ! 671: *user #2 page tables -- P0PT, P1PT, P2PT ! 672: *physical memory -- page 16, 17 , & 18 respectively ! 673: */ ! 674: .align 2 ! 675: .globl _u2p0pt ! 676: _u2p0pt: ! 677: .space 1024 /*255 max pages for user #2 text */ ! 678: .globl _u2p1pt ! 679: _u2p1pt: ! 680: .space 1024 /*255 max pages for user #2 data */ ! 681: .globl _u2p2pt ! 682: _u2p2pt: ! 683: .space 1020 /*255 max pages for user #2 stack */ ! 684: eu2p2pt: ! 685: .space 4 ! 686: ! 687: ! 688: /* ! 689: *user #3 page tables -- P0PT, P1PT, P2PT ! 690: *physical memory -- page 19, 20 , & 21 respectively ! 691: */ ! 692: .align 2 ! 693: .globl _u3p0pt ! 694: _u3p0pt: ! 695: .space 1024 /*255 max pages for user #3 text */ ! 696: .globl _u3p1pt ! 697: _u3p1pt: ! 698: .space 1024 /*255 max pages for user #3 data */ ! 699: .globl _u3p2pt ! 700: _u3p2pt: ! 701: .space 1020 /*255 max pages for user #3 stack */ ! 702: eu3p2pt: ! 703: .space 4 ! 704: ! 705: /* ! 706: *user #4 thru 6 page tables ! 707: *physical memory -- pages 22 thru 30 ! 708: */ ! 709: .globl _u4p0pt ! 710: _u4p0pt: ! 711: .space (9*NBPG) - 4 ! 712: eu6p2pt: ! 713: .space 4 ! 714: ! 715: /* ! 716: Area used for Kernel stack ! 717: physical memory -- page 31, 32 , 33 ! 718: */ ! 719: ! 720: .align 2 ! 721: .globl _Kstack /* Kernel stack */ ! 722: _Kstack: /* Physical pages 31,32,33 */ ! 723: .space 3*NBPG ! 724: .globl ekstack ! 725: ekstack: ! 726: ! 727: ! 728: .globl _iob0 /*io buffer 0 */ ! 729: _iob0: .space 1024 ! 730: .globl _iob1 /*io buffer 1 */ ! 731: _iob1: .space 1024 ! 732: .globl _iob2 /*io buffer 2 */ ! 733: _iob2: .space 1024 ! 734: .globl _iob3 /*io buffer 3 */ ! 735: _iob3: .space 1024 ! 736: .globl _iob4 /*io buffer 4 */ ! 737: _iob4: .space 1024 ! 738: .globl _iob5 /*io buffer 5 */ ! 739: _iob5: .space 1024 ! 740: .globl _iob6 /*io buffer 6 */ ! 741: _iob6: .space 1024 ! 742: esysdata: ! 743: ! 744: /* SYSTEM CONTROL BLOCK */ ! 745: #include "scblock.s" ! 746: ! 747: ! 748: ! 749: #include "evthandlers.s" ! 750: ! 751: #define ACBL(_n1,_n2,_n3,_n4) addl2 _n2,_n3; cmpl _n3,_n1; bleq _n4; ! 752: ! 753: ! 754: ! 755: # *INITIALIZATION CODE ! 756: # * ! 757: # * MME off; mode = k; IPL = 31; IS = 1 ! 758: # * ! 759: ! 760: ! 761: .globl start ! 762: start: ! 763: mtpr $0,$MME /* Disable MME */ ! 764: movl r0,_run_list ! 765: movl r1,_OPTIONS ! 766: clrl _nonstop /* clear the continuous run flag */ ! 767: movl r2,_count /* save the test count */ ! 768: bneq 1f /* is count = 0 ? */ ! 769: movl $1,_count /* yes -set cycle count = 1 */ ! 770: 1: bgeq 1f /* is count < 0 ? */ ! 771: movl $1,_nonstop /* yes -set NONSTOP flag */ ! 772: 1: ! 773: clrl _no_fpp_wcs /* clear the NO-FPP WCS flag */ ! 774: mtpr $0x400,$DCR /* check for FPP WCS loaded */ ! 775: tstl r1 /* r1 = 0 if NO-FPP WCS loaded */ ! 776: bneq 1f ! 777: movl $1,_no_fpp_wcs /* set the NO-FPP WCS flag */ ! 778: 1: ! 779: movab _scb,r0 ! 780: andl2 $0x3ffffc00,r0 ! 781: mtpr r0,$SCBB /* Set SCBB */ ! 782: mtpr $0x1f,$IPL /* Set IPL to HIGH */ ! 783: ! 784: andl3 $4,r11,_ss1 /* messages sense switch */ ! 785: ! 786: # ! 787: # clear the option flags ! 788: # ! 789: clrl _halt_flg /* clear the halt on error flag */ ! 790: clrl _loop_on_err /* clear the loop on error flag */ ! 791: movl $1,_prt_error /* set the print error messages flag */ ! 792: movl $1,_prt_hdrs /* set the print header messages flag */ ! 793: movl $1,_en_data_cache /* set the enable data cache flag */ ! 794: movl $1,_user_mode /* set the Run In User Mode flag */ ! 795: clrl _exp_event /* clear the fpp event expected flag */ ! 796: clrl _event_return /* clear the fpp event return flag */ ! 797: clrl _unexp_event_ret /*clear the unexpected event return addr */ ! 798: ! 799: # ! 800: # set the option flags as needed ! 801: # ! 802: bitl $1,_OPTIONS /* bit(0) = HALT ON ERROR */ ! 803: beql 1f ! 804: movl $1,_halt_flg /* set the HALT ON ERROR flag */ ! 805: 1: ! 806: bitl $2,_OPTIONS /* bit(1) = LOOP ON ERROR */ ! 807: beql 1f ! 808: movl $1,_loop_on_err /* set the LOOP ON ERROR flag */ ! 809: 1: ! 810: bitl $4,_OPTIONS /* bit(2) = PRINT ERROR MESSAGES */ ! 811: beql 1f ! 812: clrl _prt_error /* clear the PRINT ERROR MESSAGES flag */ ! 813: 1: ! 814: bitl $8,_OPTIONS /* bit(3) = PRINT HEADER MESSAGES */ ! 815: beql 1f ! 816: clrl _prt_hdrs /* clear the PRINT HEADER MESSAGES flag */ ! 817: 1: ! 818: bitl $16,_OPTIONS /* bit(4) = ENABLE DATA CACHE flag */ ! 819: beql 1f ! 820: clrl _en_data_cache /* clear the ENABLE DATA CACHE flag */ ! 821: 1: ! 822: bitl $32,_OPTIONS /* bit(5) = DON'T RUN IN USER MODE flag */ ! 823: beql 1f ! 824: clrl _user_mode /* reset the RUN IN USER MODE flag */ ! 825: 1: ! 826: movpsl r1 ! 827: andl2 $0xffffff00,r1 /* Mask out flags */ ! 828: cmpl r1,$0x041f0000 /*IS on,modes =k & IPL = 31? */ ! 829: beql 1f ! 830: 2: movl $1,r0 ! 831: movl $0x041f0000,r2 ! 832: halt /* PSL not initialized as expected */ ! 833: 1: ! 834: movl $_intstack+NISP*NBPG,r0 ! 835: andl2 $0x3fffffff,r0 /* Mask out bit 30,31 */ ! 836: mtpr r0,$ISP /* init. ISP */ ! 837: movl r0,sp /* in case we get exception */ ! 838: movab (sp),fp /* Initialize FP */ ! 839: # ! 840: # Clear system data area all the way upto system code ! 841: # this includes dump buffer,interrupt stack,spt,iomap,pcbs,user ! 842: # page tables, & io buffer area. ! 843: # ! 844: 3: ! 845: movab esysdata,r7 ! 846: movab _restart,r6 ! 847: 1: clrl (r6) ! 848: ACBL(r7,$4,r6,1b) ! 849: # ! 850: # Initialize System Page Table ! 851: # ! 852: 5: ! 853: clrl r2 ! 854: movab esysdata,r1 /* R1 = Last address in system data area */ ! 855: andl2 $0x3fffffff,r1 /* Mask out bit 30,31 */ ! 856: shar $PGSHIFT,r1,r1 /* Get page no. of last system data addr */ ! 857: /* Map systm data area 1 to 1,kernel writable */ ! 858: 1: ! 859: orl3 $PG_V|PG_KW,r2,_Sysmap[r2] ! 860: aoblss r1,r2,1b ! 861: ! 862: # ! 863: # Map system text area 1 to 1, Kernel read/write. ! 864: # For this to work, the label _etext must exist at the end ! 865: # of system code; Add in 4 more pages for data area used in C ! 866: # ! 867: movab _Esys,r1 /* Map System text 1 to 1; Kernel R/W */ ! 868: andl2 $0x3fffffff,r1 ! 869: shar $PGSHIFT,r1,r1 ! 870: 1: ! 871: orl3 $PG_V|PG_KW,r2,_Sysmap[r2] ! 872: aobleq r1,r2,1b ! 873: # ! 874: # Map from here to last page used by user : ! 875: # invalid, User access, & virtual = physical ! 876: # ! 877: movl r2,_unused /* Save first unused physical page no */ ! 878: movl r2,_Ufpte /* First PTE of User */ ! 879: movl $0x80000,r1 /* Allow this much memory for User */ ! 880: shar $PGSHIFT,r1,r1 ! 881: movl r1,_Ulpte /* Last PTE of User */ ! 882: ! 883: 1: ! 884: orl3 $PG_V|PG_UW,r2,_Sysmap[r2] /* Valid / User Read/Write */ ! 885: aoblss r1,r2,1b ! 886: ! 887: # ! 888: # Initialize SBR, SLR ! 889: # ! 890: sysrdy: ! 891: mtpr $_Sysmap,$SBR /* Set SYSTEM BASE REG */ ! 892: mtpr $_Syssize,$SLR ! 893: mtpr $64,$DCR /* Enable fault */ ! 894: ! 895: # GO TO VIRTUAL MODE ! 896: # Double map the kernel into user addresses : ! 897: # This will enable system to go to virtual mode the 1st time !! ! 898: # ! 899: ! 900: orl3 $0xc0000000,$_Sysmap,r0 ! 901: mtpr r0,$P0BR /* Double map P0BR to SBR */ ! 902: mtpr $_Syssize,$P0LR ! 903: mtpr $1,$PADC /* Purge all data cache */ ! 904: mtpr $1,$TBIA /* Purge all Trans. buffer */ ! 905: ! 906: mfpr $SCBB,r0 ! 907: movab _Trans,TRANSVEC(r0) /* Set new trans. fault handler */ ! 908: movab _Prvis,PRIVSVEC(r0) /* Set new priv. ins. fault handler */ ! 909: moval _FPM_handler,FPMVEC(r0) /* Set now fpm trap handler */ ! 910: mtpr $_pcb0,$0xe /* Init. PCBB to PCB_0 */ ! 911: ! 912: movab _pcb0,r0 ! 913: movab ekstack,PCB_KSP(r0) /* Init. PCB_KSP */ ! 914: movab eustack,PCB_USP(r0) /* Init. PCB_USP */ ! 915: mfpr $P0BR,PCB_P0BR(r0) /* " PCB_P0BR */ ! 916: mfpr $P0LR,PCB_P0LR(r0) /* " PCB_P0LR */ ! 917: movl $0x001f000,PCB_PSL(r0) /* Set PCB_PSL : Kernel Mode */ ! 918: ldpctx /* load the process context */ ! 919: ! 920: mtpr $1,$PACC /* purge the code cache */ ! 921: movl $1,_Codek ! 922: mtpr _Codek,$CCK /* Set code cache key */ ! 923: ! 924: callf $4,_monitor /* go execute the test */ ! 925: ! 926: ! 927: #include "fault_handlers.s" /* put spectial handlers here */ ! 928: ! 929: ! 930: # /**************************************************************************** ! 931: # * STACK AREA ! 932: # ****************************************************************************/ ! 933: ! 934: .globl _Esys /* end of systems only code */ ! 935: _Esys: ! 936: .space NBPG ! 937: ! 938: .globl _Ustack /* basic stack space */ ! 939: _Ustack: ! 940: .space (2*NBPG)-4 /* 2 pages */ ! 941: .globl eustack ! 942: eustack: ! 943: .long 0 /* initial user stack ptr */ ! 944: ! 945: .globl U_area ! 946: U_area: ! 947:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.