]> git.sur5r.net Git - freertos/blob - FreeRTOS/Source/portable/IAR/ARM_CM4F/portasm.s
Update to MIT licensed FreeRTOS V10.0.0 - see https://www.freertos.org/History.txt
[freertos] / FreeRTOS / Source / portable / IAR / ARM_CM4F / portasm.s
1 /*\r
2  * FreeRTOS Kernel V10.0.0\r
3  * Copyright (C) 2017 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. If you wish to use our Amazon\r
14  * FreeRTOS name, please do so in a fair use way that does not cause confusion.\r
15  *\r
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
18  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
19  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
20  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
21  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
22  *\r
23  * http://www.FreeRTOS.org\r
24  * http://aws.amazon.com/freertos\r
25  *\r
26  * 1 tab == 4 spaces!\r
27  */\r
28 \r
29 #include <FreeRTOSConfig.h>\r
30 \r
31         RSEG    CODE:CODE(2)\r
32         thumb\r
33 \r
34         EXTERN pxCurrentTCB\r
35         EXTERN vTaskSwitchContext\r
36 \r
37         PUBLIC xPortPendSVHandler\r
38         PUBLIC vPortSVCHandler\r
39         PUBLIC vPortStartFirstTask\r
40         PUBLIC vPortEnableVFP\r
41 \r
42 \r
43 /*-----------------------------------------------------------*/\r
44 \r
45 xPortPendSVHandler:\r
46         mrs r0, psp\r
47         isb\r
48         /* Get the location of the current TCB. */\r
49         ldr     r3, =pxCurrentTCB\r
50         ldr     r2, [r3]\r
51 \r
52         /* Is the task using the FPU context?  If so, push high vfp registers. */\r
53         tst r14, #0x10\r
54         it eq\r
55         vstmdbeq r0!, {s16-s31}\r
56 \r
57         /* Save the core registers. */\r
58         stmdb r0!, {r4-r11, r14}\r
59 \r
60         /* Save the new top of stack into the first member of the TCB. */\r
61         str r0, [r2]\r
62 \r
63         stmdb sp!, {r0, r3}\r
64         mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY\r
65         msr basepri, r0\r
66         dsb\r
67         isb\r
68         bl vTaskSwitchContext\r
69         mov r0, #0\r
70         msr basepri, r0\r
71         ldmia sp!, {r0, r3}\r
72 \r
73         /* The first item in pxCurrentTCB is the task top of stack. */\r
74         ldr r1, [r3]\r
75         ldr r0, [r1]\r
76 \r
77         /* Pop the core registers. */\r
78         ldmia r0!, {r4-r11, r14}\r
79 \r
80         /* Is the task using the FPU context?  If so, pop the high vfp registers\r
81         too. */\r
82         tst r14, #0x10\r
83         it eq\r
84         vldmiaeq r0!, {s16-s31}\r
85 \r
86         msr psp, r0\r
87         isb\r
88         #ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata */\r
89                 #if WORKAROUND_PMU_CM001 == 1\r
90                         push { r14 }\r
91                         pop { pc }\r
92                 #endif\r
93         #endif\r
94 \r
95         bx r14\r
96 \r
97 \r
98 /*-----------------------------------------------------------*/\r
99 \r
100 vPortSVCHandler:\r
101         /* Get the location of the current TCB. */\r
102         ldr     r3, =pxCurrentTCB\r
103         ldr r1, [r3]\r
104         ldr r0, [r1]\r
105         /* Pop the core registers. */\r
106         ldmia r0!, {r4-r11, r14}\r
107         msr psp, r0\r
108         isb\r
109         mov r0, #0\r
110         msr     basepri, r0\r
111         bx r14\r
112 \r
113 /*-----------------------------------------------------------*/\r
114 \r
115 vPortStartFirstTask\r
116         /* Use the NVIC offset register to locate the stack. */\r
117         ldr r0, =0xE000ED08\r
118         ldr r0, [r0]\r
119         ldr r0, [r0]\r
120         /* Set the msp back to the start of the stack. */\r
121         msr msp, r0\r
122         /* Clear the bit that indicates the FPU is in use in case the FPU was used\r
123         before the scheduler was started - which would otherwise result in the\r
124         unnecessary leaving of space in the SVC stack for lazy saving of FPU\r
125         registers. */\r
126         mov r0, #0\r
127         msr control, r0\r
128         /* Call SVC to start the first task. */\r
129         cpsie i\r
130         cpsie f\r
131         dsb\r
132         isb\r
133         svc 0\r
134 \r
135 /*-----------------------------------------------------------*/\r
136 \r
137 vPortEnableVFP:\r
138         /* The FPU enable bits are in the CPACR. */\r
139         ldr.w r0, =0xE000ED88\r
140         ldr     r1, [r0]\r
141 \r
142         /* Enable CP10 and CP11 coprocessors, then save back. */\r
143         orr     r1, r1, #( 0xf << 20 )\r
144         str r1, [r0]\r
145         bx      r14\r
146 \r
147 \r
148 \r
149         END\r
150 \r