]> git.sur5r.net Git - freertos/blob - Source/portable/GCC/PPC405_Xilinx/portasm.s
Rename PPC405 to PPC405_Xilinx.
[freertos] / Source / portable / GCC / PPC405_Xilinx / portasm.s
1 #include "xreg405.h"\r
2 \r
3         .extern pxCurrentTCB\r
4         .extern vTaskSwitchContext\r
5         .extern vTaskIncrementTick\r
6         .extern vPortISRHandler\r
7 \r
8         .global vPortStartFirstTask\r
9         .global vPortYield\r
10         .global vPortTickISR\r
11         .global vPortISRWrapper\r
12 \r
13 .set portCONTEXT_SIZE, 156\r
14 .set portR0_OFFSET, 152\r
15 .set portGPR_OFFSET, 32\r
16 .set portCR_OFFSET, 28\r
17 .set portXER_OFFSET, 24\r
18 .set portLR_OFFSET, 16\r
19 .set portCTR_OFFSET, 16\r
20 .set portUSPRG0_OFFSET, 12\r
21 .set portSRR0_OFFSET, 8\r
22 .set portSRR1_OFFSET, 4\r
23 \r
24 \r
25 .set    BChainField, 0\r
26 .set    NextLRField, BChainField + 4\r
27 .set    MSRField,    NextLRField + 4\r
28 .set    PCField,     MSRField    + 4\r
29 .set    LRField,     PCField     + 4\r
30 .set    CTRField,    LRField     + 4\r
31 .set    XERField,    CTRField    + 4\r
32 .set    CRField,     XERField    + 4\r
33 .set    USPRG0Field, CRField     + 4\r
34 .set    r0Field,     USPRG0Field + 4\r
35 .set    r2Field,     r0Field     + 4\r
36 .set    r3r31Field,  r2Field     + 4\r
37 .set    IFrameSize,  r3r31Field  + ( ( 31 - 3 ) + 1 ) * 4\r
38 \r
39 \r
40 .macro portRESTORE_CONTEXT\r
41 \r
42         # Get the address of the TCB.\r
43         xor             R0, R0, R0\r
44     addis   SP, R0, pxCurrentTCB@ha\r
45     lwz         SP,     pxCurrentTCB@l( SP )\r
46 \r
47         # Get the task stack pointer from the TCB.\r
48         lwz             SP, 0( SP )\r
49 \r
50         # Pop the special purpose registers\r
51         lwz             R0, portSRR1_OFFSET( SP )\r
52         mtspr   SRR1, R0\r
53         lwz             R0, portSRR0_OFFSET( SP )\r
54         mtspr   SRR0, R0\r
55         lwz             R0, portUSPRG0_OFFSET( SP )\r
56         mtspr   256, R0 #USPRG0\r
57         lwz             R0, portCTR_OFFSET( SP )\r
58         mtspr   CTR, R0\r
59         lwz             R0, portLR_OFFSET( SP )\r
60         mtspr   LR, R0\r
61         lwz             R0, portXER_OFFSET( SP )\r
62         mtspr   XER, R0\r
63         lwz             R0, portCR_OFFSET( SP )\r
64         mtcr    R0\r
65 \r
66         # Pop GPRs\r
67         lmw             R2, portGPR_OFFSET( SP )\r
68 \r
69         # Finally pop R0 and correct the stack pointer\r
70         lwz             R0, portR0_OFFSET( SP )\r
71         addi    R1, R1, portCONTEXT_SIZE\r
72 \r
73         # Start the task running\r
74         rfi\r
75 \r
76         .endm\r
77 \r
78 .macro portSAVE_CONTEXT\r
79 \r
80         # Make room on the stack.\r
81         subi    R1, R1, portCONTEXT_SIZE\r
82 \r
83         # Push R0, then the GPRs\r
84         stw             R0, portR0_OFFSET( SP )\r
85         stm             R2, portGPR_OFFSET( SP )\r
86 \r
87         # Push the SFRs\r
88         mfcr    R0\r
89         stw             R0, portCR_OFFSET( SP )\r
90         mfspr   R0, XER\r
91         stw             R0, portXER_OFFSET( SP )\r
92         mfspr   R0, LR\r
93         stw             R0, portLR_OFFSET( SP )\r
94         mfspr   R0, CTR\r
95         stw             R0, portCTR_OFFSET( SP )\r
96         mfspr   R0, 256 #USPRG0\r
97         stw             R0, portUSPRG0_OFFSET( SP )\r
98         mfspr   R0, SRR0\r
99         stw             R0, portSRR0_OFFSET( SP )\r
100         mfspr   R0, SRR1\r
101         stw             R0, portSRR1_OFFSET( SP )\r
102 \r
103         # Get the address of the TCB.\r
104         xor             R0, R0, R0\r
105         addis   R2, R0, pxCurrentTCB@ha\r
106         lwz             R2,     pxCurrentTCB@l( R2 )\r
107 \r
108         # Store the stack pointer into the TCB\r
109         stw             SP,     0( R2 )\r
110 \r
111         .endm\r
112 \r
113 \r
114 .macro int_epilogue\r
115 \r
116         # Get the address of the TCB.\r
117         xor             R0, R0, R0\r
118     addis   SP, R0, pxCurrentTCB@ha\r
119     lwz         SP,     pxCurrentTCB@l( SP )\r
120 \r
121         # Get the task stack pointer from the TCB.\r
122         lwz             SP, 0( SP )\r
123         \r
124         # Restore MSR register to SRR1.\r
125         lwz     R0,MSRField(R1)\r
126         mtsrr1  R0\r
127         \r
128         # Restore current PC location to SRR0.\r
129         lwz     R0,PCField(R1)\r
130         mtsrr0  R0\r
131 \r
132         # Save USPRG0 register\r
133         lwz     R0,USPRG0Field(R1)\r
134         mtspr   0x100,R0\r
135         \r
136         # Restore Condition register\r
137         lwz     R0,CRField(R1)\r
138         mtcr    R0\r
139         \r
140         # Restore Fixed Point Exception register\r
141         lwz     R0,XERField(R1)\r
142         mtxer   R0\r
143         \r
144         # Restore Counter register\r
145         lwz     R0,CTRField(R1)\r
146         mtctr   R0\r
147         \r
148         # Restore Link register\r
149         lwz     R0,LRField(R1)\r
150         mtlr    R0\r
151         \r
152         # Restore remaining GPR registers.\r
153         lmw     R3,r3r31Field(R1)\r
154         \r
155         # Restore r0 and r2.\r
156         lwz     R0,r0Field(R1)\r
157         lwz     R2,r2Field(R1)\r
158         \r
159         # Remove frame from stack\r
160         addi    R1,R1,IFrameSize\r
161         \r
162 .endm\r
163 \r
164 .macro portENTER_SWITCHING_ISR\r
165 \r
166         # Get the address of the TCB.                           \r
167         xor             R0, R0, R0\r
168         addis   R2, R0, pxCurrentTCB@ha\r
169         lwz             R2,     pxCurrentTCB@l( R2 )\r
170 \r
171         # Store the stack pointer into the TCB\r
172         stw             SP,     0( R2 )\r
173 \r
174         # Save the link register\r
175         stwu    R1, -24( R1 )\r
176         mflr    R0\r
177         stw             R31, 20( R1 )\r
178         stw             R0, 28( R1 )\r
179         mr              R31, r1\r
180 \r
181 .endm\r
182 \r
183 .macro portEXIT_SWITCHING_ISR\r
184 \r
185         # Restore the link register\r
186         lwz             R11, 0( R1 )\r
187         lwz             R0, 4( R11 )\r
188         mtlr    R0\r
189         lwz             R31, -4( R11 )\r
190         mr              R1, R11\r
191 \r
192         # Get the address of the TCB.\r
193         xor             R0, R0, R0\r
194         addis   SP, R0, pxCurrentTCB@ha\r
195         lwz             SP,     pxCurrentTCB@l( R1 )\r
196 \r
197         # Get the task stack pointer from the TCB.\r
198         lwz             SP, 0( SP )\r
199 \r
200 .endm\r
201 \r
202 \r
203 vPortStartFirstTask:\r
204 \r
205         int_epilogue\r
206         rfi\r
207 \r
208 #vPortStartFirstTask:\r
209 #       portRESTORE_CONTEXT\r
210 #       rfi\r
211 \r
212 \r
213 \r
214 vPortYield:\r
215 \r
216         portENTER_SWITCHING_ISR\r
217         bl vTaskSwitchContext\r
218         portEXIT_SWITCHING_ISR\r
219         blr\r
220 \r
221 vPortTickISR:\r
222 \r
223         portENTER_SWITCHING_ISR\r
224         bl vTaskIncrementTick\r
225         #if configUSE_PREEMPTION == 1\r
226                 bl vTaskSwitchContext\r
227         #endif\r
228 \r
229         # Clear the interrupt\r
230         lis             R0, 2048\r
231         mttsr   R0\r
232 \r
233         portEXIT_SWITCHING_ISR\r
234         blr\r
235 \r
236 vPortISRWrapper:\r
237 \r
238         portENTER_SWITCHING_ISR\r
239         bl vPortISRHandler\r
240         portEXIT_SWITCHING_ISR\r
241         blr\r