132
|
1 /**
|
|
2 * Tango Fiber switching assembler code.
|
|
3 *
|
|
4 * Author: Mikola Lysenko
|
|
5 */
|
|
6
|
|
7 /************************************************************************************
|
|
8 * POWER PC ASM BITS
|
|
9 ************************************************************************************/
|
|
10 #if defined( __ppc__ ) || defined( __PPC__ ) || defined( __powerpc__ )
|
|
11
|
|
12
|
|
13 /**
|
|
14 * Performs a context switch.
|
|
15 *
|
|
16 * r3 - old context pointer
|
|
17 * r4 - new context pointer
|
|
18 *
|
|
19 */
|
|
20 .text
|
|
21 .align 2
|
|
22 .globl _fiber_switchContext
|
|
23 _fiber_switchContext:
|
|
24
|
|
25 /* Save linkage area */
|
|
26 mflr r0
|
|
27 mfcr r5
|
|
28 stw r0, 8(r1)
|
|
29 stw r5, 4(r1)
|
|
30
|
|
31 /* Save GPRs */
|
|
32 stw r11, (-1 * 4)(r1)
|
|
33 stw r13, (-2 * 4)(r1)
|
|
34 stw r14, (-3 * 4)(r1)
|
|
35 stw r15, (-4 * 4)(r1)
|
|
36 stw r16, (-5 * 4)(r1)
|
|
37 stw r17, (-6 * 4)(r1)
|
|
38 stw r18, (-7 * 4)(r1)
|
|
39 stw r19, (-8 * 4)(r1)
|
|
40 stw r20, (-9 * 4)(r1)
|
|
41 stw r21, (-10 * 4)(r1)
|
|
42 stw r22, (-11 * 4)(r1)
|
|
43 stw r23, (-12 * 4)(r1)
|
|
44 stw r24, (-13 * 4)(r1)
|
|
45 stw r25, (-14 * 4)(r1)
|
|
46 stw r26, (-15 * 4)(r1)
|
|
47 stw r27, (-16 * 4)(r1)
|
|
48 stw r28, (-17 * 4)(r1)
|
|
49 stw r29, (-18 * 4)(r1)
|
|
50 stw r30, (-19 * 4)(r1)
|
|
51 stwu r31, (-20 * 4)(r1)
|
|
52
|
|
53 /* We update the stack pointer here, since we do not want the GC to
|
|
54 scan the floating point registers. */
|
|
55
|
|
56 /* Save FPRs */
|
|
57 stfd f14, (-1 * 8)(r1)
|
|
58 stfd f15, (-2 * 8)(r1)
|
|
59 stfd f16, (-3 * 8)(r1)
|
|
60 stfd f17, (-4 * 8)(r1)
|
|
61 stfd f18, (-5 * 8)(r1)
|
|
62 stfd f19, (-6 * 8)(r1)
|
|
63 stfd f20, (-7 * 8)(r1)
|
|
64 stfd f21, (-8 * 8)(r1)
|
|
65 stfd f22, (-9 * 8)(r1)
|
|
66 stfd f23, (-10 * 8)(r1)
|
|
67 stfd f24, (-11 * 8)(r1)
|
|
68 stfd f25, (-12 * 8)(r1)
|
|
69 stfd f26, (-13 * 8)(r1)
|
|
70 stfd f27, (-14 * 8)(r1)
|
|
71 stfd f28, (-15 * 8)(r1)
|
|
72 stfd f29, (-16 * 8)(r1)
|
|
73 stfd f30, (-17 * 8)(r1)
|
|
74 stfd f31, (-18 * 8)(r1)
|
|
75
|
|
76 /* Update the old stack pointer */
|
|
77 stw r1, 0(r3)
|
|
78
|
|
79 /* Set new stack pointer */
|
|
80 addi r1, r4, 20 * 4
|
|
81
|
|
82 /* Restore linkage area */
|
|
83 lwz r0, 8(r1)
|
|
84 lwz r5, 4(r1)
|
|
85
|
|
86 /* Restore GPRs */
|
|
87 lwz r11, (-1 * 4)(r1)
|
|
88 lwz r13, (-2 * 4)(r1)
|
|
89 lwz r14, (-3 * 4)(r1)
|
|
90 lwz r15, (-4 * 4)(r1)
|
|
91 lwz r16, (-5 * 4)(r1)
|
|
92 lwz r17, (-6 * 4)(r1)
|
|
93 lwz r18, (-7 * 4)(r1)
|
|
94 lwz r19, (-8 * 4)(r1)
|
|
95 lwz r20, (-9 * 4)(r1)
|
|
96 lwz r21, (-10 * 4)(r1)
|
|
97 lwz r22, (-11 * 4)(r1)
|
|
98 lwz r23, (-12 * 4)(r1)
|
|
99 lwz r24, (-13 * 4)(r1)
|
|
100 lwz r25, (-14 * 4)(r1)
|
|
101 lwz r26, (-15 * 4)(r1)
|
|
102 lwz r27, (-16 * 4)(r1)
|
|
103 lwz r28, (-17 * 4)(r1)
|
|
104 lwz r29, (-18 * 4)(r1)
|
|
105 lwz r30, (-19 * 4)(r1)
|
|
106 lwz r31, (-20 * 4)(r1)
|
|
107
|
|
108
|
|
109 /* Restore FPRs */
|
|
110 lfd f14, (-1 * 8)(r4)
|
|
111 lfd f15, (-2 * 8)(r4)
|
|
112 lfd f16, (-3 * 8)(r4)
|
|
113 lfd f17, (-4 * 8)(r4)
|
|
114 lfd f18, (-5 * 8)(r4)
|
|
115 lfd f19, (-6 * 8)(r4)
|
|
116 lfd f20, (-7 * 8)(r4)
|
|
117 lfd f21, (-8 * 8)(r4)
|
|
118 lfd f22, (-9 * 8)(r4)
|
|
119 lfd f23, (-10 * 8)(r4)
|
|
120 lfd f24, (-11 * 8)(r4)
|
|
121 lfd f25, (-12 * 8)(r4)
|
|
122 lfd f26, (-13 * 8)(r4)
|
|
123 lfd f27, (-14 * 8)(r4)
|
|
124 lfd f28, (-15 * 8)(r4)
|
|
125 lfd f29, (-16 * 8)(r4)
|
|
126 lfd f30, (-17 * 8)(r4)
|
|
127 lfd f31, (-18 * 8)(r4)
|
|
128
|
|
129 /* Set condition and link register */
|
|
130 mtcr r5
|
|
131 mtlr r0
|
|
132
|
|
133 /* Return and switch context */
|
|
134 blr
|
|
135
|
|
136 #endif
|