]> git.donarmstrong.com Git - qmk_firmware.git/blob - tmk_core/tool/mbed/mbed-sdk/libraries/rtos/rtx/TARGET_CORTEX_M/TARGET_M3/TOOLCHAIN_IAR/HAL_CM3.s
Merge commit '1fe4406f374291ab2e86e95a97341fd9c475fcb8'
[qmk_firmware.git] / tmk_core / tool / mbed / mbed-sdk / libraries / rtos / rtx / TARGET_CORTEX_M / TARGET_M3 / TOOLCHAIN_IAR / HAL_CM3.s
1 /*----------------------------------------------------------------------------
2  *      RL-ARM - RTX
3  *----------------------------------------------------------------------------
4  *      Name:    HAL_CM3.S
5  *      Purpose: Hardware Abstraction Layer for Cortex-M3
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_CM3.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         ITE     NE
93         MOVNE   R0,#0x02                /* Privileged Thread mode, use PSP */
94         MOVEQ   R0,#0x03                /* Unprivileged Thread mode, use PSP */
95         MSR     CONTROL,R0
96         BX      LR
97
98
99 /*--------------------------- _alloc_box ------------------------------------*/
100
101 ;      void *_alloc_box (void *box_mem);
102        /* Function wrapper for Unprivileged/Privileged mode. */
103
104         PUBLIC  _alloc_box
105 _alloc_box:
106
107         LDR     R12,=rt_alloc_box
108         MRS     R3,IPSR
109         LSLS    R3,#24
110         IT      NE
111         BXNE    R12
112         MRS     R3,CONTROL
113         LSLS    R3,#31
114         IT      EQ
115         BXEQ    R12
116         SVC     0
117         BX      LR
118
119
120 /*--------------------------- _free_box -------------------------------------*/
121
122 ;       int _free_box (void *box_mem, void *box);
123         /* Function wrapper for Unprivileged/Privileged mode. */
124
125         PUBLIC  _free_box
126 _free_box:
127
128         LDR     R12,=rt_free_box
129         MRS     R3,IPSR
130         LSLS    R3,#24
131         IT      NE
132         BXNE    R12
133         MRS     R3,CONTROL
134         LSLS    R3,#31
135         IT      EQ
136         BXEQ    R12
137         SVC     0
138         BX      LR
139
140
141 /*-------------------------- SVC_Handler ------------------------------------*/
142
143 ;       void SVC_Handler (void);
144
145         PUBLIC  SVC_Handler
146 SVC_Handler:
147
148         MRS     R0,PSP                  /* Read PSP */
149         LDR     R1,[R0,#24]             /* Read Saved PC from Stack */
150         LDRB    R1,[R1,#-2]             /* Load SVC Number */
151         CBNZ    R1,SVC_User
152
153         LDM     R0,{R0-R3,R12}          /* Read R0-R3,R12 from stack */
154         BLX     R12                     /* Call SVC Function */
155
156         MRS     R12,PSP                 /* Read PSP */
157         STM     R12,{R0-R2}             /* Store return values */
158
159         LDR     R3,=os_tsk
160         LDM     R3,{R1,R2}              /* os_tsk.run, os_tsk.new */
161         CMP     R1,R2
162         BEQ     SVC_Exit                /* no task switch */
163
164         CBZ     R1,SVC_Next             /* Runtask deleted? */
165         STMDB   R12!,{R4-R11}           /* Save Old context */
166         STR     R12,[R1,#TCB_TSTACK]    /* Update os_tsk.run->tsk_stack */
167
168         PUSH    {R2,R3}
169         BL      rt_stk_check            /* Check for Stack overflow */
170         POP     {R2,R3}
171
172 SVC_Next:
173         STR     R2,[R3]                 /* os_tsk.run = os_tsk.new */
174
175         LDR     R12,[R2,#TCB_TSTACK]    /* os_tsk.new->tsk_stack */
176         LDMIA   R12!,{R4-R11}           /* Restore New Context */
177         MSR     PSP,R12                 /* Write PSP */
178
179 SVC_Exit:
180         MVN     LR,#~0xFFFFFFFD         /* set EXC_RETURN value */
181         BX      LR
182
183         /*------------------- User SVC ------------------------------*/
184
185 SVC_User:
186         PUSH    {R4,LR}                 /* Save Registers */
187         LDR     R2,=SVC_Count
188         LDR     R2,[R2]
189         CMP     R1,R2
190         BHI     SVC_Done                /* Overflow */
191
192         LDR     R4,=SVC_Table-4
193         LDR     R4,[R4,R1,LSL #2]       /* Load SVC Function Address */
194
195         LDM     R0,{R0-R3,R12}          /* Read R0-R3,R12 from stack */
196         BLX     R4                      /* Call SVC Function */
197
198         MRS     R12,PSP
199         STM     R12,{R0-R3}             /* Function return values */
200 SVC_Done:
201         POP     {R4,PC}                 /* RETI */
202
203
204 /*-------------------------- PendSV_Handler ---------------------------------*/
205
206 ;       void PendSV_Handler (void);
207
208         PUBLIC  PendSV_Handler
209 PendSV_Handler:
210
211         BL      rt_pop_req
212
213 Sys_Switch:
214         LDR     R3,=os_tsk
215         LDM     R3,{R1,R2}              /* os_tsk.run, os_tsk.new */
216         CMP     R1,R2
217         BEQ     Sys_Exit
218
219         MRS     R12,PSP                 /* Read PSP */
220         STMDB   R12!,{R4-R11}           /* Save Old context */
221         STR     R12,[R1,#TCB_TSTACK]    /* Update os_tsk.run->tsk_stack */
222
223         PUSH    {R2,R3}
224         BL      rt_stk_check            /* Check for Stack overflow */
225         POP     {R2,R3}
226
227         STR     R2,[R3]                 /* os_tsk.run = os_tsk.new */
228
229         LDR     R12,[R2,#TCB_TSTACK]    /* os_tsk.new->tsk_stack */
230         LDMIA   R12!,{R4-R11}           /* Restore New Context */
231         MSR     PSP,R12                 /* Write PSP */
232
233 Sys_Exit:
234         MVN     LR,#~0xFFFFFFFD         /* set EXC_RETURN value */
235         BX      LR                      /* Return to Thread Mode */
236
237
238 /*-------------------------- SysTick_Handler --------------------------------*/
239
240 ;       void SysTick_Handler (void);
241
242         PUBLIC  SysTick_Handler
243 SysTick_Handler:
244
245         BL      rt_systick
246         B       Sys_Switch
247
248
249 /*-------------------------- OS_Tick_Handler --------------------------------*/
250
251 ;       void OS_Tick_Handler (void);
252
253         PUBLIC  OS_Tick_Handler
254 OS_Tick_Handler:
255
256         BL      os_tick_irqack
257         BL      rt_systick
258         B       Sys_Switch
259
260
261         END
262
263 /*----------------------------------------------------------------------------
264  * end of file
265  *---------------------------------------------------------------------------*/