]> git.donarmstrong.com Git - qmk_firmware.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
[qmk_firmware.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  *---------------------------------------------------------------------------*/