summaryrefslogtreecommitdiff
path: root/libs/context/src/asm/fcontext_ppc32_sysv_elf_gas.S
blob: 69b6ed90b520f9fd5b36370b3c78d1e647d6928e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
/*
            Copyright Oliver Kowalke 2009.
   Distributed under the Boost Software License, Version 1.0.
      (See accompanying file LICENSE_1_0.txt or copy at
          http://www.boost.org/LICENSE_1_0.txt)
*/

/*******************************************************************
 *                                                                 *
 *  -------------------------------------------------------------  *
 *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |  9  |  *
 *  -------------------------------------------------------------  *
 *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  32 |  36 |  *
 *  -------------------------------------------------------------  *
 *  | R13 | R14 | R15 | R16 | R17 | R18 | R19 | R20 | R21 | R22 |  *
 *  -------------------------------------------------------------  *
 *  -------------------------------------------------------------  *
 *  |  10 |  11 |  12 |  13 |  14 |  15 |  16 |  17 |  18 |  19 |  *
 *  -------------------------------------------------------------  *
 *  |  40 |  44 |  48 |  52 |  56 |  60 |  64 |  68 |  72 |  76 |  *
 *  -------------------------------------------------------------  *
 *  | R23 | R24 | R25 | R26 | R27 | R28 | R29 | R30 | R31 |  SP |  *
 *  -------------------------------------------------------------  *
 *  -------------------------------------------------------------  *
 *  |  20 |  21 |  22 |                                         |  *
 *  -------------------------------------------------------------  *
 *  |  80 |  84 |  88 |                                         |  *
 *  -------------------------------------------------------------  *
 *  |  CR |  LR |  PC |                                         |  *
 *  -------------------------------------------------------------  *
 *  -------------------------------------------------------------  *
 *  |  23 |  24 |                                               |  *
 *  -------------------------------------------------------------  *
 *  |  92 |  96 |                                               |  *
 *  -------------------------------------------------------------  *
 *  |sbase|slimt|                                               |  *
 *  -------------------------------------------------------------  *
 *  -------------------------------------------------------------  *
 *  |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  32 |  33 |  34 |  *
 *  -------------------------------------------------------------  *
 *  | 100 | 104 | 108 | 112 | 116 | 120 | 124 | 128 | 132 | 136 |  *
 *  -------------------------------------------------------------  *
 *  |    F14    |    F15    |    F16    |    F17    |    F18    |  *
 *  -------------------------------------------------------------  *
 *  -------------------------------------------------------------  *
 *  |  35 |  36 |  37 |  38 |  39 |  40 |  41 |  42 |  43 |  44 |  *
 *  -------------------------------------------------------------  *
 *  | 140 | 144 | 148 | 152 | 156 | 160 | 164 | 168 | 172 | 176 |  *
 *  -------------------------------------------------------------  *
 *  |    F19    |    F20    |    F21    |    F22    |    F23    |  *
 *  -------------------------------------------------------------  *
 *  -------------------------------------------------------------  *
 *  |  45 |  46 |  47 |  48 |  49 |  50 |  51 |  52 |  53 |  54 |  *
 *  -------------------------------------------------------------  *
 *  | 180 | 184 | 188 | 192 | 196 | 200 | 204 | 208 | 212 | 216 |  *
 *  -------------------------------------------------------------  *
 *  |    F24    |    F25    |    F26    |    F27    |    F28    |  *
 *  -------------------------------------------------------------  *
 *  -------------------------------------------------------------  *
 *  |  55 |  56 |  57 |  58 |  59 |  60 |  61 |  62 |           |  *
 *  -------------------------------------------------------------  *
 *  | 220 | 224 | 228 | 232 | 236 | 240 | 244 | 248 |           |  *
 *  -------------------------------------------------------------  *
 *  |    F29    |    F30    |    F31    |   fpscr   |           |  *
 *  -------------------------------------------------------------  *
 *                                                                 *
 * *****************************************************************/

