]> git.sur5r.net Git - freertos/blob - Source/portable/GCC/PPC405/portasm.s
Work in progress, for backup purposes only.
[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, 20\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 .endm\r
171 \r
172 .macro portEXIT_SWITCHING_ISR\r
173 \r
174         # Get the address of the TCB.\r
175         xor             R0, R0, R0\r
176         addis   SP, R0, pxCurrentTCB@ha\r
177         lwz             SP,     pxCurrentTCB@l( R1 )\r
178 \r
179         # Get the task stack pointer from the TCB.\r
180         lwz             SP, 0( SP )\r
181 \r
182         # Load up the LR for the correct return.\r
183         lwz     R0,LRField(R1)\r
184         mtlr    R0\r
185 \r
186 \r
187 .endm\r
188 \r
189 \r
190 vStartFirstTask:\r
191 \r
192         int_epilogue\r
193         rfi\r
194 \r
195 #vStartFirstTask:\r
196 #       portRESTORE_CONTEXT\r
197 #       rfi\r
198 \r
199 \r
200 \r
201 vPortYield:\r
202 \r
203         portENTER_SWITCHING_ISR\r
204         bl vTaskSwitchContext\r
205         portEXIT_SWITCHING_ISR\r
206         blr\r
207 \r
208         NOP\r
209         NOP\r