|
|
1.1 root 1: #
2: # privileged instructions event test
3: #
4: #
5: # halt ,ldpxtx,svpctx,mtpr,mfpr in user mode
6: #
7: # *** WARNING :
8: # halt instruction in user mode better create privileged instr
9: # fault, otherwise expect unpredictable results.
10: #
11: # R7 = PC that failed
12: # R0 = error code
13: # 1 : Failed to REI to user
14: # 2 : Expected fault didnot happen
15: # 3 : Error in PC pushed on the stack
16: # R1 = actual, R2 = expected
17: # 4 : Error in PSL pushed on the stack
18: # R1 = actual, R2 = expected
19: # 5 : Error in current PSL after taking fault
20: # R1 = actual, R2 = expected
21: #
22:
23:
24: .globl _prv_evt
25: _prv_evt:
26: .word 0x1fff
27: mtpr $31,$IPL /* Set IPL to HIGH */
28: movab (sp),_savvec0 /* Save current SP */
29: mtpr _savvec0,$ISP /* Set ISP to current SP */
30: movl _scb+PINSTVEC,_savvec2 /* Save priv. inst. fault vector */
31: movab vecvec4,_scb+PINSTVEC /* Sew new vector */
32: #
33: # go to User mode
34: #
35: umode:
36: movl $0x01000000,-(sp) /* Set PSL on stack; User mode */
37: movab ldctx,-(sp) /* Set PC for REI */
38: movab _pcb0,r1
39: mtpr r1,$PCBB /* Set PCBB to PCB_0 */
40: addl3 $16,_savvec0,r1
41: movl r1,_pcb0 /* Set PCB_KSP to SP + 16 */
42: addl2 $16,r1
43: movl r1,_pcb0+4 /* Set PCB_USP to SP + 32 */
44: clrl r5 /* R5 used as flags to be */
45: /* checked in event handler */
46: rei /* REI to User mode */
47: movl $1,r0 /* REI failed ! R0 = error code */
48: jmp *badrtn
49: #
50: # We are now in User mode ; try to execute LDPCTX in User mode
51: #
52: ldctx:
53: movab svctx,rtnxt /* Set return address for fault handler */
54: movab ldpc,exp_pc /* Set expected PC */
55: movl exp_pc,r7
56: movpsl r3 /* R3 = current PSL */
57: ldpc: ldpctx /* Should cause priv. inst. fault */
58: incl r5 /* Should never come here; set flag */
59: movl $2,r0 /* Expected fault did not happen !! */
60: jmp *badrtn /* R0 = error code */
61: #
62: # Come back here from event handler
63: # still in User mode; try to execute SVPCTX in User mode
64: #
65: svctx:
66: movab prvmt,rtnxt /* Set return address for fault handler */
67: movab svpc,exp_pc /* Set expected PC */
68: movl exp_pc,r7
69: movpsl r3 /* R3 = current PSL */
70: svpc: ldpctx /* Should cause priv. inst. fault */
71: incl r5 /* Should never come here; set flag */
72: movl $2,r0 /* Expected fault did not happen !! */
73: jmp *badrtn /* R0 = error code */
74: #
75: # Come back here from event handler
76: # still in User mode; try to execute MTPR in User mode
77: #
78: prvmt:
79: movab prvmf,rtnxt /* Set return address for fault handler */
80: movab pmtpr,exp_pc /* Set expected PC */
81: movl exp_pc,r7
82: movpsl r3 /* R3 = current PSL */
83: pmtpr: mtpr _pcb0,$PCBB /* Try MTPR instruction */
84: incl r5 /* Should never come here; set flag */
85: movl $2,r0 /* Expected fault did not happen !! */
86: jmp *badrtn /* R0 = error code */
87: #
88: # Come back here from event handler
89: # still in User mode; try to execute MFPR in User mode
90: #
91: prvmf:
92: movab prvhlt,rtnxt /* Set return address for fault handler */
93: movab pmfpr,exp_pc /* Set expected PC */
94: movl exp_pc,r7
95: movpsl r3
96: pmfpr: mfpr $PCBB,r8 /* Try MFPR */
97: incl r5 /* Should never come here; set flag */
98: movl $2,r0 /* Expected fault did not happen !! */
99: jmp *badrtn /* R0 = error code */
100: #
101: # Come back here from event handler
102: # still in User mode; try to execute HALT in User mode
103: #
104: prvhlt:
105: clrl rtnxt /* Last test : return */
106: movab phlt,exp_pc /* Set expected PC */
107: movl exp_pc,r7
108: movpsl r3
109: phlt:
110: svpctx
111: # jmp *badrtn /* Try HALT : Can not test this now */
112: incl r5 /* Should never come here; set flag */
113: movl $2,r0 /* Expected fault did not happen !! */
114: jmp *badrtn /* R0 = error code */
115: #
116: # Event handler for privilege inst. fault
117: #
118: .align 2
119: vecvec4:
120: cmpl $0,r5 /* Check flag; no fault in User mode ? */
121: beql 1f /* If yes fall thru else skip */
122: jmp *badrtn /* Error : no fault in User mode */
123: #
124: # Check parameters pushed on stack
125: #
126: 1:
127: movl (sp)+,r1 /* R1 = actual PC pop from stack */
128: movl exp_pc,r2 /* R2 = expected PC */
129: cmpl r1,r2
130: beql 1f
131: movl $3,r0 /* R0 = error code; wrong PC on stack */
132: jmp *badrtn /* R1 = actual; R2 = expected */
133:
134: 1: movl (sp)+,r1 /* R1 = actual PSL pop from stack */
135: andl2 $0xffffff00,r1 /* mask out PSW flags */
136: movl $0x01000000,r2 /* R2 = expected PSl */
137: cmpl r1,r2
138: beql 1f
139: movl $4,r0 /* R0 = error code; wrong PSL on stack */
140: jmp *badrtn /* R1= actual; R2 = expected */
141:
142: 1: movpsl r1 /* R1 = current PSL (afer fault) */
143: andl2 $0x051f0000,r1 /* Mask out PSW flags */
144: movl $0,r2 /* R2 = expected current PSL */
145: cmpl r1,r2
146: beql nxt
147: movl $5,r0 /* R0 = error code; wrong current PSL */
148: jmp *badrtn /* R1 = actual; R2 = expected */
149: #
150: # All checked out; get ready to return to test or monitor
151: #
152: nxt:
153: movl rtnxt,r9 /* R9 = return address */
154: cmpl $0,r9 /* last test ? */
155: jeql lastst /* If yes then get out */
156: movl $0x01000000,-(sp) /* Push PSL, PC on stack for REI */
157: movl r9,-(sp) /* to return */
158: rei
159: halt /* Should never come here */
160:
161: lastst: /* All done,return to monitor */
162: movl _savvec2,_scb+PINSTVEC
163: mtpr _savvec0,$ISP
164: pushl $0 /* Push dummy PC, PSL on stack */
165: pushl $0 /* We are now still on Kernel stack */
166: mtpr $31,$IPL
167: svpctx /* This will switch back to ISP */
168: nxtpc:
169: ret
170:
171: .align 2
172: rtnxt: .long 0 /* Contain return address from fault handler */
173: exp_pc: .long 0 /* Contain expected PC to be checked in fault handler */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.