1 | ;
|
---|
2 | ; TOPPERS/ASP Kernel
|
---|
3 | ; Toyohashi Open Platform for Embedded Real-Time Systems/
|
---|
4 | ; Advanced 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) 2007 by Embedded and Real-Time Systems Laboratory
|
---|
9 | ; Graduate School of Information Science, Nagoya Univ., JAPAN
|
---|
10 | ; Copyright (C) 2010 by Witz Corporation, JAPAN
|
---|
11 | ; Copyright (C) 2013 by Mitsuhiro Matsuura
|
---|
12 | ;
|
---|
13 | ; ãLì ÒÍCȺÌ(1)`(4)Ìðð½·êÉÀèC{\tgEF
|
---|
14 | ; Ai{\tgEFAðüϵ½àÌðÜÞDȺ¯¶jðgpE¡»Eü
|
---|
15 | ; ÏEÄzziȺCpÆÄÔj·é±Æð³Åø·éD
|
---|
16 | ; (1) {\tgEFAð\[XR[hÌ`Åp·éêÉÍCãLÌì
|
---|
17 | ; \¦C±Ìpð¨æÑºLÌ³ÛØKèªC»ÌÜÜÌ`Å\[
|
---|
18 | ; XR[hÉÜÜêĢ鱯D
|
---|
19 | ; (2) {\tgEFAðCCu`®ÈÇC¼Ì\tgEFAJÉg
|
---|
20 | ; pÅ«é`ÅÄzz·éêÉÍCÄzzɺ¤hL
|
---|
21 | gip
|
---|
22 | ; Ò}j
|
---|
23 | AÈÇjÉCãLÌì \¦C±Ìpð¨æÑºL
|
---|
24 | ; Ì³ÛØKèðfÚ·é±ÆD
|
---|
25 | ; (3) {\tgEFAðC@íÉgÝÞÈÇC¼Ì\tgEFAJÉg
|
---|
26 | ; pūȢ`ÅÄzz·éêÉÍCÌ¢¸ê©Ìðð½·±
|
---|
27 | ; ÆD
|
---|
28 | ; (a) Äzzɺ¤hL
|
---|
29 | gipÒ}j
|
---|
30 | AÈÇjÉCãLÌ
|
---|
31 | ; ì \¦C±Ìpð¨æÑºLÌ³ÛØKèðfÚ·é±ÆD
|
---|
32 | ; (b) ÄzzÌ`ÔðCÊÉèßéû@ÉæÁÄCTOPPERSvWFNgÉ
|
---|
33 | ; ñ·é±ÆD
|
---|
34 | ; (4) {\tgEFAÌpÉæè¼ÚIܽÍÔÚIɶ¶é¢©Èé¹
|
---|
35 | ; Q©çàCãLì Ò¨æÑTOPPERSvWFNgðÆÓ·é±ÆD
|
---|
36 | ; ܽC{\tgEFAÌ[UܽÍGh[U©çÌ¢©Èé
|
---|
37 | ; RÉîÿ©çàCãLì Ò¨æÑTOPPERSvWFNgð
|
---|
38 | ; ÆÓ·é±ÆD
|
---|
39 | ;
|
---|
40 | ; {\tgEFAÍC³ÛØÅñ³êÄ¢éàÌÅ éDãLì Ò¨
|
---|
41 | ; æÑTOPPERSvWFNgÍC{\tgEFAÉÖµÄCÁèÌgpÚI
|
---|
42 | ; ÉηéK«àÜßÄC¢©ÈéÛØàsíÈ¢DܽC{\tgEF
|
---|
43 | ; AÌpÉæè¼ÚIܽÍÔÚIɶ¶½¢©Èé¹QÉÖµÄàC»
|
---|
44 | ; ÌÓCðíÈ¢D
|
---|
45 | ;
|
---|
46 | ; @(#) $Id: prc_support.src 536 2014-10-09 23:11:40Z coas-nagasima $
|
---|
47 | ;
|
---|
48 |
|
---|
49 | ;
|
---|
50 | ; vZbT˶W
|
---|
51 | [ AZu¾êiRX630pj
|
---|
52 | ;
|
---|
53 |
|
---|
54 | ;
|
---|
55 | ; fBXpb`¨æÑÝ(CPUáO)oüèûÌ[:
|
---|
56 | ; ®ì[hðÈºÌæ¤Éè`·é.
|
---|
57 | ; fBXpb`[h:
|
---|
58 | ; CPUbNóÔ, ÝDæx}XNSðóÔ,
|
---|
59 | ; ^XNReLXg(intnest = 0), ^XNX^bN
|
---|
60 | ; Ý(CPUáO)[h
|
---|
61 | ; SÝbNóÔ(PSWWX^Irbg = 0),
|
---|
62 | ; ÝDæx}XNSðÅÈ¢óÔ(IPL != 0)
|
---|
63 | ; ÝReLXg(intnest != 0), ÝX^bN
|
---|
64 | ;
|
---|
65 | ; J[lÇOÝÌT|[gL³Æ, CPUbNóÔ, ÝDæx
|
---|
66 | ; }XNSðóÔÌÖWÍȺÌÊèÅ é.
|
---|
67 | ; J[lÇOÝ¢T|[g:
|
---|
68 | ; CPUbNóÔ(PSWWX^Irbg = 0)
|
---|
69 | ; ÝDæx}XNSðóÔ(IPL = 0)
|
---|
70 | ; J[lÇOÝT|[g:
|
---|
71 | ; CPUbNóÔ
|
---|
72 | ; (PSWWX^Irbg = 0, IPL = IPL_LOCK, lock_flag = true)
|
---|
73 | ; ÝDæx}XNSðóÔ(saved_ipl = 0)
|
---|
74 | ;
|
---|
75 | ; e\¢Ì|C^ðÈºÌæ¤ÉeWX^ÉATC·é.
|
---|
76 | ; r15 = p_runtsk ½¾µfBXpb`ÌeoûÅͳø
|
---|
77 | ; r14 = *p_runtsk dispatcher ÌÅÍ p_runtsk mèÉÄæ¾·é
|
---|
78 | ; eüèû©çÅÉÏANZX·éÆ«ÉãLWX^ÉÛ¶·é.
|
---|
79 | ;
|
---|
80 | ; \¢ÌACgÖÌÎ
|
---|
81 | ; \¢ÌACgª4Byte(ApbN)Ìê:
|
---|
82 | ; êÊIÈWX^ÎAhbVOªÂ\
|
---|
83 | ; á: mov.l #__kernel_p_runtsk, r15
|
---|
84 | ; mov.l r0, TCB_sp[r15]
|
---|
85 | ; \¢ÌACgª4ByteÅÍÈ¢(pbN)Ìê:
|
---|
86 | ; mov.lÌæ¤ÉOTCYwèÌêAÎlÍ4Ì{ÌÝLø
|
---|
87 | ; ±Ì½ß, êxÎÛAhXðßÄ©çANZX·éKvª é
|
---|
88 | ; á: mov.l #__kernel_p_runtsk, r15
|
---|
89 | ; add #TCB_sp, r15, r5
|
---|
90 | ; mov.l r0, [r5]
|
---|
91 | ; eItZbglð»fµ, ðAZuÉæèR[hðØèÖ¦é
|
---|
92 | ;
|
---|
93 |
|
---|
94 | ;
|
---|
95 | ; \¢ÌANZXÌItZbgè`
|
---|
96 | ;
|
---|
97 | .include offset.inc
|
---|
98 |
|
---|
99 | ;
|
---|
100 | ; eíEQUè`(Ht@CÌ#defineè`)
|
---|
101 | ;
|
---|
102 | .include asm_config.inc
|
---|
103 |
|
---|
104 | .glb __kernel_istkpt
|
---|
105 |
|
---|
106 | .glb __kernel_p_runtsk
|
---|
107 | .glb __kernel_p_schedtsk
|
---|
108 | .glb __kernel_reqflg
|
---|
109 | .glb __kernel_dspflg
|
---|
110 |
|
---|
111 | .glb __kernel_dispatch
|
---|
112 | .glb __exit_and_dispatch
|
---|
113 | .glb __kernel_start_r
|
---|
114 | .glb __kernel_call_texrtn
|
---|
115 | .glb _kernel_interrupt
|
---|
116 | .glb _kernel_exception
|
---|
117 | .glb __kernel_intnest
|
---|
118 | .glb __kernel_call_exit_kernel
|
---|
119 | .glb __kernel_start_dispatch
|
---|
120 |
|
---|
121 | .glb _ext_tsk
|
---|
122 | .glb __kernel_exit_kernel
|
---|
123 |
|
---|
124 | .if TIPM_LOCK != -15
|
---|
125 | .glb __kernel_lock_flag
|
---|
126 | .glb __kernel_saved_ipl
|
---|
127 | .endif
|
---|
128 |
|
---|
129 | .glb __kernel_break_wait
|
---|
130 | .glb _sil_dly_nse
|
---|
131 |
|
---|
132 | .if LOG_INH_ENTER_ENABLE == 1
|
---|
133 | .glb _kernel_log_inh_enter
|
---|
134 | .endif ; LOG_INH_ENTER_ENABLE == 1
|
---|
135 | .if LOG_INH_LEAVE_ENABLE == 1
|
---|
136 | .glb _kernel_log_inh_leave
|
---|
137 | .endif ; LOG_INH_LEAVE_ENABLE == 1
|
---|
138 | .if LOG_EXC_ENTER_ENABLE == 1
|
---|
139 | .glb _kernel_log_exc_enter
|
---|
140 | .endif ; LOG_EXC_ENTER_ENABLE == 1
|
---|
141 | .if LOG_EXC_LEAVE_ENABLE == 1
|
---|
142 | .glb _kernel_log_exc_leave
|
---|
143 | .endif ; LOG_EXC_LEAVE_ENABLE == 1
|
---|
144 | .if LOG_DSP_ENTER_ENABLE == 1
|
---|
145 | .glb _kernel_log_dsp_enter
|
---|
146 | .endif ; LOG_DSP_ENTER_ENABLE == 1
|
---|
147 | .if LOG_DSP_LEAVE_ENABLE == 1
|
---|
148 | .glb _kernel_log_dsp_leave
|
---|
149 | .endif ; LOG_DSP_LEAVE_ENABLE == 1
|
---|
150 |
|
---|
151 | ;
|
---|
152 | ; TCB_sp ÖÌÝ}N
|
---|
153 | ;
|
---|
154 | st_TCB_sp .macro src, tcb, tmp
|
---|
155 | .if (TCB_sp % 4) == 0
|
---|
156 | mov.l src, TCB_sp[tcb]
|
---|
157 | .else
|
---|
158 | add #TCB_sp, tcb, tmp
|
---|
159 | mov.l src, [tmp]
|
---|
160 | .endif
|
---|
161 | .endm
|
---|
162 |
|
---|
163 | ;
|
---|
164 | ; TCB_sp ©çÌÇoµ}N
|
---|
165 | ;
|
---|
166 | ld_TCB_sp .macro dst, tcb, tmp
|
---|
167 | .if (TCB_sp % 4) == 0
|
---|
168 | mov.l TCB_sp[tcb], dst
|
---|
169 | .else
|
---|
170 | add #TCB_sp, tcb, tmp
|
---|
171 | mov.l [tmp], dst
|
---|
172 | .endif
|
---|
173 | .endm
|
---|
174 |
|
---|
175 | ;
|
---|
176 | ; TCB_pc ÖÌÝ}N
|
---|
177 | ;
|
---|
178 | st_TCB_pc .macro src, tcb, tmp
|
---|
179 | .if (TCB_pc % 4) == 0
|
---|
180 | mov.l src, TCB_pc[tcb]
|
---|
181 | .else
|
---|
182 | add #TCB_pc, tcb, tmp
|
---|
183 | mov.l src, [tmp]
|
---|
184 | .endif
|
---|
185 | .endm
|
---|
186 |
|
---|
187 | ;
|
---|
188 | ; TCB_pc ©çÌÇoµ}N
|
---|
189 | ;
|
---|
190 | ld_TCB_pc .macro dst, tcb, tmp
|
---|
191 | .if (TCB_pc % 4) == 0
|
---|
192 | mov.l TCB_pc[tcb], dst
|
---|
193 | .else
|
---|
194 | add #TCB_pc, tcb, tmp
|
---|
195 | mov.l [tmp], dst
|
---|
196 | .endif
|
---|
197 | .endm
|
---|
198 |
|
---|
199 | ;
|
---|
200 | ; TCB_texptn ©çÌÇoµ}N
|
---|
201 | ;
|
---|
202 | ld_TCB_texptn .macro dst, tcb, tmp
|
---|
203 | .if (TCB_texptn % 4) == 0
|
---|
204 | mov.l TCB_texptn[tcb], dst
|
---|
205 | .else
|
---|
206 | add #TCB_texptn, tcb, tmp
|
---|
207 | mov.l [tmp], dst
|
---|
208 | .endif
|
---|
209 | .endm
|
---|
210 |
|
---|
211 | ;
|
---|
212 | ; TCB_p_tinib ©çÌÇoµ}N
|
---|
213 | ;
|
---|
214 | ld_TCB_p_tinib .macro dst, tcb, tmp
|
---|
215 | .if (TCB_p_tinib % 4) == 0
|
---|
216 | mov.l TCB_p_tinib[tcb], dst
|
---|
217 | .else
|
---|
218 | add #TCB_p_tinib, tcb, tmp
|
---|
219 | mov.l [tmp], dst
|
---|
220 | .endif
|
---|
221 | .endm
|
---|
222 |
|
---|
223 | ;
|
---|
224 | ; TINIB_exinf ©çÌÇoµ}N
|
---|
225 | ;
|
---|
226 | ld_TINIB_exinf .macro dst, tinib, tmp
|
---|
227 | .if (TINIB_exinf % 4) == 0
|
---|
228 | mov.l TINIB_exinf[tinib], dst
|
---|
229 | .else
|
---|
230 | add #TINIB_exinf, tinib, tmp
|
---|
231 | mov.l [tmp], dst
|
---|
232 | .endif
|
---|
233 | .endm
|
---|
234 |
|
---|
235 | ;
|
---|
236 | ; TINIB_task ©çÌÇoµ}N
|
---|
237 | ;
|
---|
238 | ld_TINIB_task .macro dst, tinib, tmp
|
---|
239 | .if (TINIB_task % 4) == 0
|
---|
240 | mov.l TINIB_task[tinib], dst
|
---|
241 | .else
|
---|
242 | add #TINIB_task, tinib, tmp
|
---|
243 | mov.l [tmp], dst
|
---|
244 | .endif
|
---|
245 | .endm
|
---|
246 |
|
---|
247 |
|
---|
248 | .section P, CODE
|
---|
249 |
|
---|
250 | ;
|
---|
251 | ; API©çÌ^XNfBXpb`üû
|
---|
252 | ;
|
---|
253 | ; ÄÑoµð:
|
---|
254 | ; EfBXpb`[h(t@Cwb_QÆ)
|
---|
255 | ;
|
---|
256 | ; ±±ÅÍ, ReLXgÌÞðÆ, ÀsÄJÔnÌÝèð·é.
|
---|
257 | ;
|
---|
258 | __kernel_dispatch:
|
---|
259 | pushm r6-r13 ; ñXNb`WX^Û¶
|
---|
260 | mov.l #__kernel_p_runtsk, r15
|
---|
261 | mov.l [r15], r14
|
---|
262 | st_TCB_sp r0, r14, r5 ; X^bN|C^ðTCBÉÛ¶
|
---|
263 | st_TCB_pc #dispatch_r, r14, r5 ; ÀsÄJÔnðTCBÉÛ¶
|
---|
264 | bra dispatcher
|
---|
265 |
|
---|
266 | ;
|
---|
267 | ; APIÖÌ^XNfBXpb`oû
|
---|
268 | ;
|
---|
269 | ; ÄÑoµð:
|
---|
270 | ; EfBXpb`[h(t@Cwb_QÆ)
|
---|
271 | ;
|
---|
272 | ; ±±ÅÍ, ^XNáOnhÄoµÆ, ReLXgÌAð·é.
|
---|
273 | ;
|
---|
274 | dispatch_r:
|
---|
275 | btst #TCB_enatex_bit, TCB_enatex[r14] ; ^XNáOÂ?
|
---|
276 | bz dispatch_r_rts
|
---|
277 | ld_TCB_texptn r5, r14, r4 ; Û¯áOvöª é©H
|
---|
278 | cmp #0, r5
|
---|
279 | bz dispatch_r_rts
|
---|
280 | bsr __kernel_call_texrtn ; ^XNáOnhÄoµÀs
|
---|
281 | dispatch_r_rts:
|
---|
282 | popm r6-r13 ; ñXNb`WX^A
|
---|
283 | rts ; dispatch ÄÑoµ³Ößé.
|
---|
284 |
|
---|
285 | ;
|
---|
286 | ; ^XNN®(^XNæªÖÌ^XNfBXpb`oû)
|
---|
287 | ;
|
---|
288 | ; ÄÑoµð:
|
---|
289 | ; EfBXpb`[h(t@Cwb_QÆ)
|
---|
290 | ;
|
---|
291 | ; ±±ÅÍ, CPUbNðóÔɵ, ^XNðN®·é.
|
---|
292 | ;
|
---|
293 | __kernel_start_r:
|
---|
294 | mov.l #_ext_tsk, r5
|
---|
295 | push.l r5 ; ßèÔnðX^bNÉÏÞ
|
---|
296 | ld_TCB_p_tinib r5, r14, r4
|
---|
297 | ld_TINIB_exinf r1, r5, r4 ; g£îñðæêøÉÝè
|
---|
298 | ld_TINIB_task r5, r5, r4 ; ^XNÌN®Ônðæ¾
|
---|
299 | .if TIPM_LOCK == -15
|
---|
300 | setpsw i ; ÝÂ(CPUbNðóÔ)
|
---|
301 | .else
|
---|
302 | mov.l #__kernel_lock_flag, r4 ; CPUbNðóÔÖ
|
---|
303 | mov.l #0, [r4] ; ±±É鯫ÍK¸ saved_ipl Ì
|
---|
304 | mvtc #00010000H, psw ; lÍ 0 ̽ß, ¼lðÝè·é.
|
---|
305 | ; SÝbNðóÔ( I = 1 )
|
---|
306 | ; ÝDæx}XNSðóÔ( IPL = 0 )
|
---|
307 | .endif
|
---|
308 | jmp r5
|
---|
309 |
|
---|
310 | ;
|
---|
311 | ; J[lN®©çÌ^XNfBXpb`üû
|
---|
312 | ;
|
---|
313 | ; ±Ì[`ÍCJ[lN®ÉC·×ÄÌÝðÖ~µ½óÔ
|
---|
314 | ; iÝbNóÔÆ¯jÅÄÑo³êéDܽCÝ[hiñ
|
---|
315 | ; ^XNReLXgƯjÅÄÑo³ê鱯ðzèµÄ¢éD
|
---|
316 | ;
|
---|
317 | ; ÄÑoµð:
|
---|
318 | ; EÝ(CPUáO)[h(t@Cwb_QÆ)
|
---|
319 | ;
|
---|
320 | ; ±±ÅÍ, fBXpb`[hÉÏX·é.
|
---|
321 | ;
|
---|
322 | __kernel_start_dispatch:
|
---|
323 | mov.l #__kernel_intnest, r5
|
---|
324 | mov.w #0, [r5] ; ^XNReLXgÉØ·¦
|
---|
325 | .if TIPM_LOCK != -15
|
---|
326 | mvtc #(IPL_LOCK | 00010000H), psw ; SÝbNðóÔ
|
---|
327 | ; ÝDæx}XNSðÅÈ¢óÔ
|
---|
328 | .endif
|
---|
329 |
|
---|
330 | ;
|
---|
331 | ; ^XNI¹(»ÝÌReLXgðÌÄé)©çÌ^XNfBXpb`üû
|
---|
332 | ;
|
---|
333 | ; ÄÑoµð:
|
---|
334 | ; EfBXpb`[h(t@Cwb_QÆ)
|
---|
335 | ;
|
---|
336 | ; ±±ÅÍ, ½à·é±ÆÍÈ¢.
|
---|
337 | ; Ȩ, p_runtsk ÌAhXæ¾¾¯ÍsȤ.
|
---|
338 | ;
|
---|
339 | __exit_and_dispatch:
|
---|
340 | mov.l #__kernel_p_runtsk, r15
|
---|
341 |
|
---|
342 | ;
|
---|
343 | ; fBXpb`{Ì
|
---|
344 | ;
|
---|
345 | ; ÄÑoµð:
|
---|
346 | ; E·×ÄÌ^XNÌReLXgÍÛ¶³êÄ¢é.
|
---|
347 | ;
|
---|
348 | ; dispatcher ÄoÌX^bN:
|
---|
349 | ; E__kernel_dispatch ©ç«½ê : ^XNX^bN
|
---|
350 | ; Eexit_and_dispatch ©ç«½ê:
|
---|
351 | ; exit_task ©ç«½ê : ^XNX^bN
|
---|
352 | ; J[lN®(__kernel_start_dispatch) : ÝX^bN
|
---|
353 | ; Eret_int ©ç«½ê : ^XNX^bN
|
---|
354 | ; Edispatcher_idle_loop ©ç«½ê : ÝX^bN
|
---|
355 | ;
|
---|
356 | dispatcher:
|
---|
357 | .if LOG_DSP_ENTER == 1
|
---|
358 | push.l r15
|
---|
359 | mov.l r14, r1 ; ø(fBXpb`³TCB)ðÝè
|
---|
360 | bsr _kernel_log_dsp_enter
|
---|
361 | pop.l r15
|
---|
362 | .endif
|
---|
363 | mov.l #__kernel_p_schedtsk, r5
|
---|
364 | mov.l [r5], [r15] ; p_schedtsk ð p_runtsk É
|
---|
365 | mov.l [r15], r14
|
---|
366 | cmp #0, r14
|
---|
367 | bz dispatcher_pre_idle ; schedtsk ªÈ¯êÎACh[vÖ
|
---|
368 | ld_TCB_sp r0, r14, r5 ; ^XNX^bN|C^ðA
|
---|
369 | .if LOG_DSP_LEAVE == 1
|
---|
370 | push.l r14
|
---|
371 | mov.l r14, r1 ; ø(fBXpb`æTCB)ðÝè
|
---|
372 | bsr _kernel_log_dsp_leave
|
---|
373 | pop.l r14
|
---|
374 | .endif
|
---|
375 | ld_TCB_pc r5, r14, r4
|
---|
376 | jmp r5 ; ÀsÄJÔnÖWv
|
---|
377 |
|
---|
378 | ;
|
---|
379 | ; schdedtskªNULLÌêÍACh[vÉüé
|
---|
380 | ; ACh[vÍÝ[hŮ쳹é
|
---|
381 | ;
|
---|
382 | ; ±±ÅÝ[hÉØè·¦éÌÍC±±Å¶·éÝÉ
|
---|
383 | ; ÇÌX^bNðg¤©Æ¢¤âèÌðÆCÝnhàÅÌ^
|
---|
384 | ; XNfBXpb`Ìh~Æ¢¤2ÂÌÓ¡ª éD
|
---|
385 | ;
|
---|
386 | dispatcher_pre_idle:
|
---|
387 | mov.l #__kernel_istkpt,r5
|
---|
388 | mov.l [r5], r0 ; ÝpÌX^bNÖØÖ¦
|
---|
389 | mov.l #__kernel_intnest, r5
|
---|
390 | mov.w #1, [r5] ; ñ^XNReLXgÉØ·¦
|
---|
391 | .if TIPM_LOCK != -15
|
---|
392 | mov.l #__kernel_lock_flag, r5 ; CPUbNðóÔÖ
|
---|
393 | mov.l #0, [r5]
|
---|
394 | mvtc #0, psw ; Dæx0ÌÝðU
|
---|
395 | .endif
|
---|
396 |
|
---|
397 | dispatcher_idle_loop:
|
---|
398 | setpsw i ; SÝÂ
|
---|
399 | clrpsw i ; SÝÖ~
|
---|
400 |
|
---|
401 | mov.l #__kernel_reqflg, r5 ; reqflg ª FALSE Èç
|
---|
402 | mov.l [r5], r4
|
---|
403 | cmp #0, r4
|
---|
404 | bz dispatcher_idle_loop ; ACh[vðJèÔ·
|
---|
405 | mov.l #0, [r5] ; reqflgªtrueÈçfalseÉ·é
|
---|
406 | mov.l #__kernel_intnest, r5
|
---|
407 | mov.w #0, [r5] ; ^XNReLXgÉØ·¦
|
---|
408 | .if TIPM_LOCK != -15
|
---|
409 | mov.l #__kernel_lock_flag, r5 ; CPUbNóÔÖ
|
---|
410 | mov.l #1, [r5]
|
---|
411 | mov.l #__kernel_saved_ipl, r5
|
---|
412 | mov.l #0, [r5]
|
---|
413 | mvtc #(IPL_LOCK | PSW_I_MASK), psw ; SÝbNðóÔ
|
---|
414 | ; ÝDæx}XNSðÅÈ¢óÔ
|
---|
415 | .endif
|
---|
416 | bra dispatcher ; dispatcher Ößé
|
---|
417 |
|
---|
418 |
|
---|
419 | ;
|
---|
420 | ; J[lÌI¹ÌÄoµ
|
---|
421 | ;
|
---|
422 | ; [hÆX^bNðñ^XNReLXgpÉØèÖ¦D
|
---|
423 | ;
|
---|
424 | .glb __kernel_call_exit_kernel
|
---|
425 | __kernel_call_exit_kernel:
|
---|
426 | .if TIPM_LOCK != -15
|
---|
427 | clrpsw i ; SÝÖ~
|
---|
428 | mov.l #__kernel_lock_flag, r5 ; CPUbNðóÔÖ
|
---|
429 | mov.l #0, [r5]
|
---|
430 | .endif
|
---|
431 | mov.l #__kernel_istkpt, r5
|
---|
432 | mov.l [r5], r0 ; ÝpÌX^bNÖØÖ¦
|
---|
433 | mov.l #__kernel_intnest, r5
|
---|
434 | mov.w #1, [r5] ; ñ^XNReLXgÉØ·¦
|
---|
435 | bsr __kernel_exit_kernel
|
---|
436 | bra __kernel_call_exit_kernel
|
---|
437 |
|
---|
438 |
|
---|
439 | ;
|
---|
440 | ; Ý(CPUáO)©çÌ^XNfBXpb`üû
|
---|
441 | ;
|
---|
442 | ; Äoµð:
|
---|
443 | ; ESÝbNóÔ(PSWWX^Irbg = 0)
|
---|
444 | ; EÝDæx}XNSðÅÈ¢óÔ(IPL != 0)
|
---|
445 | ; E^XNReLXg(intnest=0)
|
---|
446 | ; EgpX^bNÍ^XNX^bN
|
---|
447 | ; Ereqflg = true
|
---|
448 | ;
|
---|
449 | ; ±±ÅÍ, fBXpb`[hÉÏXµ, reqflgðOFFɵĩç,
|
---|
450 | ; xfBXpb`ÌL³ð»f·é.
|
---|
451 | ;
|
---|
452 |
|
---|
453 | ;
|
---|
454 | ; ret_intæªÅX^bNÉÏÜêÄ¢éPSWWX^ÖÌItZbg
|
---|
455 | ; ACC + FPSW + R14--R15 + R1--R5 + PC
|
---|
456 | ;
|
---|
457 | RET_INT_GET_PSW_OFFSET .equ (8+4+28+4)
|
---|
458 |
|
---|
459 | ret_int:
|
---|
460 | .if TIPM_LOCK == -15
|
---|
461 | mov.l RET_INT_GET_PSW_OFFSET[r0], r5 ; Ý/CPUáO¶OÌIPLlæ¾
|
---|
462 | and #PSW_IPL_MASK, r5
|
---|
463 | mvtc r5, psw ; SÝbN(CPUbN)óÔ
|
---|
464 | ; Ý/CPUáO¶OÌÝDæx
|
---|
465 | .else
|
---|
466 | mov.l #__kernel_lock_flag, r5 ; CPUbNóÔÖ
|
---|
467 | mov.l #1, [r5]
|
---|
468 | mov.l RET_INT_GET_PSW_OFFSET[r0], r5 ; Ý/CPUáO¶OÌIPLlæ¾
|
---|
469 | and #PSW_IPL_MASK, r5
|
---|
470 | mov.l #__kernel_saved_ipl, r4
|
---|
471 | mov.l r5, [r4]
|
---|
472 | mvtc #(IPL_LOCK | PSW_I_MASK), psw ; SÝbNðóÔ
|
---|
473 | ; ÝDæx}XNSðÅÈ¢óÔ
|
---|
474 | .endif
|
---|
475 | mov.l #__kernel_reqflg, r5
|
---|
476 | mov.l #0, [r5] ; reqflg <--- FALSE
|
---|
477 | mov.l #__kernel_p_runtsk, r15
|
---|
478 | mov.l [r15], r14
|
---|
479 | mov.l #__kernel_dspflg, r5 ; dspflg ª FALSE Èç ret_int_r Ö
|
---|
480 | mov.l [r5], r5
|
---|
481 | cmp #0, r5
|
---|
482 | bz ret_int_r_call_tex
|
---|
483 | mov.l #__kernel_p_schedtsk, r5
|
---|
484 | mov.l [r5], r5
|
---|
485 | cmp r5, r14 ; p_schedtsk Æ p_runtsk ª¯¶Èç
|
---|
486 | beq ret_int_r_call_tex ; ret_int_r_call_tex Ö
|
---|
487 | pushm r6-r13 ; ñXNb`WX^Û¶
|
---|
488 | st_TCB_sp r0, r14, r5 ; X^bN|C^ðTCBÉÛ¶
|
---|
489 | st_TCB_pc #ret_int_r, r14, r5 ; ÀsÄJÔnðTCBÉÛ¶
|
---|
490 | bra dispatcher
|
---|
491 |
|
---|
492 | ;
|
---|
493 | ; Ý(CPUáO)ÖÌ^XNfBXpb`oû
|
---|
494 | ;
|
---|
495 | ; ÄÑoµð:
|
---|
496 | ; EfBXpb`[h(t@Cwb_QÆ)
|
---|
497 | ;
|
---|
498 | ; ±±ÅÍ, ^XNáOnhÄoµÆ, Ý(CPUáO)[hÖÌ
|
---|
499 | ; ÏXÆ, ReLXgÌAðs¢, Ý(CUPáO)¶³Ößé.
|
---|
500 | ;
|
---|
501 | __kernel_break_wait: ;^XNj^px
|
---|
502 | ret_int_r:
|
---|
503 | popm r6-r13 ; ñXNb`WX^A
|
---|
504 | ret_int_r_call_tex:
|
---|
505 | btst #TCB_enatex_bit, TCB_enatex[r14] ; ^XNáOÂ?
|
---|
506 | bz ret_int_r_rte
|
---|
507 | ld_TCB_texptn r5, r14, r4 ; Û¯áOvöª é©H
|
---|
508 | cmp #0, r5
|
---|
509 | bz ret_int_r_rte
|
---|
510 | bsr __kernel_call_texrtn ; ^XNáOnhÄoµÀs
|
---|
511 | ret_int_r_rte:
|
---|
512 | .if TIPM_LOCK != -15
|
---|
513 | clrpsw i ; SÝÖ~
|
---|
514 | mov.l #__kernel_lock_flag, r5 ; CPUbNðóÔÖ
|
---|
515 | mov.l #0, [r5]
|
---|
516 | .endif
|
---|
517 | popm r4-r5 ; AL
|
---|
518 | [^A
|
---|
519 | mvtaclo r5 ; ACCźÊ16bitÍ0ÅA
|
---|
520 | mvtachi r4
|
---|
521 | popc fpsw ; FPUXe[^XWX^A
|
---|
522 | popm r14-r15 ; WX^A
|
---|
523 | popm r1-r5
|
---|
524 | rte ; ÝOÌÉßé
|
---|
525 |
|
---|
526 |
|
---|
527 | ;
|
---|
528 | ; ÝÌoüû(AZu¾êLqª)
|
---|
529 | ;
|
---|
530 | ; Äoµð:
|
---|
531 | ; EݶÌH/WÉæè, PSWWX^ÌIrbg=0, IPLÍót¯
|
---|
532 | ; ½ÝÌIPL.
|
---|
533 | ; EX^bNͽdèÝÈçÝX^bN, »¤ÅȯêÎ
|
---|
534 | ; ^XNX^bN
|
---|
535 | ; EݶÌH/WÉæè,X^bNÉÝ©çÌAPCÆPSWª
|
---|
536 | ; Û¶³êÄ¢é.
|
---|
537 | ; ExN^e[uÉo^³ê½ÂÊÌüèûÉæè, X^bNÉ
|
---|
538 | ; XNb`WX^(R1-R5)ªÛ¶³êÄ¢é.
|
---|
539 | ;
|
---|
540 | ; ø:
|
---|
541 | ; Er1:ÝvöÔ
|
---|
542 | ; Er2:ÝnhÌAhX
|
---|
543 | ;
|
---|
544 | ; WX^ªX^bNãÉÇÌæ¤ÉÛ¶³êÄ¢é©ðȺɦ·.
|
---|
545 | ; ±Ì}ÅÍãªáÊ, ºªÊÌAhXÅ, X^bNͺ©ç
|
---|
546 | ; ãûüÉü©ÁÄÏÝã°çêéàÌÆ·é.
|
---|
547 | ;
|
---|
548 | ; -------------------------
|
---|
549 | ; | ACC-HI(4byte) |
|
---|
550 | ; -------------------------(SP + 0)
|
---|
551 | ; | ACC-LO(4byte) |
|
---|
552 | ; -------------------------(SP + 4)
|
---|
553 | ; | FPSW(4byte) |
|
---|
554 | ; -------------------------(SP + 8)
|
---|
555 | ; | R14(4byte) |
|
---|
556 | ; -------------------------(SP + 12)
|
---|
557 | ; | R15(4byte) |
|
---|
558 | ; -------------------------(SP + 16)
|
---|
559 | ; | R1(4byte) |
|
---|
560 | ; -------------------------(SP + 20)
|
---|
561 | ; | R2(4byte) |
|
---|
562 | ; -------------------------(SP + 24)
|
---|
563 | ; | R3(4byte) |
|
---|
564 | ; -------------------------(SP + 28)
|
---|
565 | ; | R4(4byte) |
|
---|
566 | ; -------------------------(SP + 32)
|
---|
567 | ; | R5(4byte) |
|
---|
568 | ; -------------------------(SP + 36)
|
---|
569 | ; | PC(4byte) |
|
---|
570 | ; -------------------------(SP + 40)
|
---|
571 | ; | PSW(4byte) |
|
---|
572 | ; -------------------------(SP + 44)
|
---|
573 | ;
|
---|
574 | ; ±±ÅÍ, Ý[hÉÏXµÄnhðÀs·é.
|
---|
575 | ;
|
---|
576 | ; nh©ç^[µ½ãÍ, ½dÝÅÈ, ©Â reqflg ª
|
---|
577 | ; TRUE ÉÈÁ½ÉCret_int Öªò(xfBXpb`)·éD
|
---|
578 | ;
|
---|
579 | ; ½dݩǤ©ÍÝlXgJE^ÌlÅ»è·é.
|
---|
580 | ; intnest != 0 ÈçνdÝŠ鯻è·é.
|
---|
581 | ;
|
---|
582 | ; reqflg ÍCPUbNóÔÅ`FbN·é. »¤ÅÈ¢ÆC
|
---|
583 | ; reqflg `FbNãÉN®³ê½ÝnhàÅ
|
---|
584 | ; fBXpb`ªv³ê½êÉCfBXpb`³êÈ¢.
|
---|
585 | ;
|
---|
586 | _kernel_interrupt:
|
---|
587 | pushm r14-r15 ; XNb`WX^ðÞð
|
---|
588 | pushc fpsw ; FPUXe[^XWX^Þð
|
---|
589 | mvfacmi r5
|
---|
590 | shll #16, r5 ; ACCźÊ16bitÍ0Æ·é
|
---|
591 | mvfachi r4
|
---|
592 | pushm r4-r5 ; AL
|
---|
593 | [^Þð
|
---|
594 | mov.l #__kernel_intnest, r5
|
---|
595 | mov.w [r5], r4
|
---|
596 | add #1, r4 ; lXgñðCNg
|
---|
597 | mov.w r4, [r5]
|
---|
598 | cmp #1, r4 ; ½dèݩǤ©
|
---|
599 | bnz interrupt_from_int ; ÁZOª0ÅȯêνdÝ
|
---|
600 | ; iÌÝ
|
---|
601 | mov.l r0, r3 ; X^bN|C^ðæèoµ
|
---|
602 | mov.l #__kernel_istkpt, r5 ; ÝpÌX^bNÖØÖ¦é
|
---|
603 | mov.l [r5], r0
|
---|
604 | push.l r3 ; ^XNX^bNðÛ
|
---|
605 | interrupt_from_int: ; ½dÝ
|
---|
606 | setpsw i ; ÝÂ(CPUbNðóÔ)
|
---|
607 |
|
---|
608 | .if LOG_INH_LEAVE == 1
|
---|
609 | push.l r1 ; Og[XÌøðÛ
|
---|
610 | .endif
|
---|
611 |
|
---|
612 | .if LOG_INH_ENTER == 1
|
---|
613 | push.l r2
|
---|
614 | bsr _kernel_log_inh_enter ; Og[XÖÌÄoµ
|
---|
615 | ; øÌÝvöÔÍùÉr1ÉüÁÄ¢é
|
---|
616 | pop r2
|
---|
617 | .endif
|
---|
618 |
|
---|
619 | jsr r2 ; C[`ÄÑoµ
|
---|
620 |
|
---|
621 | .if LOG_INH_LEAVE == 1
|
---|
622 | pop r1 ; øÉÝvöÔðÝè
|
---|
623 | bsr _kernel_log_inh_leave ; Og[XÖÌÄoµ
|
---|
624 | .endif
|
---|
625 |
|
---|
626 | clrpsw i ; ÝÖ~(CPUbNóÔ)
|
---|
627 | mov.l #__kernel_intnest, r5
|
---|
628 | mov.w [r5], r4
|
---|
629 | sub #1, r4 ; lXgñðfNg
|
---|
630 | mov.w r4, [r5]
|
---|
631 | cmp #0, r4 ; ½dèݩǤ©
|
---|
632 | bnz interrupt_return ; ½dèÝÈç^[
|
---|
633 | ; iÌÝ
|
---|
634 | pop r0 ; ^XNÌX^bNÉß·
|
---|
635 | mov.l #__kernel_reqflg, r5 ; fBXpb`vªÈ¢©?
|
---|
636 | mov.l [r5], r5
|
---|
637 | cmp #1, r5
|
---|
638 | bz ret_int ; êÎ ret_int ÖWv
|
---|
639 | interrupt_return:
|
---|
640 | popm r4-r5 ; AL
|
---|
641 | [^A
|
---|
642 | mvtaclo r5 ; ACCźÊ16bitÍ0ÅA
|
---|
643 | mvtachi r4
|
---|
644 | popc fpsw ; FPUXe[^XWX^A
|
---|
645 | popm r14-r15 ; WX^A
|
---|
646 | popm r1-r5
|
---|
647 | rte ; ÝOÌÉßé
|
---|
648 |
|
---|
649 |
|
---|
650 | ;
|
---|
651 | ; CPUáOÌoüû(AZu¾êLqª)
|
---|
652 | ;
|
---|
653 | ; Äoµð:
|
---|
654 | ; ECPUáO¶ÌH/WÉæè, PSWWX^ÌIrbg=0, IPL=0.
|
---|
655 | ; EX^bNͽdèÝÈçÝX^bN, »¤ÅȯêÎ
|
---|
656 | ; ^XNX^bN
|
---|
657 | ; ECPUáO¶ÌH/WÉæè,X^bNÉCPUáO©çÌAPCÆ
|
---|
658 | ; PSWªÛ¶³êÄ¢é.
|
---|
659 | ; ExN^e[uÉo^³ê½ÂÊÌüèûÉæè, X^bNÉ
|
---|
660 | ; XNb`WX^(R1-R5)ªÛ¶³êÄ¢é.
|
---|
661 | ;
|
---|
662 | ; ø:
|
---|
663 | ; Er1:CPUáOvöÔ
|
---|
664 | ; Er2:CPUáOnhÌAhX
|
---|
665 | ;
|
---|
666 | ; WX^ªX^bNãÉÇÌæ¤ÉÛ¶³êÄ¢é©ðȺɦ·.
|
---|
667 | ; ±Ì}ÅÍãªáÊ, ºªÊÌAhXÅ, X^bNͺ©ç
|
---|
668 | ; ãûüÉü©ÁÄÏÝã°çêéàÌÆ·é.
|
---|
669 | ; Ȩ, CPUáOvöÔÆR6-R13ÍCPUáOnhàÅîñðæ¾
|
---|
670 | ; ·éÚIÅÞðµÄ¨è, oûÅÍÛ¶àeðjü·êÎæ¢.
|
---|
671 | ;
|
---|
672 | ; -------------------------
|
---|
673 | ; | CPUáOvöÔ | <----- p_excinf
|
---|
674 | ; ------------------------- (intptr_t)(p_excinf + 0)
|
---|
675 | ; | R6(4byte) |
|
---|
676 | ; ------------------------- (intptr_t)(p_excinf + 4)
|
---|
677 | ; | R7(4byte) |
|
---|
678 | ; ------------------------- (intptr_t)(p_excinf + 8)
|
---|
679 | ; | R8(4byte) |
|
---|
680 | ; ------------------------- (intptr_t)(p_excinf + 12)
|
---|
681 | ; | R9(4byte) |
|
---|
682 | ; ------------------------- (intptr_t)(p_excinf + 16)
|
---|
683 | ; | R10(4byte) |
|
---|
684 | ; ------------------------- (intptr_t)(p_excinf + 20)
|
---|
685 | ; | R11(4byte) |
|
---|
686 | ; ------------------------- (intptr_t)(p_excinf + 24)
|
---|
687 | ; | R12(4byte) |
|
---|
688 | ; ------------------------- (intptr_t)(p_excinf + 28)
|
---|
689 | ; | R13(4byte) |
|
---|
690 | ; ------------------------- (intptr_t)(p_excinf + 32)
|
---|
691 | ; | ACC-HI(4byte) |
|
---|
692 | ; ------------------------- (intptr_t)(p_excinf + 36)
|
---|
693 | ; | ACC-LO(4byte) |
|
---|
694 | ; ------------------------- (intptr_t)(p_excinf + 40)
|
---|
695 | ; | FPSW(4byte) |
|
---|
696 | ; ------------------------- (intptr_t)(p_excinf + 44)
|
---|
697 | ; | R14(4byte) |
|
---|
698 | ; ------------------------- (intptr_t)(p_excinf + 48)
|
---|
699 | ; | R15(4byte) |
|
---|
700 | ; ------------------------- (intptr_t)(p_excinf + 52)
|
---|
701 | ; | R1(4byte) |
|
---|
702 | ; ------------------------- (intptr_t)(p_excinf + 56)
|
---|
703 | ; | R2(4byte) |
|
---|
704 | ; ------------------------- (intptr_t)(p_excinf + 60)
|
---|
705 | ; | R3(4byte) |
|
---|
706 | ; ------------------------- (intptr_t)(p_excinf + 64)
|
---|
707 | ; | R4(4byte) |
|
---|
708 | ; ------------------------- (intptr_t)(p_excinf + 68)
|
---|
709 | ; | R5(4byte) |
|
---|
710 | ; ------------------------- (intptr_t)(p_excinf + 72)
|
---|
711 | ; | PC(4byte) |
|
---|
712 | ; ------------------------- (intptr_t)(p_excinf + 76)
|
---|
713 | ; | PSW(4byte) |
|
---|
714 | ; ------------------------- (intptr_t)(p_excinf + 80)
|
---|
715 | ;
|
---|
716 | ; ±±ÅÍ, Ý[hÉÏXµÄnhðÀs·é.
|
---|
717 | ; CPUáOnhÉn·VP^ÌÏ p_excinf ƵÄISPÌln·D
|
---|
718 | ;
|
---|
719 | ; nh©ç^[µ½ãÍ, ½dÝÅÈ, ©Â reqflg ª
|
---|
720 | ; TRUE ÉÈÁ½ÉCret_int Öªò(xfBXpb`)·éD
|
---|
721 | ;
|
---|
722 | ; ½dݩǤ©ÍÝlXgJE^ÌlÅ»è·é.
|
---|
723 | ; intnest != 0 ÈçνdÝŠ鯻è·é.
|
---|
724 | ;
|
---|
725 | ; reqflg ÍCPUbNóÔÅ`FbN·é. »¤ÅÈ¢ÆC
|
---|
726 | ; reqflg `FbNãÉN®³ê½ÝnhàÅ
|
---|
727 | ; fBXpb`ªv³ê½êÉCfBXpb`³êÈ¢.
|
---|
728 | ;
|
---|
729 | ;
|
---|
730 | ; CPUáOüû
|
---|
731 | ;
|
---|
732 | ; ±±ÅÍ, Ý[hÉÏXµÄnhðÀs·é.
|
---|
733 | ;
|
---|
734 |
|
---|
735 | ;
|
---|
736 | ; CPUáOnhÄoµãÉsvÆÈéX^bNîñÌTCY
|
---|
737 | ; EXCNO + R6--R13
|
---|
738 | ;
|
---|
739 | EXCINF_REG_SIZE .equ (4+32)
|
---|
740 |
|
---|
741 | _kernel_exception:
|
---|
742 | pushm r14-r15 ; XNb`WX^ðÞð
|
---|
743 | pushc fpsw
|
---|
744 | mvfacmi r5
|
---|
745 | shll #16, r5 ; ACCźÊ16bitÍ0Æ·é
|
---|
746 | mvfachi r4
|
---|
747 | pushm r4-r5 ; AL
|
---|
748 | [^Þð
|
---|
749 | pushm r6-r13 ; ñXNb`WX^Û¶
|
---|
750 | push.l r1 ; CPUáOvöÔðÛ
|
---|
751 | mov.l r0, r3 ; X^bN|C^ðæèoµ
|
---|
752 | mov.l EXC_GET_PSW_OFFSET[r3], r5
|
---|
753 | and #PSW_I_MASK, r5
|
---|
754 | bz exception_nonkernel ; SÝÖ~(CPUbN)óÔÈçÇO
|
---|
755 | .if TIPM_LOCK != -15
|
---|
756 | mov.l EXC_GET_PSW_OFFSET[r3], r5
|
---|
757 | and #PSW_IPL_MASK, r5
|
---|
758 | cmp #IPL_LOCK, r5
|
---|
759 | bgt exception_nonkernel ; IPLªCPUbNxÈãÈçÇO
|
---|
760 | .endif
|
---|
761 | mov.l #__kernel_intnest, r5
|
---|
762 | mov.w [r5], r4
|
---|
763 | add #1, r4 ; lXgñðCNg
|
---|
764 | mov.w r4, [r5]
|
---|
765 | cmp #1, r4 ; ½dèݩǤ©
|
---|
766 | bnz exception_from_int ; ÁZOª0ÅȯêνdÝ
|
---|
767 | ; iÌÝ
|
---|
768 | mov.l #__kernel_istkpt, r5 ; ÝpÌX^bNÖØÖ¦é
|
---|
769 | mov.l [r5], r0
|
---|
770 | push.l r3 ; ^XNX^bNðÛ
|
---|
771 | exception_from_int: ; ½dÝ
|
---|
772 | mov.l EXC_GET_PSW_OFFSET[r3], r5
|
---|
773 | mvtc r5, psw ; CPUáO¶OÌóÔÉß·
|
---|
774 | .if LOG_EXC_LEAVE == 1
|
---|
775 | push.l r1 ; Og[XÌøðÛ
|
---|
776 | .endif
|
---|
777 |
|
---|
778 | .if LOG_EXC_ENTER == 1
|
---|
779 | pushm r2-r3
|
---|
780 | bsr _kernel_log_exc_enter ; Og[XÖÌÄoµ
|
---|
781 | ; øÌÝvöÔÍùÉr1ÉüÁÄ¢é
|
---|
782 | popm r2-r3
|
---|
783 | .endif
|
---|
784 |
|
---|
785 | mov.l r3, r1 ; øÌp_excinfðÝè
|
---|
786 | jsr r2 ; C[`ÄÑoµ
|
---|
787 |
|
---|
788 | .if LOG_EXC_LEAVE == 1
|
---|
789 | pop r1 ; øÉÝvöÔðÝè
|
---|
790 | bsr _kernel_log_exc_leave ; Og[XÖÌÄoµ
|
---|
791 | .endif
|
---|
792 |
|
---|
793 | clrpsw i ; ±±©çÍK¸ÝÖ~
|
---|
794 | mov.l #__kernel_intnest, r5
|
---|
795 | mov.w [r5], r4
|
---|
796 | sub #1, r4 ; lXgñðfNg
|
---|
797 | mov.w r4, [r5]
|
---|
798 | cmp #0, r4 ; ½dèݩǤ©
|
---|
799 | bnz exception_return ; ½dèÝÈç^[
|
---|
800 | ; iÌÝ
|
---|
801 | pop r0 ; ^XNÌX^bNÉß·
|
---|
802 | mov.l #__kernel_reqflg, r5 ; fBXpb`vªÈ¢©?
|
---|
803 | mov.l [r5], r5
|
---|
804 | cmp #1, r5
|
---|
805 | bnz exception_return ; ȯêÎ^[
|
---|
806 | add #EXCINF_REG_SIZE, r0 ; CPUáOîñÌjü
|
---|
807 | bra ret_int ; êÎ ret_int ÖWv
|
---|
808 |
|
---|
809 | exception_nonkernel:
|
---|
810 | mov.l #__kernel_intnest, r5
|
---|
811 | mov.w [r5], r4
|
---|
812 | add #1, r4 ; lXgñðCNg
|
---|
813 | mov.w r4, [r5]
|
---|
814 | cmp #1, r4 ; ½dèݩǤ©
|
---|
815 | bnz exception_from_nonkernelint ; ÁZOª0ÅȯêνdÝ
|
---|
816 | ; iÌÝ
|
---|
817 | mov.l #__kernel_istkpt, r5 ; ÝpÌX^bNÖØÖ¦é
|
---|
818 | mov.l [r5], r0
|
---|
819 | push.l r3 ; ^XNX^bNðÛ
|
---|
820 | exception_from_nonkernelint: ; ½dÝ
|
---|
821 | mov.l EXC_GET_PSW_OFFSET[r3], r5
|
---|
822 | mvtc r5, psw ; CPUáO¶OÌóÔÉß·
|
---|
823 |
|
---|
824 | mov.l r3, r1 ; øÌp_excinfðÝè
|
---|
825 | jsr r2 ; C[`ÄÑoµ
|
---|
826 |
|
---|
827 | clrpsw i ; ±±©çÍK¸ÝÖ~
|
---|
828 | mov.l #__kernel_intnest, r5
|
---|
829 | mov.w [r5], r4
|
---|
830 | sub #1, r4 ; lXgñðfNg
|
---|
831 | mov.w r4, [r5]
|
---|
832 | cmp #0, r4 ; ½dèݩǤ©
|
---|
833 | bnz exception_return ; ½dèÝÈç^[
|
---|
834 | ; iÌÝ
|
---|
835 | pop r0 ; ^XNÌX^bNÉß·
|
---|
836 |
|
---|
837 | exception_return:
|
---|
838 | add #EXCINF_REG_SIZE, r0 ; CPUáOîñÌjü
|
---|
839 | popm r4-r5 ; AL
|
---|
840 | [^A
|
---|
841 | mvtaclo r5 ; ACCźÊ16bitÍ0ÅA
|
---|
842 | mvtachi r4
|
---|
843 | popc fpsw ; FPUXe[^XWX^A
|
---|
844 | popm r14-r15 ; WX^A
|
---|
845 | popm r1-r5
|
---|
846 | rte ; ÝOÌÉßé
|
---|
847 |
|
---|
848 |
|
---|
849 | ;
|
---|
850 | ; ÷ÔÒ¿
|
---|
851 | ;
|
---|
852 | _sil_dly_nse:
|
---|
853 | mov.l #SIL_DLY_TIM1, r5
|
---|
854 | sub r5, r1
|
---|
855 | ble sil_dly_nse_ret
|
---|
856 | sil_dly_nse_loop:
|
---|
857 | mov.l #SIL_DLY_TIM2, r5
|
---|
858 | sub r5, r1
|
---|
859 | bgt sil_dly_nse_loop
|
---|
860 | sil_dly_nse_ret:
|
---|
861 | rts
|
---|
862 |
|
---|
863 | .end
|
---|
864 |
|
---|