]> git.sur5r.net Git - freertos/blob - Source/portable/GCC/PPC405_Xilinx/portasm.s
Add -Wall option.
[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    BChainField, 0\r
14 .set    NextLRField, BChainField + 4\r
15 .set    MSRField,    NextLRField + 4\r
16 .set    PCField,     MSRField    + 4\r
17 .set    LRField,     PCField     + 4\r
18 .set    CTRField,    LRField     + 4\r
19 .set    XERField,    CTRField    + 4\r
20 .set    CRField,     XERField    + 4\r
21 .set    USPRG0Field, CRField     + 4\r
22 .set    r0Field,     USPRG0Field + 4\r
23 .set    r2Field,     r0Field     + 4\r
24 .set    r3r31Field,  r2Field     + 4\r
25 .set    IFrameSize,  r3r31Field  + ( ( 31 - 3 ) + 1 ) * 4\r
26 \r
27 \r
28 .macro portSAVE_STACK_POINTER_AND_LR\r
29 \r
30         # Get the address of the TCB.                           \r
31         xor             R0, R0, R0\r
32         addis   R2, R0, pxCurrentTCB@ha\r
33         lwz             R2,     pxCurrentTCB@l( R2 )\r
34 \r
35         # Store the stack pointer into the TCB\r
36         stw             SP,     0( R2 )\r
37 \r
38         # Save the link register\r
39         stwu    R1, -24( R1 )\r
40         mflr    R0\r
41         stw             R31, 20( R1 )\r
42         stw             R0, 28( R1 )\r
43         mr              R31, r1\r
44 \r
45 .endm\r
46 \r
47 .macro portRESTORE_STACK_POINTER_AND_LR\r
48 \r
49         # Restore the link register\r
50         lwz             R11, 0( R1 )\r
51         lwz             R0, 4( R11 )\r
52         mtlr    R0\r
53         lwz             R31, -4( R11 )\r
54         mr              R1, R11\r
55 \r
56         # Get the address of the TCB.\r
57         xor             R0, R0, R0\r
58         addis   SP, R0, pxCurrentTCB@ha\r
59         lwz             SP,     pxCurrentTCB@l( R1 )\r
60 \r
61         # Get the task stack pointer from the TCB.\r
62         lwz             SP, 0( SP )\r
63 \r
64 .endm\r
65 \r
66 \r
67 vPortStartFirstTask:\r
68 \r
69         # Get the address of the TCB.\r
70         xor             R0, R0, R0\r
71     addis   SP, R0, pxCurrentTCB@ha\r
72     lwz         SP,     pxCurrentTCB@l( SP )\r
73 \r
74         # Get the task stack pointer from the TCB.\r
75         lwz             SP, 0( SP )\r
76         \r
77         # Restore MSR register to SRR1.\r
78         lwz             R0, MSRField(R1)\r
79         mtsrr1  R0\r
80         \r
81         # Restore current PC location to SRR0.\r
82         lwz             R0, PCField(R1)\r
83         mtsrr0  R0\r
84 \r
85         # Save  USPRG0 register\r
86         lwz             R0, USPRG0Field(R1)\r
87         mtspr   0x100,R0\r
88         \r
89         # Restore Condition register\r
90         lwz             R0, CRField(R1)\r
91         mtcr    R0\r
92         \r
93         # Restore Fixed Point Exception register\r
94         lwz             R0, XERField(R1)\r
95         mtxer   R0\r
96         \r
97         # Restore Counter register\r
98         lwz             R0, CTRField(R1)\r
99         mtctr   R0\r
100         \r
101         # Restore Link register\r
102         lwz             R0, LRField(R1)\r
103         mtlr    R0\r
104         \r
105         # Restore remaining GPR registers.\r
106         lmw     R3,r3r31Field(R1)\r
107         \r
108         # Restore r0 and r2.\r
109         lwz             R0, r0Field(R1)\r
110         lwz             R2, r2Field(R1)\r
111         \r
112         # Remove frame from stack\r
113         addi    R1,R1,IFrameSize\r
114 \r
115         # Return into the first task\r
116         rfi\r
117 \r
118 \r
119 \r
120 vPortYield:\r
121 \r
122         portSAVE_STACK_POINTER_AND_LR\r
123         bl vTaskSwitchContext\r
124         portRESTORE_STACK_POINTER_AND_LR\r
125         blr\r
126 \r
127 vPortTickISR:\r
128 \r
129         portSAVE_STACK_POINTER_AND_LR\r
130         bl vTaskIncrementTick\r
131         #if configUSE_PREEMPTION == 1\r
132                 bl vTaskSwitchContext\r
133         #endif\r
134 \r
135         # Clear the interrupt\r
136         lis             R0, 2048\r
137         mttsr   R0\r
138 \r
139         portRESTORE_STACK_POINTER_AND_LR\r
140         blr\r
141 \r
142 vPortISRWrapper:\r
143 \r
144         portSAVE_STACK_POINTER_AND_LR\r
145         bl vPortISRHandler\r
146         portRESTORE_STACK_POINTER_AND_LR\r
147         blr\r