]> git.donarmstrong.com Git - qmk_firmware.git/blob - tmk_core/tool/mbed/mbed-sdk/libraries/rtos/rtx/TARGET_CORTEX_M/TARGET_M0P/TOOLCHAIN_IAR/HAL_CM0.s
Merge commit '1fe4406f374291ab2e86e95a97341fd9c475fcb8'
[qmk_firmware.git] / tmk_core / tool / mbed / mbed-sdk / libraries / rtos / rtx / TARGET_CORTEX_M / TARGET_M0P / TOOLCHAIN_IAR / HAL_CM0.s
1 /*----------------------------------------------------------------------------
2  *      CMSIS-RTOS  -  RTX
3  *----------------------------------------------------------------------------
4  *      Name:    HAL_CM0.S
5  *      Purpose: Hardware Abstraction Layer for Cortex-M0
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_CM0.S
36
37         #define TCB_TSTACK 40
38
39         EXTERN  os_flags
40         EXTERN  os_tsk
41         EXTERN  rt_alloc_box
42         EXTERN  rt_free_box
43         EXTERN  rt_stk_check
44         EXTERN  rt_pop_req
45         EXTERN  rt_systick
46         EXTERN  os_tick_irqack
47         EXTERN  SVC_Table
48         EXTERN  SVC_Count
49
50 /*----------------------------------------------------------------------------
51  *      Functions
52  *---------------------------------------------------------------------------*/
53
54         SECTION .text:CODE:NOROOT(2)
55         THUMB
56
57 /*--------------------------- rt_set_PSP ------------------------------------*/
58
59 ;       void rt_set_PSP (U32 stack);
60
61         PUBLIC  rt_set_PSP
62 rt_set_PSP:
63
64         MSR     PSP,R0
65         BX      LR
66
67
68 /*--------------------------- rt_get_PSP ------------------------------------*/
69
70 ;       U32 rt_get_PSP (void);
71
72         PUBLIC  rt_get_PSP
73 rt_get_PSP:
74
75         MRS     R0,PSP
76         BX      LR
77
78
79 /*--------------------------- os_set_env ------------------------------------*/
80
81 ;       void os_set_env (void);
82         /* Switch to Unprivileged/Privileged Thread mode, use PSP. */
83
84         PUBLIC  os_set_env
85 os_set_env:
86
87         MOV     R0,SP                   /* PSP = MSP */
88         MSR     PSP,R0
89         LDR     R0,=os_flags
90         LDRB    R0,[R0]
91         LSLS    R0,#31
92         BNE     PrivilegedE
93         MOVS    R0,#0x03                /* Unprivileged Thread mode, use PSP */
94         MSR     CONTROL,R0
95         BX      LR
96 PrivilegedE:
97         MOVS    R0,#0x02                /* Privileged Thread mode, use PSP */
98         MSR     CONTROL,R0
99         BX      LR
100
101
102 /*--------------------------- _alloc_box ------------------------------------*/
103
104 ;      void *_alloc_box (void *box_mem);
105        /* Function wrapper for Unprivileged/Privileged mode. */
106
107         PUBLIC  _alloc_box
108 _alloc_box:
109
110         LDR     R3,=rt_alloc_box
111         MOV     R12,R3
112         MRS     R3,IPSR
113         LSLS    R3,#24
114         BNE     PrivilegedA
115         MRS     R3,CONTROL
116         LSLS    R3,#31
117         BEQ     PrivilegedA
118         SVC     0
119         BX      LR
120 PrivilegedA:
121         BX      R12
122
123
124 /*--------------------------- _free_box -------------------------------------*/
125
126 ;       int _free_box (void *box_mem, void *box);
127         /* Function wrapper for Unprivileged/Privileged mode. */
128
129         PUBLIC  _free_box
130 _free_box:
131
132         LDR     R3,=rt_free_box
133         MOV     R12,R3
134         MRS     R3,IPSR
135         LSLS    R3,#24
136         BNE     PrivilegedF
137         MRS     R3,CONTROL
138         LSLS    R3,#31
139         BEQ     PrivilegedF
140         SVC     0
141         BX      LR
142 PrivilegedF:
143         BX      R12
144
145
146 /*-------------------------- SVC_Handler ------------------------------------*/
147
148 ;       void SVC_Handler (void);
149
150         PUBLIC  SVC_Handler
151 SVC_Handler:
152
153         MRS     R0,PSP                  /* Read PSP */
154         LDR     R1,[R0,#24]             /* Read Saved PC from Stack */
155         SUBS    R1,R1,#2                /* Point to SVC Instruction */
156         LDRB    R1,[R1]                 /* Load SVC Number */
157         CMP     R1,#0
158         BNE     SVC_User                /* User SVC Number > 0 */
159
160         MOV     LR,R4
161         LDMIA   R0,{R0-R3,R4}           /* Read R0-R3,R12 from stack */
162         MOV     R12,R4
163         MOV     R4,LR
164         BLX     R12                     /* Call SVC Function */
165
166         MRS     R3,PSP                  /* Read PSP */
167         STMIA   R3!,{R0-R2}             /* Store return values */
168
169         LDR     R3,=os_tsk
170         LDMIA   R3!,{R1,R2}             /* os_tsk.run, os_tsk.new */
171         CMP     R1,R2
172         BEQ     SVC_Exit                /* no task switch */
173
174         SUBS    R3,#8
175         CMP     R1,#0                   /* Runtask deleted? */
176         BEQ     SVC_Next
177
178         MRS     R0,PSP                  /* Read PSP */
179         SUBS    R0,R0,#32               /* Adjust Start Address */
180         STR     R0,[R1,#TCB_TSTACK]     /* Update os_tsk.run->tsk_stack */
181         STMIA   R0!,{R4-R7}             /* Save old context (R4-R7) */
182         MOV     R4,R8
183         MOV     R5,R9
184         MOV     R6,R10
185         MOV     R7,R11
186         STMIA   R0!,{R4-R7}             /* Save old context (R8-R11) */
187
188         PUSH    {R2,R3}
189         BL      rt_stk_check            /* Check for Stack overflow */
190         POP     {R2,R3}
191
192 SVC_Next:
193         STR     R2,[R3]                 /* os_tsk.run = os_tsk.new */
194
195         LDR     R0,[R2,#TCB_TSTACK]     /* os_tsk.new->tsk_stack */
196         ADDS    R0,R0,#16               /* Adjust Start Address */
197         LDMIA   R0!,{R4-R7}             /* Restore new Context (R8-R11) */
198         MOV     R8,R4
199         MOV     R9,R5
200         MOV     R10,R6
201         MOV     R11,R7
202         MSR     PSP,R0                  /* Write PSP */
203         SUBS    R0,R0,#32               /* Adjust Start Address */
204         LDMIA   R0!,{R4-R7}             /* Restore new Context (R4-R7) */
205
206 SVC_Exit:
207         MOVS    R0,#~0xFFFFFFFD         /* Set EXC_RETURN value */
208         MVNS    R0,R0
209         BX      R0                      /* RETI to Thread Mode, use PSP */
210
211         /*------------------- User SVC ------------------------------*/
212
213 SVC_User:
214         PUSH    {R4,LR}                 /* Save Registers */
215         LDR     R2,=SVC_Count
216         LDR     R2,[R2]
217         CMP     R1,R2
218         BHI     SVC_Done                /* Overflow */
219
220         LDR     R4,=SVC_Table-4
221         LSLS    R1,R1,#2
222         LDR     R4,[R4,R1]              /* Load SVC Function Address */
223         MOV     LR,R4
224
225         LDMIA   R0,{R0-R3,R4}           /* Read R0-R3,R12 from stack */
226         MOV     R12,R4
227         BLX     LR                      /* Call SVC Function */
228
229         MRS     R4,PSP                  /* Read PSP */
230         STMIA   R4!,{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         BL      rt_pop_req
243
244 Sys_Switch:
245         LDR     R3,=os_tsk
246         LDMIA   R3!,{R1,R2}             /* os_tsk.run, os_tsk.new */
247         CMP     R1,R2
248         BEQ     Sys_Exit                /* no task switch */
249
250         SUBS    R3,#8
251
252         MRS     R0,PSP                  /* Read PSP */
253         SUBS    R0,R0,#32               /* Adjust Start Address */
254         STR     R0,[R1,#TCB_TSTACK]     /* Update os_tsk.run->tsk_stack */
255         STMIA   R0!,{R4-R7}             /* Save old context (R4-R7) */
256         MOV     R4,R8
257         MOV     R5,R9
258         MOV     R6,R10
259         MOV     R7,R11
260         STMIA   R0!,{R4-R7}             /* Save old context (R8-R11) */
261
262         PUSH    {R2,R3}
263         BL      rt_stk_check            /* Check for Stack overflow */
264         POP     {R2,R3}
265
266         STR     R2,[R3]                 /* os_tsk.run = os_tsk.new */
267
268         LDR     R0,[R2,#TCB_TSTACK]     /* os_tsk.new->tsk_stack */
269         ADDS    R0,R0,#16               /* Adjust Start Address */
270         LDMIA   R0!,{R4-R7}             /* Restore new Context (R8-R11) */
271         MOV     R8,R4
272         MOV     R9,R5
273         MOV     R10,R6
274         MOV     R11,R7
275         MSR     PSP,R0                  /* Write PSP */
276         SUBS    R0,R0,#32               /* Adjust Start Address */
277         LDMIA   R0!,{R4-R7}             /* Restore new Context (R4-R7) */
278
279 Sys_Exit:
280         MOVS    R0,#~0xFFFFFFFD         /* Set EXC_RETURN value */
281         MVNS    R0,R0
282         BX      R0                      /* RETI to Thread Mode, use PSP */
283
284
285 /*-------------------------- SysTick_Handler --------------------------------*/
286
287 ;       void SysTick_Handler (void);
288
289         PUBLIC  SysTick_Handler
290 SysTick_Handler:
291
292         BL      rt_systick
293         B       Sys_Switch
294
295
296 /*-------------------------- OS_Tick_Handler --------------------------------*/
297
298 ;       void OS_Tick_Handler (void);
299
300         PUBLIC  OS_Tick_Handler
301 OS_Tick_Handler:
302
303         BL      os_tick_irqack
304         BL      rt_systick
305         B       Sys_Switch
306
307
308         END
309
310 /*----------------------------------------------------------------------------
311  * end of file
312  *---------------------------------------------------------------------------*/