1 /*----------------------------------------------------------------------------
3 *----------------------------------------------------------------------------
5 * Purpose: Hardware Abstraction Layer for Cortex-M4
7 *----------------------------------------------------------------------------
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.
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 *---------------------------------------------------------------------------*/
51 /*----------------------------------------------------------------------------
53 *---------------------------------------------------------------------------*/
55 SECTION .text:CODE:NOROOT(2)
58 /*--------------------------- rt_set_PSP ------------------------------------*/
60 ; void rt_set_PSP (U32 stack);
69 /*--------------------------- rt_get_PSP ------------------------------------*/
71 ; U32 rt_get_PSP (void);
80 /*--------------------------- os_set_env ------------------------------------*/
82 ; void os_set_env (void);
83 /* Switch to Unprivileged/Privileged Thread mode, use PSP. */
88 MOV R0,SP /* PSP = MSP */
94 MOVNE R0,#0x02 /* Privileged Thread mode, use PSP */
95 MOVEQ R0,#0x03 /* Unprivileged Thread mode, use PSP */
100 /*--------------------------- _alloc_box ------------------------------------*/
102 ; void *_alloc_box (void *box_mem);
103 /* Function wrapper for Unprivileged/Privileged mode. */
108 LDR R12,=rt_alloc_box
121 /*--------------------------- _free_box -------------------------------------*/
123 ; int _free_box (void *box_mem, void *box);
124 /* Function wrapper for Unprivileged/Privileged mode. */
142 /*-------------------------- SVC_Handler ------------------------------------*/
144 ; void SVC_Handler (void);
150 PUBLIC SVC_Handler_Veneer
154 MRS R0,PSP /* Read PSP */
155 LDR R1,[R0,#24] /* Read Saved PC from Stack */
156 LDRB R1,[R1,#-2] /* Load SVC Number */
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 */
164 MRS R12,PSP /* Read PSP */
165 STM R12,{R0-R2} /* Store return values */
168 LDM R3,{R1,R2} /* os_tsk.run, os_tsk.new */
176 BXEQ LR /* RETI, no task switch */
179 CBZ R1,SVC_Next /* Runtask deleted? */
180 TST LR,#0x10 /* is it extended frame? */
182 VSTMDBEQ R12!,{S16-S31} /* yes, stack also VFP hi-regs */
183 MOVEQ R0,#0x01 /* os_tsk->stack_frame val */
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 */
190 BL rt_stk_check /* Check for Stack overflow */
194 STR R2,[R3] /* os_tsk.run = os_tsk.new */
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 */
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 */
214 /*------------------- User SVC ------------------------------*/
217 PUSH {R4,LR} /* Save Registers */
221 BHI SVC_Done /* Overflow */
224 LDR R4,[R4,R1,LSL #2] /* Load SVC Function Address */
226 LDM R0,{R0-R3,R12} /* Read R0-R3,R12 from stack */
227 BLX R4 /* Call SVC Function */
230 STM R12,{R0-R3} /* Function return values */
232 POP {R4,PC} /* RETI */
235 /*-------------------------- PendSV_Handler ---------------------------------*/
237 ; void PendSV_Handler (void);
239 PUBLIC PendSV_Handler
243 PUBLIC PendSV_Handler_Veneer
244 PendSV_Handler_Veneer:
247 PUSH {R4,LR} /* Save EXC_RETURN */
251 POP {R4,LR} /* Restore EXC_RETURN */
254 LDM R3,{R1,R2} /* os_tsk.run, os_tsk.new */
262 BXEQ LR /* RETI, no task switch */
265 MRS R12,PSP /* Read PSP */
266 TST LR,#0x10 /* is it extended frame? */
268 VSTMDBEQ R12!,{S16-S31} /* yes, stack also VFP hi-regs */
269 MOVEQ R0,#0x01 /* os_tsk->stack_frame val */
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 */
276 BL rt_stk_check /* Check for Stack overflow */
279 STR R2,[R3] /* os_tsk.run = os_tsk.new */
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 */
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 */
296 BX LR /* Return to Thread Mode */
300 /*-------------------------- SysTick_Handler --------------------------------*/
302 ; void SysTick_Handler (void);
304 PUBLIC SysTick_Handler
307 PUBLIC SysTick_Handler_Veneer
308 SysTick_Handler_Veneer:
311 PUSH {R4,LR} /* Save EXC_RETURN */
316 /*-------------------------- OS_Tick_Handler --------------------------------*/
318 ; void OS_Tick_Handler (void);
320 PUBLIC OS_Tick_Handler
323 PUSH {R4,LR} /* Save EXC_RETURN */
331 /*----------------------------------------------------------------------------
333 *---------------------------------------------------------------------------*/