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