]> begriffs open source - freertos/blob - portable/Tasking/ARM_CM4F/port_asm.asm
FreeRTOS MPU: Remove MPU region number check (#1261)
[freertos] / portable / Tasking / ARM_CM4F / port_asm.asm
1 ;/*
2 ; * FreeRTOS Kernel <DEVELOPMENT BRANCH>
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