.text
.globl jump_fcontext
.align 2
.type jump_fcontext,@function
jump_fcontext:
    stw     %r13,  0(%r3)       # save R13
    stw     %r14,  4(%r3)       # save R14
    stw     %r15,  8(%r3)       # save R15
    stw     %r16,  12(%r3)      # save R16
    stw     %r17,  16(%r3)      # save R17
    stw     %r18,  20(%r3)      # save R18
    stw     %r19,  24(%r3)      # save R19
    stw     %r20,  28(%r3)      # save R20
    stw     %r21,  32(%r3)      # save R21
    stw     %r22,  36(%r3)      # save R22
    stw     %r23,  40(%r3)      # save R23
    stw     %r24,  44(%r3)      # save R24
    stw     %r25,  48(%r3)      # save R25
    stw     %r26,  52(%r3)      # save R26
    stw     %r27,  56(%r3)      # save R27
    stw     %r28,  60(%r3)      # save R28
    stw     %r29,  64(%r3)      # save R29
    stw     %r30,  68(%r3)      # save R30
    stw     %r31,  72(%r3)      # save R31
    stw     %r1,   76(%r3)      # save SP

    mfcr    %r0                 # load CR
    stw     %r0,   80(%r3)      # save CR
    mflr    %r0                 # load LR
    stw     %r0,   84(%r3)      # save LR
    stw     %r0,   88(%r3)      # save LR as PC

    cmpwi   cr7,   %r6,  0      # test if fpu env should be preserved
    beq     cr7,   1f

    stfd    %f14,  100(%r3)     # save F14
    stfd    %f15,  108(%r3)     # save F15
    stfd    %f16,  116(%r3)     # save F16
    stfd    %f17,  124(%r3)     # save F17
    stfd    %f18,  132(%r3)     # save F18
    stfd    %f19,  140(%r3)     # save F19
    stfd    %f20,  148(%r3)     # save F20
    stfd    %f21,  156(%r3)     # save F21
    stfd    %f22,  164(%r3)     # save F22
    stfd    %f23,  172(%r3)     # save F23
    stfd    %f24,  180(%r3)     # save F24
    stfd    %f25,  188(%r3)     # save F25
    stfd    %f26,  196(%r3)     # save F26
    stfd    %f27,  204(%r3)     # save F27
    stfd    %f28,  212(%r3)     # save F28
    stfd    %f29,  220(%r3)     # save F29
    stfd    %f30,  228(%r3)     # save F30
    stfd    %f31,  236(%r3)     # save F31
    mffs    %f0                 # load FPSCR
    stfd    %f0,   244(%r3)     # save FPSCR

    lfd     %f14,  100(%r4)     # restore F14
    lfd     %f15,  108(%r4)     # restore F15
    lfd     %f16,  116(%r4)     # restore F16
    lfd     %f17,  124(%r4)     # restore F17
    lfd     %f18,  132(%r4)     # restore F18
    lfd     %f19,  140(%r4)     # restore F19
    lfd     %f20,  148(%r4)     # restore F20
    lfd     %f21,  156(%r4)     # restore F21
    lfd     %f22,  164(%r4)     # restore F22
    lfd     %f23,  172(%r4)     # restore F23
    lfd     %f24,  180(%r4)     # restore F24
    lfd     %f25,  188(%r4)     # restore F25
    lfd     %f26,  196(%r4)     # restore F26
    lfd     %f27,  204(%r4)     # restore F27
    lfd     %f28,  212(%r4)     # restore F28
    lfd     %f29,  220(%r4)     # restore F29
    lfd     %f30,  228(%r4)     # restore F30
    lfd     %f31,  236(%r4)     # restore F31
    lfd     %f0,   244(%r4)     # load FPSCR
    mtfsf   0xff,  %f0          # restore FPSCR
1:

    lwz     %r13,  0(%r4)       # restore R13
    lwz     %r14,  4(%r4)       # restore R14
    lwz     %r15,  8(%r4)       # restore R15
    lwz     %r16,  12(%r4)      # restore R16
    lwz     %r17,  16(%r4)      # restore R17
    lwz     %r18,  20(%r4)      # restore R18
    lwz     %r19,  24(%r4)      # restore R19
    lwz     %r20,  28(%r4)      # restore R20
    lwz     %r21,  32(%r4)      # restore R21
    lwz     %r22,  36(%r4)      # restore R22
    lwz     %r23,  40(%r4)      # restore R23
    lwz     %r24,  44(%r4)      # restore R24
    lwz     %r25,  48(%r4)      # restore R25
    lwz     %r26,  52(%r4)      # restore R26
    lwz     %r27,  56(%r4)      # restore R27
    lwz     %r28,  60(%r4)      # restore R28
    lwz     %r29,  64(%r4)      # restore R29
    lwz     %r30,  68(%r4)      # restore R30
    lwz     %r31,  72(%r4)      # restore R31
    lwz     %r1,   76(%r4)      # restore SP

    lwz     %r0,   80(%r4)      # load CR
    mtcr    %r0                 # restore CR
    lwz     %r0,   84(%r4)      # load LR
    mtlr    %r0                 # restore LR

    mr.     %r3,   %r5          # use third arg as return value after jump
                                # and as first arg in context function

    lwz     %r0,   88(%r4)      # load PC
    mtctr   %r0                 # restore CTR

    bctr                        # jump to context
.size jump_fcontext, .-jump_fcontext

.text
.globl make_fcontext
.align 2
.type make_fcontext,@function
make_fcontext:
    stw     %r3, 0(%r3)         # save the current context
    stw     %r4, 88(%r3)        # save the address of the context function
    lwz     %r0, 92(%r3)        # load the stack base

    li      %r4, 28
    subf    %r1, %r4, %r1       # reserve space on stack
    stw     %r3, 24(%r1)        # store pointer to fcontext_t on stack
    mflr    %r4                 # load LR
    stw     %r4, 20(%r1)        # store LR on stack
    mr.     %r3, %r0            # context stack as arg to align_stack
    bl      align_stack@plt     # call align_stack
    mr.     %r0, %r3            # load result into R0
    lwz     %r4, 20(%r1)        # pop LR from stack
    mtlr    %r4                 # restore LR
    lwz     %r3, 24(%r1)        # pop pointer to fcontext_t from stack
    addi    %r1, %r1, 28        # release space on stack

    li      %r4, 32
    subf    %r0, %r4, %r0       # 32 bytes on stack for parameter area(== 8 registers)
    stw     %r0, 76(%r3)        # save the aligned stack base

    mflr    %r0                 # load LR
    bl      1f                  # jump to label 1
1:
    mflr    %r4                 # load LR
    addi    %r4, %r4, finish - 1b    # address of finish; called after context function returns
    mtlr    %r0                 # restore LR
    stw     %r4, 84(%r3)

    li      %r3,  0
    blr

finish:
    li      %r3,  0             # exit code is zero
    bl      _exit@plt           # exit application
.size make_fcontext, .-make_fcontext