1 | ;
|
---|
2 | ; TOPPERS/SSP Kernel
|
---|
3 | ; Smallest Set Profile Kernel
|
---|
4 | ;
|
---|
5 | ; Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
|
---|
6 | ; Toyohashi Univ. of Technology, JAPAN
|
---|
7 | ; Copyright (C) 2007 by Embedded and Real-Time Systems Laboratory
|
---|
8 | ; Graduate School of Information Science, Nagoya Univ., JAPAN
|
---|
9 | ; Copyright (C) 2010 by Witz Corporation, JAPAN
|
---|
10 | ; Copyright (C) 2013 by Mitsuhiro Matsuura
|
---|
11 | ;
|
---|
12 | ; ãLì ÒÍCȺÌ(1)`(4)Ìðð½·êÉÀèC{\tgEF
|
---|
13 | ; Ai{\tgEFAðüϵ½àÌðÜÞDȺ¯¶jðgpE¡»Eü
|
---|
14 | ; ÏEÄzziȺCpÆÄÔj·é±Æð³Åø·éD
|
---|
15 | ; (1) {\tgEFAð\[XR[hÌ`Åp·éêÉÍCãLÌì
|
---|
16 | ; \¦C±Ìpð¨æÑºLÌ³ÛØKèªC»ÌÜÜÌ`Å\[
|
---|
17 | ; XR[hÉÜÜêĢ鱯D
|
---|
18 | ; (2) {\tgEFAðCCu`®ÈÇC¼Ì\tgEFAJÉg
|
---|
19 | ; pÅ«é`ÅÄzz·éêÉÍCÄzzɺ¤hL
|
---|
20 | gip
|
---|
21 | ; Ò}j
|
---|
22 | AÈÇjÉCãLÌì \¦C±Ìpð¨æÑºL
|
---|
23 | ; Ì³ÛØKèðfÚ·é±ÆD
|
---|
24 | ; (3) {\tgEFAðC@íÉgÝÞÈÇC¼Ì\tgEFAJÉg
|
---|
25 | ; pūȢ`ÅÄzz·éêÉÍCÌ¢¸ê©Ìðð½·±
|
---|
26 | ; ÆD
|
---|
27 | ; (a) Äzzɺ¤hL
|
---|
28 | gipÒ}j
|
---|
29 | AÈÇjÉCãLÌ
|
---|
30 | ; ì \¦C±Ìpð¨æÑºLÌ³ÛØKèðfÚ·é±ÆD
|
---|
31 | ; (b) ÄzzÌ`ÔðCÊÉèßéû@ÉæÁÄCTOPPERSvWFNgÉ
|
---|
32 | ; ñ·é±ÆD
|
---|
33 | ; (4) {\tgEFAÌpÉæè¼ÚIܽÍÔÚIɶ¶é¢©Èé¹
|
---|
34 | ; Q©çàCãLì Ò¨æÑTOPPERSvWFNgðÆÓ·é±ÆD
|
---|
35 | ; ܽC{\tgEFAÌ[UܽÍGh[U©çÌ¢©Èé
|
---|
36 | ; RÉîÿ©çàCãLì Ò¨æÑTOPPERSvWFNgð
|
---|
37 | ; ÆÓ·é±ÆD
|
---|
38 | ;
|
---|
39 | ; {\tgEFAÍC³ÛØÅñ³êÄ¢éàÌÅ éDãLì Ò¨
|
---|
40 | ; æÑTOPPERSvWFNgÍC{\tgEFAÉÖµÄCÁèÌgpÚI
|
---|
41 | ; ÉηéK«àÜßÄC¢©ÈéÛØàsíÈ¢DܽC{\tgEF
|
---|
42 | ; AÌpÉæè¼ÚIܽÍÔÚIɶ¶½¢©Èé¹QÉÖµÄàC»
|
---|
43 | ; ÌÓCðíÈ¢D
|
---|
44 | ;
|
---|
45 | ;
|
---|
46 |
|
---|
47 | ;
|
---|
48 | ; vZbT˶W
|
---|
49 | [ AZu¾êiRX630pj
|
---|
50 | ;
|
---|
51 |
|
---|
52 | ;
|
---|
53 | ; fBXpb`¨æÑÝ(CPUáO)oüèûÌ[:
|
---|
54 | ; ®ì[hðÈºÌæ¤Éè`·é.
|
---|
55 | ; fBXpb`[h:
|
---|
56 | ; CPUbNóÔ, ÝDæx}XNSðóÔ,
|
---|
57 | ; ^XNReLXg(intnest = 0), ^XNX^bN
|
---|
58 | ; Ý(CPUáO)[h
|
---|
59 | ; SÝbNóÔ(PSWWX^Irbg = 0),
|
---|
60 | ; ÝDæx}XNSðÅÈ¢óÔ(IPL != 0)
|
---|
61 | ; ÝReLXg(intnest != 0), ÝX^bN
|
---|
62 | ;
|
---|
63 | ; J[lÇOÝÌT|[gL³Æ, CPUbNóÔ, ÝDæx
|
---|
64 | ; }XNSðóÔÌÖWÍȺÌÊèÅ é.
|
---|
65 | ; J[lÇOÝ¢T|[g:
|
---|
66 | ; CPUbNóÔ(PSWWX^Irbg = 0)
|
---|
67 | ; ÝDæx}XNSðóÔ(IPL = 0)
|
---|
68 | ; J[lÇOÝT|[g:
|
---|
69 | ; CPUbNóÔ
|
---|
70 | ; (PSWWX^Irbg = 0, IPL = IPL_LOCK, lock_flag = true)
|
---|
71 | ; ÝDæx}XNSðóÔ(saved_ipl = 0)
|
---|
72 | ;
|
---|
73 | ; e\¢Ì|C^ðÈºÌæ¤ÉeWX^ÉATC·é.
|
---|
74 | ; r15 = p_runtsk ½¾µfBXpb`ÌeoûÅͳø
|
---|
75 | ; r14 = *p_runtsk dispatcher ÌÅÍ p_runtsk mèÉÄæ¾·é
|
---|
76 | ; eüèû©çÅÉÏANZX·éÆ«ÉãLWX^ÉÛ¶·é.
|
---|
77 | ;
|
---|
78 | ; \¢ÌACgÖÌÎ
|
---|
79 | ; \¢ÌACgª4Byte(ApbN)Ìê:
|
---|
80 | ; êÊIÈWX^ÎAhbVOªÂ\
|
---|
81 | ; á: mov.l #__kernel_p_runtsk, r15
|
---|
82 | ; mov.l r0, TCB_sp[r15]
|
---|
83 | ; \¢ÌACgª4ByteÅÍÈ¢(pbN)Ìê:
|
---|
84 | ; mov.lÌæ¤ÉOTCYwèÌêAÎlÍ4Ì{ÌÝLø
|
---|
85 | ; ±Ì½ß, êxÎÛAhXðßÄ©çANZX·éKvª é
|
---|
86 | ; á: mov.l #__kernel_p_runtsk, r15
|
---|
87 | ; add #TCB_sp, r15, r5
|
---|
88 | ; mov.l r0, [r5]
|
---|
89 | ; eItZbglð»fµ, ðAZuÉæèR[hðØèÖ¦é
|
---|
90 | ;
|
---|
91 |
|
---|
92 | ;
|
---|
93 | ; eíEQUè`(Ht@CÌ#defineè`)
|
---|
94 | ;
|
---|
95 | .include asm_config.inc
|
---|
96 |
|
---|
97 | .glb __kernel_istkpt
|
---|
98 |
|
---|
99 | .glb __kernel_reqflg
|
---|
100 |
|
---|
101 | .glb __kernel_search_schedtsk
|
---|
102 | .glb __kernel_run_task
|
---|
103 | .glb __kernel_dispatcher
|
---|
104 | .glb _kernel_interrupt
|
---|
105 | .glb _kernel_exception
|
---|
106 | .glb __kernel_intnest
|
---|
107 | .glb __kernel_call_exit_kernel
|
---|
108 | .glb __kernel_start_dispatch
|
---|
109 |
|
---|
110 | .glb __kernel_exit_kernel
|
---|
111 |
|
---|
112 | .if TIPM_LOCK != -15
|
---|
113 | .glb __kernel_lock_flag
|
---|
114 | .glb __kernel_saved_ipl
|
---|
115 | .endif
|
---|
116 |
|
---|
117 | .glb _sil_dly_nse
|
---|
118 |
|
---|
119 | .if LOG_INH_ENTER_ENABLE == 1
|
---|
120 | .glb _kernel_log_inh_enter
|
---|
121 | .endif ; LOG_INH_ENTER_ENABLE == 1
|
---|
122 | .if LOG_INH_LEAVE_ENABLE == 1
|
---|
123 | .glb _kernel_log_inh_leave
|
---|
124 | .endif ; LOG_INH_LEAVE_ENABLE == 1
|
---|
125 | .if LOG_EXC_ENTER_ENABLE == 1
|
---|
126 | .glb _kernel_log_exc_enter
|
---|
127 | .endif ; LOG_EXC_ENTER_ENABLE == 1
|
---|
128 | .if LOG_EXC_LEAVE_ENABLE == 1
|
---|
129 | .glb _kernel_log_exc_leave
|
---|
130 | .endif ; LOG_EXC_LEAVE_ENABLE == 1
|
---|
131 | .if LOG_DSP_ENTER_ENABLE == 1
|
---|
132 | .glb _kernel_log_dsp_enter
|
---|
133 | .endif ; LOG_DSP_ENTER_ENABLE == 1
|
---|
134 | .if LOG_DSP_LEAVE_ENABLE == 1
|
---|
135 | .glb _kernel_log_dsp_leave
|
---|
136 | .endif ; LOG_DSP_LEAVE_ENABLE == 1
|
---|
137 |
|
---|
138 | .section P, CODE
|
---|
139 |
|
---|
140 | ;
|
---|
141 | ; J[lN®©çÌ^XNfBXpb`üû
|
---|
142 | ;
|
---|
143 | ; ±Ì[`ÍCJ[lN®ÉC·×ÄÌÝðÖ~µ½óÔ
|
---|
144 | ; iÝbNóÔÆ¯jÅÄÑo³êéDܽCÝ[hiñ
|
---|
145 | ; ^XNReLXgƯjÅÄÑo³ê鱯ðzèµÄ¢éD
|
---|
146 | ;
|
---|
147 | ; ÄÑoµð:
|
---|
148 | ; EÝ(CPUáO)[h(t@Cwb_QÆ)
|
---|
149 | ;
|
---|
150 | ; ±±ÅÍ, fBXpb`[hÉÏX·é.
|
---|
151 | ;
|
---|
152 | __kernel_start_dispatch:
|
---|
153 | mov.l #__kernel_intnest, r5
|
---|
154 | mov.w #0, [r5] ; ^XNReLXgÉØ·¦
|
---|
155 | .if TIPM_LOCK != -15
|
---|
156 | mvtc #(IPL_LOCK | 00010000H), psw ; SÝbNðóÔ
|
---|
157 | ; ÝDæx}XNSðÅÈ¢óÔ
|
---|
158 | .endif
|
---|
159 | bra __kernel_dispatcher
|
---|
160 |
|
---|
161 |
|
---|
162 | ;
|
---|
163 | ; J[lÌI¹ÌÄoµ
|
---|
164 | ;
|
---|
165 | ; [hÆX^bNðñ^XNReLXgpÉØèÖ¦D
|
---|
166 | ;
|
---|
167 | .glb __kernel_call_exit_kernel
|
---|
168 | __kernel_call_exit_kernel:
|
---|
169 | .if TIPM_LOCK != -15
|
---|
170 | clrpsw i ; SÝÖ~
|
---|
171 | mov.l #__kernel_lock_flag, r5 ; CPUbNðóÔÖ
|
---|
172 | mov.l #0, [r5]
|
---|
173 | .endif
|
---|
174 | mov.l #__kernel_istkpt, r5
|
---|
175 | mov.l [r5], r0 ; ÝpÌX^bNÖØÖ¦
|
---|
176 | mov.l #__kernel_intnest, r5
|
---|
177 | mov.w #1, [r5] ; ñ^XNReLXgÉØ·¦
|
---|
178 | bsr __kernel_exit_kernel
|
---|
179 | bra __kernel_call_exit_kernel
|
---|
180 |
|
---|
181 |
|
---|
182 | ;
|
---|
183 | ; Ý(CPUáO)©çÌ^XNfBXpb`üû
|
---|
184 | ;
|
---|
185 | ; Äoµð:
|
---|
186 | ; ESÝbNóÔ(PSWWX^Irbg = 0)
|
---|
187 | ; EÝDæx}XNSðÅÈ¢óÔ(IPL != 0)
|
---|
188 | ; E^XNReLXg(intnest=0)
|
---|
189 | ; EgpX^bNÍ^XNX^bN
|
---|
190 | ; Ereqflg = true
|
---|
191 | ;
|
---|
192 | ; ±±ÅÍ, fBXpb`[hÉÏXµ, reqflgðOFFɵĩç,
|
---|
193 | ; xfBXpb`ÌL³ð»f·é.
|
---|
194 | ;
|
---|
195 |
|
---|
196 | ;
|
---|
197 | ; ret_intæªÅX^bNÉÏÜêÄ¢éPSWWX^ÖÌItZbg
|
---|
198 | ; ACC + FPSW + R14--R15 + R1--R5 + PC
|
---|
199 | ;
|
---|
200 | RET_INT_GET_PSW_OFFSET .equ (8+4+28+4)
|
---|
201 |
|
---|
202 | ret_int:
|
---|
203 | .if TIPM_LOCK == -15
|
---|
204 | mov.l RET_INT_GET_PSW_OFFSET[r0], r5 ; Ý/CPUáO¶OÌIPLlæ¾
|
---|
205 | and #PSW_IPL_MASK, r5
|
---|
206 | mvtc r5, psw ; SÝbN(CPUbN)óÔ
|
---|
207 | ; Ý/CPUáO¶OÌÝDæx
|
---|
208 | .else
|
---|
209 | mov.l #__kernel_lock_flag, r5 ; CPUbNóÔÖ
|
---|
210 | mov.l #1, [r5]
|
---|
211 | mov.l RET_INT_GET_PSW_OFFSET[r0], r5 ; Ý/CPUáO¶OÌIPLlæ¾
|
---|
212 | and #PSW_IPL_MASK, r5
|
---|
213 | mov.l #__kernel_saved_ipl, r4
|
---|
214 | mov.l r5, [r4]
|
---|
215 | mvtc #(IPL_LOCK | PSW_I_MASK), psw ; SÝbNðóÔ
|
---|
216 | ; ÝDæx}XNSðÅÈ¢óÔ
|
---|
217 | .endif
|
---|
218 | mov.l #__kernel_reqflg, r5
|
---|
219 | mov.l #0, [r5] ; reqflg <--- FALSE
|
---|
220 | bsr __kernel_search_schedtsk ; ^XNðÀs
|
---|
221 | bsr __kernel_run_task ; search_schedtskÌÔèl(R1)ª»ÌÜÜrun_taskÌøÆÈé
|
---|
222 |
|
---|
223 | ;
|
---|
224 | ; Ý(CPUáO)ÖÌ^XNfBXpb`oû
|
---|
225 | ;
|
---|
226 | ; ÄÑoµð:
|
---|
227 | ; EfBXpb`[h(t@Cwb_QÆ)
|
---|
228 | ;
|
---|
229 | ; ±±ÅÍ, ^XNáOnhÄoµÆ, Ý(CPUáO)[hÖÌ
|
---|
230 | ; ÏXÆ, ReLXgÌAðs¢, Ý(CUPáO)¶³Ößé.
|
---|
231 | ;
|
---|
232 | ret_int_r_rte:
|
---|
233 | .if TIPM_LOCK != -15
|
---|
234 | clrpsw i ; SÝÖ~
|
---|
235 | mov.l #__kernel_lock_flag, r5 ; CPUbNðóÔÖ
|
---|
236 | mov.l #0, [r5]
|
---|
237 | .endif
|
---|
238 | popm r4-r5 ; AL
|
---|
239 | [^A
|
---|
240 | mvtaclo r5 ; ACCźÊ16bitÍ0ÅA
|
---|
241 | mvtachi r4
|
---|
242 | popc fpsw ; FPUXe[^XWX^A
|
---|
243 | popm r14-r15 ; WX^A
|
---|
244 | popm r1-r5
|
---|
245 | rte ; ÝOÌÉßé
|
---|
246 |
|
---|
247 |
|
---|
248 | ;
|
---|
249 | ; ÝÌoüû(AZu¾êLqª)
|
---|
250 | ;
|
---|
251 | ; Äoµð:
|
---|
252 | ; EݶÌH/WÉæè, PSWWX^ÌIrbg=0, IPLÍót¯
|
---|
253 | ; ½ÝÌIPL.
|
---|
254 | ; EX^bNͽdèÝÈçÝX^bN, »¤ÅȯêÎ
|
---|
255 | ; ^XNX^bN
|
---|
256 | ; EݶÌH/WÉæè,X^bNÉÝ©çÌAPCÆPSWª
|
---|
257 | ; Û¶³êÄ¢é.
|
---|
258 | ; ExN^e[uÉo^³ê½ÂÊÌüèûÉæè, X^bNÉ
|
---|
259 | ; XNb`WX^(R1-R5)ªÛ¶³êÄ¢é.
|
---|
260 | ;
|
---|
261 | ; ø:
|
---|
262 | ; Er1:ÝvöÔ
|
---|
263 | ; Er2:ÝnhÌAhX
|
---|
264 | ;
|
---|
265 | ; WX^ªX^bNãÉÇÌæ¤ÉÛ¶³êÄ¢é©ðȺɦ·.
|
---|
266 | ; ±Ì}ÅÍãªáÊ, ºªÊÌAhXÅ, X^bNͺ©ç
|
---|
267 | ; ãûüÉü©ÁÄÏÝã°çêéàÌÆ·é.
|
---|
268 | ;
|
---|
269 | ; -------------------------
|
---|
270 | ; | ACC-HI(4byte) |
|
---|
271 | ; -------------------------(SP + 0)
|
---|
272 | ; | ACC-LO(4byte) |
|
---|
273 | ; -------------------------(SP + 4)
|
---|
274 | ; | FPSW(4byte) |
|
---|
275 | ; -------------------------(SP + 8)
|
---|
276 | ; | R14(4byte) |
|
---|
277 | ; -------------------------(SP + 12)
|
---|
278 | ; | R15(4byte) |
|
---|
279 | ; -------------------------(SP + 16)
|
---|
280 | ; | R1(4byte) |
|
---|
281 | ; -------------------------(SP + 20)
|
---|
282 | ; | R2(4byte) |
|
---|
283 | ; -------------------------(SP + 24)
|
---|
284 | ; | R3(4byte) |
|
---|
285 | ; -------------------------(SP + 28)
|
---|
286 | ; | R4(4byte) |
|
---|
287 | ; -------------------------(SP + 32)
|
---|
288 | ; | R5(4byte) |
|
---|
289 | ; -------------------------(SP + 36)
|
---|
290 | ; | PC(4byte) |
|
---|
291 | ; -------------------------(SP + 40)
|
---|
292 | ; | PSW(4byte) |
|
---|
293 | ; -------------------------(SP + 44)
|
---|
294 | ;
|
---|
295 | ; ±±ÅÍ, Ý[hÉÏXµÄnhðÀs·é.
|
---|
296 | ;
|
---|
297 | ; nh©ç^[µ½ãÍ, ½dÝÅÈ, ©Â reqflg ª
|
---|
298 | ; TRUE ÉÈÁ½ÉCret_int Öªò(xfBXpb`)·éD
|
---|
299 | ;
|
---|
300 | ; ½dݩǤ©ÍÝlXgJE^ÌlÅ»è·é.
|
---|
301 | ; intnest != 0 ÈçνdÝŠ鯻è·é.
|
---|
302 | ;
|
---|
303 | ; reqflg ÍCPUbNóÔÅ`FbN·é. »¤ÅÈ¢ÆC
|
---|
304 | ; reqflg `FbNãÉN®³ê½ÝnhàÅ
|
---|
305 | ; fBXpb`ªv³ê½êÉCfBXpb`³êÈ¢.
|
---|
306 | ;
|
---|
307 | _kernel_interrupt:
|
---|
308 | pushm r14-r15 ; XNb`WX^ðÞð
|
---|
309 | pushc fpsw ; FPUXe[^XWX^Þð
|
---|
310 | mvfacmi r5
|
---|
311 | shll #16, r5 ; ACCźÊ16bitÍ0Æ·é
|
---|
312 | mvfachi r4
|
---|
313 | pushm r4-r5 ; AL
|
---|
314 | [^Þð
|
---|
315 | mov.l #__kernel_intnest, r5
|
---|
316 | mov.w [r5], r4
|
---|
317 | add #1, r4 ; lXgñðCNg
|
---|
318 | mov.w r4, [r5]
|
---|
319 | setpsw i ; ÝÂ(CPUbNðóÔ)
|
---|
320 |
|
---|
321 | .if LOG_INH_LEAVE == 1
|
---|
322 | push.l r1 ; Og[XÌøðÛ
|
---|
323 | .endif
|
---|
324 |
|
---|
325 | .if LOG_INH_ENTER == 1
|
---|
326 | push.l r2
|
---|
327 | bsr _kernel_log_inh_enter ; Og[XÖÌÄoµ
|
---|
328 | ; øÌÝvöÔÍùÉr1ÉüÁÄ¢é
|
---|
329 | pop r2
|
---|
330 | .endif
|
---|
331 |
|
---|
332 | jsr r2 ; C[`ÄÑoµ
|
---|
333 |
|
---|
334 | .if LOG_INH_LEAVE == 1
|
---|
335 | pop r1 ; øÉÝvöÔðÝè
|
---|
336 | bsr _kernel_log_inh_leave ; Og[XÖÌÄoµ
|
---|
337 | .endif
|
---|
338 |
|
---|
339 | clrpsw i ; ÝÖ~(CPUbNóÔ)
|
---|
340 | mov.l #__kernel_intnest, r5
|
---|
341 | mov.w [r5], r4
|
---|
342 | sub #1, r4 ; lXgñðfNg
|
---|
343 | mov.w r4, [r5]
|
---|
344 | cmp #0, r4 ; ½dèݩǤ©
|
---|
345 | bnz interrupt_return ; ½dèÝÈç^[
|
---|
346 | ; iÌÝ
|
---|
347 | mov.l #__kernel_reqflg, r5 ; fBXpb`vªÈ¢©?
|
---|
348 | mov.l [r5], r5
|
---|
349 | cmp #1, r5
|
---|
350 | bz ret_int ; êÎ ret_int ÖWv
|
---|
351 | interrupt_return:
|
---|
352 | popm r4-r5 ; AL
|
---|
353 | [^A
|
---|
354 | mvtaclo r5 ; ACCźÊ16bitÍ0ÅA
|
---|
355 | mvtachi r4
|
---|
356 | popc fpsw ; FPUXe[^XWX^A
|
---|
357 | popm r14-r15 ; WX^A
|
---|
358 | popm r1-r5
|
---|
359 | rte ; ÝOÌÉßé
|
---|
360 |
|
---|
361 |
|
---|
362 | ;
|
---|
363 | ; CPUáOÌoüû(AZu¾êLqª)
|
---|
364 | ;
|
---|
365 | ; Äoµð:
|
---|
366 | ; ECPUáO¶ÌH/WÉæè, PSWWX^ÌIrbg=0, IPL=0.
|
---|
367 | ; EX^bNͽdèÝÈçÝX^bN, »¤ÅȯêÎ
|
---|
368 | ; ^XNX^bN
|
---|
369 | ; ECPUáO¶ÌH/WÉæè,X^bNÉCPUáO©çÌAPCÆ
|
---|
370 | ; PSWªÛ¶³êÄ¢é.
|
---|
371 | ; ExN^e[uÉo^³ê½ÂÊÌüèûÉæè, X^bNÉ
|
---|
372 | ; XNb`WX^(R1-R5)ªÛ¶³êÄ¢é.
|
---|
373 | ;
|
---|
374 | ; ø:
|
---|
375 | ; Er1:CPUáOvöÔ
|
---|
376 | ; Er2:CPUáOnhÌAhX
|
---|
377 | ;
|
---|
378 | ; WX^ªX^bNãÉÇÌæ¤ÉÛ¶³êÄ¢é©ðȺɦ·.
|
---|
379 | ; ±Ì}ÅÍãªáÊ, ºªÊÌAhXÅ, X^bNͺ©ç
|
---|
380 | ; ãûüÉü©ÁÄÏÝã°çêéàÌÆ·é.
|
---|
381 | ; Ȩ, CPUáOvöÔÆR6-R13ÍCPUáOnhàÅîñðæ¾
|
---|
382 | ; ·éÚIÅÞðµÄ¨è, oûÅÍÛ¶àeðjü·êÎæ¢.
|
---|
383 | ;
|
---|
384 | ; -------------------------
|
---|
385 | ; | CPUáOvöÔ | <----- p_excinf
|
---|
386 | ; ------------------------- (intptr_t)(p_excinf + 0)
|
---|
387 | ; | R6(4byte) |
|
---|
388 | ; ------------------------- (intptr_t)(p_excinf + 4)
|
---|
389 | ; | R7(4byte) |
|
---|
390 | ; ------------------------- (intptr_t)(p_excinf + 8)
|
---|
391 | ; | R8(4byte) |
|
---|
392 | ; ------------------------- (intptr_t)(p_excinf + 12)
|
---|
393 | ; | R9(4byte) |
|
---|
394 | ; ------------------------- (intptr_t)(p_excinf + 16)
|
---|
395 | ; | R10(4byte) |
|
---|
396 | ; ------------------------- (intptr_t)(p_excinf + 20)
|
---|
397 | ; | R11(4byte) |
|
---|
398 | ; ------------------------- (intptr_t)(p_excinf + 24)
|
---|
399 | ; | R12(4byte) |
|
---|
400 | ; ------------------------- (intptr_t)(p_excinf + 28)
|
---|
401 | ; | R13(4byte) |
|
---|
402 | ; ------------------------- (intptr_t)(p_excinf + 32)
|
---|
403 | ; | ACC-HI(4byte) |
|
---|
404 | ; ------------------------- (intptr_t)(p_excinf + 36)
|
---|
405 | ; | ACC-LO(4byte) |
|
---|
406 | ; ------------------------- (intptr_t)(p_excinf + 40)
|
---|
407 | ; | FPSW(4byte) |
|
---|
408 | ; ------------------------- (intptr_t)(p_excinf + 44)
|
---|
409 | ; | R14(4byte) |
|
---|
410 | ; ------------------------- (intptr_t)(p_excinf + 48)
|
---|
411 | ; | R15(4byte) |
|
---|
412 | ; ------------------------- (intptr_t)(p_excinf + 52)
|
---|
413 | ; | R1(4byte) |
|
---|
414 | ; ------------------------- (intptr_t)(p_excinf + 56)
|
---|
415 | ; | R2(4byte) |
|
---|
416 | ; ------------------------- (intptr_t)(p_excinf + 60)
|
---|
417 | ; | R3(4byte) |
|
---|
418 | ; ------------------------- (intptr_t)(p_excinf + 64)
|
---|
419 | ; | R4(4byte) |
|
---|
420 | ; ------------------------- (intptr_t)(p_excinf + 68)
|
---|
421 | ; | R5(4byte) |
|
---|
422 | ; ------------------------- (intptr_t)(p_excinf + 72)
|
---|
423 | ; | PC(4byte) |
|
---|
424 | ; ------------------------- (intptr_t)(p_excinf + 76)
|
---|
425 | ; | PSW(4byte) |
|
---|
426 | ; ------------------------- (intptr_t)(p_excinf + 80)
|
---|
427 | ;
|
---|
428 | ; ±±ÅÍ, Ý[hÉÏXµÄnhðÀs·é.
|
---|
429 | ; CPUáOnhÉn·VP^ÌÏ p_excinf ƵÄISPÌln·D
|
---|
430 | ;
|
---|
431 | ; nh©ç^[µ½ãÍ, ½dÝÅÈ, ©Â reqflg ª
|
---|
432 | ; TRUE ÉÈÁ½ÉCret_int Öªò(xfBXpb`)·éD
|
---|
433 | ;
|
---|
434 | ; ½dݩǤ©ÍÝlXgJE^ÌlÅ»è·é.
|
---|
435 | ; intnest != 0 ÈçνdÝŠ鯻è·é.
|
---|
436 | ;
|
---|
437 | ; reqflg ÍCPUbNóÔÅ`FbN·é. »¤ÅÈ¢ÆC
|
---|
438 | ; reqflg `FbNãÉN®³ê½ÝnhàÅ
|
---|
439 | ; fBXpb`ªv³ê½êÉCfBXpb`³êÈ¢.
|
---|
440 | ;
|
---|
441 | ;
|
---|
442 | ; CPUáOüû
|
---|
443 | ;
|
---|
444 | ; ±±ÅÍ, Ý[hÉÏXµÄnhðÀs·é.
|
---|
445 | ;
|
---|
446 |
|
---|
447 | ;
|
---|
448 | ; CPUáOnhÄoµãÉsvÆÈéX^bNîñÌTCY
|
---|
449 | ; EXCNO + R6--R13
|
---|
450 | ;
|
---|
451 | EXCINF_REG_SIZE .equ (4+32)
|
---|
452 |
|
---|
453 | _kernel_exception:
|
---|
454 | pushm r14-r15 ; XNb`WX^ðÞð
|
---|
455 | pushc fpsw
|
---|
456 | mvfacmi r5
|
---|
457 | shll #16, r5 ; ACCźÊ16bitÍ0Æ·é
|
---|
458 | mvfachi r4
|
---|
459 | pushm r4-r5 ; AL
|
---|
460 | [^Þð
|
---|
461 | pushm r6-r13 ; ñXNb`WX^Û¶
|
---|
462 | push.l r1 ; CPUáOvöÔðÛ
|
---|
463 | mov.l r0, r3 ; X^bN|C^ðæèoµ
|
---|
464 | mov.l EXC_GET_PSW_OFFSET[r3], r5
|
---|
465 | and #PSW_I_MASK, r5
|
---|
466 | bz exception_nonkernel ; SÝÖ~(CPUbN)óÔÈçÇO
|
---|
467 | .if TIPM_LOCK != -15
|
---|
468 | mov.l EXC_GET_PSW_OFFSET[r3], r5
|
---|
469 | and #PSW_IPL_MASK, r5
|
---|
470 | cmp #IPL_LOCK, r5
|
---|
471 | bgt exception_nonkernel ; IPLªCPUbNxÈãÈçÇO
|
---|
472 | .endif
|
---|
473 | mov.l #__kernel_intnest, r5
|
---|
474 | mov.w [r5], r4
|
---|
475 | add #1, r4 ; lXgñðCNg
|
---|
476 | mov.w r4, [r5]
|
---|
477 | mov.l EXC_GET_PSW_OFFSET[r3], r5
|
---|
478 | mvtc r5, psw ; CPUáO¶OÌóÔÉß·
|
---|
479 | .if LOG_EXC_LEAVE == 1
|
---|
480 | push.l r1 ; Og[XÌøðÛ
|
---|
481 | .endif
|
---|
482 |
|
---|
483 | .if LOG_EXC_ENTER == 1
|
---|
484 | pushm r2-r3
|
---|
485 | bsr _kernel_log_exc_enter ; Og[XÖÌÄoµ
|
---|
486 | ; øÌÝvöÔÍùÉr1ÉüÁÄ¢é
|
---|
487 | popm r2-r3
|
---|
488 | .endif
|
---|
489 |
|
---|
490 | mov.l r3, r1 ; øÌp_excinfðÝè
|
---|
491 | jsr r2 ; C[`ÄÑoµ
|
---|
492 |
|
---|
493 | .if LOG_EXC_LEAVE == 1
|
---|
494 | pop r1 ; øÉÝvöÔðÝè
|
---|
495 | bsr _kernel_log_exc_leave ; Og[XÖÌÄoµ
|
---|
496 | .endif
|
---|
497 |
|
---|
498 | clrpsw i ; ±±©çÍK¸ÝÖ~
|
---|
499 | mov.l #__kernel_intnest, r5
|
---|
500 | mov.w [r5], r4
|
---|
501 | sub #1, r4 ; lXgñðfNg
|
---|
502 | mov.w r4, [r5]
|
---|
503 | cmp #0, r4 ; ½dèݩǤ©
|
---|
504 | bnz exception_return ; ½dèÝÈç^[
|
---|
505 | ; iÌÝ
|
---|
506 | mov.l #__kernel_reqflg, r5 ; fBXpb`vªÈ¢©?
|
---|
507 | mov.l [r5], r5
|
---|
508 | cmp #1, r5
|
---|
509 | bnz exception_return ; ȯêÎ^[
|
---|
510 | add #EXCINF_REG_SIZE, r0 ; CPUáOîñÌjü
|
---|
511 | bra ret_int ; êÎ ret_int ÖWv
|
---|
512 |
|
---|
513 | exception_nonkernel:
|
---|
514 | mov.l #__kernel_intnest, r5
|
---|
515 | mov.w [r5], r4
|
---|
516 | add #1, r4 ; lXgñðCNg
|
---|
517 | mov.w r4, [r5]
|
---|
518 | cmp #1, r4 ; ½dèݩǤ©
|
---|
519 | bnz exception_from_nonkernelint ; ÁZOª0ÅȯêνdÝ
|
---|
520 | ; iÌÝ
|
---|
521 | mov.l #__kernel_istkpt, r5 ; ÝpÌX^bNÖØÖ¦é
|
---|
522 | mov.l [r5], r0
|
---|
523 | push.l r3 ; ^XNX^bNðÛ
|
---|
524 | exception_from_nonkernelint: ; ½dÝ
|
---|
525 | mov.l EXC_GET_PSW_OFFSET[r3], r5
|
---|
526 | mvtc r5, psw ; CPUáO¶OÌóÔÉß·
|
---|
527 |
|
---|
528 | mov.l r3, r1 ; øÌp_excinfðÝè
|
---|
529 | jsr r2 ; C[`ÄÑoµ
|
---|
530 |
|
---|
531 | clrpsw i ; ±±©çÍK¸ÝÖ~
|
---|
532 | mov.l #__kernel_intnest, r5
|
---|
533 | mov.w [r5], r4
|
---|
534 | sub #1, r4 ; lXgñðfNg
|
---|
535 | mov.w r4, [r5]
|
---|
536 | cmp #0, r4 ; ½dèݩǤ©
|
---|
537 | bnz exception_return ; ½dèÝÈç^[
|
---|
538 | ; iÌÝ
|
---|
539 | pop r0 ; ^XNÌX^bNÉß·
|
---|
540 |
|
---|
541 | exception_return:
|
---|
542 | add #EXCINF_REG_SIZE, r0 ; CPUáOîñÌjü
|
---|
543 | popm r4-r5 ; AL
|
---|
544 | [^A
|
---|
545 | mvtaclo r5 ; ACCźÊ16bitÍ0ÅA
|
---|
546 | mvtachi r4
|
---|
547 | popc fpsw ; FPUXe[^XWX^A
|
---|
548 | popm r14-r15 ; WX^A
|
---|
549 | popm r1-r5
|
---|
550 | rte ; ÝOÌÉßé
|
---|
551 |
|
---|
552 |
|
---|
553 | ;
|
---|
554 | ; ÷ÔÒ¿
|
---|
555 | ;
|
---|
556 | _sil_dly_nse:
|
---|
557 | mov.l #SIL_DLY_TIM1, r5
|
---|
558 | sub r5, r1
|
---|
559 | ble sil_dly_nse_ret
|
---|
560 | sil_dly_nse_loop:
|
---|
561 | mov.l #SIL_DLY_TIM2, r5
|
---|
562 | sub r5, r1
|
---|
563 | bgt sil_dly_nse_loop
|
---|
564 | sil_dly_nse_ret:
|
---|
565 | rts
|
---|
566 |
|
---|
567 | .end
|
---|
568 |
|
---|