1 | /*
|
---|
2 | * TOPPERS/JSP Kernel
|
---|
3 | * Toyohashi Open Platform for Embedded Real-Time Systems/
|
---|
4 | * Just Standard Profile Kernel
|
---|
5 | *
|
---|
6 | * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
|
---|
7 | * Toyohashi Univ. of Technology, JAPAN
|
---|
8 | * Copyright (C) 2000-2003 by Industrial Technology Institute,
|
---|
9 | * Miyagi Prefectural Government, JAPAN
|
---|
10 | *
|
---|
11 | * ä¸è¨è使¨©è
|
---|
12 | ã¯ï¼ä»¥ä¸ã® (1)ã(4) ã®æ¡ä»¶ãï¼Free Software Foundation
|
---|
13 | * ã«ãã£ã¦å
|
---|
14 | ¬è¡¨ããã¦ãã GNU General Public License ã® Version 2 ã«è¨
|
---|
15 | * è¿°ããã¦ããæ¡ä»¶ãæºããå ´åã«éãï¼æ¬ã½ããã¦ã§ã¢ï¼æ¬ã½ããã¦ã§ã¢
|
---|
16 | * ãæ¹å¤ãããã®ãå«ãï¼ä»¥ä¸åãï¼ã使ç¨ã»è¤è£½ã»æ¹å¤ã»åé
|
---|
17 | å¸ï¼ä»¥ä¸ï¼
|
---|
18 | * å©ç¨ã¨å¼ã¶ï¼ãããã¨ãç¡åã§è¨±è«¾ããï¼
|
---|
19 | * (1) æ¬ã½ããã¦ã§ã¢ãã½ã¼ã¹ã³ã¼ãã®å½¢ã§å©ç¨ããå ´åã«ã¯ï¼ä¸è¨ã®èä½
|
---|
20 | * 権表示ï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãï¼ãã®ã¾ã¾ã®å½¢ã§ã½ã¼
|
---|
21 | * ã¹ã³ã¼ãä¸ã«å«ã¾ãã¦ãããã¨ï¼
|
---|
22 | * (2) æ¬ã½ããã¦ã§ã¢ãï¼ã©ã¤ãã©ãªå½¢å¼ãªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿
|
---|
23 | * ç¨ã§ããå½¢ã§åé
|
---|
24 | å¸ããå ´åã«ã¯ï¼åé
|
---|
25 | å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨
|
---|
26 | * è
|
---|
27 | ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®è使¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨
|
---|
28 | * ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼
|
---|
29 | * (3) æ¬ã½ããã¦ã§ã¢ãï¼æ©å¨ã«çµã¿è¾¼ããªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿
|
---|
30 | * ç¨ã§ããªãå½¢ã§åé
|
---|
31 | å¸ããå ´åã«ã¯ï¼æ¬¡ã®ããããã®æ¡ä»¶ãæºããã
|
---|
32 | * ã¨ï¼
|
---|
33 | * (a) åé
|
---|
34 | å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨è
|
---|
35 | ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®è
|
---|
36 | * 使¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼
|
---|
37 | * (b) åé
|
---|
38 | å¸ã®å½¢æ
|
---|
39 | ãï¼å¥ã«å®ããæ¹æ³ã«ãã£ã¦ï¼TOPPERSããã¸ã§ã¯ãã«
|
---|
40 | * å ±åãããã¨ï¼
|
---|
41 | * (4) æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ
|
---|
42 | * 害ãããï¼ä¸è¨è使¨©è
|
---|
43 | ããã³TOPPERSããã¸ã§ã¯ããå
|
---|
44 | 責ãããã¨ï¼
|
---|
45 | *
|
---|
46 | * æ¬ã½ããã¦ã§ã¢ã¯ï¼ç¡ä¿è¨¼ã§æä¾ããã¦ãããã®ã§ããï¼ä¸è¨è使¨©è
|
---|
47 | ã
|
---|
48 | * ãã³TOPPERSããã¸ã§ã¯ãã¯ï¼æ¬ã½ããã¦ã§ã¢ã«é¢ãã¦ï¼ãã®é©ç¨å¯è½æ§ã
|
---|
49 | * å«ãã¦ï¼ãããªãä¿è¨¼ãè¡ããªãï¼ã¾ãï¼æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´
|
---|
50 | * æ¥çã¾ãã¯éæ¥çã«çãããããªãæå®³ã«é¢ãã¦ãï¼ãã®è²¬ä»»ãè² ããªãï¼
|
---|
51 | */
|
---|
52 |
|
---|
53 | #define _MACRO_ONLY
|
---|
54 |
|
---|
55 | #include "jsp_kernel.h"
|
---|
56 | #include "offset.h"
|
---|
57 |
|
---|
58 | .section .text
|
---|
59 | .align 2
|
---|
60 |
|
---|
61 | .set noat
|
---|
62 | /* atã¬ã¸ã¹ã¿ãå©ç¨ããã¨ãã«ã¯ã¼ãã³ã°ãåºåããªãããæå® */
|
---|
63 | .set noreorder
|
---|
64 |
|
---|
65 | /*
|
---|
66 | * ä¾å¤/å²ãè¾¼ã¿åºå
|
---|
67 | ¥å£å¦çã«ã¼ãã³ï¼ä¸è¬ä¾å¤ï¼
|
---|
68 | *
|
---|
69 | * 仿§ï¼
|
---|
70 | * ã»CPUä¾å¤ãã³ãã©ã¯ãéã¿ã¹ã¯ã³ã³ããã¹ãã§å®è¡ããã
|
---|
71 | * ã»k0 ã¬ã¸ã¹ã¿ããå²è¾¼ã¿ï¼ä¾å¤ãã¹ãã«ã¦ã³ã¿ã¨ãã¦ä½¿ç¨ããã
|
---|
72 | * ã»reqflg ããã§ãã¯ããåã«å²è¾¼ã¿ãç¦æ¢ããªãã¨ãreqflg ããã§ãã¯å¾ã«èµ·åã
|
---|
73 | * ããå²è¾¼ã¿ãã³ãã©å
|
---|
74 | ã§ãã£ã¹ããããè¦æ±ãããå ´åã«ãã£ã¹ããããããªãã
|
---|
75 | * ã»å²è¾¼ã¿è¨±å¯ï¼ä¸è¨±å¯ã®å¦çã¯ãEXLããããç¨ãã¦è¡ãã
|
---|
76 | * ããã¯ãå¼åºå
|
---|
77 | ã®ã³ã³ããã¹ãã® CPUããã¯ç¶æ
|
---|
78 | ãä¿åããããã§ããã
|
---|
79 | * ãã ããå
|
---|
80 | ±éé¨ã«å¦çãç§»è¡ããå ´åã«ã¯IEããããç¨ãã¦ãå²è¾¼ã¿è¨±å¯ï¼ä¸è¨±å¯
|
---|
81 | * ãå®ç¾ããå¿
|
---|
82 | è¦ãããããã«ãIEãããã«ããå²è¾¼ã¿è¨±å¯ï¼ä¸è¨±å¯ã«å¤æ´ãã¦ãã
|
---|
83 | * äºã«æ³¨æã
|
---|
84 | * ï¼ä¾ï¼é
|
---|
85 | å»¶ãã£ã¹ãããã®å¦çã«å
|
---|
86 | ¥ãç´åãã¿ã¹ã¯ä¾å¤å¦çãå¼åºãç´åï¼
|
---|
87 | *
|
---|
88 | * Cè¨èªã«ã¼ãã³ã§long longåã使ãå ´åã¯ã¬ã¸ã¹ã¿ã®å¾
|
---|
89 | é¿ï¼å¾©å
|
---|
90 | ãdouble wordã§è¡
|
---|
91 | * ãã¹ãã ãã使ç¨é »åº¦ãä½ãã®ã¨ãåºå
|
---|
92 | ¥å£å¦çã®ãªã¼ãã¼ããããèãã¦ãwordã§å¾
|
---|
93 |
|
---|
94 | * é¿ï¼å¾©å
|
---|
95 | ãè¡ã£ã¦ãããå°æ¥çã«ã¯å¾
|
---|
96 | é¿ãããã¼ã¿ãµã¤ãºãã¿ã¹ã¯å±æ§ã§æå®ã§ãã
|
---|
97 | * ããã«ããäºå®
|
---|
98 | */
|
---|
99 |
|
---|
100 | .global general_exception
|
---|
101 | .global join_interrupt_and_exception
|
---|
102 | /* 颿°å¼åº(proc_interrupt_sys)æã«å¿
|
---|
103 | è¦ */
|
---|
104 |
|
---|
105 | general_exception:
|
---|
106 | addi sp, sp, -25*4
|
---|
107 | sw sp, 0*4(sp) /* EXCSTACKæ§é ä½ç¨(cpu_experr颿°ç¨) */
|
---|
108 | sw at, 1*4(sp)
|
---|
109 | sw v0, 2*4(sp)
|
---|
110 | sw v1, 3*4(sp)
|
---|
111 | sw a0, 4*4(sp)
|
---|
112 | sw a1, 5*4(sp)
|
---|
113 | sw a2, 6*4(sp)
|
---|
114 | sw a3, 7*4(sp)
|
---|
115 | sw t0, 8*4(sp)
|
---|
116 | sw t1, 9*4(sp)
|
---|
117 | sw t2, 10*4(sp)
|
---|
118 | sw t3, 11*4(sp)
|
---|
119 | sw t4, 12*4(sp)
|
---|
120 | sw t5, 13*4(sp)
|
---|
121 | sw t6, 14*4(sp)
|
---|
122 | sw t7, 15*4(sp)
|
---|
123 | sw t8, 16*4(sp)
|
---|
124 | sw t9, 17*4(sp)
|
---|
125 | sw gp, 18*4(sp)
|
---|
126 | sw fp, 19*4(sp)
|
---|
127 | sw ra, 20*4(sp)
|
---|
128 |
|
---|
129 | mfc0 a1, Status /* a1 -> ä¾å¤å¦çã§ä½¿ã */
|
---|
130 | mfc0 t1, EPC
|
---|
131 |
|
---|
132 | sw a1, 21*4(sp) /* Status */
|
---|
133 | sw t1, 22*4(sp) /* EPC */
|
---|
134 |
|
---|
135 | mfhi t2 /* ä¹é¤ç®ã¬ã¸ã¹ã¿ HI ã®å¾
|
---|
136 | é¿ */
|
---|
137 | mflo t3 /* ä¹é¤ç®ã¬ã¸ã¹ã¿ LO ã®å¾
|
---|
138 | é¿ */
|
---|
139 |
|
---|
140 | sw t2, 23*4(sp) /* HI */
|
---|
141 | sw t3, 24*4(sp) /* LO */
|
---|
142 |
|
---|
143 | move a0, sp /* ä¾å¤ãã³ãã©ã®å¼æ°è¨å® */
|
---|
144 | /* 弿°ã¯ãä¾å¤çºçæã®ãã¼ã¿ãéé¿ããã¹ã¿ãã¯é åã¸ã®ãã¤ã³ã¿
|
---|
145 | å²è¾¼ã¿ã³ã³ããã¼ã©ã®ãã¼ã¿ãå«ããã¨è¤éã«ãªãããã
|
---|
146 | 対象ã¯MIPS3ã³ã¢ã®ã¬ã¸ã¹ã¿é¨åã®ã¿ã¨ããã */
|
---|
147 |
|
---|
148 | PUSH_ICU_IPM /* å²è¾¼ã¿ã³ã³ããã¼ã©ã®å²è¾¼ã¿ãã¹ã¯ã®
|
---|
149 | å¾
|
---|
150 | é¿ãã¯ã(ã·ã¹ãã ä¾åé¨ã§å®ç¾©) */
|
---|
151 |
|
---|
152 | bgtz k0, multipul_exception /* åæ®µã®ä¾å¤ã¨å¤éä¾å¤ã®å¤å¥ */
|
---|
153 | addi k0, k0, 1 /* ãã¹ãã«ã¦ã³ã¿ã®ã¤ã³ã¯ãªã¡ã³ã */
|
---|
154 |
|
---|
155 | /* åæ®µã®ä¾å¤ã®å ´å */
|
---|
156 | first_exception:
|
---|
157 | la t3, _stack_top /* _stack_top ã¯ãã·ã¹ãã ä¾åé¨
|
---|
158 | (ãªã³ã«ã¹ã¯ãªããæ¨å¥¨)å®ç¾© */
|
---|
159 | /* ã¹ã¿ãã¯ãã¤ã³ã¿ã®æ¸ç®(t3=t3-4)ã¯ã
|
---|
160 | _stack_top è¨å®æã«è¡ã£ã¦ããã®ã§ã
|
---|
161 | ããã§ã¯ä¸è¦ */
|
---|
162 | sw sp, (t3) /* ã¿ã¹ã¯ã¹ã¿ãã¯ãã¤ã³ã¿ã®ä¿å */
|
---|
163 | move sp, t3 /* ã¹ã¿ãã¯åãæ¿ã */
|
---|
164 |
|
---|
165 | jal proc_interrupt_and_exception /* å²è¾¼ã¿ã¨ä¾å¤ã®å¤å¥å¦ç㸠*/
|
---|
166 | nop
|
---|
167 |
|
---|
168 | /* å²è¾¼ã¿ç¦æ¢ã§æ»ã£ã¦ãã */
|
---|
169 | la t2, reqflg
|
---|
170 | lw t3, (t2) /* t3 = reqflg */
|
---|
171 | lw sp, (sp) /* ã¹ã¿ãã¯åãæ¿ã */
|
---|
172 | beq t3, zero, ret_to_task_int /* ãã£ã¹ãããè¦æ±ããªãå ´å */
|
---|
173 | nop
|
---|
174 |
|
---|
175 | j ret_int /* å²è¾¼ã¿ï¼ä¾å¤ã®åºå£å¦ç㸠*/
|
---|
176 | sw zero, (t2) /* reqflg ã®ã¯ãªã¢ */
|
---|
177 |
|
---|
178 | /* å¤éä¾å¤ï¼å¤éå²è¾¼ã¿ï¼ã®å ´å (ä¾å¤ãã³ãã©ã®å¼æ°ã¯æ¢ã« a0 ã«è¨å®æ¸ã¿) */
|
---|
179 | multipul_exception:
|
---|
180 | jal proc_interrupt_and_exception /* å²è¾¼ã¿ã¨ä¾å¤ã®å¤å¥å¦ç㸠*/
|
---|
181 | nop
|
---|
182 |
|
---|
183 | /* ãã£ã¹ãããã£ãå¼ã°ãã«åç´ã«å²è¾¼ã¿å
|
---|
184 | ï¼ä¾å¤çºçå
|
---|
185 | ï¼ã«æ»ãå ´å */
|
---|
186 | ret_to_task_int:
|
---|
187 | POP_ICU_IPM /* å²è¾¼ã¿ã³ã³ããã¼ã©ã®å²è¾¼ã¿ãã¹ã¯ã®
|
---|
188 | 復帰ãã¯ã(ã·ã¹ãã ä¾åé¨ã§å®ç¾©) */
|
---|
189 |
|
---|
190 | lw t0, 23*4(sp) /* HI */
|
---|
191 | lw t1, 24*4(sp) /* LO */
|
---|
192 |
|
---|
193 | mthi t0 /* ä¹é¤ç®ã¬ã¸ã¹ã¿ HI ã®å¾©å
|
---|
194 | */
|
---|
195 | mtlo t1 /* ä¹é¤ç®ã¬ã¸ã¹ã¿ LO ã®å¾©å
|
---|
196 | */
|
---|
197 |
|
---|
198 | /* ä¿çï¼long longåã使ç¨ããå ´å */
|
---|
199 | lw t0, 21*4(sp) /* Status */
|
---|
200 | lw t1, 22*4(sp) /* EPC */
|
---|
201 |
|
---|
202 | lw at, 1*4(sp)
|
---|
203 | lw v0, 2*4(sp)
|
---|
204 | lw v1, 3*4(sp)
|
---|
205 | lw a0, 4*4(sp)
|
---|
206 | lw a1, 5*4(sp)
|
---|
207 | lw a2, 6*4(sp)
|
---|
208 | lw a3, 7*4(sp)
|
---|
209 |
|
---|
210 | /*
|
---|
211 | * å¤éä¾å¤æãªã®ã§ãã¿ã¹ã¯ã¹ã¤ããããªãå ´åãªã®ã§ãã¿ã¹ã¯ã³ã³ããã¹ã
|
---|
212 | * ã®å²è¾¼ã¿ãã¹ã¯ã夿´ããã¦ããå¿é
|
---|
213 | ã¯ãªãã
|
---|
214 | * ï¼ã¹ãã¼ã¿ã¹ã¬ã¸ã¹ã¿ã¯å
|
---|
215 | ã®å¤ããã®ã¾ã¾æ¸ãæ»ãï¼
|
---|
216 | */
|
---|
217 | mtc0 t0, Status
|
---|
218 | mtc0 t1, EPC
|
---|
219 |
|
---|
220 | lw t0, 8*4(sp)
|
---|
221 | lw t1, 9*4(sp)
|
---|
222 | lw t2, 10*4(sp)
|
---|
223 | lw t3, 11*4(sp)
|
---|
224 | lw t4, 12*4(sp)
|
---|
225 | lw t5, 13*4(sp)
|
---|
226 | lw t6, 14*4(sp)
|
---|
227 | lw t7, 15*4(sp)
|
---|
228 | lw t8, 16*4(sp)
|
---|
229 | lw t9, 17*4(sp)
|
---|
230 | lw gp, 18*4(sp)
|
---|
231 | lw fp, 19*4(sp)
|
---|
232 | lw ra, 20*4(sp)
|
---|
233 |
|
---|
234 | addi sp, sp, 25*4 /* ERET å½ä»¤ã¯ãç´å¾ã®å½ä»¤ãå®è¡ããªã
|
---|
235 | ã®ã§é
|
---|
236 | å»¶ã¹ãããã«ã¯å
|
---|
237 | ¥ããããªãã*/
|
---|
238 |
|
---|
239 | eret /* ä¾å¤ããã®å¾©å¸° */
|
---|
240 | nop
|
---|
241 |
|
---|
242 | /*
|
---|
243 | * å²è¾¼ã¿ã¨ä¾å¤ã®å¤å¥å¦ç颿°
|
---|
244 | * 以ä¸ã®ã¬ã¸ã¹ã¿ã«å¤ã代å
|
---|
245 | ¥æ¸ã¿
|
---|
246 | * a0 : ä¾å¤ãã³ãã©ã®å¼æ°, a1 : ã¹ãã¼ã¿ã¹ã¬ã¸ã¹ã¿
|
---|
247 | */
|
---|
248 | proc_interrupt_and_exception:
|
---|
249 | addi sp, sp, -4
|
---|
250 | sw ra, 0(sp)
|
---|
251 |
|
---|
252 | mfc0 a2, Cause
|
---|
253 | andi t2, a2, ExcCode_mask
|
---|
254 | beq t2, zero, proc_interrupt /* å²è¾¼ã¿ã¨ä¾å¤ã®å¤å¥ */
|
---|
255 | /* ããããç´æ¥proc_interrupt_sysã¸é£ã³ããããå±ããªã
|
---|
256 | å¯è½æ§ãããã®ã§ãä¸åº¦proc_interruptã«é£ã¶ã */
|
---|
257 | nop
|
---|
258 |
|
---|
259 | /* å²è¾¼ã¿ä»¥å¤ã®ä¾å¤ã®å¦ç */
|
---|
260 | la t4, exc_table
|
---|
261 | /* a1 = Status */
|
---|
262 | ori t5, a1, SR_EXL
|
---|
263 | xori t5, t5, SR_EXL /* EXLãããã¯ãªã¢ */
|
---|
264 | /* å²è¾¼ã¿ä»¥å¤ã®ä¾å¤ã¯CPUããã¯ç¶æ
|
---|
265 | ã§ãåãä»ããã®ã§ãCPUããã¯
|
---|
266 | ç¶æ
|
---|
267 | ãä¿åããå¿
|
---|
268 | è¦ãããããã®ããIEãããã¯æä½ããã«ãå²ã
|
---|
269 | è¾¼ã¿ç¦æ¢ã»è¨±å¯ã¯EXLããããç¨ãã¦å®ç¾ãã */
|
---|
270 | add t6, t4, t2 /* ä¾å¤ã³ã¼ã対å¿ã¢ãã¬ã¹ã®è¨å® */
|
---|
271 | lw t7, (t6) /* Cè¨èªã«ã¼ãã³ã®å¼åºã¢ãã¬ã¹åå¾ */
|
---|
272 | jalr t7 /* Cè¨èªã«ã¼ãã³å¼ã³åºã */
|
---|
273 | mtc0 t5, Status /* å²è¾¼ã¿è¨±å¯ (EXLããã = 0) */
|
---|
274 |
|
---|
275 | mfc0 t0, Status
|
---|
276 | ori t0, t0, SR_EXL
|
---|
277 | mtc0 t0, Status /* å²è¾¼ã¿ç¦æ¢ (EXLããã = 1) */
|
---|
278 |
|
---|
279 | NOP_FOR_CP0_HAZARD /* CP0ãã¶ã¼ãã®ããã®æé稼ããã¯ã
|
---|
280 | (ãã®ãã¯ãã¯ã·ã¹ãã ä¾åé¨å®ç¾©) */
|
---|
281 |
|
---|
282 | j join_interrupt_and_exception /* ä¾å¤ã»å²è¾¼ã¿ã®åæµå°ç¹ã¸ */
|
---|
283 | nop
|
---|
284 |
|
---|
285 | /* å²è¾¼ã¿ã®å ´åã®å¦ç */
|
---|
286 | proc_interrupt:
|
---|
287 |
|
---|
288 | /*
|
---|
289 | * å²è¾¼ã¿ã³ã³ããã¼ã©ã®å¤æ§æ§ã«å¯¾å¿ãããããå®è£
|
---|
290 | ã¯ã·ã¹ãã ä¾åé¨ã§è¡ãã
|
---|
291 | * å®è£
|
---|
292 | æ¹æ³ã¯ã
|
---|
293 | * ãã¯ãï¼PROC_INTERRUPT_SYSï¼ã¾ãã¯ã颿°å¼åº(proc_interrupt_sys)
|
---|
294 | * ã¨ããã
|
---|
295 | *
|
---|
296 | * ã»å¼åºæã«ã»ããããã¦ãã弿°
|
---|
297 | * a1 : ã¹ãã¼ã¿ã¹ã¬ã¸ã¹ã¿
|
---|
298 | * a2 : åå ã¬ã¸ã¹ã¿
|
---|
299 | *
|
---|
300 | * ã»å®è£
|
---|
301 | æã«ã¯ãraã¬ã¸ã¹ã¿ãç ´å£ãã¦ã¯ãªããªãã
|
---|
302 | *
|
---|
303 | * ã»å®è£
|
---|
304 | ããå
|
---|
305 | ·ä½çãªå¦çã®æµãï¼
|
---|
306 | * 1. å²è¾¼ã¿è¦å ã®å¤å¥
|
---|
307 | * 2. å²è¾¼ã¿ãã¹ã¯ï¼ã³ã¢ãå²è¾¼ã¿ã³ã³ããã¼ã©ï¼ã®è¨å®
|
---|
308 | * 3. å²è¾¼ã¿è¨±å¯
|
---|
309 | * 4. ï¼£è¨èªã«ã¼ãã³ã®å¼åº
|
---|
310 | * 5. å²è¾¼ã¿ç¦æ¢
|
---|
311 | * 6. å²è¾¼ã¿ã³ã³ããã¼ã©ã®å²è¾¼ã¿è¦æ±ã®ã¯ãªã¢
|
---|
312 | * (7. join_interrupt_and_exceptionã«æ»ãã; 颿°å¼åºã®å ´å)
|
---|
313 | */
|
---|
314 |
|
---|
315 | #ifdef PROC_INTERRUPT_SYS
|
---|
316 | PROC_INTERRUPT_SYS
|
---|
317 | #else /* PROC_INTERRUPT_SYS */
|
---|
318 | j proc_interrupt_sys
|
---|
319 | nop
|
---|
320 | #endif /* PROC_INTERRUPT_SYS */
|
---|
321 |
|
---|
322 | /* ä¾å¤ã»å²è¾¼ã¿å¦çã®åæµå°ç¹ */
|
---|
323 | join_interrupt_and_exception:
|
---|
324 | addi k0, k0, -1 /* ãã¹ãã«ã¦ã³ã¿ ãã£ã¯ãªã¡ã³ã */
|
---|
325 | lw ra, (sp) /* ra ã復å
|
---|
326 | */
|
---|
327 | jr ra /* proc_interrupt_and_exeption ã®å¼åºå
|
---|
328 |
|
---|
329 | ã«æ»ã */
|
---|
330 | addi sp, sp, 4
|
---|
331 |
|
---|
332 | /*
|
---|
333 | * å²ãè¾¼ã¿ãã³ãã©/CPUä¾å¤ãã³ãã©åºå£å¦ç
|
---|
334 | *
|
---|
335 | * æ»ãå
|
---|
336 | ãã¿ã¹ã¯ã³ã³ããã¹ãã§reqflgãã»ããããã¦ããå ´åã®ã¿ãããã«ããã
|
---|
337 | * ã»k0 = 0ãå²è¾¼ã¿ç¦æ¢ç¶æ
|
---|
338 | ãæ±ç¨ã¬ã¸ã¹ã¿ãä¿åããç¶æ
|
---|
339 | ã§å¼ã³åºããã¨ã
|
---|
340 | * ã»t1ã«runtskã®å¤ãå
|
---|
341 | ¥ãã¦ããret_int_1ã«ã¸ã£ã³ããããã¨ã
|
---|
342 | */
|
---|
343 |
|
---|
344 | ret_int:
|
---|
345 | POP_ICU_IPM /* å²è¾¼ã¿ã³ã³ããã¼ã©ã®å²è¾¼ã¿ãã¹ã¯ã®
|
---|
346 | 復帰ãã¯ã(ã·ã¹ãã ä¾åé¨ã§å®ç¾©) */
|
---|
347 |
|
---|
348 | lw t1, 21*4(sp) /* Status */
|
---|
349 | ori t1, t1, SR_EXL /* å²è¾¼ã¿å¦çã«å
|
---|
350 | ¥ãã¨ãã®ãCPUããã¯
|
---|
351 | ç¶æ
|
---|
352 | ãä¿æãããã®ã§ãå²è¾¼ã¿ç¦æ¢ã¯
|
---|
353 | EXLããããç¨ãã¦è¡ãã */
|
---|
354 | mtc0 t1, Status /* MIPS3ã³ã¢ã®å²è¾¼ã¿ãã¹ã¯ã®å¾©å¸°
|
---|
355 | + EXLãããã«ããå²è¾¼ã¿ç¦æ¢ */
|
---|
356 |
|
---|
357 | la t0, enadsp
|
---|
358 | la t3, runtsk
|
---|
359 | lw t2, (t0) /* t2 = enadsp */
|
---|
360 | lw t1, (t3) /* t1 = runtsk */
|
---|
361 | beq t2, zero, ret_int_1 /* ãã£ã¹ãããç¦æ¢ãªãã¸ã£ã³ã */
|
---|
362 | nop
|
---|
363 | la t4, schedtsk
|
---|
364 | lw t5, (t4) /* t5 = schedtsk */
|
---|
365 | beq t1, t5, ret_int_1 /* runtsk = schedtsk ãªãã¸ã£ã³ã */
|
---|
366 | nop
|
---|
367 |
|
---|
368 | /* ãã£ã¹ãããã£ãçµç±ããå ´åã®å¦ç (t1 = runtsk ã«æ³¨æ) */
|
---|
369 | /* ãããããå²è¾¼ã¿ç¦æ¢ï¼è¨±å¯ããEXLããããç¨ãã¦å®ç¾ããæ¹æ³ã«å¤æ´ */
|
---|
370 | mfc0 t0, Status
|
---|
371 | ori t0, t0, SR_EXL_IE
|
---|
372 | xori t0, t0, SR_EXL_IE /* lock_cpu ç¸å½ (å²è¾¼ã¿ç¦æ¢)
|
---|
373 | + EXLãããã¯ãªã¢ (å²è¾¼ã¿è¨±å¯) */
|
---|
374 | mtc0 t0, Status
|
---|
375 |
|
---|
376 | addi sp, sp, -8*4 /* ã¹ã¯ã©ããã¬ã¸ã¹ã¿ã®ä¿å */
|
---|
377 | sw s0, 0*4(sp)
|
---|
378 | sw s1, 1*4(sp)
|
---|
379 | sw s2, 2*4(sp)
|
---|
380 | sw s3, 3*4(sp)
|
---|
381 | sw s4, 4*4(sp)
|
---|
382 | sw s5, 5*4(sp)
|
---|
383 | sw s6, 6*4(sp)
|
---|
384 | sw s7, 7*4(sp)
|
---|
385 | /* t1 = runtsk ã«æ³¨æ */
|
---|
386 | sw sp, TCB_sp(t1) /* runtsk->sp = sp
|
---|
387 | (ã¿ã¹ã¯ã¹ã¿ãã¯ãã¤ã³ã¿ã®ä¿å) */
|
---|
388 | la t2, ret_int_r
|
---|
389 |
|
---|
390 | j dispatcher /* ãã£ã¹ãããã£å¼ã³åºã */
|
---|
391 | sw t2, TCB_pc(t1) /* runtsk->pc = ret_int_r
|
---|
392 | (å®è¡åéçªå°ã®ä¿å) */
|
---|
393 |
|
---|
394 | /*
|
---|
395 | * å²è¾¼ã¿ã»ä¾å¤ã®åºå£å¦ç
|
---|
396 | * ã»ãã£ã¹ãããã£å¦çã«ããã¦ãt1 = runtsk ã¨ãªã£ã¦ãããã¨ã«æ³¨æ
|
---|
397 | * ã»ã¹ã¿ãã¯ãã¤ã³ã¿ãè¨å®æ¸ã¿
|
---|
398 | */
|
---|
399 | /* ãã£ã¹ãããã£å¼ã³åºãå¾ã®ã¿ã¹ã¯ã³ã³ããã¹ãããã®åæµå°ç¹ */
|
---|
400 | ret_int_r:
|
---|
401 | lw s0, 0*4(sp) /* ã¹ã¯ã©ããã¬ã¸ã¹ã¿ã®å¾©å
|
---|
402 | */
|
---|
403 | lw s1, 1*4(sp)
|
---|
404 | lw s2, 2*4(sp)
|
---|
405 | lw s3, 3*4(sp)
|
---|
406 | lw s4, 4*4(sp)
|
---|
407 | lw s5, 5*4(sp)
|
---|
408 | lw s6, 6*4(sp)
|
---|
409 | lw s7, 7*4(sp)
|
---|
410 | addi sp, sp, 8*4
|
---|
411 |
|
---|
412 | mfc0 t0, Status
|
---|
413 | ori t0, t0, SR_EXL_IE /* unlock_cpu ç¸å½ (å²è¾¼ã¿è¨±å¯)
|
---|
414 | + EXLãããã»ãã (å²è¾¼ã¿ç¦æ¢) */
|
---|
415 | mtc0 t0, Status
|
---|
416 |
|
---|
417 | /* ãã£ã¹ãããã£ãçµç±ããªãå ´åã®åæµå°ç¹ (t1 = runtsk ã«æ³¨æ) */
|
---|
418 | ret_int_1:
|
---|
419 |
|
---|
420 | /* ã¿ã¹ã¯ä¾å¤å¦çè¦æ±ã®ãã§ã㯠*/
|
---|
421 | lb t2, TCB_enatex(t1)
|
---|
422 | andi t4, t2, TCB_enatex_mask /* t3 = runtsk->enatex */
|
---|
423 | beq t4, zero, ret_int_2 /* ã¿ã¹ã¯ä¾å¤å¦çç¦æ¢ã®æãã¸ã£ã³ã */
|
---|
424 | nop
|
---|
425 |
|
---|
426 | lw t5, TCB_texptn(t1) /* t5 = runtsk->texptn */
|
---|
427 | beq t5, zero, ret_int_2 /* ã¿ã¹ã¯ä¾å¤è¦æ±ãç¡ãæãã¸ã£ã³ã */
|
---|
428 | nop
|
---|
429 |
|
---|
430 | mfc0 t0, Status
|
---|
431 | ori t0, t0, SR_EXL_IE
|
---|
432 | xori t0, t0, SR_EXL_IE /* lock_cpuç¸å½ (å²è¾¼ã¿ç¦æ¢)
|
---|
433 | + EXLãããã¯ãªã¢ (å²è¾¼ã¿è¨±å¯) */
|
---|
434 | mtc0 t0, Status
|
---|
435 |
|
---|
436 | jal call_texrtn /* ã¿ã¹ã¯ä¾å¤å¦çã«ã¼ãã³(ã¿ã¼ã²ããé
|
---|
437 | ä¾åé¨å®ç¾©)ã®å¼ã³åºã */
|
---|
438 | nop
|
---|
439 | /* call_texrtn()(task.c)ã§ã¯ãå®éã®ã¿ã¹ã¯ä¾å¤å¦çã«ã¼ãã³å¼ã³
|
---|
440 | åºãåå¾ã§ãunlock_cpuãlock_cpuå¦çãè¡ã£ã¦ããã®ã§ãç¶æ
|
---|
441 | ã¯
|
---|
442 | ä¿æãããã */
|
---|
443 |
|
---|
444 | mfc0 t0, Status
|
---|
445 | ori t0, t0, SR_EXL_IE /* unlock_cpu ç¸å½ (å²è¾¼ã¿è¨±å¯)
|
---|
446 | + EXLãããã»ãã (å²è¾¼ã¿ç¦æ¢) */
|
---|
447 | mtc0 t0, Status
|
---|
448 | /* ããã¾ã§ããå²è¾¼ã¿ç¦æ¢ï¼è¨±å¯ããEXLããããç¨ãã¦å®ç¾ããæ¹æ³ */
|
---|
449 |
|
---|
450 | ret_int_2:
|
---|
451 | /* ã¬ã¸ã¹ã¿ã®å¾©å¸° (Statusã¬ã¸ã¹ã¿ã¯ãæ¢ã«å¾©å
|
---|
452 | æ¸ã¿) */
|
---|
453 | lw t1, 22*4(sp) /* EPC */
|
---|
454 | mtc0 t1, EPC
|
---|
455 |
|
---|
456 | lw t2, 23*4(sp) /* HI */
|
---|
457 | lw t3, 24*4(sp) /* LO */
|
---|
458 |
|
---|
459 | mthi t2 /* ä¹é¤ç®ã¬ã¸ã¹ã¿ HI ã®å¾©å
|
---|
460 | */
|
---|
461 | mtlo t3 /* ä¹é¤ç®ã¬ã¸ã¹ã¿ LO ã®å¾©å
|
---|
462 | */
|
---|
463 |
|
---|
464 | lw at, 1*4(sp)
|
---|
465 | lw v0, 2*4(sp)
|
---|
466 | lw v1, 3*4(sp)
|
---|
467 | lw a0, 4*4(sp)
|
---|
468 | lw a1, 5*4(sp)
|
---|
469 | lw a2, 6*4(sp)
|
---|
470 | lw a3, 7*4(sp)
|
---|
471 | lw t0, 8*4(sp)
|
---|
472 | lw t1, 9*4(sp)
|
---|
473 | lw t2, 10*4(sp)
|
---|
474 | lw t3, 11*4(sp)
|
---|
475 | lw t4, 12*4(sp)
|
---|
476 | lw t5, 13*4(sp)
|
---|
477 | lw t6, 14*4(sp)
|
---|
478 | lw t7, 15*4(sp)
|
---|
479 | lw t8, 16*4(sp)
|
---|
480 | lw t9, 17*4(sp)
|
---|
481 |
|
---|
482 | lw gp, 18*4(sp)
|
---|
483 | lw fp, 19*4(sp)
|
---|
484 | lw ra, 20*4(sp)
|
---|
485 |
|
---|
486 | addi sp, sp, 25*4
|
---|
487 |
|
---|
488 | eret /* å²è¾¼ã¿/ä¾å¤å¦çããã®å¾©å¸° */
|
---|
489 | nop
|
---|
490 |
|
---|
491 | /*
|
---|
492 | * ã¿ã¹ã¯ãã£ã¹ãããã£
|
---|
493 | * ã»dispatch ã¯ãk0 = 0ãCPUããã¯(å²è¾¼ã¿ç¦æ¢)ç¶æ
|
---|
494 | ã§å¼ã³åºããªããã°ãªããªãã
|
---|
495 | * ã»exit_and_dispatch ã¯ï¼k0 = 0ãCPUããã¯(å²è¾¼ã¿ç¦æ¢)ç¶æ
|
---|
496 | ã§å¼ã³åºãã®ãåå
|
---|
497 | * ããããã«ã¼ãã«èµ·åå¦çã®ããï¼k0 = 1ã§å¼ã³åºããå ´åã«ã対å¿ãã¦ããã
|
---|
498 | */
|
---|
499 |
|
---|
500 | .global dispatch
|
---|
501 | .global exit_and_dispatch
|
---|
502 |
|
---|
503 | /* ã¿ã¹ã¯ãã£ã¹ãããã£ãæç¤ºçã«å¼ã³åºãæ */
|
---|
504 | dispatch:
|
---|
505 | addi sp, sp, -13*4
|
---|
506 | sw at, 1*4(sp) /* ã¹ã¯ã©ããã¬ã¸ã¹ã¿ã®å¾
|
---|
507 | é¿ */
|
---|
508 | sw s0, 2*4(sp)
|
---|
509 | sw s1, 3*4(sp)
|
---|
510 | sw s2, 4*4(sp)
|
---|
511 | sw s3, 5*4(sp)
|
---|
512 | sw s4, 6*4(sp)
|
---|
513 | sw s5, 7*4(sp)
|
---|
514 | sw s6, 8*4(sp)
|
---|
515 | sw s7, 9*4(sp)
|
---|
516 | sw gp, 10*4(sp)
|
---|
517 | sw fp, 11*4(sp)
|
---|
518 | sw ra, 12*4(sp)
|
---|
519 |
|
---|
520 | la t0, runtsk
|
---|
521 | la t2, dispatch_r
|
---|
522 | lw t1, (t0) /* t1 = runtsk */
|
---|
523 | sw sp, TCB_sp(t1) /* runtsk->sp = sp */
|
---|
524 | j dispatcher
|
---|
525 | sw t2, TCB_pc(t1) /* runtsk->pc = dispatch_r */
|
---|
526 |
|
---|
527 | /* ç¾å¨å®è¡ä¸ã®ã³ã³ããã¹ããæ¨ã¦ã¦ãã¿ã¹ã¯ãã£ã¹ãããã£ãå¼ã³åºãæ */
|
---|
528 | exit_and_dispatch:
|
---|
529 | move k0, zero /* ãã¹ãã«ã¦ã³ã¿ãã¯ãªã¢ */
|
---|
530 |
|
---|
531 | dispatcher:
|
---|
532 | /* ããã«ã¯ CPUããã¯ï¼å²ãè¾¼ã¿ç¦æ¢ï¼ã§æ¥ãã㨠*/
|
---|
533 | la t0, schedtsk
|
---|
534 | lw t1, (t0) /* t1 = schedtsk */
|
---|
535 | beq t1, zero, dispatcher_2 /* schedtsk ãç¡ããã°å²è¾¼ã¿å¾
|
---|
536 | ã¡ã¸ */
|
---|
537 | nop
|
---|
538 |
|
---|
539 | dispatcher_1:
|
---|
540 | la t0, runtsk
|
---|
541 | sw t1, (t0) /* runtsk = t1 (= schedtsk)
|
---|
542 | (ã¿ã¹ã¯ã¹ã¤ããã®å®è¡) */
|
---|
543 | lw t2, TCB_pc(t1) /* å®è¡åéçªå°ãåå¾ããã
|
---|
544 | å®è¡åéçªå°ã¯ä»¥ä¸ã®3éã
|
---|
545 | ã»ãã£ã¹ãããã£ã®åºå£ dispatch_r
|
---|
546 | ã»å²è¾¼ã¿ï¼ä¾å¤ã®åºå£ ret_int_r
|
---|
547 | ã»ã¿ã¹ã¯èµ·åç´å¾ activate_r
|
---|
548 | ãããã®å ´åã t1=runtsk ã¨ãã¦å¼ã³
|
---|
549 | åºãã¦ãããã¨ã«æ³¨æã */
|
---|
550 | jr t2 /* å®è¡åéçªå°ã¸ã¸ã£ã³ã */
|
---|
551 | lw sp, TCB_sp(t1) /* ã¹ã¿ãã¯ãã¤ã³ã¿ã復å
|
---|
552 | */
|
---|
553 |
|
---|
554 | /*
|
---|
555 | * å®è¡ãã¹ãã¿ã¹ã¯ãç¾ããã¾ã§å¾
|
---|
556 | ã¤å¦ç
|
---|
557 | *
|
---|
558 | * ããã§ã³ã³ããã¹ããåãæããã®ã¯ï¼
|
---|
559 | * ã»ããã§çºçããå²è¾¼ã¿å¦çã«ã©ã®ã¹ã¿ãã¯ã使ããã¨ããåé¡ã®è§£æ±º
|
---|
560 | * ã»å²è¾¼ã¿ãã³ãã©å
|
---|
561 | ã§ã®ã¿ã¹ã¯ãã£ã¹ãããã®é²æ¢
|
---|
562 | * ã¨ããäºã¤ã®æå³ãããï¼
|
---|
563 | */
|
---|
564 | dispatcher_2:
|
---|
565 | la t2, runtsk
|
---|
566 | sw zero, (t2) /* runtsk = NULL
|
---|
567 | ããã¯ãiget_id ããTSK_NONEãè¿ã
|
---|
568 | å ´åã«å¯¾å¿ããããã*/
|
---|
569 |
|
---|
570 | la sp, _stack_top /* ã¹ã¿ãã¯åãæ¿ã */
|
---|
571 | /* _stack_top ã¯ãã·ã¹ãã ä¾åé¨
|
---|
572 | (ãªã³ã«ã¹ã¯ãªããæ¨å¥¨)å®ç¾© */
|
---|
573 | li k0, 1 /* ãã¹ãã«ã¦ã³ã¿ï¼1 */
|
---|
574 |
|
---|
575 | /* ã«ã¼ãå
|
---|
576 | ã§ä½¿ã宿°ã®æºå */
|
---|
577 | la t2, reqflg /* reqflg ã®ã¢ãã¬ã¹ */
|
---|
578 | li t3, ~SR_ERL_EXL /* Status ã®å²è¾¼ã¿é¢é£ããã */
|
---|
579 | li t4, ~SR_IE /* Status ã®å²è¾¼ã¿è¨±å¯ããã */
|
---|
580 |
|
---|
581 | dispatcher_3:
|
---|
582 | mfc0 t1, Status
|
---|
583 | and t1, t1, t3 /* ERL, EXL ãããã¯ãªã¢ */
|
---|
584 | ori t1, t1, SR_IE /* IEãããã»ãã */
|
---|
585 | mtc0 t1, Status /* å²è¾¼ã¿è¨±å¯ : unlock_cpu ç¸å½ */
|
---|
586 | and t1, t1, t4 /* IEããããªã»ãã */
|
---|
587 | mtc0 t1, Status /* å²è¾¼ã¿ç¦æ¢ : lock_cpu ç¸å½ */
|
---|
588 |
|
---|
589 | NOP_FOR_CP0_HAZARD /* CP0ãã¶ã¼ãã®ããã®æé稼ããã¯ã
|
---|
590 | (ãã®ãã¯ãã¯ã·ã¹ãã ä¾åé¨å®ç¾©) */
|
---|
591 |
|
---|
592 | lw t5, (t2) /* t5 = reqflg */
|
---|
593 |
|
---|
594 | beq t5, zero, dispatcher_3 /* ãã£ã¹ãããè¦æ±ããªããã°ã«ã¼ãã®
|
---|
595 | å
|
---|
596 | é 㸠*/
|
---|
597 | nop
|
---|
598 | sw zero, (t2) /* reqflg = NULL (reqflgãã¯ãªã¢) */
|
---|
599 | j dispatcher /* å®è¡åéçªå°ã®åå¾å¦çã¸ã¸ã£ã³ã */
|
---|
600 | move k0, zero /* ãã¹ãã«ã¦ã³ã¿ãã¯ãªã¢ */
|
---|
601 |
|
---|
602 | /*
|
---|
603 | * ãã£ã¹ãããã£åºå£å¦ç
|
---|
604 | * ã»ãã£ã¹ãããã£å¦çã«ããã¦ãt1 = runtsk ã¨ãªã£ã¦ãããã¨ã«æ³¨æ
|
---|
605 | * ã»ã¹ã¿ãã¯ãã¤ã³ã¿ãè¨å®æ¸ã¿
|
---|
606 | */
|
---|
607 | dispatch_r:
|
---|
608 | lw at, 1*4(sp) /* ã¹ã¯ã©ããã¬ã¸ã¹ã¿ã復帰 */
|
---|
609 | lw s0, 2*4(sp)
|
---|
610 | lw s1, 3*4(sp)
|
---|
611 | lw s2, 4*4(sp)
|
---|
612 | lw s3, 5*4(sp)
|
---|
613 | lw s4, 6*4(sp)
|
---|
614 | lw s5, 7*4(sp)
|
---|
615 | lw s6, 8*4(sp)
|
---|
616 | lw s7, 9*4(sp)
|
---|
617 | lw gp, 10*4(sp)
|
---|
618 | lw fp, 11*4(sp)
|
---|
619 | lw ra, 12*4(sp)
|
---|
620 | addi sp, sp, 13*4
|
---|
621 |
|
---|
622 | /* ã¿ã¹ã¯ä¾å¤å¦çè¦æ±ã®ãã§ã㯠*/
|
---|
623 | lb t2, TCB_enatex(t1)
|
---|
624 | andi t4, t2, TCB_enatex_mask /* t4 = runtsk->enatex */
|
---|
625 | beq t4, zero, dispatch_r_1 /* ã¿ã¹ã¯ä¾å¤å¦çç¦æ¢ã®æãã¸ã£ã³ã */
|
---|
626 | nop
|
---|
627 |
|
---|
628 | lw t5, TCB_texptn(t1) /* t5 = runtsk->texptn */
|
---|
629 | beq t5, zero, dispatch_r_1 /* ã¿ã¹ã¯ä¾å¤è¦æ±ãç¡ãæãã¸ã£ã³ã */
|
---|
630 | nop
|
---|
631 |
|
---|
632 | j call_texrtn /* ã¿ã¹ã¯ä¾å¤å¦çã«ã¼ãã³(ã¿ã¼ã²ããé
|
---|
633 | ä¾åé¨å®ç¾©)ã®å¼ã³åºã */
|
---|
634 | nop
|
---|
635 | /* call_texrtn()(task.c)ã§ã¯ãå®éã®ã¿ã¹ã¯ä¾å¤å¦çã«ã¼ãã³å¼ã³
|
---|
636 | åºãåå¾ã§ãunlock_cpuãlock_cpuå¦çãè¡ã£ã¦ããã®ã§ãç¶æ
|
---|
637 | ã¯
|
---|
638 | ä¿æãããã */
|
---|
639 |
|
---|
640 | dispatch_r_1:
|
---|
641 | jr ra /* dispatch å¼ã³åºãå
|
---|
642 | ã¸æ»ã */
|
---|
643 | nop
|
---|
644 |
|
---|
645 | /*
|
---|
646 | * ã¿ã¹ã¯èµ·åå¦ç
|
---|
647 | * ã»ãã£ã¹ãããã£å¦çã«ããã¦ãt1 = runtsk ã¨ãªã£ã¦ãããã¨ã«æ³¨æ
|
---|
648 | * ã»ã¹ã¿ãã¯ãã¤ã³ã¿ãè¨å®æ¸ã¿
|
---|
649 | */
|
---|
650 |
|
---|
651 | .globl activate_r
|
---|
652 |
|
---|
653 | activate_r:
|
---|
654 | /* ããã«æ¥ãã¨ãã¯ãCPUããã¯ã«ãªã£ã¦ããï¼IEããã = 0) */
|
---|
655 |
|
---|
656 | /* å²ãè¾¼ã¿è¨±å¯ã®æºå */
|
---|
657 | mfc0 t0, Status
|
---|
658 | ori t0, t0, SR_ERL_EXL_IE /* xorã使ãããã1度ãããã»ãããã */
|
---|
659 | xori t0, t0, SR_ERL_EXL /* ERL, EXLããããã¯ãªã¢
|
---|
660 | (IEãããã¯æ®ã) */
|
---|
661 |
|
---|
662 | /* ã¿ã¹ã¯é¢ä¿ã®è¨å®æºå */
|
---|
663 | /* t1 = runtsk (ãã£ã¹ãããã£ã§è¨å®) */
|
---|
664 | lw t2, TCB_tinib(t1) /* t2 = runtsk->tinib */
|
---|
665 |
|
---|
666 | /* ã¿ã¹ã¯èµ·åçªå°ã®è¨å® */
|
---|
667 | lw t3, TINIB_task(t2) /* t3 = runtsk->tinib->task */
|
---|
668 |
|
---|
669 | /* ã¿ã¹ã¯ã¸ã®å¼æ°ï¼æ¡å¼µæ
|
---|
670 | å ±ï¼è¨å® */
|
---|
671 | lw a0, TINIB_exinf(t2) /* a0 = runtsk->tinib->exinf */
|
---|
672 |
|
---|
673 | mtc0 t0, Status /* unlock_cpu ç¸å½ (å²è¾¼ã¿è¨±å¯) */
|
---|
674 |
|
---|
675 | la ra, ext_tsk /* ã¿ã¹ã¯ããã®æ»ãçªå°ãè¨å® */
|
---|
676 |
|
---|
677 | j t3 /* ã¿ã¹ã¯èµ·å */
|
---|
678 | nop
|
---|