|
|
1.1 ! root 1: # ! 2: # reserved operand event test ! 3: # ! 4: # includes mtpr,mfpr,&rei ! 5: # ! 6: # R7 = which instruction is testing ! 7: # 1 - MTPR ! 8: # 2 - MFPR ! 9: # 3 - REI ! 10: # R3 = PC that force fault ! 11: # R0 = error code ! 12: # 1 : expected reserved operand fault didnot happen ! 13: # 2 : error in PC pushed on stack ! 14: # R1 = actual, R2 = expected ! 15: # 3 : error in PSL pushed on stack ! 16: # R1 = actual, R2 = expected ! 17: # 4 : Too many parameters pushed on the stack ! 18: # 5 : REI did not catch bad PC/PSL on the stack ! 19: # ! 20: ! 21: .set N_EXIST_PR,255 ! 22: ! 23: .globl _roprnd_evt ! 24: _roprnd_evt: ! 25: .word 0x1fff ! 26: mtpr $31,$IPL ! 27: movab (sp),_savvec0 /* Save current SP */ ! 28: mtpr _savvec0,$ISP /* Set ISP = current SP */ ! 29: movl _scb+ROVEC,_savvec2 /* Save vector of Resr. oprd fault */ ! 30: movab ropflt1,_scb+ROVEC /* Set new vector */ ! 31: movl $-1,-(sp) /* Push marker on stack */ ! 32: ! 33: movab _pcb0,r1 /* Partially set PCBB */ ! 34: mtpr r1,$PCBB /* Set PCBB to PCB_0 */ ! 35: movab (sp),_pcb0 /* Set PCB_KSP = current SP */ ! 36: movab (sp),_pcb0+4 /* Set PCB_USP = current SP */ ! 37: ! 38: movpsl r1 /* If PSL_MODE != Kernel then */ ! 39: bitl $0x01000000,r1 /* change to Kernel mode by */ ! 40: beql 1f /* executing a privilege inst. */ ! 41: movl _scb+PINSTVEC,_savvec3 /* as HALT */ ! 42: movab tempvec,_scb+PINSTVEC ! 43: halt ! 44: ! 45: .align 2 ! 46: tempvec: ! 47: addl2 $8,sp /* Get rid of trash on the stack */ ! 48: movl _savvec3,_scb+PINSTVEC /* Restore original vector */ ! 49: # ! 50: # We are running in Kernel mode; Interrupt stack ! 51: # MTPR to non existent privileged register */ ! 52: # ! 53: 1: ! 54: movl $0,r11 /* Set flag to be checked in event handler */ ! 55: movab mfprt,r6 /* R6 = return address after exception */ ! 56: movab mtprt,r5 /* R5 = expected PC on stack after fault */ ! 57: movl r5,r3 ! 58: movl $1,r7 /* R7 = 1; testing MTPR */ ! 59: movpsl r4 /* R4 = expected PSL */ ! 60: mtprt: ! 61: mtpr $0,$N_EXIST_PR /* Should cause reserved operand fault !! */ ! 62: movl $1,r0 /* R0 = error code; expected reserved */ ! 63: jmp *badrtn /* operand fault did not happen */ ! 64: ! 65: .align 2 /* Event handler for reserved oprd. fault */ ! 66: ropflt1: ! 67: movl (sp)+,r1 /* R1 = actual PC from stack */ ! 68: movl r5,r2 /* R5 = expected PC */ ! 69: cmpl r1,r2 ! 70: beql 1f ! 71: movl $2,r0 /* R0 = error code; PC saved on stack */ ! 72: jmp *badrtn /* not equal to expexted PC */ ! 73: /* R1 = actual; R2 = expected */ ! 74: ! 75: 1: movl (sp)+,r1 /* R1 = actual PSL from stack */ ! 76: movl r4,r2 /* R2 = expected PSL */ ! 77: cmpl r2,r1 /* Are they the same ? */ ! 78: beql 1f ! 79: movl $3,r0 /* Error in PSL !! */ ! 80: jmp *badrtn ! 81: 1: ! 82: cmpl $1,r11 /* Is fault caused by REI or MTPR ? */ ! 83: bneq 1f /* Skip this part if come here from MTPR */ ! 84: movl (sp)+,r10 /* REI fault : get rid off PC,PSL on the */ ! 85: movl (sp)+,r10 /* stack then check for marker */ ! 86: ! 87: 1: ! 88: cmpl $-1,(sp) /* Is SP pointing at the marker on SP ? */ ! 89: beql 1f ! 90: movl $4,r0 /* If not then error : pushed too many */ ! 91: jmp *badrtn /* parameters on SP after fault .. */ ! 92: ! 93: 1: movpsl r1 /* Get ready to return from fault */ ! 94: movl r1,-(sp) /* Push current PSL on stack */ ! 95: movl r6,-(sp) /* R6 = addr to return to */ ! 96: rei ! 97: halt /* Should never come here !!!! */ ! 98: # ! 99: # ! 100: # MFPR from non existent privileged register ! 101: # ! 102: mfprt: ! 103: movl $2,r7 /* R7 = 2; testing MFPR */ ! 104: movab reit,r6 /* Set R6 = return adddress after fault */ ! 105: movab mfprt0,r5 /* R5 = expected PC on stack */ ! 106: movl r5,r3 ! 107: movpsl r4 /* R4 = expected PSL */ ! 108: mfprt0: ! 109: mfpr $N_EXIST_PR,r10 /* Should cause resr. oprd. fault .. */ ! 110: movl $1,r0 /* Error; expected fault did not happen */ ! 111: jmp *badrtn ! 112: # ! 113: # REI with illegal PSL on the stack : PSL_IS on and PSL_MODE is User ! 114: # ! 115: reit: ! 116: movl $3,r7 /* R7 = 3; testing REI */ ! 117: movab reit1,r6 /* R6 = return address after exception */ ! 118: movab reita,r5 /* R5 = expected PC on SP */ ! 119: movl r5,r3 ! 120: movl $0x05000000,r1 /* Push PSL on stack; PSL_IS on and */ ! 121: movl r1,-(sp) /* and PSL_MODE = User */ ! 122: movab reierr,-(sp) /* PC if REI doesn't catch bad PSL */ ! 123: movl $1,r11 /* Set flag to be checked in event handler */ ! 124: reita: rei /* should cause reserved opr. fault */ ! 125: movl $1,r0 /* Error; expected fault did not happen */ ! 126: jmp *badrtn /* Should never come here .. */ ! 127: # ! 128: # REI with illegal PSL on the stack : PSL_IS on and PSL_IPL = 0 ! 129: # ! 130: reit1: ! 131: movab reit2,r6 /* R6 = return address after exception */ ! 132: movab reit1a,r5 /* R5 = expected PC on stack */ ! 133: movl r5,r3 ! 134: movl $0x04000000,r1 /* Set PSL, PC on stack for REI */ ! 135: movl r1,-(sp) ! 136: movab reierr,-(sp) /* PC if REI doesn't catch bad PSL */ ! 137: reit1a: rei /* Should cause fault */ ! 138: movl $1,r0 /* Error; expected fault did not happen */ ! 139: jmp *badrtn /* Should never come here .. */ ! 140: # ! 141: # REI with illegal PSL on the stack : PSL_IS off,PSL_IPL > 0 ! 142: # and PSL_MODE = User ! 143: # ! 144: reit2: ! 145: movab reit3,r6 /* R6 = return address after exception */ ! 146: movab reit2a,r5 /* R5 = expected PC on stack */ ! 147: movl r5,r3 ! 148: movl $0x010f0000,r1 /* Set PSL, PC on stack for REI */ ! 149: movl r1,-(sp) ! 150: movab reierr,-(sp) /* PC if REI doesn't catch bad PSl */ ! 151: reit2a: rei /* Should cause fault */ ! 152: movl $1,r0 /* Error; expected fault did not happen */ ! 153: jmp *badrtn /* Should never come here .. */ ! 154: ! 155: reit3: ! 156: movpsl r1 ! 157: bitl $0x04000000,r1 ! 158: beql 1f /* If IS is ON, turn it off by */ ! 159: andl2 $0xfbffffff,r1 /* using REI */ ! 160: movl r1,-(sp) ! 161: movab 1f,-(sp) ! 162: rei ! 163: jmp *badrtn ! 164: ! 165: # ! 166: # REI with illegal PSL on the stack : PSL_IS on; Try to switch ! 167: # to Interrupt stack by REI ! 168: # ! 169: 1: /* Current PSL_IS is OFF */ ! 170: movab reit4,r6 /* R6 = return address after exception */ ! 171: movab reit3a,r5 /* R5 = expected PC on stack */ ! 172: movl r5,r3 ! 173: movl $0x04000000,r1 /* Set PSL, PC on stack for REI */ ! 174: movl r1,-(sp) ! 175: movab reierr,-(sp) /* PC if REI doesn't catch bad PSL */ ! 176: movpsl r4 ! 177: reit3a: rei /* Should cause fault */ ! 178: movl $1,r0 /* Error; expected fault did not happen */ ! 179: jmp *badrtn /* Should never come here .. */ ! 180: # ! 181: # REI with illegal PSL on the stack : Current PSL_IPL is smaller ! 182: # than PSL_IPL on stack ! 183: # ! 184: reit4: ! 185: movab reit5,r6 /* R6 = return address after exception */ ! 186: movab reit4a,r5 /* R5 = expected PC on stack */ ! 187: movl r5,r3 ! 188: mtpr $0x10,$IPL /* Set current PSL_IPL = 0x10 */ ! 189: movpsl r4 ! 190: movl $0x00180001,r1 /* Set PSL_IPL (on stack) to 0x18 */ ! 191: movl r1,-(sp) ! 192: movab reierr,-(sp) /* PC if REI doesn't catch bad PSL */ ! 193: reit4a: rei /* Should cause fault */ ! 194: movl $1,r0 /* Error; expected fault did not happen */ ! 195: jmp *badrtn /* Should never come here .. */ ! 196: # ! 197: # ! 198: reit5: ! 199: movl $0x01000000,-(sp) /* Set up PSL, PC to use REI to */ ! 200: movab usrmd,-(sp) /* switch to User mode */ ! 201: rei ! 202: jmp *badrtn ! 203: # ! 204: # REI with illegal PSL on the stack : Try to switch from USER to ! 205: # KERNEL mode by REI ! 206: # ! 207: usrmd: /* We now running in User mode */ ! 208: movab reit6,r6 /* R6 = return address after exception */ ! 209: movab reit5a,r5 /* R5 = expected PC on stack */ ! 210: movl r5,r3 ! 211: movl $0x00000000,r1 /* Set up PSL, PC for REI */ ! 212: movl r1,-(sp) ! 213: movab reierr,-(sp) /* PC if REI doesn't catch bad PSL */ ! 214: clrl r11 /* Clear flag */ ! 215: movpsl r4 ! 216: reit5a: rei /* Should cause fault */ ! 217: movl $1,r0 ! 218: jmp *badrtn /* Should never come here .. */ ! 219: # ! 220: # ! 221: # ! 222: reit6: ! 223: movl _savvec3,_scb+PINSTVEC /* Restore vectors */ ! 224: movl _savvec2,_scb+ROVEC ! 225: pushl $0 /* Push dummy PSL,PC on stack */ ! 226: pushl $0 ! 227: svpctx /* Switch to ISP */ ! 228: btisp: ! 229: mtpr $31,$IPL /* Reset IPL to HIGH */ ! 230: movl _savvec0,sp /* Restore SP */ ! 231: ret ! 232: # ! 233: # ! 234: # ! 235: reierr: ! 236: movl $5,r0 ! 237: jmp *badrtn /* REI error - REI did not catch illegal PSL*/ ! 238: /* on the stack !*/
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.