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