|
|
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.