]> git.donarmstrong.com Git - qmk_firmware.git/blob - tmk_core/tool/mbed/mbed-sdk/libraries/rtos/rtx/TARGET_CORTEX_M/TARGET_M4/TOOLCHAIN_GCC/HAL_CM4.s
allow overriding of TARGET
[qmk_firmware.git] / tmk_core / tool / mbed / mbed-sdk / libraries / rtos / rtx / TARGET_CORTEX_M / TARGET_M4 / TOOLCHAIN_GCC / HAL_CM4.s
1 /*----------------------------------------------------------------------------
2  *      RL-ARM - 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         .file   "HAL_CM4.S"
36         .syntax unified
37
38         .equ    TCB_STACKF, 32
39         .equ    TCB_TSTACK, 40
40
41
42 /*----------------------------------------------------------------------------
43  *      Functions
44  *---------------------------------------------------------------------------*/
45
46         .thumb
47
48         .section ".text"
49         .align  2
50
51
52 /*--------------------------- rt_set_PSP ------------------------------------*/
53
54 #       void rt_set_PSP (U32 stack);
55
56         .thumb_func
57         .type   rt_set_PSP, %function
58         .global rt_set_PSP
59 rt_set_PSP:
60         .fnstart
61         .cantunwind
62
63         MSR     PSP,R0
64         BX      LR
65
66         .fnend
67         .size   rt_set_PSP, .-rt_set_PSP
68
69
70 /*--------------------------- rt_get_PSP ------------------------------------*/
71
72 #       U32 rt_get_PSP (void);
73
74         .thumb_func
75         .type   rt_get_PSP, %function
76         .global rt_get_PSP
77 rt_get_PSP:
78         .fnstart
79         .cantunwind
80
81         MRS     R0,PSP
82         BX      LR
83
84         .fnend
85         .size   rt_get_PSP, .-rt_get_PSP
86
87
88 /*--------------------------- os_set_env ------------------------------------*/
89
90 #       void os_set_env (void);
91         /* Switch to Unprivileged/Privileged Thread mode, use PSP. */
92
93         .thumb_func
94         .type   os_set_env, %function
95         .global os_set_env
96 os_set_env:
97         .fnstart
98         .cantunwind
99
100         MOV     R0,SP                   /* PSP = MSP */
101         MSR     PSP,R0
102         LDR     R0,=os_flags
103         LDRB    R0,[R0]
104         LSLS    R0,#31
105         ITE     NE
106         MOVNE   R0,#0x02                /* Privileged Thread mode, use PSP */
107         MOVEQ   R0,#0x03                /* Unprivileged Thread mode, use PSP */
108         MSR     CONTROL,R0
109         BX      LR
110
111         .fnend
112         .size   os_set_env, .-os_set_env
113
114
115 /*--------------------------- _alloc_box ------------------------------------*/
116
117 #      void *_alloc_box (void *box_mem);
118        /* Function wrapper for Unprivileged/Privileged mode. */
119
120         .thumb_func
121         .type   _alloc_box, %function
122         .global _alloc_box
123 _alloc_box:
124         .fnstart
125         .cantunwind
126
127         LDR     R12,=rt_alloc_box
128         MRS     R3,IPSR
129         LSLS    R3,#24
130         IT      NE
131         BXNE    R12
132         MRS     R3,CONTROL
133         LSLS    R3,#31
134         IT      EQ
135         BXEQ    R12
136         SVC     0
137         BX      LR
138
139         .fnend
140         .size   _alloc_box, .-_alloc_box
141
142
143 /*--------------------------- _free_box -------------------------------------*/
144
145 #       int _free_box (void *box_mem, void *box);
146         /* Function wrapper for Unprivileged/Privileged mode. */
147
148         .thumb_func
149         .type   _free_box, %function
150         .global _free_box
151 _free_box:
152         .fnstart
153         .cantunwind
154
155         LDR     R12,=rt_free_box
156         MRS     R3,IPSR
157         LSLS    R3,#24
158         IT      NE
159         BXNE    R12
160         MRS     R3,CONTROL
161         LSLS    R3,#31
162         IT      EQ
163         BXEQ    R12
164         SVC     0
165         BX      LR
166
167         .fnend
168         .size   _free_box, .-_free_box
169
170
171 /*-------------------------- SVC_Handler ------------------------------------*/
172
173 #       void SVC_Handler (void);
174
175         .thumb_func
176         .type   SVC_Handler, %function
177         .global SVC_Handler
178 SVC_Handler:
179         .ifdef  IFX_XMC4XXX
180         .global SVC_Handler_Veneer
181 SVC_Handler_Veneer:
182         .endif
183         .fnstart
184         .cantunwind
185
186         MRS     R0,PSP                  /* Read PSP */
187         LDR     R1,[R0,#24]             /* Read Saved PC from Stack */
188         LDRB    R1,[R1,#-2]             /* Load SVC Number */
189         CBNZ    R1,SVC_User
190
191         LDM     R0,{R0-R3,R12}          /* Read R0-R3,R12 from stack */
192         PUSH    {R4,LR}                 /* Save EXC_RETURN */
193         BLX     R12                     /* Call SVC Function */
194         POP     {R4,LR}                 /* Restore EXC_RETURN */
195
196         MRS     R12,PSP                 /* Read PSP */
197         STM     R12,{R0-R2}             /* Store return values */
198
199         LDR     R3,=os_tsk
200         LDM     R3,{R1,R2}              /* os_tsk.run, os_tsk.new */
201         CMP     R1,R2
202         .ifdef  IFX_XMC4XXX
203         ITT     EQ
204         PUSHEQ  {LR}
205         POPEQ   {PC}
206         .else
207         IT      EQ
208         BXEQ    LR                      /* RETI, no task switch */
209         .endif
210
211         CBZ     R1,SVC_Next             /* Runtask deleted? */
212         TST     LR,#0x10                /* is it extended frame? */
213         #ifdef  __FPU_PRESENT
214         ITTE    EQ
215         VSTMDBEQ R12!,{S16-S31}         /* yes, stack also VFP hi-regs */
216         #else
217         ITE    EQ
218         #endif
219         MOVEQ   R0,#0x01                /* os_tsk->stack_frame val */
220         MOVNE   R0,#0x00
221         STRB    R0,[R1,#TCB_STACKF]     /* os_tsk.run->stack_frame = val */
222         STMDB   R12!,{R4-R11}           /* Save Old context */
223         STR     R12,[R1,#TCB_TSTACK]    /* Update os_tsk.run->tsk_stack */
224
225         PUSH    {R2,R3}
226         BL      rt_stk_check            /* Check for Stack overflow */
227         POP     {R2,R3}
228
229 SVC_Next:
230         STR     R2,[R3]                 /* os_tsk.run = os_tsk.new */
231
232         LDR     R12,[R2,#TCB_TSTACK]    /* os_tsk.new->tsk_stack */
233         LDMIA   R12!,{R4-R11}           /* Restore New Context */
234         LDRB    R0,[R2,#TCB_STACKF]     /* Stack Frame */
235         CMP     R0,#0                   /* Basic/Extended Stack Frame */
236         #ifdef  __FPU_PRESENT
237         ITTE    NE
238         VLDMIANE R12!,{S16-S31}         /* restore VFP hi-registers */
239         #else
240         ITE    NE
241         #endif
242         MVNNE   LR,#~0xFFFFFFED         /* set EXC_RETURN value */
243         MVNEQ   LR,#~0xFFFFFFFD
244         MSR     PSP,R12                 /* Write PSP */
245
246 SVC_Exit:
247         .ifdef  IFX_XMC4XXX
248         PUSH    {LR}
249         POP     {PC}
250         .else
251         BX      LR
252         .endif
253
254         /*------------------- User SVC ------------------------------*/
255
256 SVC_User:
257         PUSH    {R4,LR}                 /* Save Registers */
258         LDR     R2,=SVC_Count
259         LDR     R2,[R2]
260         CMP     R1,R2
261         BHI     SVC_Done                /* Overflow */
262
263         LDR     R4,=SVC_Table-4
264         LDR     R4,[R4,R1,LSL #2]       /* Load SVC Function Address */
265
266         LDM     R0,{R0-R3,R12}          /* Read R0-R3,R12 from stack */
267         BLX     R4                      /* Call SVC Function */
268
269         MRS     R12,PSP
270         STM     R12,{R0-R3}             /* Function return values */
271 SVC_Done:
272         POP     {R4,PC}                 /* RETI */
273
274         .fnend
275         .size   SVC_Handler, .-SVC_Handler
276
277
278 /*-------------------------- PendSV_Handler ---------------------------------*/
279
280 #       void PendSV_Handler (void);
281
282         .thumb_func
283         .type   PendSV_Handler, %function
284         .global PendSV_Handler
285         .global Sys_Switch
286 PendSV_Handler:
287         .ifdef  IFX_XMC4XXX
288         .global PendSV_Handler_Veneer
289 PendSV_Handler_Veneer:
290         .endif
291         .fnstart
292         .cantunwind
293
294         PUSH    {R4,LR}                 /* Save EXC_RETURN */
295         BL      rt_pop_req
296
297 Sys_Switch:
298         POP     {R4,LR}                 /* Restore EXC_RETURN */
299
300         LDR     R3,=os_tsk
301         LDM     R3,{R1,R2}              /* os_tsk.run, os_tsk.new */
302         CMP     R1,R2
303         .ifdef  IFX_XMC4XXX
304         ITT     EQ
305         PUSHEQ  {LR}
306         POPEQ   {PC}
307         .else
308         IT      EQ
309         BXEQ    LR                      /* RETI, no task switch */
310         .endif
311
312         MRS     R12,PSP                 /* Read PSP */
313         TST     LR,#0x10                /* is it extended frame? */
314         #ifdef  __FPU_PRESENT
315         ITTE    EQ
316         VSTMDBEQ R12!,{S16-S31}         /* yes, stack also VFP hi-regs */
317         #else
318         ITE    EQ
319         #endif
320         MOVEQ   R0,#0x01                /* os_tsk->stack_frame val */
321         MOVNE   R0,#0x00
322         STRB    R0,[R1,#TCB_STACKF]     /* os_tsk.run->stack_frame = val */
323         STMDB   R12!,{R4-R11}           /* Save Old context */
324         STR     R12,[R1,#TCB_TSTACK]    /* Update os_tsk.run->tsk_stack */
325
326         PUSH    {R2,R3}
327         BL      rt_stk_check            /* Check for Stack overflow */
328         POP     {R2,R3}
329
330         STR     R2,[R3]                 /* os_tsk.run = os_tsk.new */
331
332         LDR     R12,[R2,#TCB_TSTACK]    /* os_tsk.new->tsk_stack */
333         LDMIA   R12!,{R4-R11}           /* Restore New Context */
334         LDRB    R0,[R2,#TCB_STACKF]     /* Stack Frame */
335         CMP     R0,#0                   /* Basic/Extended Stack Frame */
336         #ifdef  __FPU_PRESENT
337         ITTE    NE
338         VLDMIANE R12!,{S16-S31}         /* restore VFP hi-registers */
339         #else
340         ITE    NE
341         #endif
342         MVNNE   LR,#~0xFFFFFFED         /* set EXC_RETURN value */
343         MVNEQ   LR,#~0xFFFFFFFD
344         MSR     PSP,R12                 /* Write PSP */
345
346 Sys_Exit:
347         .ifdef  IFX_XMC4XXX
348         PUSH    {LR}
349         POP     {PC}
350         .else
351         BX      LR                      /* Return to Thread Mode */
352         .endif
353
354         .fnend
355         .size   PendSV_Handler, .-PendSV_Handler
356
357
358 /*-------------------------- SysTick_Handler --------------------------------*/
359
360 #       void SysTick_Handler (void);
361
362         .thumb_func
363         .type   SysTick_Handler, %function
364         .global SysTick_Handler
365 SysTick_Handler:
366         .ifdef  IFX_XMC4XXX
367         .global SysTick_Handler_Veneer
368 SysTick_Handler_Veneer:
369         .endif
370         .fnstart
371         .cantunwind
372
373         PUSH    {R4,LR}                 /* Save EXC_RETURN */
374         BL      rt_systick
375         B       Sys_Switch
376
377         .fnend
378         .size   SysTick_Handler, .-SysTick_Handler
379
380
381 /*-------------------------- OS_Tick_Handler --------------------------------*/
382
383 #       void OS_Tick_Handler (void);
384
385         .thumb_func
386         .type   OS_Tick_Handler, %function
387         .global OS_Tick_Handler
388 OS_Tick_Handler:
389         .fnstart
390         .cantunwind
391
392         PUSH    {R4,LR}                 /* Save EXC_RETURN */
393         BL      os_tick_irqack
394         BL      rt_systick
395         B       Sys_Switch
396
397         .fnend
398         .size   OS_Tick_Handler, .-OS_Tick_Handler
399
400
401         .end
402
403 /*----------------------------------------------------------------------------
404  * end of file
405  *---------------------------------------------------------------------------*/