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