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