]> git.sur5r.net Git - freertos/blob - FreeRTOS/Source/portable/CCS/ARM_CM3/portasm.asm
Update version numbers ready for release.
[freertos] / FreeRTOS / Source / portable / CCS / ARM_CM3 / portasm.asm
1 ;/*\r
2 ; * FreeRTOS Kernel V10.1.1\r
3 ; * Copyright (C) 2018 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
4 ; *\r
5 ; * Permission is hereby granted, free of charge, to any person obtaining a copy of\r
6 ; * this software and associated documentation files (the "Software"), to deal in\r
7 ; * the Software without restriction, including without limitation the rights to\r
8 ; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r
9 ; * the Software, and to permit persons to whom the Software is furnished to do so,\r
10 ; * subject to the following conditions:\r
11 ; *\r
12 ; * The above copyright notice and this permission notice shall be included in all\r
13 ; * copies or substantial portions of the Software.\r
14 ; *\r
15 ; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
16 ; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
17 ; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
18 ; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
19 ; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
20 ; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
21 ; *\r
22 ; * http://www.FreeRTOS.org\r
23 ; * http://aws.amazon.com/freertos\r
24 ; *\r
25 ; * 1 tab == 4 spaces!\r
26 ; */\r
27 \r
28         .thumb\r
29 \r
30         .ref pxCurrentTCB\r
31         .ref vTaskSwitchContext\r
32         .ref ulMaxSyscallInterruptPriority\r
33 \r
34         .def xPortPendSVHandler\r
35         .def ulPortGetIPSR\r
36         .def vPortSVCHandler\r
37         .def vPortStartFirstTask\r
38 \r
39 NVICOffsetConst:                                        .word   0xE000ED08\r
40 CPACRConst:                                                     .word   0xE000ED88\r
41 pxCurrentTCBConst:                                      .word   pxCurrentTCB\r
42 ulMaxSyscallInterruptPriorityConst: .word ulMaxSyscallInterruptPriority\r
43 \r
44 ; -----------------------------------------------------------\r
45 \r
46         .align 4\r
47 ulPortGetIPSR: .asmfunc\r
48         mrs r0, ipsr\r
49         bx r14\r
50         .endasmfunc\r
51  ; -----------------------------------------------------------\r
52 \r
53         .align 4\r
54 vPortSetInterruptMask: .asmfunc\r
55         push {r0}\r
56         ldr r0, ulMaxSyscallInterruptPriorityConst\r
57         msr basepri, r0\r
58         pop {r0}\r
59         bx r14\r
60         .endasmfunc\r
61 ; -----------------------------------------------------------\r
62 \r
63         .align 4\r
64 xPortPendSVHandler: .asmfunc\r
65         mrs r0, psp\r
66         isb\r
67 \r
68         ;/* Get the location of the current TCB. */\r
69         ldr     r3, pxCurrentTCBConst\r
70         ldr     r2, [r3]\r
71 \r
72         ;/* Save the core registers. */\r
73         stmdb r0!, {r4-r11}\r
74 \r
75         ;/* Save the new top of stack into the first member of the TCB. */\r
76         str r0, [r2]\r
77 \r
78         stmdb sp!, {r3, r14}\r
79         ldr r0, ulMaxSyscallInterruptPriorityConst\r
80         ldr r1, [r0]\r
81         msr basepri, r1\r
82         dsb\r
83         isb\r
84         bl vTaskSwitchContext\r
85         mov r0, #0\r
86         msr basepri, r0\r
87         ldmia sp!, {r3, r14}\r
88 \r
89         ;/* The first item in pxCurrentTCB is the task top of stack. */\r
90         ldr r1, [r3]\r
91         ldr r0, [r1]\r
92 \r
93         ;/* Pop the core registers. */\r
94         ldmia r0!, {r4-r11}\r
95 \r
96         msr psp, r0\r
97         isb\r
98         bx r14\r
99         .endasmfunc\r
100 \r
101 ; -----------------------------------------------------------\r
102 \r
103         .align 4\r
104 vPortSVCHandler: .asmfunc\r
105         ;/* Get the location of the current TCB. */\r
106         ldr     r3, pxCurrentTCBConst\r
107         ldr r1, [r3]\r
108         ldr r0, [r1]\r
109         ;/* Pop the core registers. */\r
110         ldmia r0!, {r4-r11}\r
111         msr psp, r0\r
112         isb\r
113         mov r0, #0\r
114         msr     basepri, r0\r
115         orr r14, #0xd\r
116         bx r14\r
117         .endasmfunc\r
118 \r
119 ; -----------------------------------------------------------\r
120 \r
121         .align 4\r
122 vPortStartFirstTask: .asmfunc\r
123         ;/* Use the NVIC offset register to locate the stack. */\r
124         ldr r0, NVICOffsetConst\r
125         ldr r0, [r0]\r
126         ldr r0, [r0]\r
127         ;/* Set the msp back to the start of the stack. */\r
128         msr msp, r0\r
129         ;/* Clear the bit that indicates the FPU is in use in case the FPU was used\r
130         ;before the scheduler was started - which would otherwise result in the\r
131         ;unnecessary leaving of space in the SVC stack for lazy saving of FPU\r
132         ;registers. */\r
133         mov r0, #0\r
134         msr control, r0\r
135         ;/* Call SVC to start the first task. */\r
136         cpsie i\r
137         cpsie f\r
138         dsb\r
139         isb\r
140         svc #0\r
141         .endasmfunc\r
142 \r
143 ; -----------------------------------------------------------\r
144 \r