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