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

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

Interface誌2006年8月号添付のTOPPERS/OSEK用SH2をTOPPERS/ATK1に対応させました.多少のバグフィックスも行っています.

File size: 15.0 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 bra _start_dispatch /* ƒfƒBƒXƒpƒbƒ`ƒƒ‚Ö */
271 nop
272
273/*
274 * Š„ž‚݃nƒ“ƒhƒ‰oŒûˆ—(ƒfƒBƒXƒpƒbƒ`—v‹‚ ‚è)
275 *
276 * ŒÄo‚µðŒ:
277 * EFLGƒŒƒWƒXƒ^‚ÌIPL=0xf, ƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg(callevel=1)
278 * EŽg—pƒXƒ^ƒbƒN‚̓^ƒXƒNƒXƒ^ƒbƒN
279 * Eƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚Ír0-r7,mach,machl,gbr,pr‚ªƒXƒ^ƒbƒN‚ɐς܂ꂽó‘Ô
280 */
281 .align 2
282 .globl ret_int
283ret_int:
284 /* Žc‚è‚̃ŒƒWƒXƒ^‚ð•Û‘¶ */
285 mov.l r8 , @-r15
286 mov.l r9 , @-r15
287 mov.l r10 , @-r15
288 mov.l r11 , @-r15
289 mov.l r12 , @-r15
290 mov.l r13 , @-r15
291 mov.l r14 , @-r15
292 shll2 r0 /* runtsk‚Ír0‚É“ü‚Á‚Ä‚¢‚é */
293 mov.l tcxb_sp_adr , r1
294 mov.l r15 , @(r0 , r1) /* ƒXƒ^ƒbƒNƒ|ƒCƒ“ƒ^‚ð•Û‘¶ */
295 mov.l tcxb_pc_adr , r1
296 mov.l ret_int_r_adr , r2 /* –ß‚è”Ô’n‚ðret_int_r‚ɐݒè */
297 mov.l r2 , @(r0 , r1) /* ƒXƒ^ƒbƒNƒ|ƒCƒ“ƒ^‚ð•Û‘¶ */
298 /* CPUƒƒbƒNó‘Ô‚É‚É */
299 xor r0 , r0
300 mov.l _intmask_adr , r1
301 mov.l r0 , @r1
302 mov.l _lock_flag_adr , r1
303 mov #1 , r0
304 mov.l r0 , @r1
305 bra dispatcher /* ƒfƒBƒXƒpƒbƒ`ƒƒ‚Ö */
306 nop
307
308.align 4
309ret_int_r_adr:
310 .long ret_int_r
311_intmask_adr:
312 .long _intmask
313_lock_flag_adr:
314 .long _lock_flag
315
316
317/*
318 * ŒÄ‚яo‚µðŒ: IPL=0xf, (CPUƒƒbƒNó‘Ô),
319 * callevel=1(ƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg), ƒ^ƒXƒNƒXƒ^ƒbƒN
320 * ƒXƒ^ƒbƒN‚É‚Ír14-r8,gbr,mach,machl,pr,r7-r0‚̏‡‚Őς܂ê‚Ä‚¢‚é
321 */
322.align 2
323ret_int_r:
324 mov.l @r15+ , r14 /* ƒŒƒWƒXƒ^‚𕜋A */
325 mov.l @r15+ , r13
326 mov.l @r15+ , r12
327 mov.l @r15+ , r11
328 mov.l @r15+ , r10
329 mov.l @r15+ , r9
330 mov.l @r15+ , r8
331 ldc.l @r15+ , gbr
332 lds.l @r15+ , mach
333 lds.l @r15+ , macl
334 lds.l @r15+ , pr
335 mov.l @r15+ , r7
336 mov.l @r15+ , r6
337 mov.l @r15+ , r5
338 mov.l @r15+ , r4
339 mov.l @r15+ , r3
340 mov.l @r15+ , r2
341 mov.l @r15+ , r1
342 mov.l @r15+ , r0
343 rte /* Š„‚荞‚ÝŒ³‚Ö•œ‹A */
344 nop
345
346/*
347 * Š„ž‚ݏo“üŒûˆ—(ƒAƒZƒ“ƒuƒŠŒ¾Œê‹Lq•”•ª)
348 *
349 * ŒÄo‚µðŒ:
350 * ESRƒŒƒWƒXƒ^‚ÌIPL‚Í0xf
351 * EƒXƒ^ƒbƒN‚Í‘½dŠ„‚荞‚݂Ȃ犄ž‚݃Xƒ^ƒbƒN, ‚»‚¤‚Å‚È‚¯‚ê‚Î
352 * ƒ^ƒXƒNƒXƒ^ƒbƒN
353 * Er0 ‚É‚ÍŠ„ž‚݃nƒ“ƒhƒ‰‚̃AƒhƒŒƒX‚ªŠi”[‚³‚ê‚Ä‚¢‚é.
354 * Er1 ‚É‚Í‘O‰ñ‚ÌŽÀs’†Š„ž‚ÝID‚ªŠi”[‚³‚ê‚Ä‚¢‚éD
355 * Er2 ‚É‚ÍŠ„‚荞‚ÝŽó•tŽž‚ÌSRƒŒƒWƒXƒ^‚Ì’l‚ªŠi”[‚³‚ê‚Ä‚¢‚é
356 *
357 * ƒŒƒWƒXƒ^‚ªƒXƒ^ƒbƒNã‚ɂǂ̂悤‚É•Û‘¶‚³‚ê‚Ä‚¢‚é‚©‚ðˆÈ‰º‚ÉŽ¦‚·.
358 * ‚±‚̐}‚ł͏オ’áˆÊ, ‰º‚ª‚ˆÊ‚̃AƒhƒŒƒX‚Å, ƒXƒ^ƒbƒN‚͉º‚©‚ç
359 * ã•ûŒü‚ÉŒü‚©‚Á‚Đςݏグ‚ç‚ê‚é‚à‚Ì‚Æ‚·‚é.
360 *
361 * -------------------------
362 * | R3(4byte) |
363 * --------------------------
364 * | R2(4byte) |
365 * --------------------------
366 * | R1(4byte) |
367 * --------------------------
368 * | R0(4byte) |
369 * --------------------------
370 * | SR(4byte) | <- Š„‚荞‚Ý”­¶Žž‚ÌSRƒŒƒWƒXƒ^(H/W‚É‚Ä•Û‘¶)
371 * --------------------------
372 * | PC(4byte) | <- Š„‚荞‚Ý‚©‚ç•œ‹A‚·‚éPC(H/W‚É‚Ä•Û‘¶)
373 * --------------------------
374 *
375 * Š„‚荞‚Ý‹¤’Ê•”‚ÅŽc‚è‚̃ŒƒWƒXƒ^‚ð‘Þ”ð‚µ‚½Œã‚̃Xƒ^ƒbƒN‚ðˆÈ‰º‚ÉŽ¦‚·D
376 * -------------------------
377 * | GBR(4byte) |
378 * -------------------------
379 * | MACH(4byte) |
380 * -------------------------
381 * | MACL(4byte) |
382 * -------------------------
383 * | PR(4byte) |
384 * -------------------------
385 * | R7(4byte) |
386 * -------------------------
387 * | R6(4byte) |
388 * -------------------------
389 * | R5(4byte) |
390 * -------------------------
391 * | R4(4byte) |
392 * -------------------------
393 * | R3(4byte) |
394 * --------------------------
395 * | R2(4byte) |
396 * --------------------------
397 * | R1(4byte) |
398 * --------------------------
399 * | R0(4byte) |
400 * --------------------------
401 * | SR(4byte) | <- Š„‚荞‚Ý”­¶Žž‚ÌSRƒŒƒWƒXƒ^(H/W‚É‚Ä•Û‘¶)
402 * --------------------------
403 * | PC(4byte) | <- Š„‚荞‚Ý‚©‚ç•œ‹A‚·‚éPC(H/W‚É‚Ä•Û‘¶)
404 * --------------------------
405 *
406 * ’x‰„ƒfƒBƒXƒpƒbƒ`—v‹Žž‚Éret_int‚ɂăXƒ^ƒbƒN‚ɐς܂ê‚郌ƒWƒXƒ^‚ð
407 * ˆÈ‰º‚ÉŽ¦‚·D
408 *
409 * -------------------------
410 * | R14(4byte) |
411 * -------------------------
412 * | R13(4byte) |
413 * -------------------------
414 * | R12(4byte) |
415 * --------------------------
416 * | R11(4byte) |
417 * --------------------------
418 * | R10(4byte) |
419 * --------------------------
420 * | R9(4byte) |
421 * -------------------------
422 * | R8(4byte) |
423 * -------------------------
424 * | MACH(4byte) |
425 * -------------------------
426 * | MACL(4byte) |
427 * -------------------------
428 * | PR(4byte) |
429 * -------------------------
430 * | R7(4byte) |
431 * -------------------------
432 * | R6(4byte) |
433 * -------------------------
434 * | R5(4byte) |
435 * -------------------------
436 * | R4(4byte) |
437 * -------------------------
438 * | R3(4byte) |
439 * --------------------------
440 * | R2(4byte) |
441 * --------------------------
442 * | R1(4byte) |
443 * --------------------------
444 * | R0(4byte) |
445 * --------------------------
446 * | SR(4byte) | <- Š„‚荞‚Ý”­¶Žž‚ÌSRƒŒƒWƒXƒ^(H/W‚É‚Ä•Û‘¶)
447 * --------------------------
448 * | PC(4byte) | <- Š„‚荞‚Ý‚©‚ç•œ‹A‚·‚éPC(H/W‚É‚Ä•Û‘¶)
449 * --------------------------
450 *
451 * ƒnƒ“ƒhƒ‰‚©‚烊ƒ^[ƒ“‚µ‚½Œã‚Í, ‘½dŠ„ž‚Ý‚Å‚È‚­,
452 * ƒfƒBƒXƒpƒbƒ`—v‹‚ª‚ ‚鎞(schedtsk != runtsk)‚ɁC
453 * ret_int ‚Ö•ªŠò‚·‚éD
454 *
455 * ‘½dŠ„ž‚Ý‚©‚Ç‚¤‚©‚Ícallevel‚Ì’l‚Å”»’è‚·‚é.
456 * callevel != 1 ‚È‚ç‚Α½dŠ„ž‚Ý‚Å‚ ‚é‚Æ”»’è‚·‚é.
457 *
458 */
459
460.align 2
461_interrupt:
462 /* Žc‚è‚̃Xƒ^ƒbƒN‚ð‘Þ”ð */
463 mov.l r4 , @-r15
464 mov.l r5 , @-r15
465 mov.l r6 , @-r15
466 mov.l r7 , @-r15
467 sts.l pr , @-r15
468 sts.l macl , @-r15
469 sts.l mach , @-r15
470 stc.l gbr , @-r15
471 mov #TCL_TASK , r4 /* ‘½dŠ„‚荞‚Ý‚©‚ðƒ`ƒFƒbƒN */
472 mov.l callevel_adr , r3
473 mov.b @r3 , r5
474 cmp/eq r4 , r5
475 bf int_from_int
476int_from_task:
477 mov.l int_stack , r4 /* ƒXƒ^ƒbƒN‚ðØ‚è‘Ö‚¦ */
478 mov.l r15 , @-r4
479 mov r4 , r15
480 mov #TCL_ISR2 , r6 /* ŽÀsƒŒƒxƒ‹‚ð•ÏX */
481 mov.b r6 , @r3
482int_from_int:
483 mov.w r1 , @-r15 /* ‘O‚ÌŠ„‚荞‚ÝID‚ðƒXƒ^ƒbƒN‚É•Û‘¶ */
484 mov.w r5 , @-r15 /* ‘O‚ÌŽÀsƒŒƒxƒ‹‚ðƒXƒ^ƒbƒN‚É•Û‘¶ */
485 /* ‚±‚±‚я[ƒh‚Å•Û‘¶‚µ‚Ä‚¢‚é‚̂́A */
486 /* SP‚ð4ƒoƒCƒg‹«ŠE‚ɕۂ‚½‚ß‚Å‚ ‚é */
487 ldc r2 , sr /* Š„‚荞‚Ý‹–‰Â */
488 jsr @r0 /* Š„‚荞‚݃‹[ƒ`ƒ“ŒÄ‚яo‚µ */
489 nop
490 mov.l mask_ipm , r0 /* Š„‚荞‚Ý‹ÖŽ~ */
491 ldc r0 , sr
492 mov.w @r15+ , r0 /* ‘O‚ÌŽÀsƒŒƒxƒ‹‚𕜋A */
493 mov.l callevel_adr , r1
494 mov.b r0 , @r1
495 mov.w @r15+ , r2 /* ‘O‚ÌŠ„‚荞‚ÝID‚𕜋A */
496 mov.l runisr_adr , r1
497 mov.b r2 , @r1
498 mov #TCL_TASK , r1 /* ‘½dŠ„‚荞‚Ý‚©‚Ç‚¤‚©H */
499 cmp/eq r0 , r1
500 bf int_return
501
502 /* ‰’i‚ÌŠ„‚荞‚Ý‚©‚ç•œ‹A‚·‚鏈— */
503 mov.l @r15 , r15 /* ƒ^ƒXƒNƒXƒ^ƒbƒN‚É–ß‚· */
504 mov.l callevel_adr , r2
505 mov.b r1 , @r2
506
507 /* Š„‚荞‚Ý“ü‚èŒû‚ÅŠ„‚荞‚Ý‚ª“ü‚Á‚Ä‚È‚¢‚©‚ðŠm”F */
508 mov r15 , r0
509 mov.l @(52, r0) , r0 /* Š„‚荞‚Ý‘O‚ÌSRƒŒƒWƒXƒ^‚ðŽæ‚èo‚µ */
510 mov.l mask_ipm , r1 /* IPM‚ðŽæ‚èo‚µ */
511 and r1 , r0
512 tst r0 , r0 /* 0‚©‚Ç‚¤‚©ƒ`ƒFƒbƒN */
513 bf int_return /* 0‚Å‚È‚¢ê‡‚Í‘½dŠ„‚荞‚Ý */
514
515 mov.l runtsk_adr , r1 /* ƒfƒBƒXƒpƒbƒ`—v‹‚ª‚ ‚é‚©H */
516 mov.b @r1 , r0
517 extu.b r0 , r0
518 mov.l schedtsk_adr , r1
519 mov.b @r1 , r2
520 extu.b r2 , r2
521 cmp/eq r0 , r2
522 bf ret_int
523int_return:
524 ldc.l @r15+ , gbr /* ƒŒƒWƒXƒ^‚𕜋A */
525 lds.l @r15+ , mach
526 lds.l @r15+ , macl
527 lds.l @r15+ , pr
528 mov.l @r15+ , r7
529 mov.l @r15+ , r6
530 mov.l @r15+ , r5
531 mov.l @r15+ , r4
532 mov.l @r15+ , r3
533 mov.l @r15+ , r2
534 mov.l @r15+ , r1
535 mov.l @r15+ , r0
536 rte /* Š„‚荞‚ÝŒ³‚É•œ‹A */
537 nop
538
539
540/* –¢Žg—pŠ„ž‚݂̏ˆ— */
541.globl _unused_interrupt
542_unused_interrupt:
543 rte
544 nop
545
546.align 4
547runtsk_adr:
548 .long _runtsk
549schedtsk_adr:
550 .long _schedtsk
551tcxb_sp_adr:
552 .long _tcxb_sp
553tcxb_pc_adr:
554 .long _tcxb_pc
555int_stack:
556 .long STACK_TOP
557callevel_adr:
558 .long _callevel
559runisr_adr:
560 .long _runisr
561mask_ipm:
562 .long 0x000000f0
563invalid_tsk:
564 .long INVALID_TASK
565
566/* ’萔‚Ì’è‹` */
567.equ TCL_TASK , 1
568.equ TCL_ISR2 , 2
569.equ INVALID_TASK , 0xff
570
571
572
573 .end
Note: See TracBrowser for help on using the repository browser.