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