]> git.sur5r.net Git - freertos/blob - FreeRTOS/Source/portable/GCC/PPC405_Xilinx/portasm.S
Update version number to 9.0.0rc2.
[freertos] / FreeRTOS / Source / portable / GCC / PPC405_Xilinx / portasm.S
1 /*\r
2     FreeRTOS V9.0.0rc2 - Copyright (C) 2016 Real Time Engineers Ltd.\r
3     All rights reserved\r
4 \r
5     VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.\r
6 \r
7     This file is part of the FreeRTOS distribution.\r
8 \r
9     FreeRTOS is free software; you can redistribute it and/or modify it under\r
10     the terms of the GNU General Public License (version 2) as published by the\r
11     Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception.\r
12 \r
13     ***************************************************************************\r
14     >>!   NOTE: The modification to the GPL is included to allow you to     !<<\r
15     >>!   distribute a combined work that includes FreeRTOS without being   !<<\r
16     >>!   obliged to provide the source code for proprietary components     !<<\r
17     >>!   outside of the FreeRTOS kernel.                                   !<<\r
18     ***************************************************************************\r
19 \r
20     FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY\r
21     WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\r
22     FOR A PARTICULAR PURPOSE.  Full license text is available on the following\r
23     link: http://www.freertos.org/a00114.html\r
24 \r
25     ***************************************************************************\r
26      *                                                                       *\r
27      *    FreeRTOS provides completely free yet professionally developed,    *\r
28      *    robust, strictly quality controlled, supported, and cross          *\r
29      *    platform software that is more than just the market leader, it     *\r
30      *    is the industry's de facto standard.                               *\r
31      *                                                                       *\r
32      *    Help yourself get started quickly while simultaneously helping     *\r
33      *    to support the FreeRTOS project by purchasing a FreeRTOS           *\r
34      *    tutorial book, reference manual, or both:                          *\r
35      *    http://www.FreeRTOS.org/Documentation                              *\r
36      *                                                                       *\r
37     ***************************************************************************\r
38 \r
39     http://www.FreeRTOS.org/FAQHelp.html - Having a problem?  Start by reading\r
40     the FAQ page "My application does not run, what could be wrong?".  Have you\r
41     defined configASSERT()?\r
42 \r
43     http://www.FreeRTOS.org/support - In return for receiving this top quality\r
44     embedded software for free we request you assist our global community by\r
45     participating in the support forum.\r
46 \r
47     http://www.FreeRTOS.org/training - Investing in training allows your team to\r
48     be as productive as possible as early as possible.  Now you can receive\r
49     FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers\r
50     Ltd, and the world's leading authority on the world's leading RTOS.\r
51 \r
52     http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,\r
53     including FreeRTOS+Trace - an indispensable productivity tool, a DOS\r
54     compatible FAT file system, and our tiny thread aware UDP/IP stack.\r
55 \r
56     http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.\r
57     Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.\r
58 \r
59     http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High\r
60     Integrity Systems ltd. to sell under the OpenRTOS brand.  Low cost OpenRTOS\r
61     licenses offer ticketed support, indemnification and commercial middleware.\r
62 \r
63     http://www.SafeRTOS.com - High Integrity Systems also provide a safety\r
64     engineered and independently SIL3 certified version for use in safety and\r
65     mission critical applications that require provable dependability.\r
66 \r
67     1 tab == 4 spaces!\r
68 */\r
69 \r
70 #include "FreeRTOSConfig.h"\r
71 \r
72         .extern pxCurrentTCB\r
73         .extern vTaskSwitchContext\r
74         .extern xTaskIncrementTick\r
75         .extern vPortISRHandler\r
76 \r
77         .global vPortStartFirstTask\r
78         .global vPortYield\r
79         .global vPortTickISR\r
80         .global vPortISRWrapper\r
81         .global vPortSaveFPURegisters\r
82         .global vPortRestoreFPURegisters\r
83 \r
84 .set    BChainField, 0\r
85 .set    NextLRField, BChainField + 4\r
86 .set    MSRField,    NextLRField + 4\r
87 .set    PCField,     MSRField    + 4\r
88 .set    LRField,     PCField     + 4\r
89 .set    CTRField,    LRField     + 4\r
90 .set    XERField,    CTRField    + 4\r
91 .set    CRField,     XERField    + 4\r
92 .set    USPRG0Field, CRField     + 4\r
93 .set    r0Field,     USPRG0Field + 4\r
94 .set    r2Field,     r0Field     + 4\r
95 .set    r3r31Field,  r2Field     + 4\r
96 .set    IFrameSize,  r3r31Field  + ( ( 31 - 3 ) + 1 ) * 4\r
97 \r
98 \r
99 .macro portSAVE_STACK_POINTER_AND_LR\r
100 \r
101         /* Get the address of the TCB. */\r
102         xor             R0, R0, R0\r
103         addis   R2, R0, pxCurrentTCB@ha\r
104         lwz             R2,     pxCurrentTCB@l( R2 )\r
105 \r
106         /* Store the stack pointer into the TCB */\r
107         stw             SP,     0( R2 )\r
108 \r
109         /* Save the link register */\r
110         stwu    R1, -24( R1 )\r
111         mflr    R0\r
112         stw             R31, 20( R1 )\r
113         stw             R0, 28( R1 )\r
114         mr              R31, r1\r
115 \r
116 .endm\r
117 \r
118 .macro portRESTORE_STACK_POINTER_AND_LR\r
119 \r
120         /* Restore the link register */\r
121         lwz             R11, 0( R1 )\r
122         lwz             R0, 4( R11 )\r
123         mtlr    R0\r
124         lwz             R31, -4( R11 )\r
125         mr              R1, R11\r
126 \r
127         /* Get the address of the TCB. */\r
128         xor             R0, R0, R0\r
129         addis   SP, R0, pxCurrentTCB@ha\r
130         lwz             SP,     pxCurrentTCB@l( R1 )\r
131 \r
132         /* Get the task stack pointer from the TCB. */\r
133         lwz             SP, 0( SP )\r
134 \r
135 .endm\r
136 \r
137 \r
138 vPortStartFirstTask:\r
139 \r
140         /* Get the address of the TCB. */\r
141         xor             R0, R0, R0\r
142     addis   SP, R0, pxCurrentTCB@ha\r
143     lwz         SP,     pxCurrentTCB@l( SP )\r
144 \r
145         /* Get the task stack pointer from the TCB. */\r
146         lwz             SP, 0( SP )\r
147         \r
148         /* Restore MSR register to SRR1. */\r
149         lwz             R0, MSRField(R1)\r
150         mtsrr1  R0\r
151         \r
152         /* Restore current PC location to SRR0. */\r
153         lwz             R0, PCField(R1)\r
154         mtsrr0  R0\r
155 \r
156         /* Save  USPRG0 register */\r
157         lwz             R0, USPRG0Field(R1)\r
158         mtspr   0x100,R0\r
159         \r
160         /* Restore Condition register */\r
161         lwz             R0, CRField(R1)\r
162         mtcr    R0\r
163         \r
164         /* Restore Fixed Point Exception register */\r
165         lwz             R0, XERField(R1)\r
166         mtxer   R0\r
167         \r
168         /* Restore Counter register */\r
169         lwz             R0, CTRField(R1)\r
170         mtctr   R0\r
171         \r
172         /* Restore Link register */\r
173         lwz             R0, LRField(R1)\r
174         mtlr    R0\r
175         \r
176         /* Restore remaining GPR registers. */\r
177         lmw     R3,r3r31Field(R1)\r
178         \r
179         /* Restore r0 and r2. */\r
180         lwz             R0, r0Field(R1)\r
181         lwz             R2, r2Field(R1)\r
182         \r
183         /* Remove frame from stack */\r
184         addi    R1,R1,IFrameSize\r
185 \r
186         /* Return into the first task */\r
187         rfi\r
188 \r
189 \r
190 \r
191 vPortYield:\r
192 \r
193         portSAVE_STACK_POINTER_AND_LR\r
194         bl vTaskSwitchContext\r
195         portRESTORE_STACK_POINTER_AND_LR\r
196         blr\r
197 \r
198 vPortTickISR:\r
199 \r
200         portSAVE_STACK_POINTER_AND_LR\r
201         bl xTaskIncrementTick\r
202         \r
203         #if configUSE_PREEMPTION == 1\r
204                 bl vTaskSwitchContext\r
205         #endif\r
206 \r
207         /* Clear the interrupt */\r
208         lis             R0, 2048\r
209         mttsr   R0\r
210 \r
211         portRESTORE_STACK_POINTER_AND_LR\r
212         blr\r
213 \r
214 vPortISRWrapper:\r
215 \r
216         portSAVE_STACK_POINTER_AND_LR\r
217         bl vPortISRHandler\r
218         portRESTORE_STACK_POINTER_AND_LR\r
219         blr\r
220 \r
221 #if configUSE_FPU == 1\r
222 \r
223 vPortSaveFPURegisters:\r
224 \r
225         /* Enable APU and mark FPU as present. */\r
226         mfmsr   r0\r
227         xor             r30, r30, r30\r
228         oris    r30, r30, 512\r
229         ori             r30, r30, 8192\r
230         or              r0, r0, r30\r
231         mtmsr   r0\r
232 \r
233 #ifdef USE_DP_FPU\r
234 \r
235         /* Buffer address is in r3.  Save each flop register into an offset from\r
236         this buffer address. */\r
237         stfd    f0, 0(r3)\r
238         stfd    f1, 8(r3)\r
239         stfd    f2, 16(r3)\r
240         stfd    f3, 24(r3)\r
241         stfd    f4, 32(r3)\r
242         stfd    f5, 40(r3)\r
243         stfd    f6, 48(r3)\r
244         stfd    f7, 56(r3)\r
245         stfd    f8, 64(r3)\r
246         stfd    f9, 72(r3)\r
247         stfd    f10, 80(r3)\r
248         stfd    f11, 88(r3)\r
249         stfd    f12, 96(r3)\r
250         stfd    f13, 104(r3)\r
251         stfd    f14, 112(r3)\r
252         stfd    f15, 120(r3)\r
253         stfd    f16, 128(r3)\r
254         stfd    f17, 136(r3)\r
255         stfd    f18, 144(r3)\r
256         stfd    f19, 152(r3)\r
257         stfd    f20, 160(r3)\r
258         stfd    f21, 168(r3)\r
259         stfd    f22, 176(r3)\r
260         stfd    f23, 184(r3)\r
261         stfd    f24, 192(r3)\r
262         stfd    f25, 200(r3)\r
263         stfd    f26, 208(r3)\r
264         stfd    f27, 216(r3)\r
265         stfd    f28, 224(r3)\r
266         stfd    f29, 232(r3)\r
267         stfd    f30, 240(r3)\r
268         stfd    f31, 248(r3)    \r
269         \r
270         /* Also save the FPSCR. */\r
271         mffs    f31\r
272         stfs    f31, 256(r3)\r
273 \r
274 #else\r
275 \r
276         /* Buffer address is in r3.  Save each flop register into an offset from\r
277         this buffer address. */\r
278         stfs    f0, 0(r3)\r
279         stfs    f1, 4(r3)\r
280         stfs    f2, 8(r3)\r
281         stfs    f3, 12(r3)\r
282         stfs    f4, 16(r3)\r
283         stfs    f5, 20(r3)\r
284         stfs    f6, 24(r3)\r
285         stfs    f7, 28(r3)\r
286         stfs    f8, 32(r3)\r
287         stfs    f9, 36(r3)\r
288         stfs    f10, 40(r3)\r
289         stfs    f11, 44(r3)\r
290         stfs    f12, 48(r3)\r
291         stfs    f13, 52(r3)\r
292         stfs    f14, 56(r3)\r
293         stfs    f15, 60(r3)\r
294         stfs    f16, 64(r3)\r
295         stfs    f17, 68(r3)\r
296         stfs    f18, 72(r3)\r
297         stfs    f19, 76(r3)\r
298         stfs    f20, 80(r3)\r
299         stfs    f21, 84(r3)\r
300         stfs    f22, 88(r3)\r
301         stfs    f23, 92(r3)\r
302         stfs    f24, 96(r3)\r
303         stfs    f25, 100(r3)\r
304         stfs    f26, 104(r3)\r
305         stfs    f27, 108(r3)\r
306         stfs    f28, 112(r3)\r
307         stfs    f29, 116(r3)\r
308         stfs    f30, 120(r3)\r
309         stfs    f31, 124(r3)\r
310         \r
311         /* Also save the FPSCR. */\r
312         mffs    f31\r
313         stfs    f31, 128(r3)\r
314         \r
315 #endif\r
316 \r
317         blr\r
318 \r
319 #endif /* configUSE_FPU. */\r
320 \r
321 \r
322 #if configUSE_FPU == 1\r
323 \r
324 vPortRestoreFPURegisters:\r
325 \r
326         /* Enable APU and mark FPU as present. */\r
327         mfmsr   r0\r
328         xor             r30, r30, r30\r
329         oris    r30, r30, 512\r
330         ori             r30, r30, 8192\r
331         or              r0, r0, r30\r
332         mtmsr   r0\r
333 \r
334 #ifdef USE_DP_FPU\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, 256(r3)\r
341         mtfsf   f31, 7\r
342 \r
343         lfd             f0, 0(r3)\r
344         lfd         f1, 8(r3)\r
345         lfd             f2, 16(r3)\r
346         lfd             f3, 24(r3)\r
347         lfd             f4, 32(r3)\r
348         lfd             f5, 40(r3)\r
349         lfd             f6, 48(r3)\r
350         lfd             f7, 56(r3)\r
351         lfd             f8, 64(r3)\r
352         lfd             f9, 72(r3)\r
353         lfd             f10, 80(r3)\r
354         lfd             f11, 88(r3)\r
355         lfd             f12, 96(r3)\r
356         lfd             f13, 104(r3)\r
357         lfd             f14, 112(r3)\r
358         lfd             f15, 120(r3)\r
359         lfd             f16, 128(r3)\r
360         lfd             f17, 136(r3)\r
361         lfd             f18, 144(r3)\r
362         lfd             f19, 152(r3)\r
363         lfd             f20, 160(r3)\r
364         lfd             f21, 168(r3)\r
365         lfd             f22, 176(r3)\r
366         lfd             f23, 184(r3)\r
367         lfd             f24, 192(r3)\r
368         lfd             f25, 200(r3)\r
369         lfd             f26, 208(r3)\r
370         lfd             f27, 216(r3)\r
371         lfd             f28, 224(r3)\r
372         lfd             f29, 232(r3)\r
373         lfd             f30, 240(r3)\r
374         lfd             f31, 248(r3)\r
375 \r
376 #else\r
377 \r
378         /* Buffer address is in r3.  Restore each flop register from an offset\r
379         into this buffer. \r
380         \r
381         First the FPSCR. */\r
382         lfs             f31, 128(r3)\r
383         mtfsf   f31, 7\r
384 \r
385         lfs             f0, 0(r3)\r
386         lfs             f1, 4(r3)\r
387         lfs             f2, 8(r3)\r
388         lfs             f3, 12(r3)\r
389         lfs             f4, 16(r3)\r
390         lfs             f5, 20(r3)\r
391         lfs             f6, 24(r3)\r
392         lfs             f7, 28(r3)\r
393         lfs             f8, 32(r3)\r
394         lfs             f9, 36(r3)\r
395         lfs             f10, 40(r3)\r
396         lfs             f11, 44(r3)\r
397         lfs             f12, 48(r3)\r
398         lfs             f13, 52(r3)\r
399         lfs             f14, 56(r3)\r
400         lfs             f15, 60(r3)\r
401         lfs             f16, 64(r3)\r
402         lfs             f17, 68(r3)\r
403         lfs             f18, 72(r3)\r
404         lfs             f19, 76(r3)\r
405         lfs             f20, 80(r3)\r
406         lfs             f21, 84(r3)\r
407         lfs             f22, 88(r3)\r
408         lfs             f23, 92(r3)\r
409         lfs             f24, 96(r3)\r
410         lfs             f25, 100(r3)\r
411         lfs             f26, 104(r3)\r
412         lfs             f27, 108(r3)\r
413         lfs             f28, 112(r3)\r
414         lfs             f29, 116(r3)\r
415         lfs             f30, 120(r3)\r
416         lfs             f31, 124(r3)\r
417 \r
418 #endif\r
419 \r
420         blr\r
421 \r
422 #endif /* configUSE_FPU. */\r
423 \r
424 \r