]> begriffs open source - freertos/blob - Source/portable/GCC/PPC440_Xilinx/portasm.S
Update the V6.0.4. The primary difference being that the unsupported demos have...
[freertos] / Source / portable / GCC / PPC440_Xilinx / portasm.S
1 /*\r
2     FreeRTOS V6.0.4 - Copyright (C) 2010 Real Time Engineers Ltd.\r
3 \r
4     ***************************************************************************\r
5     *                                                                         *\r
6     * If you are:                                                             *\r
7     *                                                                         *\r
8     *    + New to FreeRTOS,                                                   *\r
9     *    + Wanting to learn FreeRTOS or multitasking in general quickly       *\r
10     *    + Looking for basic training,                                        *\r
11     *    + Wanting to improve your FreeRTOS skills and productivity           *\r
12     *                                                                         *\r
13     * then take a look at the FreeRTOS eBook                                  *\r
14     *                                                                         *\r
15     *        "Using the FreeRTOS Real Time Kernel - a Practical Guide"        *\r
16     *                  http://www.FreeRTOS.org/Documentation                  *\r
17     *                                                                         *\r
18     * A pdf reference manual is also available.  Both are usually delivered   *\r
19     * to your inbox within 20 minutes to two hours when purchased between 8am *\r
20     * and 8pm GMT (although please allow up to 24 hours in case of            *\r
21     * exceptional circumstances).  Thank you for your support!                *\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 exception to the GPL is included to allow you to distribute\r
31     a combined work that includes FreeRTOS without being obliged to provide the\r
32     source code for proprietary components outside of the FreeRTOS kernel.\r
33     FreeRTOS is distributed in the hope that it will be useful, but WITHOUT\r
34     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
35     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     http://www.FreeRTOS.org - Documentation, latest information, license and\r
45     contact details.\r
46 \r
47     http://www.SafeRTOS.com - A version that is certified for use in safety\r
48     critical systems.\r
49 \r
50     http://www.OpenRTOS.com - Commercial support, development, porting,\r
51     licensing and training services.\r
52 */\r
53 \r
54 #include "FreeRTOSConfig.h"\r
55 \r
56         .extern pxCurrentTCB\r
57         .extern vTaskSwitchContext\r
58         .extern vTaskIncrementTick\r
59         .extern vPortISRHandler\r
60 \r
61         .global vPortStartFirstTask\r
62         .global vPortYield\r
63         .global vPortTickISR\r
64         .global vPortISRWrapper\r
65         .global vPortSaveFPURegisters\r
66         .global vPortRestoreFPURegisters\r
67 \r
68 .set    BChainField, 0\r
69 .set    NextLRField, BChainField + 4\r
70 .set    MSRField,    NextLRField + 4\r
71 .set    PCField,     MSRField    + 4\r
72 .set    LRField,     PCField     + 4\r
73 .set    CTRField,    LRField     + 4\r
74 .set    XERField,    CTRField    + 4\r
75 .set    CRField,     XERField    + 4\r
76 .set    USPRG0Field, CRField     + 4\r
77 .set    r0Field,     USPRG0Field + 4\r
78 .set    r2Field,     r0Field     + 4\r
79 .set    r3r31Field,  r2Field     + 4\r
80 .set    IFrameSize,  r3r31Field  + ( ( 31 - 3 ) + 1 ) * 4\r
81 \r
82 \r
83 .macro portSAVE_STACK_POINTER_AND_LR\r
84 \r
85         /* Get the address of the TCB. */\r
86         xor             R0, R0, R0\r
87         addis   R2, R0, pxCurrentTCB@ha\r
88         lwz             R2,     pxCurrentTCB@l( R2 )\r
89 \r
90         /* Store the stack pointer into the TCB */\r
91         stw             SP,     0( R2 )\r
92 \r
93         /* Save the link register */\r
94         stwu    R1, -24( R1 )\r
95         mflr    R0\r
96         stw             R31, 20( R1 )\r
97         stw             R0, 28( R1 )\r
98         mr              R31, r1\r
99 \r
100 .endm\r
101 \r
102 .macro portRESTORE_STACK_POINTER_AND_LR\r
103 \r
104         /* Restore the link register */\r
105         lwz             R11, 0( R1 )\r
106         lwz             R0, 4( R11 )\r
107         mtlr    R0\r
108         lwz             R31, -4( R11 )\r
109         mr              R1, R11\r
110 \r
111         /* Get the address of the TCB. */\r
112         xor             R0, R0, R0\r
113         addis   SP, R0, pxCurrentTCB@ha\r
114         lwz             SP,     pxCurrentTCB@l( R1 )\r
115 \r
116         /* Get the task stack pointer from the TCB. */\r
117         lwz             SP, 0( SP )\r
118 \r
119 .endm\r
120 \r
121 \r
122 vPortStartFirstTask:\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( SP )\r
128 \r
129         /* Get the task stack pointer from the TCB. */\r
130         lwz             SP, 0( SP )\r
131         \r
132         /* Restore MSR register to SRR1. */\r
133         lwz             R0, MSRField(R1)\r
134         mtsrr1  R0\r
135         \r
136         /* Restore current PC location to SRR0. */\r
137         lwz             R0, PCField(R1)\r
138         mtsrr0  R0\r
139 \r
140         /* Save  USPRG0 register */\r
141         lwz             R0, USPRG0Field(R1)\r
142         mtspr   0x100,R0\r
143         \r
144         /* Restore Condition register */\r
145         lwz             R0, CRField(R1)\r
146         mtcr    R0\r
147         \r
148         /* Restore Fixed Point Exception register */\r
149         lwz             R0, XERField(R1)\r
150         mtxer   R0\r
151         \r
152         /* Restore Counter register */\r
153         lwz             R0, CTRField(R1)\r
154         mtctr   R0\r
155         \r
156         /* Restore Link register */\r
157         lwz             R0, LRField(R1)\r
158         mtlr    R0\r
159         \r
160         /* Restore remaining GPR registers. */\r
161         lmw     R3,r3r31Field(R1)\r
162         \r
163         /* Restore r0 and r2. */\r
164         lwz             R0, r0Field(R1)\r
165         lwz             R2, r2Field(R1)\r
166         \r
167         /* Remove frame from stack */\r
168         addi    R1,R1,IFrameSize\r
169 \r
170         /* Return into the first task */\r
171         rfi\r
172 \r
173 \r
174 \r
175 vPortYield:\r
176 \r
177         portSAVE_STACK_POINTER_AND_LR\r
178         bl vTaskSwitchContext\r
179         portRESTORE_STACK_POINTER_AND_LR\r
180         blr\r
181 \r
182 vPortTickISR:\r
183 \r
184         portSAVE_STACK_POINTER_AND_LR\r
185         bl vTaskIncrementTick\r
186         \r
187         #if configUSE_PREEMPTION == 1\r
188                 bl vTaskSwitchContext\r
189         #endif\r
190 \r
191         /* Clear the interrupt */\r
192         lis             R0, 2048\r
193         mttsr   R0\r
194 \r
195         portRESTORE_STACK_POINTER_AND_LR\r
196         blr\r
197 \r
198 vPortISRWrapper:\r
199 \r
200         portSAVE_STACK_POINTER_AND_LR\r
201         bl vPortISRHandler\r
202         portRESTORE_STACK_POINTER_AND_LR\r
203         blr\r
204 \r
205 #if configUSE_FPU == 1\r
206 \r
207 vPortSaveFPURegisters:\r
208 \r
209         /* Enable APU and mark FPU as present. */\r
210         mfmsr   r0\r
211         xor             r30, r30, r30\r
212         oris    r30, r30, 512\r
213         ori             r30, r30, 8192\r
214         or              r0, r0, r30\r
215         mtmsr   r0\r
216 \r
217 #ifdef USE_DP_FPU\r
218 \r
219         /* Buffer address is in r3.  Save each flop register into an offset from\r
220         this buffer address. */\r
221         stfd    f0, 0(r3)\r
222         stfd    f1, 8(r3)\r
223         stfd    f2, 16(r3)\r
224         stfd    f3, 24(r3)\r
225         stfd    f4, 32(r3)\r
226         stfd    f5, 40(r3)\r
227         stfd    f6, 48(r3)\r
228         stfd    f7, 56(r3)\r
229         stfd    f8, 64(r3)\r
230         stfd    f9, 72(r3)\r
231         stfd    f10, 80(r3)\r
232         stfd    f11, 88(r3)\r
233         stfd    f12, 96(r3)\r
234         stfd    f13, 104(r3)\r
235         stfd    f14, 112(r3)\r
236         stfd    f15, 120(r3)\r
237         stfd    f16, 128(r3)\r
238         stfd    f17, 136(r3)\r
239         stfd    f18, 144(r3)\r
240         stfd    f19, 152(r3)\r
241         stfd    f20, 160(r3)\r
242         stfd    f21, 168(r3)\r
243         stfd    f22, 176(r3)\r
244         stfd    f23, 184(r3)\r
245         stfd    f24, 192(r3)\r
246         stfd    f25, 200(r3)\r
247         stfd    f26, 208(r3)\r
248         stfd    f27, 216(r3)\r
249         stfd    f28, 224(r3)\r
250         stfd    f29, 232(r3)\r
251         stfd    f30, 240(r3)\r
252         stfd    f31, 248(r3)    \r
253         \r
254         /* Also save the FPSCR. */\r
255         mffs    f31\r
256         stfs    f31, 256(r3)\r
257 \r
258 #else\r
259 \r
260         /* Buffer address is in r3.  Save each flop register into an offset from\r
261         this buffer address. */\r
262         stfs    f0, 0(r3)\r
263         stfs    f1, 4(r3)\r
264         stfs    f2, 8(r3)\r
265         stfs    f3, 12(r3)\r
266         stfs    f4, 16(r3)\r
267         stfs    f5, 20(r3)\r
268         stfs    f6, 24(r3)\r
269         stfs    f7, 28(r3)\r
270         stfs    f8, 32(r3)\r
271         stfs    f9, 36(r3)\r
272         stfs    f10, 40(r3)\r
273         stfs    f11, 44(r3)\r
274         stfs    f12, 48(r3)\r
275         stfs    f13, 52(r3)\r
276         stfs    f14, 56(r3)\r
277         stfs    f15, 60(r3)\r
278         stfs    f16, 64(r3)\r
279         stfs    f17, 68(r3)\r
280         stfs    f18, 72(r3)\r
281         stfs    f19, 76(r3)\r
282         stfs    f20, 80(r3)\r
283         stfs    f21, 84(r3)\r
284         stfs    f22, 88(r3)\r
285         stfs    f23, 92(r3)\r
286         stfs    f24, 96(r3)\r
287         stfs    f25, 100(r3)\r
288         stfs    f26, 104(r3)\r
289         stfs    f27, 108(r3)\r
290         stfs    f28, 112(r3)\r
291         stfs    f29, 116(r3)\r
292         stfs    f30, 120(r3)\r
293         stfs    f31, 124(r3)\r
294         \r
295         /* Also save the FPSCR. */\r
296         mffs    f31\r
297         stfs    f31, 128(r3)\r
298         \r
299 #endif\r
300 \r
301         blr\r
302 \r
303 #endif /* configUSE_FPU. */\r
304 \r
305 \r
306 #if configUSE_FPU == 1\r
307 \r
308 vPortRestoreFPURegisters:\r
309 \r
310         /* Enable APU and mark FPU as present. */\r
311         mfmsr   r0\r
312         xor             r30, r30, r30\r
313         oris    r30, r30, 512\r
314         ori             r30, r30, 8192\r
315         or              r0, r0, r30\r
316         mtmsr   r0\r
317 \r
318 #ifdef USE_DP_FPU\r
319 \r
320         /* Buffer address is in r3.  Restore each flop register from an offset\r
321         into this buffer. \r
322         \r
323         First the FPSCR. */\r
324         lfs             f31, 256(r3)\r
325         mtfsf   f31, 7\r
326 \r
327         lfd             f0, 0(r3)\r
328         lfd         f1, 8(r3)\r
329         lfd             f2, 16(r3)\r
330         lfd             f3, 24(r3)\r
331         lfd             f4, 32(r3)\r
332         lfd             f5, 40(r3)\r
333         lfd             f6, 48(r3)\r
334         lfd             f7, 56(r3)\r
335         lfd             f8, 64(r3)\r
336         lfd             f9, 72(r3)\r
337         lfd             f10, 80(r3)\r
338         lfd             f11, 88(r3)\r
339         lfd             f12, 96(r3)\r
340         lfd             f13, 104(r3)\r
341         lfd             f14, 112(r3)\r
342         lfd             f15, 120(r3)\r
343         lfd             f16, 128(r3)\r
344         lfd             f17, 136(r3)\r
345         lfd             f18, 144(r3)\r
346         lfd             f19, 152(r3)\r
347         lfd             f20, 160(r3)\r
348         lfd             f21, 168(r3)\r
349         lfd             f22, 176(r3)\r
350         lfd             f23, 184(r3)\r
351         lfd             f24, 192(r3)\r
352         lfd             f25, 200(r3)\r
353         lfd             f26, 208(r3)\r
354         lfd             f27, 216(r3)\r
355         lfd             f28, 224(r3)\r
356         lfd             f29, 232(r3)\r
357         lfd             f30, 240(r3)\r
358         lfd             f31, 248(r3)\r
359 \r
360 #else\r
361 \r
362         /* Buffer address is in r3.  Restore each flop register from an offset\r
363         into this buffer. \r
364         \r
365         First the FPSCR. */\r
366         lfs             f31, 128(r3)\r
367         mtfsf   f31, 7\r
368 \r
369         lfs             f0, 0(r3)\r
370         lfs             f1, 4(r3)\r
371         lfs             f2, 8(r3)\r
372         lfs             f3, 12(r3)\r
373         lfs             f4, 16(r3)\r
374         lfs             f5, 20(r3)\r
375         lfs             f6, 24(r3)\r
376         lfs             f7, 28(r3)\r
377         lfs             f8, 32(r3)\r
378         lfs             f9, 36(r3)\r
379         lfs             f10, 40(r3)\r
380         lfs             f11, 44(r3)\r
381         lfs             f12, 48(r3)\r
382         lfs             f13, 52(r3)\r
383         lfs             f14, 56(r3)\r
384         lfs             f15, 60(r3)\r
385         lfs             f16, 64(r3)\r
386         lfs             f17, 68(r3)\r
387         lfs             f18, 72(r3)\r
388         lfs             f19, 76(r3)\r
389         lfs             f20, 80(r3)\r
390         lfs             f21, 84(r3)\r
391         lfs             f22, 88(r3)\r
392         lfs             f23, 92(r3)\r
393         lfs             f24, 96(r3)\r
394         lfs             f25, 100(r3)\r
395         lfs             f26, 104(r3)\r
396         lfs             f27, 108(r3)\r
397         lfs             f28, 112(r3)\r
398         lfs             f29, 116(r3)\r
399         lfs             f30, 120(r3)\r
400         lfs             f31, 124(r3)\r
401 \r
402 #endif\r
403 \r
404         blr\r
405 \r
406 #endif /* configUSE_FPU. */\r
407 \r
408 \r