]> begriffs open source - cmsis-freertos/blob - Source/portable/Tasking/ARM_CM4F/port_asm.asm
Updated pack to FreeRTOS 10.4.6
[cmsis-freertos] / Source / portable / Tasking / ARM_CM4F / port_asm.asm
1 ;/*
2 ; * FreeRTOS Kernel V10.4.6
3 ; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
4 ; *
5 ; * SPDX-License-Identifier: MIT
6 ; *
7 ; * Permission is hereby granted, free of charge, to any person obtaining a copy of
8 ; * this software and associated documentation files (the "Software"), to deal in
9 ; * the Software without restriction, including without limitation the rights to
10 ; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
11 ; * the Software, and to permit persons to whom the Software is furnished to do so,
12 ; * subject to the following conditions:
13 ; *
14 ; * The above copyright notice and this permission notice shall be included in all
15 ; * copies or substantial portions of the Software.
16 ; *
17 ; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 ; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
19 ; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
20 ; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
21 ; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 ; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 ; *
24 ; * https://www.FreeRTOS.org
25 ; * https://github.com/FreeRTOS
26 ; *
27 ; */
28
29
30         .extern pxCurrentTCB
31         .extern vTaskSwitchContext
32         .extern ulMaxSyscallInterruptPriorityConst
33
34         .global _vector_14
35         .global _lc_ref__vector_pp_14
36         .global SVC_Handler
37         .global vPortStartFirstTask
38         .global vPortEnableVFP
39         .global ulPortSetInterruptMask
40         .global vPortClearInterruptMask
41
42 ;-----------------------------------------------------------
43
44         .section .text
45         .thumb
46         .align 4
47 _vector_14: .type func
48
49         mrs r0, psp
50         isb
51
52         ;Get the location of the current TCB.
53         ldr.w   r3, =pxCurrentTCB
54         ldr     r2, [r3]
55
56         ;Is the task using the FPU context?  If so, push high vfp registers.
57         tst r14, #0x10
58         it eq
59         vstmdbeq r0!, {s16-s31}
60
61         ;Save the core registers.
62         stmdb r0!, {r4-r11, r14}
63
64         ;Save the new top of stack into the first member of the TCB.
65         str r0, [r2]
66
67         stmdb sp!, {r0, r3}
68         ldr.w r0, =ulMaxSyscallInterruptPriorityConst
69         ldr r0, [r0]
70         msr basepri, r0
71         bl vTaskSwitchContext
72         mov r0, #0
73         msr basepri, r0
74         ldmia sp!, {r0, r3}
75
76         ;The first item in pxCurrentTCB is the task top of stack.
77         ldr r1, [r3]
78         ldr r0, [r1]
79
80         ;Pop the core registers.
81         ldmia r0!, {r4-r11, r14}
82
83         ;Is the task using the FPU context?  If so, pop the high vfp registers too.
84         tst r14, #0x10
85         it eq
86         vldmiaeq r0!, {s16-s31}
87
88         msr psp, r0
89         isb
90         bx r14
91
92         .size   _vector_14, $-_vector_14
93         .endsec
94
95 ;-----------------------------------------------------------
96
97 ; This function is an XMC4000 silicon errata workaround.  It will get used when
98 ; the SILICON_BUG_PMC_CM_001 linker macro is defined.
99         .section .text
100         .thumb
101         .align 4
102 _lc_ref__vector_pp_14: .type func
103
104         mrs r0, psp
105         isb
106
107         ;Get the location of the current TCB.
108         ldr.w   r3, =pxCurrentTCB
109         ldr     r2, [r3]
110
111         ;Is the task using the FPU context?  If so, push high vfp registers.
112         tst r14, #0x10
113         it eq
114         vstmdbeq r0!, {s16-s31}
115
116         ;Save the core registers.
117         stmdb r0!, {r4-r11, r14}
118
119         ;Save the new top of stack into the first member of the TCB.
120         str r0, [r2]
121
122         stmdb sp!, {r3}
123         ldr.w r0, =ulMaxSyscallInterruptPriorityConst
124         ldr r0, [r0]
125         msr basepri, r0
126         bl vTaskSwitchContext
127         mov r0, #0
128         msr basepri, r0
129         ldmia sp!, {r3}
130
131         ;The first item in pxCurrentTCB is the task top of stack.
132         ldr r1, [r3]
133         ldr r0, [r1]
134
135         ;Pop the core registers.
136         ldmia r0!, {r4-r11, r14}
137
138         ;Is the task using the FPU context?  If so, pop the high vfp registers too.
139         tst r14, #0x10
140         it eq
141         vldmiaeq r0!, {s16-s31}
142
143         msr psp, r0
144         isb
145         push { lr }
146         pop { pc } ; XMC4000 specific errata workaround.  Do not used "bx lr" here.
147
148         .size   _lc_ref__vector_pp_14, $-_lc_ref__vector_pp_14
149         .endsec
150
151 ;-----------------------------------------------------------
152
153         .section .text
154         .thumb
155         .align 4
156 SVC_Handler: .type func
157         ;Get the location of the current TCB.
158         ldr.w   r3, =pxCurrentTCB
159         ldr r1, [r3]
160         ldr r0, [r1]
161         ;Pop the core registers.
162         ldmia r0!, {r4-r11, r14}
163         msr psp, r0
164         isb
165         mov r0, #0
166         msr     basepri, r0
167         bx r14
168         .size   SVC_Handler, $-SVC_Handler
169         .endsec
170
171 ;-----------------------------------------------------------
172
173         .section .text
174         .thumb
175         .align 4
176 vPortStartFirstTask .type func
177         ;Use the NVIC offset register to locate the stack.
178         ldr.w r0, =0xE000ED08
179         ldr r0, [r0]
180         ldr r0, [r0]
181         ;Set the msp back to the start of the stack.
182         msr msp, r0
183         ;Call SVC to start the first task.
184         cpsie i
185         cpsie f
186         dsb
187         isb
188         svc 0
189         .size   vPortStartFirstTask, $-vPortStartFirstTask
190         .endsec
191
192 ;-----------------------------------------------------------
193
194         .section .text
195         .thumb
196         .align 4
197 vPortEnableVFP .type func
198         ;The FPU enable bits are in the CPACR.
199         ldr.w r0, =0xE000ED88
200         ldr     r1, [r0]
201
202         ;Enable CP10 and CP11 coprocessors, then save back.
203         orr     r1, r1, #( 0xf << 20 )
204         str r1, [r0]
205         bx      r14
206         .size   vPortEnableVFP, $-vPortEnableVFP
207         .endsec
208
209 ;-----------------------------------------------------------
210
211         .section .text
212         .thumb
213         .align 4
214 ulPortSetInterruptMask:
215         mrs r0, basepri
216         ldr.w r1, =ulMaxSyscallInterruptPriorityConst
217         ldr r1, [r1]
218         msr basepri, r1
219         bx r14
220         .size   ulPortSetInterruptMask, $-ulPortSetInterruptMask
221         .endsec
222
223 ;-----------------------------------------------------------
224
225         .section .text
226         .thumb
227         .align 4
228 vPortClearInterruptMask:
229         msr basepri, r0
230         bx r14
231         .size   vPortClearInterruptMask, $-vPortClearInterruptMask
232         .endsec
233
234 ;-----------------------------------------------------------
235
236         .end
237