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