1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
|
/**************************************
*
* copyright @ Motorola, 1999
*
**************************************/
#include <ppc_asm.tmpl>
#include <ppc_defs.h>
#include <asm/processor.h>
/*********************************************
* function: CoreExtIntEnable
*
* description: Enable 603e core external interrupt
*
* note: mtmsr is context-synchronization
**********************************************/
.text
.align 2
.global CoreExtIntEnable
CoreExtIntEnable:
mfmsr r3
ori r3,r3,0x8000 /* enable external interrupt */
mtmsr r3
bclr 20, 0
/*******************************************
* function: CoreExtIntDisable
*
* description: Disable 603e core external interrupt
*
* note:
*******************************************/
.text
.align 2
.global CoreExtIntDisable
CoreExtIntDisable:
mfmsr r4
xor r3,r3,r3
or r3,r3,r4
andis. r4,r4,0xffff
andi. r3,r3,0x7fff /* disable external interrupt */
or r3,r3,r4
mtmsr r3
bclr 20, 0
/*********************************************************
* function: epicEOI
*
* description: signal the EOI and restore machine status
* Input: r3 - value of eumbbar
* Output: r3 - value of eumbbar
* r4 - ISR vector value
* note:
********************************************************/
.text
.align 2
.global epicEOI
epicEOI:
lis r5,0x0006 /* Build End Of Interrupt Register offset */
ori r5,r5,0x00b0
xor r7,r7,r7 /* Clear r7 */
stwbrx r7,r5,r3 /* Save r7, writing to this register will
* intidate the end of processing the
* highest interrupt.
*/
sync
/* ---RESTORE MACHINE STATE */
mfmsr r13 /* Clear Recoverable Interrupt bit in MSR */
or r7,r7,r13
andis. r7,r7,0xffff
andi. r13,r13,0x7ffd /* (and disable interrupts) */
or r13,r13,r7
mtmsr r13
lwz r13,0x1c(r1) /* pull ctr */
mtctr r13
lwz r13,0x18(r1) /* pull xer */
mtctr r13
lwz r13,0x14(r1) /* pull lr */
mtctr r13
lwz r13,0x10(r1) /* Pull SRR1 from stack */
mtspr SRR1,r13 /* Restore SRR1 */
lwz r13,0xc(r1) /* Pull SRR0 from stack */
mtspr SRR0,r13 /* Restore SRR0 */
lwz r13,0x8(r1) /* Pull User stack pointer from stack */
mtspr SPRG1,r13 /* Restore SPRG1 */
lwz r4,0x4(r1) /* vector value */
lwz r3,0x0(r1) /* eumbbar */
sync
addi r1,r1,0x20 /* Deallocate stack */
mtspr SPRG0,r1 /* Save updated Supervisor stack pointer */
mfspr r1,SPRG1 /* Restore User stack pointer */
bclr 20,0
/***********************************************************
* function: exception routine called by exception vector
* at 0x500, external interrupt
*
* description: Kahlua EPIC controller
*
* input: r3 - content of eumbbar
* output: r3 - ISR return value
* r4 - Interrupt vector number
* note:
***********************************************************/
.text
.align 2
.global epic_exception
epic_exception:
/*---SAVE MACHINE STATE TO A STACK */
mtspr SPRG1,r1 /* Save User stack pointer to SPRG1 */
mfspr r1,SPRG0 /* Load Supervisor stack pointer into r1 */
stwu r3,-0x20(r1) /* Push the value of eumbbar onto stack */
mfspr r3,SPRG1 /* Push User stack pointer onto stack */
stw r3,0x8(r1)
mfspr r3,SRR0 /* Push SRR0 onto stack */
stw r1,0xc(r1)
mfspr r3,SRR1 /* Push SRR1 onto stack */
stw r3,0x10(r1)
mflr r3
stw r3,0x14(r1) /* Push LR */
mfxer r3
stw r3,0x18(r1) /* Push Xer */
mfctr r3
stw r3,0x1c(r1) /* Push CTR */
mtspr SPRG0,r1 /* Save updated Supervisor stack pointer
* value to SPRG0
*/
mfmsr r3
ori r3,r3,0x0002 /* Set Recoverable Interrupt bit in MSR */
mtmsr r3
/* ---READ IN THE EUMBAR REGISTER */
lwz r6,0(r1) /* this is eumbbar */
sync
/* ---READ EPIC REGISTER: PROCESSOR INTERRUPT ACKNOWLEDGE REGISTER */
lis r5,0x0006 /* Build Interrupt Acknowledge Register
* offset
*/
ori r5,r5,0x00a0
lwbrx r7,r5,r6 /* Load interrupt vector into r7 */
sync
/* --MASK OFF ALL BITS EXCEPT THE VECTOR */
xor r3,r3,r3
xor r4,r4,r4
or r3, r3, r6 /* eumbbar in r3 */
andi. r4,r7,0x00ff /* Mask off bits, vector in r4 */
stw r4,0x04(r1) /* save the vector value */
lis r5,epicISR@ha
ori r5,r5,epicISR@l
mtlr r5
blrl
xor r30,r30,r30
or r30,r30,r3 /* save the r3 which containts the return value from epicISR */
/* ---READ IN THE EUMBAR REGISTER */
lwz r3,0(r1)
sync
lis r5,epicEOI@ha
ori r5,r5,epicEOI@l
mtlr r5
blrl
xor r3,r3,r3
or r3,r3,r30 /* restore the ISR return value */
bclr 20,0
|