]> git.sur5r.net Git - freertos/blob - FreeRTOS/Source/portable/GCC/PPC440_Xilinx/portasm.S
Update to MIT licensed FreeRTOS V10.0.0 - see https://www.freertos.org/History.txt
[freertos] / FreeRTOS / Source / portable / GCC / PPC440_Xilinx / 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         .extern pxCurrentTCB\r
32         .extern vTaskSwitchContext\r
33         .extern xTaskIncrementTick\r
34         .extern vPortISRHandler\r
35 \r
36         .global vPortStartFirstTask\r
37         .global vPortYield\r
38         .global vPortTickISR\r
39         .global vPortISRWrapper\r
40         .global vPortSaveFPURegisters\r
41         .global vPortRestoreFPURegisters\r
42 \r
43 .set    BChainField, 0\r
44 .set    NextLRField, BChainField + 4\r
45 .set    MSRField,    NextLRField + 4\r
46 .set    PCField,     MSRField    + 4\r
47 .set    LRField,     PCField     + 4\r
48 .set    CTRField,    LRField     + 4\r
49 .set    XERField,    CTRField    + 4\r
50 .set    CRField,     XERField    + 4\r
51 .set    USPRG0Field, CRField     + 4\r
52 .set    r0Field,     USPRG0Field + 4\r
53 .set    r2Field,     r0Field     + 4\r
54 .set    r3r31Field,  r2Field     + 4\r
55 .set    IFrameSize,  r3r31Field  + ( ( 31 - 3 ) + 1 ) * 4\r
56 \r
57 \r
58 .macro portSAVE_STACK_POINTER_AND_LR\r
59 \r
60         /* Get the address of the TCB. */\r
61         xor             R0, R0, R0\r
62         addis   R2, R0, pxCurrentTCB@ha\r
63         lwz             R2,     pxCurrentTCB@l( R2 )\r
64 \r
65         /* Store the stack pointer into the TCB */\r
66         stw             SP,     0( R2 )\r
67 \r
68         /* Save the link register */\r
69         stwu    R1, -24( R1 )\r
70         mflr    R0\r
71         stw             R31, 20( R1 )\r
72         stw             R0, 28( R1 )\r
73         mr              R31, r1\r
74 \r
75 .endm\r
76 \r
77 .macro portRESTORE_STACK_POINTER_AND_LR\r
78 \r
79         /* Restore the link register */\r
80         lwz             R11, 0( R1 )\r
81         lwz             R0, 4( R11 )\r
82         mtlr    R0\r
83         lwz             R31, -4( R11 )\r
84         mr              R1, R11\r
85 \r
86         /* Get the address of the TCB. */\r
87         xor             R0, R0, R0\r
88         addis   SP, R0, pxCurrentTCB@ha\r
89         lwz             SP,     pxCurrentTCB@l( R1 )\r
90 \r
91         /* Get the task stack pointer from the TCB. */\r
92         lwz             SP, 0( SP )\r
93 \r
94 .endm\r
95 \r
96 \r
97 vPortStartFirstTask:\r
98 \r
99         /* Get the address of the TCB. */\r
100         xor             R0, R0, R0\r
101     addis   SP, R0, pxCurrentTCB@ha\r
102     lwz         SP,     pxCurrentTCB@l( SP )\r
103 \r
104         /* Get the task stack pointer from the TCB. */\r
105         lwz             SP, 0( SP )\r
106         \r
107         /* Restore MSR register to SRR1. */\r
108         lwz             R0, MSRField(R1)\r
109         mtsrr1  R0\r
110         \r
111         /* Restore current PC location to SRR0. */\r
112         lwz             R0, PCField(R1)\r
113         mtsrr0  R0\r
114 \r
115         /* Save  USPRG0 register */\r
116         lwz             R0, USPRG0Field(R1)\r
117         mtspr   0x100,R0\r
118         \r
119         /* Restore Condition register */\r
120         lwz             R0, CRField(R1)\r
121         mtcr    R0\r
122         \r
123         /* Restore Fixed Point Exception register */\r
124         lwz             R0, XERField(R1)\r
125         mtxer   R0\r
126         \r
127         /* Restore Counter register */\r
128         lwz             R0, CTRField(R1)\r
129         mtctr   R0\r
130         \r
131         /* Restore Link register */\r
132         lwz             R0, LRField(R1)\r
133         mtlr    R0\r
134         \r
135         /* Restore remaining GPR registers. */\r
136         lmw     R3,r3r31Field(R1)\r
137         \r
138         /* Restore r0 and r2. */\r
139         lwz             R0, r0Field(R1)\r
140         lwz             R2, r2Field(R1)\r
141         \r
142         /* Remove frame from stack */\r
143         addi    R1,R1,IFrameSize\r
144 \r
145         /* Return into the first task */\r
146         rfi\r
147 \r
148 \r
149 \r
150 vPortYield:\r
151 \r
152         portSAVE_STACK_POINTER_AND_LR\r
153         bl vTaskSwitchContext\r
154         portRESTORE_STACK_POINTER_AND_LR\r
155         blr\r
156 \r
157 vPortTickISR:\r
158 \r
159         portSAVE_STACK_POINTER_AND_LR\r
160         bl xTaskIncrementTick\r
161         \r
162         #if configUSE_PREEMPTION == 1\r
163                 bl vTaskSwitchContext\r
164         #endif\r
165 \r
166         /* Clear the interrupt */\r
167         lis             R0, 2048\r
168         mttsr   R0\r
169 \r
170         portRESTORE_STACK_POINTER_AND_LR\r
171         blr\r
172 \r
173 vPortISRWrapper:\r
174 \r
175         portSAVE_STACK_POINTER_AND_LR\r
176         bl vPortISRHandler\r
177         portRESTORE_STACK_POINTER_AND_LR\r
178         blr\r
179 \r
180 #if configUSE_FPU == 1\r
181 \r
182 vPortSaveFPURegisters:\r
183 \r
184         /* Enable APU and mark FPU as present. */\r
185         mfmsr   r0\r
186         xor             r30, r30, r30\r
187         oris    r30, r30, 512\r
188         ori             r30, r30, 8192\r
189         or              r0, r0, r30\r
190         mtmsr   r0\r
191 \r
192 #ifdef USE_DP_FPU\r
193 \r
194         /* Buffer address is in r3.  Save each flop register into an offset from\r
195         this buffer address. */\r
196         stfd    f0, 0(r3)\r
197         stfd    f1, 8(r3)\r
198         stfd    f2, 16(r3)\r
199         stfd    f3, 24(r3)\r
200         stfd    f4, 32(r3)\r
201         stfd    f5, 40(r3)\r
202         stfd    f6, 48(r3)\r
203         stfd    f7, 56(r3)\r
204         stfd    f8, 64(r3)\r
205         stfd    f9, 72(r3)\r
206         stfd    f10, 80(r3)\r
207         stfd    f11, 88(r3)\r
208         stfd    f12, 96(r3)\r
209         stfd    f13, 104(r3)\r
210         stfd    f14, 112(r3)\r
211         stfd    f15, 120(r3)\r
212         stfd    f16, 128(r3)\r
213         stfd    f17, 136(r3)\r
214         stfd    f18, 144(r3)\r
215         stfd    f19, 152(r3)\r
216         stfd    f20, 160(r3)\r
217         stfd    f21, 168(r3)\r
218         stfd    f22, 176(r3)\r
219         stfd    f23, 184(r3)\r
220         stfd    f24, 192(r3)\r
221         stfd    f25, 200(r3)\r
222         stfd    f26, 208(r3)\r
223         stfd    f27, 216(r3)\r
224         stfd    f28, 224(r3)\r
225         stfd    f29, 232(r3)\r
226         stfd    f30, 240(r3)\r
227         stfd    f31, 248(r3)    \r
228         \r
229         /* Also save the FPSCR. */\r
230         mffs    f31\r
231         stfs    f31, 256(r3)\r
232 \r
233 #else\r
234 \r
235         /* Buffer address is in r3.  Save each flop register into an offset from\r
236         this buffer address. */\r
237         stfs    f0, 0(r3)\r
238         stfs    f1, 4(r3)\r
239         stfs    f2, 8(r3)\r
240         stfs    f3, 12(r3)\r
241         stfs    f4, 16(r3)\r
242         stfs    f5, 20(r3)\r
243         stfs    f6, 24(r3)\r
244         stfs    f7, 28(r3)\r
245         stfs    f8, 32(r3)\r
246         stfs    f9, 36(r3)\r
247         stfs    f10, 40(r3)\r
248         stfs    f11, 44(r3)\r
249         stfs    f12, 48(r3)\r
250         stfs    f13, 52(r3)\r
251         stfs    f14, 56(r3)\r
252         stfs    f15, 60(r3)\r
253         stfs    f16, 64(r3)\r
254         stfs    f17, 68(r3)\r
255         stfs    f18, 72(r3)\r
256         stfs    f19, 76(r3)\r
257         stfs    f20, 80(r3)\r
258         stfs    f21, 84(r3)\r
259         stfs    f22, 88(r3)\r
260         stfs    f23, 92(r3)\r
261         stfs    f24, 96(r3)\r
262         stfs    f25, 100(r3)\r
263         stfs    f26, 104(r3)\r
264         stfs    f27, 108(r3)\r
265         stfs    f28, 112(r3)\r
266         stfs    f29, 116(r3)\r
267         stfs    f30, 120(r3)\r
268         stfs    f31, 124(r3)\r
269         \r
270         /* Also save the FPSCR. */\r
271         mffs    f31\r
272         stfs    f31, 128(r3)\r
273         \r
274 #endif\r
275 \r
276         blr\r
277 \r
278 #endif /* configUSE_FPU. */\r
279 \r
280 \r
281 #if configUSE_FPU == 1\r
282 \r
283 vPortRestoreFPURegisters:\r
284 \r
285         /* Enable APU and mark FPU as present. */\r
286         mfmsr   r0\r
287         xor             r30, r30, r30\r
288         oris    r30, r30, 512\r
289         ori             r30, r30, 8192\r
290         or              r0, r0, r30\r
291         mtmsr   r0\r
292 \r
293 #ifdef USE_DP_FPU\r
294 \r
295         /* Buffer address is in r3.  Restore each flop register from an offset\r
296         into this buffer. \r
297         \r
298         First the FPSCR. */\r
299         lfs             f31, 256(r3)\r
300         mtfsf   f31, 7\r
301 \r
302         lfd             f0, 0(r3)\r
303         lfd         f1, 8(r3)\r
304         lfd             f2, 16(r3)\r
305         lfd             f3, 24(r3)\r
306         lfd             f4, 32(r3)\r
307         lfd             f5, 40(r3)\r
308         lfd             f6, 48(r3)\r
309         lfd             f7, 56(r3)\r
310         lfd             f8, 64(r3)\r
311         lfd             f9, 72(r3)\r
312         lfd             f10, 80(r3)\r
313         lfd             f11, 88(r3)\r
314         lfd             f12, 96(r3)\r
315         lfd             f13, 104(r3)\r
316         lfd             f14, 112(r3)\r
317         lfd             f15, 120(r3)\r
318         lfd             f16, 128(r3)\r
319         lfd             f17, 136(r3)\r
320         lfd             f18, 144(r3)\r
321         lfd             f19, 152(r3)\r
322         lfd             f20, 160(r3)\r
323         lfd             f21, 168(r3)\r
324         lfd             f22, 176(r3)\r
325         lfd             f23, 184(r3)\r
326         lfd             f24, 192(r3)\r
327         lfd             f25, 200(r3)\r
328         lfd             f26, 208(r3)\r
329         lfd             f27, 216(r3)\r
330         lfd             f28, 224(r3)\r
331         lfd             f29, 232(r3)\r
332         lfd             f30, 240(r3)\r
333         lfd             f31, 248(r3)\r
334 \r
335 #else\r
336 \r
337         /* Buffer address is in r3.  Restore each flop register from an offset\r
338         into this buffer. \r
339         \r
340         First the FPSCR. */\r
341         lfs             f31, 128(r3)\r
342         mtfsf   f31, 7\r
343 \r
344         lfs             f0, 0(r3)\r
345         lfs             f1, 4(r3)\r
346         lfs             f2, 8(r3)\r
347         lfs             f3, 12(r3)\r
348         lfs             f4, 16(r3)\r
349         lfs             f5, 20(r3)\r
350         lfs             f6, 24(r3)\r
351         lfs             f7, 28(r3)\r
352         lfs             f8, 32(r3)\r
353         lfs             f9, 36(r3)\r
354         lfs             f10, 40(r3)\r
355         lfs             f11, 44(r3)\r
356         lfs             f12, 48(r3)\r
357         lfs             f13, 52(r3)\r
358         lfs             f14, 56(r3)\r
359         lfs             f15, 60(r3)\r
360         lfs             f16, 64(r3)\r
361         lfs             f17, 68(r3)\r
362         lfs             f18, 72(r3)\r
363         lfs             f19, 76(r3)\r
364         lfs             f20, 80(r3)\r
365         lfs             f21, 84(r3)\r
366         lfs             f22, 88(r3)\r
367         lfs             f23, 92(r3)\r
368         lfs             f24, 96(r3)\r
369         lfs             f25, 100(r3)\r
370         lfs             f26, 104(r3)\r
371         lfs             f27, 108(r3)\r
372         lfs             f28, 112(r3)\r
373         lfs             f29, 116(r3)\r
374         lfs             f30, 120(r3)\r
375         lfs             f31, 124(r3)\r
376 \r
377 #endif\r
378 \r
379         blr\r
380 \r
381 #endif /* configUSE_FPU. */\r
382 \r
383 \r