]> git.sur5r.net Git - freertos/blob - Source/portable/GCC/PPC405/portasm.s
Add initial PPC405 files - this is a work in progress not a completed port.
[freertos] / Source / portable / GCC / PPC405 / portasm.s
1         .extern pxCurrentTCB\r
2         .extern vTaskSwitchContext\r
3 \r
4         .global vStartFirstTask\r
5         .global vPortYield\r
6 \r
7 .set portCONTEXT_SIZE, 156\r
8 .set portR0_OFFSET, 152\r
9 .set portGPR_OFFSET, 32\r
10 .set portCR_OFFSET, 28\r
11 .set portXER_OFFSET, 24\r
12 .set portLR_OFFSET, 20\r
13 .set portCTR_OFFSET, 16\r
14 .set portUSPRG0_OFFSET, 12\r
15 .set portSRR0_OFFSET, 8\r
16 .set portSRR1_OFFSET, 4\r
17 \r
18 .macro portRESTORE_CONTEXT\r
19 \r
20         # Get the address of the TCB.\r
21         xor             R0, R0, R0\r
22     addis   SP, R0, pxCurrentTCB@ha\r
23     lwz         SP,     pxCurrentTCB@l( SP )\r
24 \r
25         # Get the task stack pointer from the TCB.\r
26         lwz             SP, 0( SP )\r
27 \r
28         # Pop the special purpose registers\r
29         lwz             R0, portSRR1_OFFSET( SP )\r
30         mtspr   SRR1, R0\r
31         lwz             R0, portSRR0_OFFSET( SP )\r
32         mtspr   SRR0, R0\r
33         lwz             R0, portUSPRG0_OFFSET( SP )\r
34         mtspr   256, R0 #USPRG0\r
35         lwz             R0, portCTR_OFFSET( SP )\r
36         mtspr   CTR, R0\r
37         lwz             R0, portLR_OFFSET( SP )\r
38         mtspr   LR, R0\r
39         lwz             R0, portXER_OFFSET( SP )\r
40         mtspr   XER, R0\r
41         lwz             R0, portCR_OFFSET( SP )\r
42         mtcr    R0\r
43 \r
44         # Pop GPRs\r
45         lmw             R2, portGPR_OFFSET( SP )\r
46 \r
47         # Finally pop R0 and correct the stack pointer\r
48         lwz             R0, portR0_OFFSET( SP )\r
49         addi    R1, R1, portCONTEXT_SIZE\r
50 \r
51         # Start the task running\r
52         rfi\r
53 \r
54         .endm\r
55 \r
56 .macro portSAVE_CONTEXT\r
57 \r
58         # Make room on the stack.\r
59         subi    R1, R1, portCONTEXT_SIZE\r
60 \r
61         # Push R0, then the GPRs\r
62         stw             R0, portR0_OFFSET( SP )\r
63         stm             R2, portGPR_OFFSET( SP )\r
64 \r
65         # Push the SFRs\r
66         mfcr    R0\r
67         stw             R0, portCR_OFFSET( SP )\r
68         mfspr   R0, XER\r
69         stw             R0, portXER_OFFSET( SP )\r
70         mfspr   R0, LR\r
71         stw             R0, portLR_OFFSET( SP )\r
72         mfspr   R0, CTR\r
73         stw             R0, portCTR_OFFSET( SP )\r
74         mfspr   R0, 256 #USPRG0\r
75         stw             R0, portUSPRG0_OFFSET( SP )\r
76         mfspr   R0, SRR0\r
77         stw             R0, portSRR0_OFFSET( SP )\r
78         mfspr   R0, SRR1\r
79         stw             R0, portSRR1_OFFSET( SP )\r
80 \r
81         # Get the address of the TCB.\r
82         xor             R0, R0, R0\r
83         addis   R2, R0, pxCurrentTCB@ha\r
84         lwz             R2,     pxCurrentTCB@l( R2 )\r
85 \r
86         # Store the stack pointer into the TCB\r
87         stw             SP,     0( R2 )\r
88 \r
89         .endm\r
90 \r
91 vStartFirstTask:\r
92         portRESTORE_CONTEXT\r
93         rfi\r
94 \r
95 \r
96 \r
97 vPortYield:\r
98 \r
99         portSAVE_CONTEXT\r
100         bl vTaskSwitchContext\r
101         portRESTORE_CONTEXT\r
102 \r
103         NOP\r
104         NOP\r