]> git.gir.st - tmk_keyboard.git/blob - tool/mbed/mbed-sdk/libraries/rtos/rtx/TARGET_CORTEX_M/TARGET_M4/TOOLCHAIN_IAR/HAL_CM4.s
Squashed 'tmk_core/' changes from 7967731..b9e0ea0
[tmk_keyboard.git] / tool / mbed / mbed-sdk / libraries / rtos / rtx / TARGET_CORTEX_M / TARGET_M4 / TOOLCHAIN_IAR / HAL_CM4.s
1 /*----------------------------------------------------------------------------
2 * CMSIS-RTOS - RTX
3 *----------------------------------------------------------------------------
4 * Name: HAL_CM4.S
5 * Purpose: Hardware Abstraction Layer for Cortex-M4
6 * Rev.: V4.70
7 *----------------------------------------------------------------------------
8 *
9 * Copyright (c) 1999-2009 KEIL, 2009-2013 ARM Germany GmbH
10 * All rights reserved.
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions are met:
13 * - Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * - Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 * - Neither the name of ARM nor the names of its contributors may be used
19 * to endorse or promote products derived from this software without
20 * specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
26 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 * POSSIBILITY OF SUCH DAMAGE.
33 *---------------------------------------------------------------------------*/
34
35 NAME HAL_CM4.S
36
37 #define TCB_STACKF 32
38 #define TCB_TSTACK 40
39
40 EXTERN os_flags
41 EXTERN os_tsk
42 EXTERN rt_alloc_box
43 EXTERN rt_free_box
44 EXTERN rt_stk_check
45 EXTERN rt_pop_req
46 EXTERN rt_systick
47 EXTERN os_tick_irqack
48 EXTERN SVC_Table
49 EXTERN SVC_Count
50
51 /*----------------------------------------------------------------------------
52 * Functions
53 *---------------------------------------------------------------------------*/
54
55 SECTION .text:CODE:NOROOT(2)
56 THUMB
57
58 /*--------------------------- rt_set_PSP ------------------------------------*/
59
60 ; void rt_set_PSP (U32 stack);
61
62 PUBLIC rt_set_PSP
63 rt_set_PSP:
64
65 MSR PSP,R0
66 BX LR
67
68
69 /*--------------------------- rt_get_PSP ------------------------------------*/
70
71 ; U32 rt_get_PSP (void);
72
73 PUBLIC rt_get_PSP
74 rt_get_PSP:
75
76 MRS R0,PSP
77 BX LR
78
79
80 /*--------------------------- os_set_env ------------------------------------*/
81
82 ; void os_set_env (void);
83 /* Switch to Unprivileged/Privileged Thread mode, use PSP. */
84
85 PUBLIC os_set_env
86 os_set_env:
87
88 MOV R0,SP /* PSP = MSP */
89 MSR PSP,R0
90 LDR R0,=os_flags
91 LDRB R0,[R0]
92 LSLS R0,#31
93 ITE NE
94 MOVNE R0,#0x02 /* Privileged Thread mode, use PSP */
95 MOVEQ R0,#0x03 /* Unprivileged Thread mode, use PSP */
96 MSR CONTROL,R0
97 BX LR
98
99
100 /*--------------------------- _alloc_box ------------------------------------*/
101
102 ; void *_alloc_box (void *box_mem);
103 /* Function wrapper for Unprivileged/Privileged mode. */
104
105 PUBLIC _alloc_box
106 _alloc_box:
107
108 LDR R12,=rt_alloc_box
109 MRS R3,IPSR
110 LSLS R3,#24
111 IT NE
112 BXNE R12
113 MRS R3,CONTROL
114 LSLS R3,#31
115 IT EQ
116 BXEQ R12
117 SVC 0
118 BX LR
119
120
121 /*--------------------------- _free_box -------------------------------------*/
122
123 ; int _free_box (void *box_mem, void *box);
124 /* Function wrapper for Unprivileged/Privileged mode. */
125
126 PUBLIC _free_box
127 _free_box:
128
129 LDR R12,=rt_free_box
130 MRS R3,IPSR
131 LSLS R3,#24
132 IT NE
133 BXNE R12
134 MRS R3,CONTROL
135 LSLS R3,#31
136 IT EQ
137 BXEQ R12
138 SVC 0
139 BX LR
140
141
142 /*-------------------------- SVC_Handler ------------------------------------*/
143
144 ; void SVC_Handler (void);
145
146 PUBLIC SVC_Handler
147 SVC_Handler:
148
149 #ifdef IFX_XMC4XXX
150 PUBLIC SVC_Handler_Veneer
151 SVC_Handler_Veneer:
152 #endif
153
154 MRS R0,PSP /* Read PSP */
155 LDR R1,[R0,#24] /* Read Saved PC from Stack */
156 LDRB R1,[R1,#-2] /* Load SVC Number */
157 CBNZ R1,SVC_User
158
159 LDM R0,{R0-R3,R12} /* Read R0-R3,R12 from stack */
160 PUSH {R4,LR} /* Save EXC_RETURN */
161 BLX R12 /* Call SVC Function */
162 POP {R4,LR} /* Restore EXC_RETURN */
163
164 MRS R12,PSP /* Read PSP */
165 STM R12,{R0-R2} /* Store return values */
166
167 LDR R3,=os_tsk
168 LDM R3,{R1,R2} /* os_tsk.run, os_tsk.new */
169 CMP R1,R2
170 #ifdef IFX_XMC4XXX
171 ITT EQ
172 PUSHEQ {LR}
173 POPEQ {PC}
174 #else
175 IT EQ
176 BXEQ LR /* RETI, no task switch */
177 #endif
178
179 CBZ R1,SVC_Next /* Runtask deleted? */
180 TST LR,#0x10 /* is it extended frame? */
181 ITTE EQ
182 VSTMDBEQ R12!,{S16-S31} /* yes, stack also VFP hi-regs */
183 MOVEQ R0,#0x01 /* os_tsk->stack_frame val */
184 MOVNE R0,#0x00
185 STRB R0,[R1,#TCB_STACKF] /* os_tsk.run->stack_frame = val */
186 STMDB R12!,{R4-R11} /* Save Old context */
187 STR R12,[R1,#TCB_TSTACK] /* Update os_tsk.run->tsk_stack */
188
189 PUSH {R2,R3}
190 BL rt_stk_check /* Check for Stack overflow */
191 POP {R2,R3}
192
193 SVC_Next:
194 STR R2,[R3] /* os_tsk.run = os_tsk.new */
195
196 LDR R12,[R2,#TCB_TSTACK] /* os_tsk.new->tsk_stack */
197 LDMIA R12!,{R4-R11} /* Restore New Context */
198 LDRB R0,[R2,#TCB_STACKF] /* Stack Frame */
199 CMP R0,#0 /* Basic/Extended Stack Frame */
200 ITTE NE
201 VLDMIANE R12!,{S16-S31} /* restore VFP hi-registers */
202 MVNNE LR,#~0xFFFFFFED /* set EXC_RETURN value */
203 MVNEQ LR,#~0xFFFFFFFD
204 MSR PSP,R12 /* Write PSP */
205
206 SVC_Exit:
207 #ifdef IFX_XMC4XXX
208 PUSH {LR}
209 POP {PC}
210 #else
211 BX LR
212 #endif
213
214 /*------------------- User SVC ------------------------------*/
215
216 SVC_User:
217 PUSH {R4,LR} /* Save Registers */
218 LDR R2,=SVC_Count
219 LDR R2,[R2]
220 CMP R1,R2
221 BHI SVC_Done /* Overflow */
222
223 LDR R4,=SVC_Table-4
224 LDR R4,[R4,R1,LSL #2] /* Load SVC Function Address */
225
226 LDM R0,{R0-R3,R12} /* Read R0-R3,R12 from stack */
227 BLX R4 /* Call SVC Function */
228
229 MRS R12,PSP
230 STM R12,{R0-R3} /* Function return values */
231 SVC_Done:
232 POP {R4,PC} /* RETI */
233
234
235 /*-------------------------- PendSV_Handler ---------------------------------*/
236
237 ; void PendSV_Handler (void);
238
239 PUBLIC PendSV_Handler
240 PendSV_Handler:
241
242 #ifdef IFX_XMC4XXX
243 PUBLIC PendSV_Handler_Veneer
244 PendSV_Handler_Veneer:
245 #endif
246
247 PUSH {R4,LR} /* Save EXC_RETURN */
248 BL rt_pop_req
249
250 Sys_Switch:
251 POP {R4,LR} /* Restore EXC_RETURN */
252
253 LDR R3,=os_tsk
254 LDM R3,{R1,R2} /* os_tsk.run, os_tsk.new */
255 CMP R1,R2
256 #ifdef IFX_XMC4XXX
257 ITT EQ
258 PUSHEQ {LR}
259 POPEQ {PC}
260 #else
261 IT EQ
262 BXEQ LR /* RETI, no task switch */
263 #endif
264
265 MRS R12,PSP /* Read PSP */
266 TST LR,#0x10 /* is it extended frame? */
267 ITTE EQ
268 VSTMDBEQ R12!,{S16-S31} /* yes, stack also VFP hi-regs */
269 MOVEQ R0,#0x01 /* os_tsk->stack_frame val */
270 MOVNE R0,#0x00
271 STRB R0,[R1,#TCB_STACKF] /* os_tsk.run->stack_frame = val */
272 STMDB R12!,{R4-R11} /* Save Old context */
273 STR R12,[R1,#TCB_TSTACK] /* Update os_tsk.run->tsk_stack */
274
275 PUSH {R2,R3}
276 BL rt_stk_check /* Check for Stack overflow */
277 POP {R2,R3}
278
279 STR R2,[R3] /* os_tsk.run = os_tsk.new */
280
281 LDR R12,[R2,#TCB_TSTACK] /* os_tsk.new->tsk_stack */
282 LDMIA R12!,{R4-R11} /* Restore New Context */
283 LDRB R0,[R2,#TCB_STACKF] /* Stack Frame */
284 CMP R0,#0 /* Basic/Extended Stack Frame */
285 ITTE NE
286 VLDMIANE R12!,{S16-S31} /* restore VFP hi-registers */
287 MVNNE LR,#~0xFFFFFFED /* set EXC_RETURN value */
288 MVNEQ LR,#~0xFFFFFFFD
289 MSR PSP,R12 /* Write PSP */
290
291 Sys_Exit:
292 #ifdef IFX_XMC4XXX
293 PUSH {LR}
294 POP {PC}
295 #else
296 BX LR /* Return to Thread Mode */
297 #endif
298
299
300 /*-------------------------- SysTick_Handler --------------------------------*/
301
302 ; void SysTick_Handler (void);
303
304 PUBLIC SysTick_Handler
305 SysTick_Handler:
306 #ifdef IFX_XMC4XXX
307 PUBLIC SysTick_Handler_Veneer
308 SysTick_Handler_Veneer:
309 #endif
310
311 PUSH {R4,LR} /* Save EXC_RETURN */
312 BL rt_systick
313 B Sys_Switch
314
315
316 /*-------------------------- OS_Tick_Handler --------------------------------*/
317
318 ; void OS_Tick_Handler (void);
319
320 PUBLIC OS_Tick_Handler
321 OS_Tick_Handler:
322
323 PUSH {R4,LR} /* Save EXC_RETURN */
324 BL os_tick_irqack
325 BL rt_systick
326 B Sys_Switch
327
328
329 END
330
331 /*----------------------------------------------------------------------------
332 * end of file
333 *---------------------------------------------------------------------------*/
Imprint / Impressum