source: asp_ewarm/asp-1.7.0/arch/arm_m_iccarm/prc_support.S@ 61

Last change on this file since 61 was 61, checked in by ertl-honda, 11 years ago

ASP for EWARM のコミット.

File size: 27.7 KB
Line 
1/*
2 * TOPPERS/ASP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Advanced Standard Profile Kernel
5 *
6 * Copyright (C) 2008 by Embedded and Real-Time Systems Laboratory
7 * Graduate School of Information Science, Nagoya Univ., JAPAN
8 *
9 * ã‹L’˜ìŒ ŽÒ‚́CˆÈ‰º‚Ì(1)`(4)‚ÌðŒ‚ð–ž‚½‚·ê‡‚ÉŒÀ‚èC–{ƒ\ƒtƒgƒEƒF
10 * ƒAi–{ƒ\ƒtƒgƒEƒFƒA‚ð‰ü•Ï‚µ‚½‚à‚Ì‚ðŠÜ‚ށDˆÈ‰º“¯‚¶j‚ðŽg—pE•¡»E‰ü
11 * •ÏEÄ”z•ziˆÈ‰ºC—˜—p‚ƌĂԁj‚·‚邱‚Ƃ𖳏ž‚Å‹–‘ø‚·‚éD
12 * (1) –{ƒ\ƒtƒgƒEƒFƒA‚ðƒ\[ƒXƒR[ƒh‚ÌŒ`‚Å—˜—p‚·‚éê‡‚ɂ́Cã‹L‚Ì’˜ì
13 * Œ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’肪C‚»‚Ì‚Ü‚Ü‚ÌŒ`‚Ń\[
14 * ƒXƒR[ƒh’†‚ÉŠÜ‚Ü‚ê‚Ä‚¢‚邱‚ƁD
15 * (2) –{ƒ\ƒtƒgƒEƒFƒA‚ðCƒ‰ƒCƒuƒ‰ƒŠŒ`Ž®‚ȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
16 * —p‚Å‚«‚éŒ`‚ōĔz•z‚·‚éê‡‚ɂ́CÄ”z•z‚É”º‚¤ƒhƒLƒ…
17ƒƒ“ƒgi—˜—p
18 * ŽÒƒ}ƒjƒ…
19ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L
20 * ‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
21 * (3) –{ƒ\ƒtƒgƒEƒFƒA‚ðC‹@Ší‚É‘g‚ݍž‚ނȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
22 * —p‚Å‚«‚È‚¢Œ`‚ōĔz•z‚·‚éê‡‚ɂ́CŽŸ‚Ì‚¢‚¸‚ê‚©‚ÌðŒ‚ð–ž‚½‚·‚±
23 * ‚ƁD
24 * (a) Ä”z•z‚É”º‚¤ƒhƒLƒ…
25ƒƒ“ƒgi—˜—pŽÒƒ}ƒjƒ…
26ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜
27 * ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
28 * (b) Ä”z•z‚ÌŒ`‘Ô‚ðC•Ê‚É’è‚ß‚é•û–@‚É‚æ‚Á‚āCTOPPERSƒvƒƒWƒFƒNƒg‚É
29 * •ñ‚·‚邱‚ƁD
30 * (4) –{ƒ\ƒtƒgƒEƒFƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚é‚¢‚©‚Ȃ鑹
31 * ŠQ‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð–Ɛӂ·‚邱‚ƁD
32 * ‚Ü‚½C–{ƒ\ƒtƒgƒEƒFƒA‚̃†[ƒU‚Ü‚½‚̓Gƒ“ƒhƒ†[ƒU‚©‚ç‚Ì‚¢‚©‚Ȃ闝
33 * —R‚ÉŠî‚­¿‹‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð
34 * –Ɛӂ·‚邱‚ƁD
35 *
36 * –{ƒ\ƒtƒgƒEƒFƒA‚́C–³•ÛØ‚Å’ñ‹Ÿ‚³‚ê‚Ä‚¢‚é‚à‚Ì‚Å‚ ‚éDã‹L’˜ìŒ ŽÒ‚¨
37 * ‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚́C–{ƒ\ƒtƒgƒEƒFƒA‚ÉŠÖ‚µ‚āC“Á’è‚ÌŽg—p–Ú“I
38 * ‚ɑ΂·‚é“K‡«‚àŠÜ‚߂āC‚¢‚©‚È‚é•ÛØ‚às‚í‚È‚¢D‚Ü‚½C–{ƒ\ƒtƒgƒEƒF
39 * ƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚½‚¢‚©‚Ȃ鑹ŠQ‚ÉŠÖ‚µ‚Ä‚àC‚»
40 * ‚̐ӔC‚𕉂í‚È‚¢D
41 *
42 */
43
44 NAME core_support
45/*
46 * ƒvƒƒZƒbƒTˆË‘¶ƒ‚ƒWƒ…
47[ƒ‹ ƒAƒZƒ“ƒuƒŠŒ¾Œê•”iARM-M—pj
48 */
49
50#define TOPPERS_MACRO_ONLY
51#define UINT_C(val) (val) /* uint_tŒ^‚̒萔‚ðì‚éƒ}ƒNƒ */
52#define ULONG_C(val) (val) /* ulong_tŒ^‚̒萔‚ðì‚éƒ}ƒNƒ */
53#define CAST(type, val) (val) /* Œ^ƒLƒƒƒXƒg‚ðs‚¤ƒ}ƒNƒ */
54
55#include "kernel_impl.h"
56#include "arm_m.h"
57#include "offset.h"
58
59
60/*
61 * ƒ^ƒXƒNƒfƒBƒXƒpƒbƒ`ƒƒ
62 */
63 PUBLIC dispatch
64 IMPORT p_runtsk
65
66 SECTION .text : CODE (2)
67 THUMB
68dispatch:
69 /*
70 *
71 * ‚±‚̃‹[ƒ`ƒ“‚́Cƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒgECPUƒƒbƒNó‘ԁEƒfƒBƒpƒbƒ`‹–‰Âó‘Ô
72 * Eiƒ‚ƒfƒ‹ã‚́jŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‘SŠJó‘ԂŌĂяo‚³‚ê‚éD
73 */
74 stmfd sp!,{r4-r11,lr} /* ƒŒƒWƒXƒ^‚Ì•Û‘¶ */
75 ldr r0, =p_runtsk /* p_runtsk‚ð“ǂݍž‚Þ */
76 ldr r1, [r0]
77 str sp, [r1,#TCB_sp] /* ƒ^ƒXƒNƒXƒ^ƒbƒN‚ð•Û‘¶ */
78 ldr lr, =dispatch_r /* ŽÀsÄŠJ”Ô’n‚ð•Û‘¶ */
79 str lr, [r1,#TCB_pc]
80 b dispatcher
81
82 IMPORT call_texrtn
83 IMPORT ipmflg
84
85 SECTION .text : CODE (2)
86 THUMB
87dispatch_r:
88 ldmfd sp!,{r4 - r11,lr} /* ƒŒƒWƒXƒ^‚Ì•œ‹A */
89 /*
90 * ƒ^ƒXƒN—áŠOˆ—ƒ‹[ƒ`ƒ“‚Ì‹N“®
91 * dispatcher‚©‚çŒÄ‚яo‚³‚ê‚邽‚߁CTCB‚̃AƒhƒŒƒX‚Ír1‚É“ü‚Á‚Ä‚¢‚é
92 */
93 ldrb r0,[r1,#TCB_enatex]
94 tst r0,#TCB_enatex_mask
95 beq dispatch_r_1 /* enatex ‚ª false ‚Ȃ烊ƒ^[ƒ“ */
96 ldr r0,[r1,#TCB_texptn] /* texptn ‚ª0‚Å‚È‚¯‚ê‚Î */
97 tst r0,r0
98 beq dispatch_r_1 /* ƒ^ƒXƒN—áŠOƒ‹[ƒ`ƒ“‚̌Ăяo‚µ */
99 ldr r1, =ipmflg /* ipmflg‚ª false ‚Ȃ烊ƒ^[ƒ“ */
100 ldr r0, [r1]
101 tst r0,r0
102 /*bne call_texrtn /* ƒ^ƒXƒN—áŠOƒ‹[ƒ`ƒ“‚̌Ăяo‚µ */
103 beq dispatch_r_1
104 ldr r0, =call_texrtn /* ƒ^ƒXƒN—áŠOƒ‹[ƒ`ƒ“‚̌Ăяo‚µ */
105 bx r0
106dispatch_r_1: /* ƒ^ƒXƒN‚Ö‚Ìcall_textn‚©‚ç–ß‚é */
107 /*mov pc,lr*/
108 bx lr
109
110
111/*
112 * CPU—áŠOƒGƒ“ƒgƒŠ
113 *
114 * Š„ž‚݃Gƒ“ƒgƒŠ‚Əˆ—‚Ì“à—e‚Í“¯“™‚¾‚ªCƒƒO‚ÌŽí—Þ‚ªˆÙ‚Ȃ邽‚߁C
115 * •ª‚¯‚Ä‚¢‚éD
116 */
117 PUBLIC core_exc_entry
118
119 SECTION .text : CODE (2)
120 THUMB
121core_exc_entry:
122 /*
123 * —áŠO/Š„ž‚Ý‚ª”­¶‚·‚é‚ƁC”­¶Žž‚ɃAƒNƒeƒBƒu‚ȃXƒ^ƒbƒN‚ɃXƒNƒ‰
124 * ƒbƒ`ƒŒƒWƒXƒ^“™‚ª•Û‘¶‚³‚ê‚éD
125 * ‚±‚Ì“à—e‚ɉÁ‚¦‚āCCPU—áŠOƒnƒ“ƒhƒ‰‚ւ̏î•ñ‚Æ‚µ‚āCbasepri ‚Ì’l‚ƁC
126 * EXC_RETURN‚̏î•ñ‚ð‰Á‚¦‚Ä•Û‘¶‚·‚éDbasepri‚Ì’l‚́CCPU—áŠO‚©‚ç‚Ì
127 * ƒŠƒ^[ƒ“Žž‚ÉŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‚Ì’l‚ðŒ³‚É–ß‚·‚½‚ß‚É‚à—p‚¢‚ç‚ê‚éD
128 *
129 * -----------
130 * | EXC_RETURN|
131 * -----------
132 * | basepri |
133 * -----------
134 * | R0 |
135 * -----------
136 * | R1 |
137 * -----------
138 * | R2 |
139 * -----------
140 * | R3 |
141 * -----------
142 * | R12 |
143 * -----------
144 * | LR |
145 * -----------
146 * | PC |
147 * -----------
148 * | xPSR |
149 * -----------
150 *
151 */
152 /*¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤*/
153 /*
154 * Š„ž‚Ý”­¶Žž‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‚ðƒXƒ^ƒbƒN‚É•Û‘¶‚·‚邽‚ߎ擾
155 */
156 /*mrs r2, basepri /* baepri‚Ì’l‚ðŽæ“¾ */
157
158 /*
159 * ƒJ[ƒlƒ‹ŠÇ—ŠO‚Ì—áŠO‚©ƒ`ƒFƒbƒN
160 * ƒJ[ƒlƒ‹“à‚̃NƒŠƒeƒBƒJƒ‹ƒZƒNƒVƒ‡ƒ“‚ÌŽÀs’†C‘SŠ„ž‚݃ƒbƒNó‘ԁC
161 * CPUƒƒbƒNó‘ԁCƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌŠ„ž‚݃nƒ“ƒhƒ‰ŽÀs’†‚Ì‚¢‚¸‚ê‚©‚Å
162 * ”­¶‚µ‚½CPU—áŠO‚ðCƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌCPU—áŠO‚ƌĂÔ
163 * CPUƒƒbƒNó‘Ô‚Íbasepri‚ªIIPM_LOCK‚Å”»’f‚·‚éD
164 * ‘SŠ„ž‚݃ƒbƒNó‘Ô‚ÍFAULTMASK‚ª'1'‚̏ꍇ
165 */
166 /*cmp r2, #IIPM_LOCK /* CPUƒƒbƒNó‘Ô‚È‚çƒJ[ƒlƒ‹ŠÇ—ŠO—áŠOˆ—‚Ö */
167 /*beq prc_nonkernel_exc_entry*/
168 /*mrs r2, FAULTMASK /* ‘SŠ„ž‚݃ƒbƒNó‘Ô‚È‚çƒJ[ƒlƒ‹ŠÇ—ŠO—áŠOˆ—‚Ö */
169 /*cbnz r2, prc_nonkernel_exc_entry*/
170 /*¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢*/
171 /*
172 * ƒJ[ƒlƒ‹ŠÇ—ŠO‚Ì—áŠO‚©ƒ`ƒFƒbƒN
173 * ƒJ[ƒlƒ‹“à‚̃NƒŠƒeƒBƒJƒ‹ƒZƒNƒVƒ‡ƒ“‚ÌŽÀs’†C‘SŠ„ž‚݃ƒbƒNó‘ԁC
174 * CPUƒƒbƒNó‘ԁCƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌŠ„ž‚݃nƒ“ƒhƒ‰ŽÀs’†‚Ì‚¢‚¸‚ê‚©‚Å
175 * ”­¶‚µ‚½CPU—áŠO‚ðCƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌCPU—áŠO‚ƌĂÔ
176 * ‘SŠ„ž‚݃ƒbƒNó‘Ô‚ÍFAULTMASK‚ª'1'‚̏ꍇ
177 * CPUƒƒbƒNó‘Ô‚Íbasepri‚ªIIPM_LOCK‚©‚Å”»’f‚·‚éD
178 */
179 mrs r2, FAULTMASK /* ‘SŠ„ž‚݃ƒbƒNó‘Ô‚È‚çƒJ[ƒlƒ‹ŠÇ—ŠO—áŠOˆ—‚Ö */
180 cbnz r2, core_nonkernel_exc_entry
181
182 mrs r2, basepri /* baepri‚Ì’l‚ðŽæ“¾ */
183 cmp r2, #IIPM_LOCK /* CPUƒƒbƒNó‘Ô‚È‚çƒJ[ƒlƒ‹ŠÇ—ŠO—áŠOˆ—‚Ö */
184 beq core_nonkernel_exc_entry
185
186
187
188 /*
189 * ƒXƒ^ƒbƒN‚ð•ÏX‚·‚é•K—v‚ª‚ ‚é‚©ƒ`ƒFƒbƒN
190 * EXC_RETURNiŠ„ž‚ÝŽž‚ÉLR‚ɐݒ肳‚ê‚é’lj‚ðƒ`ƒFƒbƒN‚µ‚āC—áŠO”­¶Žž‚É
191 * ƒAƒNƒeƒBƒu‚ȃXƒ^ƒbƒN‚ð“Á’è‚·‚邱‚Æ‚Å‘½dŠ„ž‚Ý‚©”»’è‚·‚éD
192 */
193 tst lr, #EXC_RETURN_PSP /* Š„ž‚ÝŒ³‚ªMSP‚Ȃ瑽dŠ„ž‚Ý */
194 beq core_exc_entry_1 /* ‘½dŠ„ž‚Ý‚È‚çcore_exc_entry_1‚Ö */
195 mrs r0, psp /* ˆê’i–Ú‚ÌŠ„ž‚݂̏ꍇ‚ÍPSPã‚É */
196#ifdef OLD_STMFD_INST
197 stmfd r0!,{r2} /* Š„ž‚Ý”­¶Žž‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‚ðÏ‚Þ */
198 stmfd r0!,{lr} /* EXC_RETURN ‚ðÏ‚Þ */
199#else
200 str r2, [r0, #-0x04]!
201 str lr, [r0, #-0x04]!
202endif
203 msr psp, r0 /* CPU—áŠOƒnƒ“ƒhƒ‰‚ւ̈ø”‚Æ‚È‚é */
204 push {lr} /* MSPã‚É‚àEXC_RETURN ‚ðÏ‚Þ */
205 b core_exc_entry_2
206core_exc_entry_1: /* ‘½dŠ„ž‚݂̏ꍇ */
207 push {r2} /* Š„ž‚Ý”­¶Žž‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‚ðÏ‚Þ */
208 push {lr} /* EXC_RETURN ‚ðÏ‚Þ */
209 mov r0, sp /* CPU—áŠOƒnƒ“ƒhƒ‰‚ւ̈ø”‚Æ‚È‚é */
210
211 /*
212 * ‹¤’ʏˆ—
213 */
214core_exc_entry_2:
215 mrs r3, ipsr /* ƒnƒ“ƒhƒ‰ƒAƒhƒŒƒX‚ðŽæ“¾ */
216 ldr r1, =_kernel_exc_tbl
217 ldr r2, [r1, r3, lsl #2]
218
219#ifdef LOG_EXC_ENTER
220 push {r0,r2,r3}
221 mov r0, r3 /* —áŠO”ԍ†‚ðƒpƒ‰ƒ[ƒ^‚É */
222 bl log_exc_enter /* log_exc_enter‚ðŒÄ‚яo‚· */
223 pop {r0,r2,r3}
224 push {r3} /* —áŠO”ԍ†‚ðƒXƒ^ƒbƒN‚Ö */
225#endif /* LOG_EXC_ENTER */
226
227 /*
228 * CPU—áŠOƒnƒ“ƒhƒ‰‚̌Ăяo‚µ
229 */
230 blx r2
231
232#ifdef LOG_EXC_ENTER
233 pop {r0} /* —áŠO”ԍ†‚ðˆø”‚É */
234 bl log_exc_leave /* log_exc_leave‚ðŒÄ‚яo‚· */
235#endif /* LOG_EXC_ENTER */
236
237 b ret_exc
238
239/*
240 * ƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌCPU—áŠO‚̏o“üŒûˆ—
241 */
242core_nonkernel_exc_entry:
243 tst lr, #EXC_RETURN_PSP /* Š„ž‚ÝŒ³‚ªMSP‚Ȃ瑽dŠ„ž‚Ý */
244 beq core_nonkernel_exc_entry_1 /* ‘½dŠ„ž‚Ý‚È‚ç */
245 mrs r0, psp /* ˆê’i–Ú‚ÌŠ„ž‚݂̏ꍇ‚ÍPSPã‚É */
246#ifdef OLD_STMFD_INST
247 stmfd r0!,{r2} /* Š„ž‚Ý”­¶Žž‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‚ðÏ‚Þ */
248 stmfd r0!,{lr} /* EXC_RETURN ‚ðÏ‚Þ */
249#else
250 str r2, [r0, #-0x04]!
251 str lr, [r0, #-0x04]!
252#endif
253 msr psp, r0 /* CPU—áŠOƒnƒ“ƒhƒ‰‚ւ̈ø”‚Æ‚È‚é */
254 push {lr} /* MSPã‚É‚àEXC_RETURN ‚ðÏ‚Þ */
255 b core_nonkernel_exc_entry_2
256core_nonkernel_exc_entry_1: /* ‘½dŠ„ž‚݂̏ꍇ */
257 push {r2} /* Š„ž‚Ý”­¶Žž‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‚ðÏ‚Þ */
258 push {lr} /* EXC_RETURN ‚ðÏ‚Þ */
259 mov r0, sp /* CPU—áŠOƒnƒ“ƒhƒ‰‚ւ̈ø”‚Æ‚È‚é */
260
261core_nonkernel_exc_entry_2:
262 mrs r3, ipsr /* CPU—áŠOƒnƒ“ƒhƒ‰‚̃AƒhƒŒƒX‚ðŽæ“¾ */
263 ldr r1, =_kernel_exc_tbl
264 ldr r2, [r1, r3, lsl #2]
265
266 /*
267 * CPU—áŠOƒnƒ“ƒhƒ‰‚̌Ăяo‚µ
268 */
269 blx r2
270
271 /*
272 * Š„ž‚݃ƒbƒNó‘Ô‚Æ‚·‚éD
273 */
274 cpsid f
275
276 /*
277 * –ß‚èæ‚̃Rƒ“ƒeƒLƒXƒg‚Ì”»’è
278 *
279 * Š„ž‚݃nƒ“ƒhƒ‰ŽÀs‚ÉLR‚ɃZƒbƒg‚³‚ê‚éEXC_RETURN‚ðƒ`ƒFƒbƒN‚µ‚āC–ß‚è
280 * æ‚ÅMSP‚ªŽg‚í‚ê‚Ä‚¢‚ê‚΁CŠ„ž‚ݐ悪”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚Æ”»’è‚·‚éD
281 */
282 pop {r3} /* lr‚ðƒXƒ^ƒbƒN‚©‚çŽæ“¾ */
283 tst r3, #EXC_RETURN_PSP /* –ß‚èæ‚ªPSP‚È‚ç */
284 bne nonkernel_ret_exc_1
285 pop {r1} /* Œ³‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒN(basepri) */
286 b nonkernel_ret_exc_2 /* ‚Ì’l‚ðMSP‚©‚çŽæ“¾ */
287
288nonkernel_ret_exc_1:
289 /*
290 * PSPã‚©‚çEXC_RETURN‚ðíœ
291 */
292 mrs r2, psp
293 add r2, r2, #4
294 /*
295 * Œ³‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒN(basepri)‚Ì’l‚ðPSP‚©‚çŽæ“¾
296 */
297 ldmfd r2!, {r1}
298 msr psp, r2
299
300nonkernel_ret_exc_2:
301 msr basepri, r1 /* Š„ž‚Ý—Dæ“xƒ}ƒXƒN‚ðŠ„ž‚Ý‘O‚ɏó‘Ô‚Ö */
302 bx r3 /* ƒŠƒ^[ƒ“ */
303
304/*
305 * Š„ž‚݃Gƒ“ƒgƒŠ
306 */
307 PUBLIC core_int_entry
308 IMPORT _kernel_exc_tbl
309 IMPORT log_inh_enter
310 IMPORT log_exc_leave
311 IMPORT reqflg
312 IMPORT lock_flag
313 IMPORT saved_iipm
314 IMPORT p_runtsk
315 IMPORT dspflg
316 IMPORT p_schedtsk
317 IMPORT _kernel_int_iipm_tbl
318 SECTION .text : CODE (2)
319 THUMB
320core_int_entry:
321 /*
322 * Š„ž‚Ý”­¶Žž‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‚ðƒXƒ^ƒbƒN‚É•Û‘¶‚·‚邽‚ߎ擾
323 */
324 mrs r2, basepri /* baepri‚Ì’l‚ðŽæ“¾ */
325
326 /*
327 * ‘½dŠ„ž‚Ý‚©ƒ`ƒFƒbƒN
328 * EXC_RETURNiŠ„ž‚ÝŽž‚ÉLR‚ɐݒ肳‚ê‚é’lj‚ðƒ`ƒFƒbƒN‚µ‚āC—áŠO”­¶Žž‚É
329 * ƒAƒNƒeƒBƒu‚ȃXƒ^ƒbƒN‚ð“Á’è‚·‚邱‚Æ‚Å‘½dŠ„ž‚Ý‚©”»’è‚·‚éD
330 */
331 tst lr, #EXC_RETURN_PSP /* Š„ž‚ÝŒ³‚ªMSP‚Ȃ瑽dŠ„ž‚Ý */
332 beq core_int_entry_1 /* ‘½dŠ„ž‚Ý‚È‚çcore_int_entry_1‚Ö */
333 mrs r0, psp /* ˆê’i–Ú‚ÌŠ„ž‚݂̏ꍇ‚ÍPSPã‚É */
334#ifdef OLD_STMFD_INST
335 stmfd r0!,{r2} /* Š„ž‚Ý”­¶Žž‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‚ðÏ‚Þ */
336 stmfd r0!,{lr} /* EXC_RETURN ‚ðÏ‚Þ */
337#else
338 str r2, [r0, #-0x04]!
339 str lr, [r0, #-0x04]!
340#endif
341 msr psp, r0 /* CPU—áŠOƒnƒ“ƒhƒ‰‚ւ̈ø”‚Æ‚È‚é */
342 push {lr} /* MSPã‚É‚àEXC_RETURN ‚ðÏ‚Þ */
343 b core_int_entry_2
344core_int_entry_1: /* ‘½dŠ„ž‚݂̏ꍇ */
345 push {r2} /* Š„ž‚Ý”­¶Žž‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‚ðÏ‚Þ */
346 push {lr} /* EXC_RETURN ‚ðÏ‚Þ */
347 mov r0, sp /* –¢’è‹`‚ÌŠ„ž‚Ý‚ª”­¶‚µ‚½ê‡‚̏î•ñ‚Æ‚·‚é */
348
349 /*
350 * ‹¤’ʏˆ—
351 */
352core_int_entry_2:
353 mrs r3, ipsr /* ƒnƒ“ƒhƒ‰ƒAƒhƒŒƒX‚ðŽæ“¾ */
354 ldr r1, =_kernel_exc_tbl
355 ldr r2, [r1, r3, lsl #2]
356
357 /*
358 * basepri‚̐ݒè
359 * NVIC—Dæ“xƒ}ƒXƒN‚ªŽ©“®“I‚ɐݒ肳‚ê‚邽‚ß—Dæ“xƒ}ƒXƒN‚Ì“_‚Å‚Í•K—v‚È
360 * ‚¢‚ªCx_get_ipm()‚ªbasepri‚ðŽQÆ‚·‚邽‚߁Cbasepri‚àXV‚·‚éD
361 */
362 ldr r1, =_kernel_int_iipm_tbl
363 ldr lr, [r1, r3, lsl #2]
364 msr basepri, lr
365
366#ifdef LOG_INH_ENTER
367 push {r0,r2,r3}
368 mov r0, r3 /* —áŠO”ԍ†‚ðƒpƒ‰ƒ[ƒ^‚É */
369 bl log_inh_enter /* log_exc_enter‚ðŒÄ‚яo‚· */
370 pop {r0,r2,r3}
371 push {r3} /* —áŠO”ԍ†‚ðƒXƒ^ƒbƒN‚Ö */
372#endif /* LOG_INH_ENTER */
373
374 /*
375 * Š„ž‚݃nƒ“ƒhƒ‰‚̌Ăяo‚µ
376 */
377 blx r2
378
379#ifdef LOG_INH_LEAVE
380 pop {r0} /* —áŠO”ԍ†‚ðˆø”‚É */
381 bl log_exc_leave /* log_exc_leave‚ðŒÄ‚яo‚· */
382#endif /* LOG_INH_LEAVE */
383
384
385
386/*
387 * Š„ž‚Ý/—áŠOoŒû
388 *
389 * ret_exc/ret_int‚́CCPU—áŠO/Š„ž‚݃nƒ“ƒhƒ‰‚©‚ç–ß‚Á‚½’¼Œã‚ÉŽÀs‚·‚é
390 * ƒ‹[ƒ`ƒ“‚Å‚ ‚éD
391 */
392ret_exc:
393ret_int:
394 /*
395 * Š„ž‚݃ƒbƒNó‘Ô‚Æ‚·‚éD‚±‚ÌŽž“_‚ł́CCPUƒƒbƒNó‘Ô‚É‚Í‚È‚ç‚È‚¢
396 * ibasepri‚Ælock_flag‚Æsaved_iipm‚͍XV‚µ‚È‚¢jD
397 *
398 * Š„ž‚݃ƒbƒNó‘Ô‚Æ‚·‚é‚̂́C–ß‚èæ‚̃Rƒ“ƒeƒLƒXƒg‚̃`ƒFƒbƒN‚ƁC
399 * –ß‚èæ‚ª”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚Å‚ ‚Á‚½ê‡‚̃Šƒ^[ƒ“‚ðƒAƒgƒ~ƒbƒN
400 * ‚ɍs‚¤‚½‚ß‚Å‚ ‚éDbsepri‚ðCPUƒƒbƒN‚Ì’l‚É‚·‚邱‚Æ‚Å‚àƒAƒgƒ~ƒb
401 * ƒN‚ȃ`ƒFƒbƒN‚Æ•œ‹A‚͉”\‚Å‚ ‚邪CŠ„ž‚Ý‚©‚烊ƒ^[ƒ“‚µ‚Ä‚àC
402 * basepri ‚̐ݒè“à—e‚ÍŒ³‚É–ß‚ç‚È‚¢‚½‚߁CŽg—p‚·‚邱‚Æ‚ª‚Å‚«‚È‚¢D
403 * ˆê•ûCFAULTMASK‚́CŠ„ž‚Ý‚©‚ç‚̃Šƒ^[ƒ“ˆ—‚É‚æ‚Á‚āC'0'‚ɃNƒŠ
404 * ƒA‚³‚ê‚éD
405 */
406 cpsid f
407
408 /*
409 * –ß‚èæ‚̃Rƒ“ƒeƒLƒXƒg‚Ì”»’è
410 *
411 * Š„ž‚݃nƒ“ƒhƒ‰ŽÀs‚ÉLR‚ɃZƒbƒg‚³‚ê‚éEXC_RETURN‚ðƒ`ƒFƒbƒN‚µ‚āC–ß‚è
412 * æ‚ÅMSP‚ªŽg‚í‚ê‚Ä‚¢‚ê‚΁CŠ„ž‚ݐ悪”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚Æ”»’è‚·‚éD
413 */
414 pop {r3} /* lr‚ðƒXƒ^ƒbƒN‚©‚çŽæ“¾ */
415 tst r3, #EXC_RETURN_PSP /* –ß‚èæ‚ªPSP‚È‚ç ret_int_1 ‚Ö */
416 bne ret_int_1
417 pop {r1} /* Œ³‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒN(basepri)‚ðr1‚Ö */
418 b ret_int_2 /* ‚Ì’l‚ðMSP‚©‚çŽæ“¾ */
419
420 /*
421 * ˆê’i–Ú‚ÌŠ„ž‚݂̏oŒûˆ—
422 */
423ret_int_1:
424 /*
425 * PSPã‚©‚çCEXC_RETURN(r0)‚ÆŒ³‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒN(basepri)(r1)
426 * ‚ðŽæ“¾
427 */
428 mrs r2, psp
429 ldmfd r2!, {r0,r1}
430 msr psp, r2
431
432 /*
433 * reqflg‚ðƒ`ƒFƒbƒN‚·‚é
434 *
435 * ƒJ[ƒlƒ‹ŠÇ—“à‚ÌŠ„ž‚Ý‚Í‹ÖŽ~‚µ‚½ó‘Ô‚ÅŽÀs‚·‚é•K—v‚ª‚ ‚邽‚߁C
436 * FAULTMASK‚ð'1'‚É‚µ‚½ó‘Ô‚ÅŽÀs‚·‚éD
437 * reqflg‚ðƒ`ƒFƒbƒN‚·‚é‘O‚ÉŠ„ž‚Ý‚ð‹ÖŽ~‚·‚é‚̂́Creqflg‚ðƒ`ƒFƒbƒN
438 * ‚µ‚½’¼Œã‚ÉŠ„ž‚݃nƒ“ƒhƒ‰‚ª‹N“®‚³‚êC‚»‚Ì’†‚ŃfƒBƒXƒpƒbƒ`‚ª—v‹
439 * ‚³‚ꂽê‡‚ɁC‚·‚®‚ɃfƒBƒXƒpƒbƒ`‚³‚ê‚È‚¢‚Æ‚¢‚¤–â‘肪¶‚¶‚邽‚ß
440 * ‚Å‚ ‚éD
441 */
442 ldr r0, =reqflg /* reqflg‚ªfalse‚È‚ç‚»‚Ì‚Ü‚Ü–ß‚é */
443 ldr r2, [r0]
444 cbnz r2, ret_int_3 /* true‚È‚çret_int_3‚Ö */
445
446ret_int_2:
447 /*
448 * ‚±‚±‚É‚ÍŠ„ž‚݃ƒbƒNó‘ԁiFAULTMASK‚ªƒZƒbƒgj‚³‚ꂽó‘Ô‚Å—ˆ‚éD
449 * Threadƒ‚[ƒh‚©‚ç‚̃Šƒ^[ƒ“‚É‚æ‚莩“®“I‚ÉŠ„ž‚݃ƒbƒN‰ðœó‘Ô‚É‚È‚éD
450 * Š„ž‚Ý—Dæ“xƒ}ƒXƒN‚ÍŠ„ž‚Ý‘O‚ɏó‘Ô‚É–ß‚·D
451 */
452 msr basepri, r1 /* Š„ž‚Ý—Dæ“xƒ}ƒXƒN‚ðŠ„ž‚Ý‘O‚ɏó‘Ô‚Ö */
453 bx r3 /* ƒŠƒ^[ƒ“ */
454
455
456ret_int_3:
457 /*
458 * ‚±‚±‚ł́C–ß‚èæ‚ªƒ^ƒXƒN‚Å‚ ‚èCPSPã‚ɃXƒNƒ‰ƒbƒ`ƒŒƒWƒXƒ^‚ÆŠ„
459 * ž‚Ý—Dæ“xƒ}ƒXƒN(basepri)‚ª•Û‘¶‚³‚ꂽó‘Ô‚É‚È‚Á‚Ä‚¢‚éD‚Ü‚½C
460 * ƒvƒƒZƒbƒT‚́CHandlerƒ‚[ƒhEŠ„ž‚݃ƒbƒNó‘Ô‚Æ‚È‚Á‚Ä‚¢‚éD
461 * ‚Ü‚½Cr0‚ɂ́Creqflg‚̃AƒhƒŒƒXCr3‚É‚ÍŠ„ž‚ÝŽó•tŽž‚Ìlr‚Ì’l‚ª•Û
462 * Ž‚³‚ê‚Ä‚¢‚éD
463 */
464 /*
465 * ƒ^ƒXƒN—áŠOƒnƒ“ƒhƒ‰‚âƒfƒBƒXƒpƒbƒ`‚ð‚·‚éÛ‚ÉThreadƒ‚[ƒh‚Ö‘JˆÚ‚·‚é
466 * ƒ_ƒ~[‚̃Xƒ^ƒbƒNƒtƒŒ[ƒ€‚ðì¬‚µ‚āCbx–½—ß‚ÅHandlerƒ‚[ƒh‚©‚烊
467 * ƒ^[ƒ“‚·‚éD‚Ü‚½C’x‰„ƒfƒBƒXƒpƒbƒ`‚·‚éê‡‚àCÄ‚ÑŠ„‚荞‚ñ‚¾ƒ^ƒX
468 * ƒN‚É–ß‚éÛ‚ɂ́Csvc–½—߂ŁCsvc_handler‚ðŒÄ‚яo‚·D
469 * ƒXƒ^ƒbƒNƒtƒŒ[ƒ€‚́CConfigureation and Control Register(CCR)‚Ì
470 * STKALIGN‚ª'1'‚̏ꍇ‚́C8byte‹«ŠE‚ɃAƒ‰ƒCƒ“‚³‚ê‚éD
471 * ŽQl : DDI0403B_arm_architecture_v7m_reference_manual(P.220)
472 * ‚»‚Ì‚½‚߁C‚±‚ÌŽž“_‚̃Xƒ^ƒbƒN‚ÍŠ„ž‚Ý‚â—áŠO”­¶Žž‚ɍ쐬‚³‚ꂽ
473 * ƒXƒ^ƒbƒNƒtƒŒ[ƒ€‚©‚çC8byte‹«ŠE‚̃TƒCƒY‚É‚µ‚Ä‚¨‚­‚ƁCsvc_handler
474 * “™‚ŃXƒ^ƒbƒNƒtƒŒ[ƒ€‚̃Aƒ‰ƒCƒƒ“ƒg‚Ì—L–³‚ÌŠm”F‚ðÈ—ª‚Å‚«‚éD
475 * ‚½‚¾‚µCƒVƒXƒeƒ€‹N“®Œã‚́C“®“I‚ÉCCR‚ÌSTKALIGN‚̐ݒè‚ð•ÏX‚·‚é‚Ì‚Í
476 * ‹ÖŽ~‚Æ‚·‚éD
477 * ‚±‚ÌŽž“_‚Í•W€‚̃Xƒ^ƒbƒNƒtƒŒ[ƒ€‚́CŠ„ž‚݁E—áŠO”­¶Žž‚Æ“¯“™‚Å‚ 
478 * ‚邽‚߁Cƒ^ƒXƒNƒXƒ^ƒbƒN(PSP)‚Í8byte‹«ŠE‚É‚È‚Á‚Ä‚¢‚éD
479 */
480 mov r1, #0 /* reqflg‚ðfalse‚É */
481 str r1, [r0]
482
483 /*
484 * CPUƒƒbƒNó‘ԂɈڍs‚·‚éD
485 *
486 * ƒJ[ƒlƒ‹‚ÌŠÇ—“à‚ÌŠ„ž‚Ý‚ð‹ÖŽ~‚·‚é‚悤‚Ébasepri‚ðÝ’肵C
487 * lock_flag ‚Æ saved_iipm ‚ðXV‚·‚éDsaved_iipm‚́C–ß‚èæ‚ÌŠ„ž‚Ý
488 * —Dæ“xƒ}ƒXƒNi‚Ì“à•”•\Œ»j‚ɐݒ肷‚éD
489 * ‚±‚ÌŽž“_‚ÅCPUƒƒbƒNó‘Ô‚Æ‚·‚é‚̂́Cdispatcher‚Ö•ªŠò‚·‚鎞‚ƁC
490 * call_texrtn‚ðŒÄ‚яo‚·Žž‚ɁCCPUƒƒbƒNó‘Ô‚É‚È‚Á‚Ä‚¢‚é•K—v‚ª‚ ‚é
491 * ‚½‚ß‚Å‚ ‚éD
492 * ‚È‚¨C‚±‚̏ˆ—‚ÌŒãCThreadƒ‚[ƒh‚ւ̈ڍsˆ—‚ðs‚È‚¤‚½‚߁CŠ„ž‚Ý
493 * ƒƒbƒNó‘Ô(FAULTMASK‚ð"1")‚Í•ÛŽ‚·‚éD
494 */
495 ldr r1, =IIPM_LOCK /* CPUƒƒbƒNó‘Ô */
496 msr basepri, r1
497 mov r1, #0x01 /* lock_flag ‚ð true‚É */
498 ldr r0, =lock_flag
499 str r1, [r0]
500
501 /*
502 * Š„ž‚Ý—Dæ“xƒ}ƒXƒN‚ðC‘S‰ðœó‘ԁiTIPM_ENAALLj‚ɐݒ肷‚é
503 * ‚·‚Å‚ÉCPUƒƒbƒNó‘ԂȂ̂ŁCsaved_iipm‚ðIIPM_ENAALL‚Æ‚·‚éD
504 */
505 ldr r1, =IIPM_ENAALL
506 ldr r0, =saved_iipm /* saved_iipm‚É•Û‘¶ */
507 str r1, [r0]
508
509 /*
510 * Threadƒ‚[ƒh‚ֈڍs‚·‚éD
511 *
512 * dispatcher‚âcall_texrn‚ðŒÄ‚яo‚·ê‡‚́CThreadƒ‚[ƒh‚Å‚ ‚é•K
513 * —v‚ª‚ ‚邽‚߁CPSPƒXƒ^ƒbƒNã‚Ƀ_ƒ~[‚Ì—áŠOƒtƒŒ[ƒ€‚ð’u‚¢‚āC
514 * ‹[Ž—“I‚ÉŠ„ž‚݃nƒ“ƒhƒ‰‚©‚烊ƒ^[ƒ“‚·‚éD
515 * ƒŠƒ^[ƒ“‚Æ“¯Žž‚ÉFAULTMASK‚ªŽ©“®“I‚ɃNƒŠƒA‚³‚êCƒJ[ƒlƒ‹ŠÇ—ŠO‚Ì
516 * Š„ž‚Ý‚ª‹–‰Â‚³‚ê‚éD
517 */
518 ldr r0, =ret_int_4 /* PC */
519 ldr r1, =EPSR_T /* xPSR(Tƒrƒbƒg‚ª'1'‚Å‚ ‚é•K—v‚ª‚ ‚é) */
520 mrs r2, psp
521 stmfd r2!, {r0-r1} /* ƒ_ƒ~[ƒtƒŒ[ƒ€‚ðƒXƒ^ƒbƒNã‚ÉÏ‚Þ */
522 /*sub r2, r2, #(EXC_FRAME_SIZE - (4*2)) /* r0-r3,r12,lr‚Ì“à—e‚͐ݒ肷‚é•K—v‚ª‚È‚¢ */
523 subs r2, #(EXC_FRAME_SIZE - (4*2)) /* r0-r3,r12,lr‚Ì“à—e‚͐ݒ肷‚é•K—v‚ª‚È‚¢ */
524 msr psp,r2
525 bx r3 /* Threadƒ‚[ƒh‚ֈڍs */
526
527ret_int_4:
528 /*
529 * ã‹L‚̏ˆ—‚É‚æ‚èCThreadƒ‚[ƒh‚ÅŽÀs‚³‚ê‚éD
530 * dspflg‚ªfalse‚Å‚ ‚éê‡‚ƁCp_runtsk‚Æp_schedtsk‚ª“¯‚¶ê‡‚ɂ́C
531 * ƒfƒBƒXƒpƒbƒ`‚ðs‚í‚È‚¢D‚±‚̃`ƒFƒbƒN‚ª•K—v‚Ȃ̂́Cƒ^ƒXƒN—áŠOˆ
532 * —ƒ‹[ƒ`ƒ“‚̌ďo‚µ‚ª•K—v‚ȏꍇ‚ɁCƒfƒBƒXƒpƒbƒ`‚ª•K—v‚È‚­‚Ä‚àC
533 * reqflg‚ðtrue‚É‚·‚邽‚ß‚Å‚ ‚éD
534 */
535 ldr r0, =p_runtsk /* ƒfƒBƒXƒpƒbƒ`‚ðs‚í‚È‚¢ê‡‚Å‚àCr1‚Ép_runtsk ‚Ì’l(TCB) */
536 ldr r1, [r0] /* ‚ª“ü‚Á‚Ä‚¢‚é•K—v‚ª‚ ‚é‚̂ŁCæ‚ɓǂݍž‚Þ */
537 ldr r0, =dspflg
538 ldr r2, [r0]
539 cbz r2, ret_int_r_1 /* dspflg‚ªfalse‚È‚çret_int_r_1‚Ö */
540 ldr r0, =p_schedtsk
541 ldr r2, [r0]
542 cmp r1, r2 /* p_runtsk‚Æp_schedtsk‚ª“¯‚¶‚È‚ç */
543 beq ret_int_r_1 /* ret_int_r_1‚Ö */
544 stmfd sp!, {r4-r11} /* Žc‚è‚̃ŒƒWƒXƒ^‚ð•Û‘¶ */
545 str sp, [r1,#TCB_sp] /* ƒ^ƒXƒNƒXƒ^ƒbƒN‚ð•Û‘¶ */
546 ldr lr, =ret_int_r /* ŽÀsÄŠJ”Ô’n‚ð•Û‘¶ */
547 str lr, [r1,#TCB_pc]
548 b dispatcher /* ƒfƒBƒXƒpƒbƒ`ƒƒ‚Ö */
549
550/*
551 * Š„ž‚Ý‚É‚æ‚èƒvƒŠƒGƒ“ƒvƒg‚³‚ꂽƒ^ƒXƒN‚ւ̃Šƒ^[ƒ“ˆ—
552 *
553 * Threadƒ‚[ƒh‚ŁCƒfƒBƒXƒpƒbƒ`ƒƒ‚⊄ž‚݂̏oŒûˆ—‚©‚çŒÄ‚яo‚³‚ê‚éD
554 * Š„ž‚Ý‚É‚æ‚èƒvƒŠƒGƒ“ƒvƒg‚³‚ꂽƒ^ƒXƒN‚ÖƒŠƒ^[ƒ“‚·‚é‚ɂ́C‚¢‚Á‚½‚ñ
555 * Handlerƒ‚[ƒh‚Ɉڍs‚µCPC‚É0xfffffffd‚ð‘ã“ü‚µ‚ăŠƒ^[ƒ“‚·‚é•K—v
556 * ‚ª‚ ‚éD‚»‚Ì‚½‚߁CSVC‚É‚æ‚èCSVCƒnƒ“ƒhƒ‰‚ðŒÄ‚яo‚µCHandlerƒ‚[
557 * ƒh‚ֈڍs‚·‚éD
558 */
559 SECTION .text : CODE (2)
560 THUMB
561ret_int_r:
562 pop {r4-r11} /* ƒŒƒWƒXƒ^‚Ì•œ‹A */
563ret_int_r_1:
564 /*
565 * enatex‚ªtrue‚ŁCtexptn‚ª0‚Å‚È‚¯‚ê‚΁Cƒ^ƒXƒN—áŠOˆ—ƒ‹[ƒ`ƒ“‚ð
566 * ŒÄ‚яo‚·D
567 * dispatcher‚©‚çŒÄ‚яo‚³‚ê‚邽‚߁CTCB‚̃AƒhƒŒƒX‚Ír1‚É“ü‚Á‚Ä‚¢‚é
568 */
569 ldrb r0, [r1,#TCB_enatex]
570 tst r0, #TCB_enatex_mask
571 beq ret_int_r_2 /* enatex ‚ª false ‚È‚ç ret_int_r_2‚Ö */
572 ldr r0, [r1,#TCB_texptn] /* texptn‚ðƒ[ƒh */
573 cbz r0, ret_int_r_2 /* '0'‚Ȃ烊ƒ^[ƒ“ */
574 ldr r1, =ipmflg /* ipmflg‚ª false ‚Ȃ烊ƒ^[ƒ“ */
575 ldr r0, [r1]
576 cbz r0, ret_int_r_2
577 bl call_texrtn /* ƒ^ƒXƒN—áŠOƒ‹[ƒ`ƒ“‚̌Ăяo‚µ */
578ret_int_r_2:
579 svc 0 /* SVC‚̌Ăяo‚µ */
580
581/*
582 * SVCƒnƒ“ƒhƒ‰
583 */
584 PUBLIC svc_handler
585 IMPORT lock_flag
586
587 SECTION .text : CODE (2)
588 THUMB
589svc_handler:
590 /*
591 * Š„ž‚ݏˆ—‚©‚ç‚̃Šƒ^[ƒ“‚É‚æ‚èCCPUƒƒbƒN‰ðœó‘ԂɈڍs‚·‚é‚æ
592 * ‚¤€”õ‚·‚éD
593 */
594 cpsid f /* Š„ž‚݃ƒbƒNó‘Ô‚Ö */
595 mrs r0, psp
596 /*add r0, r0, #EXC_FRAME_SIZE /* ƒXƒ^ƒbƒN‚ðŽÌ‚Ä‚é */
597 adds r0, #EXC_FRAME_SIZE /* ƒXƒ^ƒbƒN‚ðŽÌ‚Ä‚é */
598 msr psp, r0
599 mov r0, #0
600 ldr r1, =lock_flag /* CPUƒƒbƒN‰ðœó‘Ô‚Ö */
601 str r0, [r1]
602 ldr r1, =IIPM_ENAALL /* Š„ž‚Ý—Dæ“xƒ}ƒXƒN‚ð‘S‰ðœó‘Ԃɐݒè */
603 msr basepri, r1 /* Š„ž‚Ý—Dæ“xƒ}ƒXƒN‚ðÝ’è */
604 bx lr /* ƒŠƒ^[ƒ“ */
605
606/*
607 * ƒfƒBƒXƒpƒbƒ`ƒƒ‚Ì“®ìŠJŽn
608 */
609 PUBLIC start_dispatch
610 IMPORT istkpt
611
612 PUBLIC exit_and_dispatch
613 IMPORT p_runtsk
614 IMPORT log_dsp_enter
615 IMPORT p_schedtsk
616 IMPORT log_dsp_leave
617 IMPORT reqflg
618 IMPORT lock_flag
619 IMPORT saved_iipm
620
621 SECTION .text : CODE (2)
622 THUMB
623start_dispatch:
624 /*
625 * ‚±‚̃‹[ƒ`ƒ“‚́CƒJ[ƒlƒ‹‹N“®Žž‚ɁC‚·‚ׂĂ̊„ž‚Ý‚ð‹ÖŽ~‚µ‚½ó‘Ô
626 * iŠ„ž‚݃ƒbƒNó‘Ô‚Æ“¯“™j‚ŌĂяo‚³‚ê‚éD‚Ü‚½CŠ„ž‚݃‚[ƒhi”ñ
627 * ƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚Æ“¯“™j‚ŌĂяo‚³‚ê‚邱‚Æ‚ð‘z’肵‚Ä‚¢‚éD
628 *
629 * prc_initialize‚ŁClock_flag‚ðtrue‚ɁCsaved_iipm‚ðIIPM_ENAALL‚É
630 * ‰Šú‰»‚µ‚Ä‚¢‚邽‚߁CƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌŠ„ž‚Ý‚ð‹–‰Â‚·‚邱‚ƂŁC
631 * CPUƒƒbƒNó‘ԁEiƒ‚ƒfƒ‹ã‚́jŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‘S‰ðœó‘Ô‚É‚È‚éD
632 * ‚Ü‚½Ctask_initialize‚Ådisdsp‚ðfalse‚ɏ‰Šú‰»‚µ‚Ä‚¢‚邽‚߁CƒfƒB
633 * ƒXƒpƒbƒ`‹–‰Âó‘Ô‚É‚È‚Á‚Ä‚¢‚éD
634 */
635 ldr r0,=istkpt /* MSP‚ð‰Šú‰» */
636 ldr r1,[r0] /* start_dispatchŒÄ‚яo‚µŽž‚ɌĂяo‚µ—p‚É */
637 msr msp, r1 /* Žg—p‚µ‚Ä‚¢‚邽‚ߏ‰Šú‰»‚·‚é */
638 ldr r1, =IIPM_LOCK /* ƒJ[ƒlƒ‹ŠÇ—“à‚ÌŠ„ž‚Ý‚ð‹ÖŽ~ */
639 msr basepri, r1
640 cpsie f /* ƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌŠ„ž‚Ý‚ð‹–‰Â */
641 mov r0, #CONTROL_PSP /* PSP‚ð—LŒø‚É */
642 msr control, r0
643 isb /* control ‚Ì‘€ìŒã‚É•K—v */
644
645/*
646 * Œ»Ý‚̃Rƒ“ƒeƒLƒXƒg‚ðŽÌ‚ĂăfƒBƒXƒpƒbƒ`
647 */
648exit_and_dispatch:
649 /* ƒfƒBƒXƒpƒbƒ`ƒƒ–{‘́idispatcherj‚Ö */
650
651
652/*
653 * ƒfƒBƒXƒpƒbƒ`ƒƒ–{‘Ì
654 */
655dispatcher:
656 /*
657 * ‚±‚̃‹[ƒ`ƒ“‚́Cƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒgECPUƒƒbƒNó‘ԁEƒfƒBƒXƒpƒbƒ`
658 * ‹–‰Âó‘ԁEiƒ‚ƒfƒ‹ã‚́jŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‘S‰ðœó‘ԂŌĂяo‚³
659 * ‚ê‚éD
660 *
661 * ‚·‚È‚í‚¿CThreadƒ‚[ƒhElock_flag‚ªtrueEdisdsp‚ªfalseEdspflg
662 * ‚ªtrueEsaved_iipm‚ªIIPM_ENAALL‚Æ‚È‚Á‚Ä‚¢‚éDŽÀsÄŠJ”Ô’n‚Ö‚à‚±
663 * ‚̏ó‘Ô‚Ì‚Ü‚Ü•ªŠò‚·‚éD
664 */
665#ifdef LOG_DSP_ENTER
666 ldr r1, =p_runtsk /* p_runtsk‚ðƒpƒ‰ƒ[ƒ^‚É */
667 ldr r0, [r1]
668 bl log_dsp_enter
669#endif /* LOG_DSP_ENTER */
670dispatcher_0:
671 ldr r0, =p_schedtsk /* p_schedtsk‚ðp_runtsk‚É */
672 ldr r1, [r0]
673 ldr r2, =p_runtsk
674 str r1, [r2]
675 cbz r1, dispatcher_1 /* p_runtsk¤¬NULL¤Ê¤édispatcher_1¤Ø */
676 ldr sp, [r1,#TCB_sp] /* ƒ^ƒXƒNƒXƒ^ƒbƒN‚𕜋A */
677#ifdef LOG_DSP_LEAVE
678 mov r0, r1 /* p_runtsk‚ðƒpƒ‰ƒ[ƒ^‚É */
679 mov r4, r1 /* r1‚̓XƒNƒ‰ƒbƒ`ƒŒƒWƒXƒ^‚È‚Ì‚Å•Û‘¶ */
680 bl log_dsp_leave
681 mov r1, r4
682#endif /* LOG_DSP_LEAVE */
683 ldr pc, [r1,#TCB_pc] /* ŽÀsÄŠJ”Ô’n‚𕜋A */
684dispatcher_1:
685 /*
686 * CPUƒƒbƒNó‘Ô‚Ì‰ðœ‚ÆC”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒgŽÀsó‘Ô‚Ö‚Ì
687 * €”õ‚ð‚·‚é
688 */
689 mov r0, #CONTROL_MSP /* MSP‚ð—LŒø‚É */
690 msr control, r0
691 isb /* control ‚Ì‘€ìŒã‚É•K—v */
692 /*--> ldr r2, =reqflg /* r2 <- reqflg */
693 /*--> ldr r1, =IIPM_LOCK /* Š„ž‚݃ƒbƒNó‘Ô‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‚Ì’l */
694 /*--> mov r0, #0 */
695 /*--> ldr r4, =lock_flag /* CPUƒƒbƒN‰ðœó‘Ô‚Ö */
696 /*--> str r0, [r4] */
697 mov r4, #0 /* r4 <- '0' */
698 ldr r5, =IIPM_LOCK /* r5 <- Š„ž‚݃ƒbƒNó‘Ô‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‚Ì’l */
699 ldr r6, =reqflg /* r6 <- reqflg */
700 ldr r7, =lock_flag /* r7 <- lock_flg */
701 str r4, [r7] /* CPUƒƒbƒN‰ðœó‘Ô‚Ö */
702dispatcher_2:
703 /*
704 * Š„ž‚Ý‚ð‹–‰Â‚µC”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒgŽÀsó‘Ô‚Æ‚µŠ„ž‚Ý‚ð‘҂D
705 *
706 * ‚±‚±‚Å”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒgŽÀsó‘Ԃɐ؂芷‚¦‚é‚̂́C‚±‚±‚Å”­¶
707 * ‚·‚銄ž‚ݏˆ—‚ɂǂ̃Xƒ^ƒbƒN‚ðŽg‚¤‚©‚Æ‚¢‚¤–â‘è‚Ì‰ðŒˆ‚ÆCŠ„ž‚Ý
708 * ƒnƒ“ƒhƒ‰“à‚ł̃^ƒXƒNƒfƒBƒXƒpƒbƒ`‚Ì–hŽ~‚Æ‚¢‚¤2‚‚̈Ӗ¡‚ª‚ ‚éD
709 *
710 * ƒvƒƒZƒbƒT‚ðŠ„ž‚Ý‘Ò‚¿‚Ɉڍs‚³‚¹‚鏈—‚ƁCŠ„ž‚Ý‹–‰Â‚Ƃ́C•s‰Â
711 * •ª‚ɍs‚È‚¤•K—v‚ª‚ ‚éD
712 * ‚±‚ê‚ð•s‰Â•ª‚ɍs‚È‚í‚È‚¢ê‡CŠ„ž‚Ý‚ð‹–‰Â‚µ‚½’¼Œã‚ÉŠ„ž
713 * ‚Ý‚ª“ü‚èC‚»‚Ì’†‚Ń^ƒXƒN‚ªŽÀs‰Â”\ó‘Ô‚É‚È‚é‚ƁCŽÀs‚·‚ׂ«ƒ^ƒX
714 * ƒN‚ª‚ ‚é‚É‚à‚©‚©‚í‚炸ƒvƒƒZƒbƒT‚ªŠ„ž‚Ý‘Ò‚¿‚É‚È‚Á‚Ä‚µ‚Ü‚¤D
715 * ARM-M‚ł́CPRIMASK‚ðƒZƒbƒg‚µ‚½ó‘Ô‚ÅWFI‚ðŒÄ‚яo‚·‚±‚Æ‚ÅŽÀŒ»‚Å‚«‚éD
716 * ‚±‚̏ó‘Ô‚ÅŠ„ž‚Ý‚ª“ü‚é‚ƁCŠ„ž‚Ý‚ÍŽÀs‚³‚ꂸCWFI‚©‚烊ƒ^[ƒ“‚·
717 * ‚邱‚Æ‚É‚È‚é‚̂ŁCˆê’UŠ„ž‚Ý‚ð‹–‰Â‚µ‚ÄŠ„ž‚݃nƒ“ƒhƒ‰‚ðŽÀs‚·‚éD
718 *
719 * Š„ž‚Ý‘Ò‚¿‚̊Ԃ́Cp_runtsk‚ðNULLi0j‚ɐݒ肵‚È‚¯‚ê‚΂Ȃç‚È
720 * ‚¢D‚±‚̂悤‚ɐݒ肵‚È‚¢‚ƁCŠ„ž‚݃nƒ“ƒhƒ‰‚©‚çiget_tid‚ðŒÄ‚яo
721 * ‚µ‚½Û‚Ì“®ì‚ªŽd—l‚ɍ‡’v‚µ‚È‚­‚È‚éD
722 *
723 */
724#ifdef TOPPERS_CUSTOM_IDLE
725 toppers_asm_custom_idle
726#else
727 cpsid i /* PRIMASK ‚ðƒZƒbƒg */
728 /*--> msr basepri, r0 /* ‘SŠ„ž‚Ý‹–‰Â */
729 /*--> wfi */
730 /*--> cpsie i /* PRIMASK ‚ðƒNƒŠƒAiŠ„ž‚Ý‚ðŽó‚¯•t‚¯‚éj */
731 /*--> msr basepri, r1 /* CPUƒƒbƒNó‘Ô‚Ö */
732 msr basepri, r4 /* ‘SŠ„ž‚Ý‹–‰Â */
733 wfi
734 cpsie i /* PRIMASK ‚ðƒNƒŠƒAiŠ„ž‚Ý‚ðŽó‚¯•t‚¯‚éj */
735 msr basepri, r5 /* CPUƒƒbƒNó‘Ô‚Ö */
736
737#endif /* TOPPERS_CUSTOM_IDLE */
738
739 /*--> ldr r6, [r2] /* reqflg‚ªfalse‚È‚çdispatcher_2‚Ö */
740 /*--> cmp r6, #0 */
741 /*--> beq dispatcher_2 */
742 /*--> str r0, [r2] /* reqflg‚ðfalse‚É */
743 ldr r0, [r6] /* reqflg‚ªfalse‚È‚çdispatcher_2‚Ö */
744 cmp r0, #0
745 beq dispatcher_2
746 str r4, [r6] /* reqflg‚ðfalse‚É */
747
748 /*
749 * CPUƒƒbƒNó‘Ô‚É–ß‚·DŠ„ž‚Ý‘Ò‚¿‚ÌŠÔ‚ÉŽÀs‚µ‚½Š„ž‚݃nƒ“ƒhƒ‰‚É‚æ
750 * ‚èCsaved_iipm‚ª‘‚«Š·‚¦‚ç‚ê‚é‰Â”\«‚ª‚ ‚邽‚߁CŒ³‚Ì’l‚É–ß‚·•K
751 * —v‚ª‚ ‚éDdispatcher‚ªŽÀs‚³‚ê‚鎞‚́Csaved_iipm‚ªIIPM_ENAALL
752 * ‚Æ‚È‚Á‚Ä‚¢‚邽‚߁C‚±‚±‚Å‚Ísaved_iipm‚ðIIPM_ENAALLi0j‚É–ß‚¹
753 * ‚΂悢D
754 */
755 mov r0, #CONTROL_PSP /* PSP‚ð—LŒø‚É */
756 msr control, r0
757 isb /* control ‚Ì‘€ìŒã‚É•K—v */
758 /*--> mov r2, #1 /* lock_flag‚ðtrue‚Ö */
759 /*--> ldr r4, =lock_flag
760 /*--> str r2, [r4]
761 /*--> ldr r4, =saved_iipm /* saved_iipm ‚ð0‚É */
762 /*--> mov r0, #0
763 /*--> str r0, [r4]
764 /*--> b dispatcher_0 */
765 mov r2, #1 /* lock_flag‚ðtrue‚Ö */
766 str r2, [r7]
767 ldr r0, =saved_iipm /* saved_iipm ‚ð0‚É */
768 str r4, [r0]
769 b dispatcher_0
770
771
772/*
773 * ƒJ[ƒlƒ‹‚̏I—¹ˆ—‚̌ďo‚µ
774 *
775 * ƒXƒ^ƒbƒN‚ð”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg—p‚ɐ؂è‘Ö‚¦D
776 *
777 */
778 PUBLIC call_exit_kernel
779 IMPORT exit_kernel
780
781 SECTION .text : CODE (2)
782 THUMB
783call_exit_kernel:
784 mov r0, #CONTROL_MSP
785 msr control, r0 /* MSP‚ð—LŒø‚É */
786 isb /* control ‚Ì‘€ìŒã‚É•K—v */
787 /*--> b exit_kernel /* ƒJ[ƒlƒ‹‚̏I—¹ˆ—‚ðŒÄ‚Ô */
788 ldr r0, =exit_kernel /* ƒJ[ƒlƒ‹‚̏I—¹ˆ—‚ðŒÄ‚Ô */
789 bx r0
790
791/*
792 * ƒ^ƒXƒN‹N“®ˆ—
793 *
794 * dispatcher‚©‚çŒÄ‚яo‚³‚ê‚邽‚߁CTCB‚̃AƒhƒŒƒX‚Ír1‚É“ü‚Á‚Ä‚¢‚é
795 *
796 */
797 PUBLIC start_r
798 IMPORT lock_flag
799 IMPORT ext_tsk
800
801 SECTION .text : CODE (2)
802 THUMB
803start_r:
804 mov r0, #0
805 ldr r4, =lock_flag /* CPUƒƒbƒN‰ðœó‘Ô‚Ö */
806 str r0, [r4]
807 msr basepri, r0 /* Š„ž‚Ý‹–‰Â */
808 ldr lr, =ext_tsk /* –ß‚è”Ô’nÝ’è */
809 ldr r2, [r1, #TCB_p_tinib] /* p_runtsk->p_tinib‚ðr2‚É */
810 ldr r0, [r2, #TINIB_exinf] /* exinf‚ðˆø”ƒŒƒWƒXƒ^r0‚É */
811 ldr r1, [r2, #TINIB_task] /* ƒ^ƒXƒN‹N“®”Ô’n‚ɃWƒƒƒ“ƒv */
812 /*mov pc, r1 */
813 bx r1
814
815/*
816 * ”÷­ŽžŠÔ‘Ò‚¿
817 */
818 PUBLIC sil_dly_nse
819
820 SECTION .text : CODE (2)
821 THUMB
822sil_dly_nse:
823 sub r0, r0, #SIL_DLY_TIM1
824 cmp r0, #0
825 bgt sil_dly_nse1
826 /*mov pc, lr*/
827 bx lr
828sil_dly_nse1:
829 sub r0, r0, #SIL_DLY_TIM2
830 cmp r0, #0
831 bgt sil_dly_nse1
832 /*mov pc, lr*/
833 bx lr
834
835 END
836
Note: See TracBrowser for help on using the repository browser.