|
|
1.1 root 1: #
2: # *software interrupt event test
3: #
4: # R0 = error code
5: # 1 - REI fell thru
6: # R8 = PC of REI instruction
7: # 2 - REI did not take pending software int. #2 in SISR
8: # R1 = current PSL after REI; R2 = SISR
9: # R8 = PC of REI instruction
10: # 3 - MTPR to SIRR did not cause initerrupt
11: # R1 = current PSL ; R2 = SISR
12: # R8 = PC of MTPR instruction
13: # 4 - Unexpected software interrupt
14: # R1 = current PSL ; R2 = PC pushed on the stack
15: # R3 = PSL pushed on the stack
16: # R4 = SISR
17: # 5 - Error in PC pushed on the stack after software interrupt
18: # R1 = Actual PC ; R2 = Expected PC
19: # R8 = PC of REI that caused software interrupt.
20: # 6 - PSL is not saved on the stack after software interrupt
21: # R8 = PC of REI that caused software interrupt.
22: # 7 - Too many paramters pushed on the stack
23: # R8 = PC of REI that caused software interrupt.
24: # 8 - Cuurent PSL_IPL is not set to expected value after int.
25: # R1 = PSL after taking interrupt.
26: # R2 = Expected PSL_IPL
27: #
28: .globl _sftint_evt
29: _sftint_evt:
30: .word 0x1ff
31: mtpr $31,$IPL
32: movab (sp),_savvec0 /* Save current SP */
33: mtpr _savvec0,$ISP
34: movl _scb+SIVEC1-4,_savvec2 /*save vector for soft int #2 */
35: movab _scb+SIVEC1-8,_savvec3 /*save vector for soft int#3 */
36: movab vecvec4,_scb+SIVEC1-4 /*new vector */
37: movab vecvec4,_scb+SIVEC1-8 /*new vector */
38: movl $-1,-(sp) /*marker on SP to be checked */
39: /* after taken interrupt. */
40: movab _pcb0,r1 /* Partialy set PCB0 */
41: mtpr r1,$PCBB
42: movab (sp),_pcb0 /*ksp in pcb0 */
43: movab (sp),_pcb0+4 /*usp in pcb0 */
44:
45: movpsl r1 /*if not kernel mode, then force*/
46: bitl $0x01000000,r1 /*kernel mode */
47: beql 1f
48: movl _scb+PINSTVEC,_savvec3
49: movab forckmd,_scb+PINSTVEC
50: halt /*halt in USER mode to force */
51: /*K mode in psl */
52: .align 2
53: forckmd:
54: addl2 $8,sp /*get rid of trash on the stack */
55: movl _savvec3,_scb+PINSTVEC /*restore vector */
56:
57: 1:
58: movl $-1,r7
59: mtpr $2,$SIRR /* Software request interrupt at IPL 2 */
60: /* current IPL is 31 so SISR is set at 2 */
61: mtpr $3,$IPL /* lower current IPL to 3 */
62: movl $2,r7 /* R7 = flag to be check in int. handler */
63: movpsl r1
64: andl2 $0xffe10000,r1 /* REI to process has IPL #1 */
65: movl r1,-(sp) /* Set up PC,PSL for REI */
66: movab error,r5 /* R5 = Expected PC on SP after interrupt */
67: movl r5,-(sp)
68: movab pc1,r6 /* R6 = return address from exception */
69: movab spc1,r8
70: spc1:
71: rei /* This should take soft int#2 */
72:
73: movl $1,r0
74: jmp *badrtn /* Error : REI fell thru */
75: error:
76: movl $2,r0 /* Error : REI did not take soft int#2 */
77: movpsl r1 /* pending in SISR; R1 = current PSL */
78: mfpr $SISR,r2 /* R2 = SISR */
79: jmp *badrtn
80: pc1:
81: movab eee,r6 /* R6 = address to return from exception */
82: movab exp1,r5 /* R5 = expected address after taken int */
83: movl $3,r7 /* R7 = flag to be check in int. handler */
84: movab spc2,r8
85: spc2:
86: mtpr $3,$SIRR /* At this point ipl = 2, and so we */
87: /* should get int at level #3 */
88: exp1: movl $3,r0 /* Error : MTPR to SIRR did not cause */
89: movpsl r1 /* soft interrupt #3 */
90: mfpr $SISR,r2 /* R2 = SISR, R1 = current PSL */
91: jmp *badrtn
92:
93: .align 2 /* SOFTWARE interrupt #2 handler */
94: vecvec4:
95: cmpl $-1,r7 /* If R7 == -1 then unexpected interrupt */
96: bneq 1f
97: movpsl r1 /* Error : Took int when PSL_IPL was greater */
98: movl (sp)+,r2 /* or equal to the one set by MTPR in SIRR */
99: movl (sp)+,r3 /* R0 = error code, R1 = current PSL */
100: mfpr $SISR,r4 /* R2 = PC on SP , R3 = PSL on SP, R4 = SISR */
101: movl $4,r0
102: jmp *badrtn
103: 1:
104: movl (sp)+,r1 /* R1 = PC from SP */
105: movl r5,r2 /* R2 = expected PC */
106: cmpl r1,r2
107: beql 1f
108: movl $5,r0 /* Error : Actual PC not same as expected */
109: jmp *badrtn
110:
111: 1: movl (sp)+,r1 /* R1 = PSL from SP */
112: cmpl $-1,r1 /* If -1, then it is not PSL */
113: bneq 1f
114: movl $6,r0
115: jmp *badrtn /* Error - PSL not saved on the stack */
116: /* after Soft interrupt; */
117: 1:
118: cmpl $-1,(sp) /* SP should be pointing at the marker at */
119: beql 1f /* this point, otherwise error */
120: movl $7,r0
121: jmp *badrtn /* Too many longwords pushed on the */
122: /* SP after software interrupt */
123: 1:
124: movpsl r1 /* R1 = current PSL after taken interrupt */
125: andl2 $0x001f0000,r1 /* Mask out all other bits except IPL */
126: cmpl $3,r7 /* Soft #3 interrupt? */
127: bneq 1f
128: cmpl $0x00030000,r1 /* Did IPL set to 3 after taken int. ? */
129: beql 2f
130: brb 5f
131: 1: cmpl $0x00020000,r1 /* Did IPL set to 2 after taken int. ? */
132: beql 2f
133: 5: movl $8,r0 /* Error : PSL_IPL not set to expected */
134: movpsl r1 /* value after taking interrupt */
135: movl r7,r2
136: jmp *badrtn
137: 2:
138: movpsl -(sp) /* Set PSL & PC on the stack for return */
139: movl r6,-(sp) /* R6 must have been loaded previously */
140: mtpr $31,$IPL
141: rei
142: halt /* Should never come here */
143:
144:
145: /* Restore original state of SP, PSL & vectors */
146: eee:
147: movl _savvec2,_scb+SIVEC1-4
148: movl _savvec3,_scb+SIVEC1-8
149: mtpr $31,$IPL
150: movl _savvec0,sp
151: ret
152:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.