unwind_registers.S revision 1.4 1 //===------------------------- unwind_registers.S -------------------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //
9 // Abstracts accessing local vs remote address spaces.
10 //
11 //===----------------------------------------------------------------------===//
12 #include <machine/asm.h>
13
14 #ifdef __i386__
15 .hidden _ZN7_Unwind13Registers_x86C1Ev
16 ENTRY(_ZN7_Unwind13Registers_x86C1Ev)
17 pushl %eax
18 movl 8(%esp), %eax /* Load this */
19 /* Save all registers except EAX, EIP and ESP */
20 /* Skip ECX */
21 /* Skip EDX */
22 movl %ebx, 12(%eax)
23 movl %ebp, 20(%eax)
24 movl %esi, 24(%eax)
25 movl %edi, 28(%eax)
26
27 leal 8(%esp), %edx /* Compute ESP from the call site */
28 movl %edx, 16(%eax) /* ...and store it as ESP */
29 movl 4(%esp), %edx /* Load return address */
30 movl %edx, 32(%eax) /* ...and store it as EIP */
31 popl %edx /* Take old EAX from stack */
32 movl %edx, 0(%eax) /* ...and store it */ // XXX skip
33 ret
34
35 .hidden _ZNK7_Unwind13Registers_x866jumptoEv
36 ENTRY(_ZNK7_Unwind13Registers_x866jumptoEv)
37 movl 4(%esp), %eax /* Load this */
38 movl 16(%eax), %edx /* Load new stack pointer */
39 subl $4, %edx /* Reserve space on new stack for EIP */
40 movl 32(%eax), %ebx /* Load new EIP */
41 movl %ebx, 0(%edx) /* ...and save it on the new stack */
42 pushl %edx /* Save new stack pointer on old stack */
43 /* New stack is prepared, now restore all registers except ESP */
44 /* EAX is the index register and must be restored last */
45 movl 4(%eax), %ecx
46 movl 8(%eax), %edx
47 movl 12(%eax), %ebx
48 movl 20(%eax), %ebp
49 /* 16 is ESP */
50 movl 24(%eax), %esi
51 movl 28(%eax), %edi
52 movl 0(%eax), %eax
53 /* Now load new stack pointer pushed on the old stack earlier */
54 popl %esp
55 /* Return address is already on the new stack. */
56 ret
57 #endif
58
59 #ifdef __x86_64
60 .hidden _ZN7_Unwind16Registers_x86_64C1Ev
61 ENTRY(_ZN7_Unwind16Registers_x86_64C1Ev)
62 /* RDI == this */
63 /* Skip RAX */
64 /* Skip RDX */
65 /* Skip RCX */
66 movq %rbx, 24(%rdi)
67 /* Skip RSI */
68 /* Skip RDI */
69 movq %rbp, 48(%rdi)
70 leaq 8(%rsp), %rax
71 movq %rax, 56(%rdi)
72 /* Skip R8 */
73 /* Skip R9 */
74 /* Skip R10 */
75 /* Skip R11 */
76 movq %r12, 96(%rdi)
77 movq %r13, 104(%rdi)
78 movq %r14, 112(%rdi)
79 movq %r15, 120(%rdi)
80 movq (%rsp), %rax
81 movq %rax, 128(%rdi)
82 ret
83
84 .hidden _ZNK7_Unwind16Registers_x86_646jumptoEv
85 ENTRY(_ZNK7_Unwind16Registers_x86_646jumptoEv)
86 /* RDI == this */
87 movq 56(%rdi), %rax
88 subq $8, %rax /* Reserve space on new stack for RIP */
89 movq 128(%rdi), %rbx /* Load new RIP */
90 movq %rbx, 0(%rax) /* ...and save it on the new stack */
91 pushq %rax /* Save new stack pointer on old stack */
92 /* New stack is prepared, now restore all registers */
93 movq 0(%rdi), %rax
94 movq 8(%rdi), %rdx
95 movq 16(%rdi), %rcx
96 movq 24(%rdi), %rbx
97 movq 32(%rdi), %rsi
98 /* RDI restored later as it is still used as index register */
99 movq 48(%rdi), %rbp
100 /* RSP is restored later */
101 movq 64(%rdi), %r8
102 movq 72(%rdi), %r9
103 movq 80(%rdi), %r10
104 movq 88(%rdi), %r11
105 movq 96(%rdi), %r12
106 movq 104(%rdi), %r13
107 movq 112(%rdi), %r14
108 movq 120(%rdi), %r15
109 movq 40(%rdi), %rdi
110 /* Now load new stack pointer pushed on the old stack earlier */
111 popq %rsp
112 /* Return address is already on the new stack. */
113 ret
114 #endif
115
116 #ifdef __powerpc__
117 .hidden _ZN7_Unwind15Registers_ppc32C1Ev
118 ENTRY(_ZN7_Unwind15Registers_ppc32C1Ev)
119 /* TODO: skip non-callee-safe registers */
120 stw %r0, 0(%r3)
121 stw %r1, 4(%r3)
122 stw %r2, 8(%r3)
123 stw %r3, 12(%r3)
124 stw %r4, 16(%r3)
125 stw %r5, 20(%r3)
126 stw %r6, 24(%r3)
127 stw %r7, 28(%r3)
128 stw %r8, 32(%r3)
129 stw %r9, 36(%r3)
130 stw %r10, 40(%r3)
131 stw %r11, 44(%r3)
132 stw %r12, 48(%r3)
133 stw %r13, 52(%r3)
134 stw %r14, 56(%r3)
135 stw %r15, 60(%r3)
136 stw %r16, 64(%r3)
137 stw %r17, 68(%r3)
138 stw %r18, 72(%r3)
139 stw %r19, 76(%r3)
140 stw %r20, 80(%r3)
141 stw %r21, 84(%r3)
142 stw %r22, 88(%r3)
143 stw %r23, 92(%r3)
144 stw %r24, 96(%r3)
145 stw %r25,100(%r3)
146 stw %r26,104(%r3)
147 stw %r27,108(%r3)
148 stw %r28,112(%r3)
149 stw %r29,116(%r3)
150 stw %r30,120(%r3)
151 stw %r31,124(%r3)
152 mflr %r0
153 stw %r0, 136(%r3) /* SRR0 */
154 mfcr %r0
155 stw %r0, 132(%r3) /* CR */
156
157 stfd %f0, 144(%r3)
158 stfd %f1, 152(%r3)
159 stfd %f2, 160(%r3)
160 stfd %f3, 168(%r3)
161 stfd %f4, 176(%r3)
162 stfd %f5, 184(%r3)
163 stfd %f6, 192(%r3)
164 stfd %f7, 200(%r3)
165 stfd %f8, 208(%r3)
166 stfd %f9, 216(%r3)
167 stfd %f10, 224(%r3)
168 stfd %f11, 232(%r3)
169 stfd %f12, 240(%r3)
170 stfd %f13, 248(%r3)
171 stfd %f14, 256(%r3)
172 stfd %f15, 264(%r3)
173 stfd %f16, 272(%r3)
174 stfd %f17, 280(%r3)
175 stfd %f18, 288(%r3)
176 stfd %f19, 296(%r3)
177 stfd %f20, 304(%r3)
178 stfd %f21, 312(%r3)
179 stfd %f22, 320(%r3)
180 stfd %f23, 328(%r3)
181 stfd %f24, 336(%r3)
182 stfd %f25, 344(%r3)
183 stfd %f26, 352(%r3)
184 stfd %f27, 360(%r3)
185 stfd %f28, 368(%r3)
186 stfd %f29, 376(%r3)
187 stfd %f30, 384(%r3)
188 stfd %f31, 392(%r3)
189
190 /* LR is undefined */
191 blr
192
193 .hidden _ZNK7_Unwind15Registers_ppc326jumptoEv
194 ENTRY(_ZNK7_Unwind15Registers_ppc326jumptoEv)
195 lfd %f0, 144(%r3)
196 lfd %f1, 152(%r3)
197 lfd %f2, 160(%r3)
198 lfd %f3, 168(%r3)
199 lfd %f4, 176(%r3)
200 lfd %f5, 184(%r3)
201 lfd %f6, 192(%r3)
202 lfd %f7, 200(%r3)
203 lfd %f8, 208(%r3)
204 lfd %f9, 216(%r3)
205 lfd %f10, 224(%r3)
206 lfd %f11, 232(%r3)
207 lfd %f12, 240(%r3)
208 lfd %f13, 248(%r3)
209 lfd %f14, 256(%r3)
210 lfd %f15, 264(%r3)
211 lfd %f16, 272(%r3)
212 lfd %f17, 280(%r3)
213 lfd %f18, 288(%r3)
214 lfd %f19, 296(%r3)
215 lfd %f20, 304(%r3)
216 lfd %f21, 312(%r3)
217 lfd %f22, 320(%r3)
218 lfd %f23, 328(%r3)
219 lfd %f24, 336(%r3)
220 lfd %f25, 344(%r3)
221 lfd %f26, 352(%r3)
222 lfd %f27, 360(%r3)
223 lfd %f28, 368(%r3)
224 lfd %f29, 376(%r3)
225 lfd %f30, 384(%r3)
226 lfd %f31, 392(%r3)
227
228 lwz %r2, 8(%r3)
229 /* skip r3 for now */
230 lwz %r4, 16(%r3)
231 lwz %r5, 20(%r3)
232 lwz %r6, 24(%r3)
233 lwz %r7, 28(%r3)
234 lwz %r8, 32(%r3)
235 lwz %r9, 36(%r3)
236 lwz %r10, 40(%r3)
237 lwz %r11, 44(%r3)
238 lwz %r12, 48(%r3)
239 lwz %r13, 52(%r3)
240 lwz %r14, 56(%r3)
241 lwz %r15, 60(%r3)
242 lwz %r16, 64(%r3)
243 lwz %r17, 68(%r3)
244 lwz %r18, 72(%r3)
245 lwz %r19, 76(%r3)
246 lwz %r20, 80(%r3)
247 lwz %r21, 84(%r3)
248 lwz %r22, 88(%r3)
249 lwz %r23, 92(%r3)
250 lwz %r24, 96(%r3)
251 lwz %r25,100(%r3)
252 lwz %r26,104(%r3)
253 lwz %r27,108(%r3)
254 lwz %r28,112(%r3)
255 lwz %r29,116(%r3)
256 lwz %r30,120(%r3)
257 lwz %r31,124(%r3)
258
259 lwz %r0, 128(%r3) /* LR */
260 mtlr %r0
261 lwz %r0, 132(%r3) /* CR */
262 mtcr %r0
263 lwz %r0, 136(%r3) /* SRR0 */
264 mtctr %r0
265
266 lwz %r0, 0(%r3) /* do r0 now */
267 lwz %r1, 4(%r3) /* do sp now */
268 lwz %r3, 12(%r3) /* do r3 last */
269 bctr
270 #endif
271
272 #if defined(__arm__) && !defined(__ARM_EABI__)
273 .hidden _ZN7_Unwind15Registers_arm32C1Ev
274 ENTRY(_ZN7_Unwind15Registers_arm32C1Ev)
275 stmia r0, {r0-r14}
276
277 str lr, [r0, #60] /* PC */
278 mrs r1, cpsr
279 str r1, [r0, #64] /* CPSR */
280
281 RET
282 END(_ZN7_Unwind15Registers_arm32C1Ev)
283
284 .hidden _ZNK7_Unwind15Registers_arm326jumptoEv
285 ENTRY(_ZNK7_Unwind15Registers_arm326jumptoEv)
286 ldr r1, [r0, #64]
287 msr cpsr_sxc, r1
288 ldmia r0, {r0-r15}
289 END(_ZNK7_Unwind15Registers_arm326jumptoEv)
290 #endif
291
292 #if defined(__vax__)
293 .hidden _ZN7_Unwind13Registers_vaxC1Ev
294 ENTRY(_ZN7_Unwind13Registers_vaxC1Ev, R0)
295 subl2 $4, %sp
296 movl 4(%ap), %r0
297 movl %r1, 4(%r0)
298 movl %r2, 8(%r0)
299 movl %r3, 12(%r0)
300 movl %r4, 16(%r0)
301 movl %r5, 20(%r0)
302 movl %r6, 24(%r0)
303 movl %r7, 28(%r0)
304 movl %r8, 32(%r0)
305 movl %r9, 36(%r0)
306 movl %r10, 40(%r0)
307 movl %r11, 44(%r0)
308 movl 8(%fp), 48(%r0)
309 movl 12(%fp), 52(%r0)
310 /* XXX correct argument handling */
311 addl3 $36, %r14, 56(%r0)
312 /* Return PC */
313 movl 16(%fp), 60(%r0)
314 /* Load saved value of r0 as r1 */
315 movl 20(%fp), 0(%r0)
316 /* Saved PSW */
317 movl 4(%fp), 64(%r0)
318 ret
319 END(_ZN7_Unwind13Registers_vaxC1Ev)
320
321 .hidden _ZNK7_Unwind13Registers_vax6jumptoEv
322 ENTRY(_ZNK7_Unwind13Registers_vax6jumptoEv, 0)
323 subl2 $4, %sp
324 movl 4(%ap), %r0
325 movl 4(%r0), %r1
326 movl 8(%r0), %r2
327 movl 12(%r0), %r3
328 movl 16(%r0), %r4
329 movl 20(%r0), %r5
330 movl 24(%r0), %r6
331 movl 28(%r0), %r7
332 movl 32(%r0), %r8
333 movl 36(%r0), %r9
334 movl 40(%r0), %r10
335 movl 44(%r0), %r11
336 movl 48(%r0), %r12
337 movl 52(%r0), %r13
338 movl 56(%r0), %r14
339 movl 60(%r0), -(%sp)
340 movl 0(%r0), %r0
341 /* XXX restore PSW */
342 rsb
343
344 END(_ZNK7_Unwind13Registers_vax6jumptoEv)
345 #endif
346