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