]> begriffs open source - freertos/blob - portable/CCS/ARM_CM3/portasm.asm
FreeRTOS MPU: Remove MPU region number check (#1261)
[freertos] / portable / CCS / ARM_CM3 / portasm.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     .thumb
30
31     .ref pxCurrentTCB
32     .ref vTaskSwitchContext
33     .ref ulMaxSyscallInterruptPriority
34
35     .def xPortPendSVHandler
36     .def ulPortGetIPSR
37     .def vPortSVCHandler
38     .def vPortStartFirstTask
39
40 NVICOffsetConst:                    .word   0xE000ED08
41 CPACRConst:                         .word   0xE000ED88
42 pxCurrentTCBConst:                  .word   pxCurrentTCB
43 ulMaxSyscallInterruptPriorityConst: .word ulMaxSyscallInterruptPriority
44
45 ; -----------------------------------------------------------
46
47     .align 4
48 ulPortGetIPSR: .asmfunc
49     mrs r0, ipsr
50     bx r14
51     .endasmfunc
52  ; -----------------------------------------------------------
53
54     .align 4
55 vPortSetInterruptMask: .asmfunc
56     push {r0}
57     ldr r0, ulMaxSyscallInterruptPriorityConst
58     msr basepri, r0
59     pop {r0}
60     bx r14
61     .endasmfunc
62 ; -----------------------------------------------------------
63
64     .align 4
65 xPortPendSVHandler: .asmfunc
66     mrs r0, psp
67     isb
68
69     ;/* Get the location of the current TCB. */
70     ldr r3, pxCurrentTCBConst
71     ldr r2, [r3]
72
73     ;/* Save the core registers. */
74     stmdb r0!, {r4-r11}
75
76     ;/* Save the new top of stack into the first member of the TCB. */
77     str r0, [r2]
78
79     stmdb sp!, {r3, r14}
80     ldr r0, ulMaxSyscallInterruptPriorityConst
81     ldr r1, [r0]
82     msr basepri, r1
83     dsb
84     isb
85     bl vTaskSwitchContext
86     mov r0, #0
87     msr basepri, r0
88     ldmia sp!, {r3, r14}
89
90     ;/* The first item in pxCurrentTCB is the task top of stack. */
91     ldr r1, [r3]
92     ldr r0, [r1]
93
94     ;/* Pop the core registers. */
95     ldmia r0!, {r4-r11}
96
97     msr psp, r0
98     isb
99     bx r14
100     .endasmfunc
101
102 ; -----------------------------------------------------------
103
104     .align 4
105 vPortSVCHandler: .asmfunc
106     ;/* Get the location of the current TCB. */
107     ldr r3, pxCurrentTCBConst
108     ldr r1, [r3]
109     ldr r0, [r1]
110     ;/* Pop the core registers. */
111     ldmia r0!, {r4-r11}
112     msr psp, r0
113     isb
114     mov r0, #0
115     msr basepri, r0
116     orr r14, #0xd
117     bx r14
118     .endasmfunc
119
120 ; -----------------------------------------------------------
121
122     .align 4
123 vPortStartFirstTask: .asmfunc
124     ;/* Use the NVIC offset register to locate the stack. */
125     ldr r0, NVICOffsetConst
126     ldr r0, [r0]
127     ldr r0, [r0]
128     ;/* Set the msp back to the start of the stack. */
129     msr msp, r0
130     ;/* Clear the bit that indicates the FPU is in use in case the FPU was used
131     ;before the scheduler was started - which would otherwise result in the
132     ;unnecessary leaving of space in the SVC stack for lazy saving of FPU
133     ;registers. */
134     mov r0, #0
135     msr control, r0
136     ;/* Call SVC to start the first task. */
137     cpsie i
138     cpsie f
139     dsb
140     isb
141     svc #0
142     .endasmfunc
143
144 ; -----------------------------------------------------------