source: atk1_sh2/trunk/config/sh2-gnu/cpu_support.S@ 6

Last change on this file since 6 was 6, checked in by msugi, 14 years ago

ファイルの追加忘れ分があったため追加.
intmaskの初期化がidle_loopの出口になかったため,追加.

File size: 15.1 KB
Line 
1/*
2 * TOPPERS/OSEK Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * OSEK Kernel
5 *
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2004 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 * Copyright (C) 2006 by Witz Corporation, JAPAN
11 * Copyright (C) 2010 by Meika Sugimoto
12 *
13 * ã‹L’˜ìŒ ŽÒ‚́CˆÈ‰º‚Ì (1)`(4) ‚ÌðŒ‚©CFree Software Foundation
14 * ‚É‚æ‚Á‚ÄŒö•\‚³‚ê‚Ä‚¢‚é GNU General Public License ‚Ì Version 2 ‚É‹L
15 * q‚³‚ê‚Ä‚¢‚éðŒ‚ð–ž‚½‚·ê‡‚ÉŒÀ‚èC–{ƒ\ƒtƒgƒEƒFƒAi–{ƒ\ƒtƒgƒEƒFƒA
16 * ‚ð‰ü•Ï‚µ‚½‚à‚Ì‚ðŠÜ‚ށDˆÈ‰º“¯‚¶j‚ðŽg—pE•¡»E‰ü•ÏEÄ”z•ziˆÈ‰ºC
17 * —˜—p‚ƌĂԁj‚·‚邱‚Ƃ𖳏ž‚Å‹–‘ø‚·‚éD
18 * (1) –{ƒ\ƒtƒgƒEƒFƒA‚ðƒ\[ƒXƒR[ƒh‚ÌŒ`‚Å—˜—p‚·‚éê‡‚ɂ́Cã‹L‚Ì’˜ì
19 * Œ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’肪C‚»‚Ì‚Ü‚Ü‚ÌŒ`‚Ń\[
20 * ƒXƒR[ƒh’†‚ÉŠÜ‚Ü‚ê‚Ä‚¢‚邱‚ƁD
21 * (2) –{ƒ\ƒtƒgƒEƒFƒA‚ðCƒ‰ƒCƒuƒ‰ƒŠŒ`Ž®‚ȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
22 * —p‚Å‚«‚éŒ`‚ōĔz•z‚·‚éê‡‚ɂ́CÄ”z•z‚É”º‚¤ƒhƒLƒ…
23ƒƒ“ƒgi—˜—p
24 * ŽÒƒ}ƒjƒ…
25ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L
26 * ‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
27 * (3) –{ƒ\ƒtƒgƒEƒFƒA‚ðC‹@Ší‚É‘g‚ݍž‚ނȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
28 * —p‚Å‚«‚È‚¢Œ`‚ōĔz•z‚·‚éê‡‚ɂ́CŽŸ‚Ì‚¢‚¸‚ê‚©‚ÌðŒ‚ð–ž‚½‚·‚±
29 * ‚ƁD
30 * (a) Ä”z•z‚É”º‚¤ƒhƒLƒ…
31ƒƒ“ƒgi—˜—pŽÒƒ}ƒjƒ…
32ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜
33 * ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
34 * (b) Ä”z•z‚ÌŒ`‘Ô‚ðC•Ê‚É’è‚ß‚é•û–@‚É‚æ‚Á‚āCTOPPERSƒvƒƒWƒFƒNƒg‚É
35 * •ñ‚·‚邱‚ƁD
36 * (4) –{ƒ\ƒtƒgƒEƒFƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚é‚¢‚©‚Ȃ鑹
37 * ŠQ‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð–Ɛӂ·‚邱‚ƁD
38 *
39 * –{ƒ\ƒtƒgƒEƒFƒA‚́C–³•ÛØ‚Å’ñ‹Ÿ‚³‚ê‚Ä‚¢‚é‚à‚Ì‚Å‚ ‚éDã‹L’˜ìŒ ŽÒ‚¨
40 * ‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚́C–{ƒ\ƒtƒgƒEƒFƒA‚ÉŠÖ‚µ‚āC‚»‚Ì“K—p‰Â”\«‚à
41 * ŠÜ‚߂āC‚¢‚©‚È‚é•ÛØ‚às‚í‚È‚¢D‚Ü‚½C–{ƒ\ƒtƒgƒEƒFƒA‚Ì—˜—p‚É‚æ‚è’¼
42 * Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚½‚¢‚©‚Ȃ鑹ŠQ‚ÉŠÖ‚µ‚Ä‚àC‚»‚̐ӔC‚𕉂í‚È‚¢D
43 *
44 */
45
46/* ƒvƒƒZƒbƒTˆË‘¶ƒ‚ƒWƒ…
47[ƒ‹ ƒAƒZƒ“ƒuƒŠŒ¾Œê•”iSH2—pj*/
48
49#define _MACRO_ONLY
50#include "sys_defs.h"
51
52/* ŠO•”ŽQÆéŒ¾ */
53 .globl _runtsk
54 .globl _schedtsk
55 .globl _tcxb_pc
56 .globl _tcxb_sp
57 .globl _tinib_task
58 .globl _callevel
59 .globl _runisr
60 .globl _tinib_exepri
61 .globl _tcb_curpri
62 .globl _call_pretaskhook
63 .globl _call_posttaskhook
64 .globl _PreTaskHook
65 .globl _PostTaskHook
66 .globl _lock_flag
67 .globl _intmask
68
69/* ŠO•”ŒöŠJéŒ¾ */
70 .globl _dispatch
71 .globl _start_dispatch
72 .globl _exit_and_dispatch
73 .globl _activate_r
74 .globl _interrupt
75 .globl dispatch_r
76
77.section ".text" , "ax"
78.align 2
79
80/*
81 * ƒ^ƒXƒNƒfƒBƒXƒpƒbƒ`ƒƒ
82 *
83 * ŒÄ‚яo‚µðŒ:
84 * Š„ž‚݁FIPL=0, FLGƒŒƒWƒXƒ^Iƒrƒbƒg=0 (CPUƒƒbƒNó‘Ô)
85 * ƒRƒ“ƒeƒLƒXƒgFcallevel=1(ƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg)
86 * ƒXƒ^ƒbƒNF ƒ^ƒXƒNƒXƒ^ƒbƒN
87*/
88
89_dispatch:
90 /* ƒXƒ^ƒbƒN‚ÖƒŒƒWƒXƒ^•Û‘¶ */
91 mov.l r8 , @-r15
92 mov.l r9 , @-r15
93 mov.l r10 , @-r15
94 mov.l r11 , @-r15
95 mov.l r12 , @-r15
96 mov.l r13 , @-r15
97 mov.l r14 , @-r15
98 sts.l pr , @-r15
99 mov.l runtsk_adr , r1
100 mov.b @r1 , r0
101 extu.b r0 , r0
102 shll2 r0
103 mov.l tcxb_sp_adr , r2
104 mov.l r15 , @(r0 , r2) /* ƒXƒ^ƒbƒNƒ|ƒCƒ“ƒ^‚ðTCB‚É•Û‘¶ */
105 mov.l dispatch_r_adr , r3
106 mov.l tcxb_pc_adr , r2 /* ŽÀsÄŠJ”Ô’n‚ðTCB‚É•Û‘¶ */
107 mov.l r3 , @(r0 , r2)
108 bra dispatcher /* dispatcher‚Ö */
109 nop
110
111.align 4
112dispatch_r_adr:
113 .long dispatch_r
114
115/*
116 * ŒÄ‚яo‚µðŒ:
117 * Š„ž‚݁FIPL=0xf, (CPUƒƒbƒNó‘Ô)
118 * ƒRƒ“ƒeƒLƒXƒgFcallevel=1(ƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg)
119 * ƒXƒ^ƒbƒNF ƒ^ƒXƒNƒXƒ^ƒbƒN
120 */
121
122.align 2
123dispatch_r:
124 /* ƒ^ƒXƒNƒXƒ^ƒbƒN‚©‚烌ƒWƒXƒ^•œ‹A */
125 lds.l @r15+ , pr
126 mov.l @r15+ , r14
127 mov.l @r15+ , r13
128 mov.l @r15+ , r12
129 mov.l @r15+ , r11
130 mov.l @r15+ , r10
131 mov.l @r15+ , r9
132 mov.l @r15+ , r8
133 rts /* dispatch ŒÄ‚яo‚µŒ³‚Ö–ß‚é. */
134 nop
135
136/*
137 * ƒ^ƒXƒN‹N“®Žžˆ—
138 * ‚±‚±‚Å‚Í, CPUƒƒbƒN‰ðœó‘Ô‚É‚µ, ƒ^ƒXƒN‚ð‹N“®‚·‚é.
139 *
140 * ŒÄoðŒ: FLGƒŒƒWƒXƒ^Iƒrƒbƒg=0xf (CPUƒƒbƒNó‘Ô), ƒ^ƒXƒNƒXƒ^ƒbƒN
141 * callevel = 1(ƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg), ƒ^ƒXƒNƒXƒ^ƒbƒN
142 */
143
144.align 2
145_activate_r:
146 mov.l runtsk_adr ,r2 /* ŽÀsŠJŽnƒ^ƒXƒNID */
147 mov.b @r2 , r0
148 extu.b r0 , r0
149 mov.l tinib_exepri_adr , r2 /* ‰Šú—Dæ“x‚̓ǂݍž‚Ý */
150 mov.b @(r0 , r2) , r1
151 extu.b r1 , r1
152 mov.l tcb_curpri_adr , r3 /* Œ»Ý—Dæ“x‚ɐݒè */
153 mov.b r1 , @(r0 , r3)
154
155 mov #0 , r3
156 shll2 r0
157 mov.l tinib_task_adr , r1
158 mov.l @(r0 , r1) , r2
159 jmp @r2
160 ldc r3 , sr /* ’x‰„ƒXƒƒbƒgAŠ„‚荞‚Ý‹–‰Â */
161
162.align 4
163tinib_exepri_adr:
164 .long _tinib_exepri
165tcb_curpri_adr:
166 .long _tcb_curpri
167tinib_task_adr:
168 .long _tinib_task
169
170/*
171 * dispatcherŒÄ‚яo‚µðŒ:
172 * E‚·‚ׂẴ^ƒXƒN‚̃Rƒ“ƒeƒLƒXƒg‚Í•Û‘¶‚³‚ê‚Ä‚¢‚é.
173 * ESRƒŒƒWƒXƒ^IPLƒrƒbƒg=0xf (CPUƒƒbƒNó‘Ô),
174 * EƒRƒ“ƒeƒLƒXƒg‚̓J[ƒlƒ‹‹N“®Žž‚ðœ‚«ƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg(callevel=1)
175 * callevel‚̏‰Šú’l‚Í1H
176 * ‹N“®Žž‚Í”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg(callevel=1)‚Å, ‚»‚̏ꍇ‚É‚à‘Ήž.
177 * dispatcher ŒÄoŽž‚̃Xƒ^ƒbƒN:
178 * __kernel_dispatch ‚©‚ç‚«‚½ê‡: ƒ^ƒXƒNƒXƒ^ƒbƒN
179 * exit_and_dispatch ‚©‚ç‚«‚½ê‡:
180 * exit_task ‚©‚ç‚«‚½ê‡‚̓^ƒXƒNƒXƒ^ƒbƒN
181 * ƒJ[ƒlƒ‹‹N“®Žž‚ÍŠ„ž‚݃Xƒ^ƒbƒN
182 * ret_int ‚©‚ç‚«‚½ê‡: ƒ^ƒXƒNƒXƒ^ƒbƒN
183 * dispatcher_1 ‚Å‚ÌŠ„ž‚Ý‘Ò‚¿‚©‚ç‚«‚½ê‡: Š„ž‚݃Xƒ^ƒbƒN
184 */
185
186.align 2
187_exit_and_dispatch:
188dispatcher:
189 /* ƒ|ƒXƒgƒ^ƒXƒNƒtƒbƒN‚̌Ăяo‚µ */
190 mov.l PostTaskHook_adr , r0
191 tst r0 , r0
192 bt _start_dispatch
193 mov.l call_posttaskhook_adr , r0
194 jsr @r0
195 nop
196_start_dispatch:
197 mov.l schedtsk_adr, r0 /* schedtsk ‚ð runtsk ‚É */
198 mov.b @r0 , r2
199 extu.b r2 , r2
200 mov.l runtsk_adr , r1
201 mov.b r2 , @r1
202
203 mov.l invalid_tsk , r0
204 cmp/eq r0 , r2 /* schedtsk ‚ª–³Œø‚È‚ç‚΃AƒCƒhƒ‹ƒ‹[ƒv‚Ö */
205 bt pre_idle
206 shll2 r2
207 mov.l tcxb_sp_adr , r0
208 mov.l @(r0 , r2) , r15 /* ƒ^ƒXƒNƒXƒ^ƒbƒNƒ|ƒCƒ“ƒ^‚𕜋A */
209 mov.l tcxb_pc_adr , r0
210 mov.l @(r0 , r2) , r3
211 mov.l PreTaskHook_adr , r1
212 tst r1 , r1
213 bt PreTaskHook_r
214 mov.l call_pretaskhook_adr , r1
215 mov.l r3 , @-r15 /* PreTaskHook—p‚É–ß‚èPC‚ðƒXƒ^ƒbƒN‘Þ”ð */
216 jsr @r1
217 nop
218 mov.l @r15+ , r3 /* –ß‚èPC‚ð–ß‚· */
219PreTaskHook_r:
220 jmp @r3 /* –ß‚è”Ô’n‚Ö */
221 nop
222
223.align 4
224_activate_r_adr:
225 .long _activate_r
226PreTaskHook_adr:
227 .long _PreTaskHook
228PostTaskHook_adr:
229 .long _PostTaskHook
230call_pretaskhook_adr:
231 .long _call_pretaskhook
232call_posttaskhook_adr:
233 .long _call_posttaskhook
234
235/*
236 * ‚±‚±‚©‚ç‚Í schedtsk ‚ª‚È‚¢ê‡
237 */
238.align 2
239pre_idle:
240 /*
241 * ‚±‚±‚Å”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg,Š„ž‚݃Xƒ^ƒbƒN‚ɐ؂芷‚¦‚½‚Ì‚Í,
242 * ‚±‚±‚Å”­¶‚·‚銄ž‚ݏˆ—‚ɂǂ̃Xƒ^ƒbƒN‚ðŽg‚¤‚©‚Æ‚¢‚¤–â‘è‚Ì‰ðŒˆ‚Æ,
243 * Š„ž‚݃nƒ“ƒhƒ‰“à‚ł̃fƒBƒXƒpƒbƒ`–hŽ~‚Æ‚¢‚¤2‚‚̈Ӗ¡‚ª‚ ‚éD
244 */
245 mov.l int_stack, r15 /* Š„ž‚Ý—p‚̃Xƒ^ƒbƒN‚֐ؑւ¦ */
246 mov.l callevel_adr , r0
247 mov #TCL_ISR2 , r1
248 mov.b r1 , @r0 /* ”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg */
249 /* ƒAƒCƒhƒ‹ƒ‹[ƒv‚̏€”õ */
250 mov #0 , r2
251 mov.l _lock_flag_adr , r8
252 mov.l r2 , @r8
253 mov.l mask_ipm , r3
254 mov.l schedtsk_adr , r5
255 mov.l invalid_tsk , r4
256idle_loop:
257 ldc r2 , sr /* Š„‚荞‚Ý‘Ò‚¿ */
258 nop
259 ldc r3 , sr /* Š„‚荞‚Ý‹–‰Â */
260 mov.b @r5 , r1 /* schedtsk‚ð“ǂݏo‚µ */
261 extu.b r1 , r1
262 cmp/eq r4 , r1 /* ƒXƒPƒWƒ…
263[ƒ‹‚·‚ׂ«ƒ^ƒXƒN‚ª‚ ‚é‚©H */
264 bt idle_loop /* Ä‚уAƒCƒhƒ‹ƒ‹[ƒv */
265
266 mov #TCL_TASK , r3
267 mov.b r3 , @r0 /* callevel‚ð–ß‚· */
268 mov #1 , r2
269 mov.l r2 , @r8
270 /* CPUƒƒbƒNó‘Ô‚É */
271 xor r0 , r0
272 mov.l _intmask_adr , r1
273 mov.l r0 , @r1
274 mov.l _lock_flag_adr , r1
275 mov #1 , r0
276 mov.l r0 , @r1
277 bra _start_dispatch /* ƒfƒBƒXƒpƒbƒ`ƒƒ‚Ö */
278 nop
279
280/*
281 * Š„ž‚݃nƒ“ƒhƒ‰oŒûˆ—(ƒfƒBƒXƒpƒbƒ`—v‹‚ ‚è)
282 *
283 * ŒÄo‚µðŒ:
284 * EFLGƒŒƒWƒXƒ^‚ÌIPL=0xf, ƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg(callevel=1)
285 * EŽg—pƒXƒ^ƒbƒN‚̓^ƒXƒNƒXƒ^ƒbƒN
286 * Eƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚Ír0-r7,mach,machl,gbr,pr‚ªƒXƒ^ƒbƒN‚ɐς܂ꂽó‘Ô
287 */
288 .align 2
289 .globl ret_int
290ret_int:
291 /* Žc‚è‚̃ŒƒWƒXƒ^‚ð•Û‘¶ */
292 mov.l r8 , @-r15
293 mov.l r9 , @-r15
294 mov.l r10 , @-r15
295 mov.l r11 , @-r15
296 mov.l r12 , @-r15
297 mov.l r13 , @-r15
298 mov.l r14 , @-r15
299 shll2 r0 /* runtsk‚Ír0‚É“ü‚Á‚Ä‚¢‚é */
300 mov.l tcxb_sp_adr , r1
301 mov.l r15 , @(r0 , r1) /* ƒXƒ^ƒbƒNƒ|ƒCƒ“ƒ^‚ð•Û‘¶ */
302 mov.l tcxb_pc_adr , r1
303 mov.l ret_int_r_adr , r2 /* –ß‚è”Ô’n‚ðret_int_r‚ɐݒè */
304 mov.l r2 , @(r0 , r1) /* ƒXƒ^ƒbƒNƒ|ƒCƒ“ƒ^‚ð•Û‘¶ */
305 /* CPUƒƒbƒNó‘Ô‚É */
306 xor r0 , r0
307 mov.l _intmask_adr , r1
308 mov.l r0 , @r1
309 mov.l _lock_flag_adr , r1
310 mov #1 , r0
311 mov.l r0 , @r1
312 bra dispatcher /* ƒfƒBƒXƒpƒbƒ`ƒƒ‚Ö */
313 nop
314
315.align 4
316ret_int_r_adr:
317 .long ret_int_r
318_intmask_adr:
319 .long _intmask
320_lock_flag_adr:
321 .long _lock_flag
322
323
324/*
325 * ŒÄ‚яo‚µðŒ: IPL=0xf, (CPUƒƒbƒNó‘Ô),
326 * callevel=1(ƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg), ƒ^ƒXƒNƒXƒ^ƒbƒN
327 * ƒXƒ^ƒbƒN‚É‚Ír14-r8,gbr,mach,machl,pr,r7-r0‚̏‡‚Őς܂ê‚Ä‚¢‚é
328 */
329.align 2
330ret_int_r:
331 mov.l @r15+ , r14 /* ƒŒƒWƒXƒ^‚𕜋A */
332 mov.l @r15+ , r13
333 mov.l @r15+ , r12
334 mov.l @r15+ , r11
335 mov.l @r15+ , r10
336 mov.l @r15+ , r9
337 mov.l @r15+ , r8
338 ldc.l @r15+ , gbr
339 lds.l @r15+ , mach
340 lds.l @r15+ , macl
341 lds.l @r15+ , pr
342 mov.l @r15+ , r7
343 mov.l @r15+ , r6
344 mov.l @r15+ , r5
345 mov.l @r15+ , r4
346 mov.l @r15+ , r3
347 mov.l @r15+ , r2
348 mov.l @r15+ , r1
349 mov.l @r15+ , r0
350 rte /* Š„‚荞‚ÝŒ³‚Ö•œ‹A */
351 nop
352
353/*
354 * Š„ž‚ݏo“üŒûˆ—(ƒAƒZƒ“ƒuƒŠŒ¾Œê‹Lq•”•ª)
355 *
356 * ŒÄo‚µðŒ:
357 * ESRƒŒƒWƒXƒ^‚ÌIPL‚Í0xf
358 * EƒXƒ^ƒbƒN‚Í‘½dŠ„‚荞‚݂Ȃ犄ž‚݃Xƒ^ƒbƒN, ‚»‚¤‚Å‚È‚¯‚ê‚Î
359 * ƒ^ƒXƒNƒXƒ^ƒbƒN
360 * Er0 ‚É‚ÍŠ„ž‚݃nƒ“ƒhƒ‰‚̃AƒhƒŒƒX‚ªŠi”[‚³‚ê‚Ä‚¢‚é.
361 * Er1 ‚É‚Í‘O‰ñ‚ÌŽÀs’†Š„ž‚ÝID‚ªŠi”[‚³‚ê‚Ä‚¢‚éD
362 * Er2 ‚É‚ÍŠ„‚荞‚ÝŽó•tŽž‚ÌSRƒŒƒWƒXƒ^‚Ì’l‚ªŠi”[‚³‚ê‚Ä‚¢‚é
363 *
364 * ƒŒƒWƒXƒ^‚ªƒXƒ^ƒbƒNã‚ɂǂ̂悤‚É•Û‘¶‚³‚ê‚Ä‚¢‚é‚©‚ðˆÈ‰º‚ÉŽ¦‚·.
365 * ‚±‚̐}‚ł͏オ’áˆÊ, ‰º‚ª‚ˆÊ‚̃AƒhƒŒƒX‚Å, ƒXƒ^ƒbƒN‚͉º‚©‚ç
366 * ã•ûŒü‚ÉŒü‚©‚Á‚Đςݏグ‚ç‚ê‚é‚à‚Ì‚Æ‚·‚é.
367 *
368 * -------------------------
369 * | R3(4byte) |
370 * --------------------------
371 * | R2(4byte) |
372 * --------------------------
373 * | R1(4byte) |
374 * --------------------------
375 * | R0(4byte) |
376 * --------------------------
377 * | SR(4byte) | <- Š„‚荞‚Ý”­¶Žž‚ÌSRƒŒƒWƒXƒ^(H/W‚É‚Ä•Û‘¶)
378 * --------------------------
379 * | PC(4byte) | <- Š„‚荞‚Ý‚©‚ç•œ‹A‚·‚éPC(H/W‚É‚Ä•Û‘¶)
380 * --------------------------
381 *
382 * Š„‚荞‚Ý‹¤’Ê•”‚ÅŽc‚è‚̃ŒƒWƒXƒ^‚ð‘Þ”ð‚µ‚½Œã‚̃Xƒ^ƒbƒN‚ðˆÈ‰º‚ÉŽ¦‚·D
383 * -------------------------
384 * | GBR(4byte) |
385 * -------------------------
386 * | MACH(4byte) |
387 * -------------------------
388 * | MACL(4byte) |
389 * -------------------------
390 * | PR(4byte) |
391 * -------------------------
392 * | R7(4byte) |
393 * -------------------------
394 * | R6(4byte) |
395 * -------------------------
396 * | R5(4byte) |
397 * -------------------------
398 * | R4(4byte) |
399 * -------------------------
400 * | R3(4byte) |
401 * --------------------------
402 * | R2(4byte) |
403 * --------------------------
404 * | R1(4byte) |
405 * --------------------------
406 * | R0(4byte) |
407 * --------------------------
408 * | SR(4byte) | <- Š„‚荞‚Ý”­¶Žž‚ÌSRƒŒƒWƒXƒ^(H/W‚É‚Ä•Û‘¶)
409 * --------------------------
410 * | PC(4byte) | <- Š„‚荞‚Ý‚©‚ç•œ‹A‚·‚éPC(H/W‚É‚Ä•Û‘¶)
411 * --------------------------
412 *
413 * ’x‰„ƒfƒBƒXƒpƒbƒ`—v‹Žž‚Éret_int‚ɂăXƒ^ƒbƒN‚ɐς܂ê‚郌ƒWƒXƒ^‚ð
414 * ˆÈ‰º‚ÉŽ¦‚·D
415 *
416 * -------------------------
417 * | R14(4byte) |
418 * -------------------------
419 * | R13(4byte) |
420 * -------------------------
421 * | R12(4byte) |
422 * --------------------------
423 * | R11(4byte) |
424 * --------------------------
425 * | R10(4byte) |
426 * --------------------------
427 * | R9(4byte) |
428 * -------------------------
429 * | R8(4byte) |
430 * -------------------------
431 * | MACH(4byte) |
432 * -------------------------
433 * | MACL(4byte) |
434 * -------------------------
435 * | PR(4byte) |
436 * -------------------------
437 * | R7(4byte) |
438 * -------------------------
439 * | R6(4byte) |
440 * -------------------------
441 * | R5(4byte) |
442 * -------------------------
443 * | R4(4byte) |
444 * -------------------------
445 * | R3(4byte) |
446 * --------------------------
447 * | R2(4byte) |
448 * --------------------------
449 * | R1(4byte) |
450 * --------------------------
451 * | R0(4byte) |
452 * --------------------------
453 * | SR(4byte) | <- Š„‚荞‚Ý”­¶Žž‚ÌSRƒŒƒWƒXƒ^(H/W‚É‚Ä•Û‘¶)
454 * --------------------------
455 * | PC(4byte) | <- Š„‚荞‚Ý‚©‚ç•œ‹A‚·‚éPC(H/W‚É‚Ä•Û‘¶)
456 * --------------------------
457 *
458 * ƒnƒ“ƒhƒ‰‚©‚烊ƒ^[ƒ“‚µ‚½Œã‚Í, ‘½dŠ„ž‚Ý‚Å‚È‚­,
459 * ƒfƒBƒXƒpƒbƒ`—v‹‚ª‚ ‚鎞(schedtsk != runtsk)‚ɁC
460 * ret_int ‚Ö•ªŠò‚·‚éD
461 *
462 * ‘½dŠ„ž‚Ý‚©‚Ç‚¤‚©‚Ícallevel‚Ì’l‚Å”»’è‚·‚é.
463 * callevel != 1 ‚È‚ç‚Α½dŠ„ž‚Ý‚Å‚ ‚é‚Æ”»’è‚·‚é.
464 *
465 */
466
467.align 2
468_interrupt:
469 /* Žc‚è‚̃Xƒ^ƒbƒN‚ð‘Þ”ð */
470 mov.l r4 , @-r15
471 mov.l r5 , @-r15
472 mov.l r6 , @-r15
473 mov.l r7 , @-r15
474 sts.l pr , @-r15
475 sts.l macl , @-r15
476 sts.l mach , @-r15
477 stc.l gbr , @-r15
478 mov #TCL_TASK , r4 /* ‘½dŠ„‚荞‚Ý‚©‚ðƒ`ƒFƒbƒN */
479 mov.l callevel_adr , r3
480 mov.b @r3 , r5
481 cmp/eq r4 , r5
482 bf int_from_int
483int_from_task:
484 mov.l int_stack , r4 /* ƒXƒ^ƒbƒN‚ðØ‚è‘Ö‚¦ */
485 mov.l r15 , @-r4
486 mov r4 , r15
487 mov #TCL_ISR2 , r6 /* ŽÀsƒŒƒxƒ‹‚ð•ÏX */
488 mov.b r6 , @r3
489int_from_int:
490 mov.w r1 , @-r15 /* ‘O‚ÌŠ„‚荞‚ÝID‚ðƒXƒ^ƒbƒN‚É•Û‘¶ */
491 mov.w r5 , @-r15 /* ‘O‚ÌŽÀsƒŒƒxƒ‹‚ðƒXƒ^ƒbƒN‚É•Û‘¶ */
492 /* ‚±‚±‚я[ƒh‚Å•Û‘¶‚µ‚Ä‚¢‚é‚̂́A */
493 /* SP‚ð4ƒoƒCƒg‹«ŠE‚ɕۂ‚½‚ß‚Å‚ ‚é */
494 ldc r2 , sr /* Š„‚荞‚Ý‹–‰Â */
495 jsr @r0 /* Š„‚荞‚݃‹[ƒ`ƒ“ŒÄ‚яo‚µ */
496 nop
497 mov.l mask_ipm , r0 /* Š„‚荞‚Ý‹ÖŽ~ */
498 ldc r0 , sr
499 mov.w @r15+ , r0 /* ‘O‚ÌŽÀsƒŒƒxƒ‹‚𕜋A */
500 mov.l callevel_adr , r1
501 mov.b r0 , @r1
502 mov.w @r15+ , r2 /* ‘O‚ÌŠ„‚荞‚ÝID‚𕜋A */
503 mov.l runisr_adr , r1
504 mov.b r2 , @r1
505 mov #TCL_TASK , r1 /* ‘½dŠ„‚荞‚Ý‚©‚Ç‚¤‚©H */
506 cmp/eq r0 , r1
507 bf int_return
508
509 /* ‰’i‚ÌŠ„‚荞‚Ý‚©‚ç•œ‹A‚·‚鏈— */
510 mov.l @r15 , r15 /* ƒ^ƒXƒNƒXƒ^ƒbƒN‚É–ß‚· */
511 mov.l callevel_adr , r2
512 mov.b r1 , @r2
513
514 /* Š„‚荞‚Ý“ü‚èŒû‚ÅŠ„‚荞‚Ý‚ª“ü‚Á‚Ä‚È‚¢‚©‚ðŠm”F */
515 mov r15 , r0
516 mov.l @(52, r0) , r0 /* Š„‚荞‚Ý‘O‚ÌSRƒŒƒWƒXƒ^‚ðŽæ‚èo‚µ */
517 mov.l mask_ipm , r1 /* IPM‚ðŽæ‚èo‚µ */
518 and r1 , r0
519 tst r0 , r0 /* 0‚©‚Ç‚¤‚©ƒ`ƒFƒbƒN */
520 bf int_return /* 0‚Å‚È‚¢ê‡‚Í‘½dŠ„‚荞‚Ý */
521
522 mov.l runtsk_adr , r1 /* ƒfƒBƒXƒpƒbƒ`—v‹‚ª‚ ‚é‚©H */
523 mov.b @r1 , r0
524 extu.b r0 , r0
525 mov.l schedtsk_adr , r1
526 mov.b @r1 , r2
527 extu.b r2 , r2
528 cmp/eq r0 , r2
529 bf ret_int
530int_return:
531 ldc.l @r15+ , gbr /* ƒŒƒWƒXƒ^‚𕜋A */
532 lds.l @r15+ , mach
533 lds.l @r15+ , macl
534 lds.l @r15+ , pr
535 mov.l @r15+ , r7
536 mov.l @r15+ , r6
537 mov.l @r15+ , r5
538 mov.l @r15+ , r4
539 mov.l @r15+ , r3
540 mov.l @r15+ , r2
541 mov.l @r15+ , r1
542 mov.l @r15+ , r0
543 rte /* Š„‚荞‚ÝŒ³‚É•œ‹A */
544 nop
545
546
547/* –¢Žg—pŠ„ž‚݂̏ˆ— */
548.globl _unused_interrupt
549_unused_interrupt:
550 rte
551 nop
552
553.align 4
554runtsk_adr:
555 .long _runtsk
556schedtsk_adr:
557 .long _schedtsk
558tcxb_sp_adr:
559 .long _tcxb_sp
560tcxb_pc_adr:
561 .long _tcxb_pc
562int_stack:
563 .long STACK_TOP
564callevel_adr:
565 .long _callevel
566runisr_adr:
567 .long _runisr
568mask_ipm:
569 .long 0x000000f0
570invalid_tsk:
571 .long INVALID_TASK
572
573/* ’萔‚Ì’è‹` */
574.equ TCL_TASK , 1
575.equ TCL_ISR2 , 2
576.equ INVALID_TASK , 0xff
577
578
579
580 .end
Note: See TracBrowser for help on using the repository browser.