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