| Index: third_party/libc++abi/src/Unwind/UnwindRegistersSave.s
|
| ===================================================================
|
| --- third_party/libc++abi/src/Unwind/UnwindRegistersSave.s (revision 0)
|
| +++ third_party/libc++abi/src/Unwind/UnwindRegistersSave.s (revision 0)
|
| @@ -0,0 +1,286 @@
|
| +//===------------------------ UnwindRegistersSave.s -----------------------===//
|
| +//
|
| +// The LLVM Compiler Infrastructure
|
| +//
|
| +// This file is dual licensed under the MIT and the University of Illinois Open
|
| +// Source Licenses. See LICENSE.TXT for details.
|
| +//
|
| +//===----------------------------------------------------------------------===//
|
| +
|
| +
|
| + .text
|
| +
|
| +#if __i386__
|
| +
|
| +#
|
| +# extern int unw_getcontext(unw_context_t* thread_state)
|
| +#
|
| +# On entry:
|
| +# + +
|
| +# +-----------------------+
|
| +# + thread_state pointer +
|
| +# +-----------------------+
|
| +# + return address +
|
| +# +-----------------------+ <-- SP
|
| +# + +
|
| +#
|
| + .globl _unw_getcontext
|
| +_unw_getcontext:
|
| + push %eax
|
| + movl 8(%esp), %eax
|
| + movl %ebx, 4(%eax)
|
| + movl %ecx, 8(%eax)
|
| + movl %edx, 12(%eax)
|
| + movl %edi, 16(%eax)
|
| + movl %esi, 20(%eax)
|
| + movl %ebp, 24(%eax)
|
| + movl %esp, %edx
|
| + addl $8, %edx
|
| + movl %edx, 28(%eax) # store what sp was at call site as esp
|
| + # skip ss
|
| + # skip eflags
|
| + movl 4(%esp), %edx
|
| + movl %edx, 40(%eax) # store return address as eip
|
| + # skip cs
|
| + # skip ds
|
| + # skip es
|
| + # skip fs
|
| + # skip gs
|
| + movl (%esp), %edx
|
| + movl %edx, (%eax) # store original eax
|
| + popl %eax
|
| + xorl %eax, %eax # return UNW_ESUCCESS
|
| + ret
|
| +
|
| +#elif __x86_64__
|
| +
|
| +#
|
| +# extern int unw_getcontext(unw_context_t* thread_state)
|
| +#
|
| +# On entry:
|
| +# thread_state pointer is in rdi
|
| +#
|
| + .globl _unw_getcontext
|
| +_unw_getcontext:
|
| + movq %rax, (%rdi)
|
| + movq %rbx, 8(%rdi)
|
| + movq %rcx, 16(%rdi)
|
| + movq %rdx, 24(%rdi)
|
| + movq %rdi, 32(%rdi)
|
| + movq %rsi, 40(%rdi)
|
| + movq %rbp, 48(%rdi)
|
| + movq %rsp, 56(%rdi)
|
| + addq $8, 56(%rdi)
|
| + movq %r8, 64(%rdi)
|
| + movq %r9, 72(%rdi)
|
| + movq %r10, 80(%rdi)
|
| + movq %r11, 88(%rdi)
|
| + movq %r12, 96(%rdi)
|
| + movq %r13,104(%rdi)
|
| + movq %r14,112(%rdi)
|
| + movq %r15,120(%rdi)
|
| + movq (%rsp),%rsi
|
| + movq %rsi,128(%rdi) # store return address as rip
|
| + # skip rflags
|
| + # skip cs
|
| + # skip fs
|
| + # skip gs
|
| + xorl %eax, %eax # return UNW_ESUCCESS
|
| + ret
|
| +
|
| +#elif __ppc__
|
| +
|
| +;
|
| +; extern int unw_getcontext(unw_context_t* thread_state)
|
| +;
|
| +; On entry:
|
| +; thread_state pointer is in r3
|
| +;
|
| + .globl _unw_getcontext
|
| +_unw_getcontext:
|
| + stw r0, 8(r3)
|
| + mflr r0
|
| + stw r0, 0(r3) ; store lr as ssr0
|
| + stw r1, 12(r3)
|
| + stw r2, 16(r3)
|
| + stw r3, 20(r3)
|
| + stw r4, 24(r3)
|
| + stw r5, 28(r3)
|
| + stw r6, 32(r3)
|
| + stw r7, 36(r3)
|
| + stw r8, 40(r3)
|
| + stw r9, 44(r3)
|
| + stw r10, 48(r3)
|
| + stw r11, 52(r3)
|
| + stw r12, 56(r3)
|
| + stw r13, 60(r3)
|
| + stw r14, 64(r3)
|
| + stw r15, 68(r3)
|
| + stw r16, 72(r3)
|
| + stw r17, 76(r3)
|
| + stw r18, 80(r3)
|
| + stw r19, 84(r3)
|
| + stw r20, 88(r3)
|
| + stw r21, 92(r3)
|
| + stw r22, 96(r3)
|
| + stw r23,100(r3)
|
| + stw r24,104(r3)
|
| + stw r25,108(r3)
|
| + stw r26,112(r3)
|
| + stw r27,116(r3)
|
| + stw r28,120(r3)
|
| + stw r29,124(r3)
|
| + stw r30,128(r3)
|
| + stw r31,132(r3)
|
| +
|
| + ; save VRSave register
|
| + mfspr r0,256
|
| + stw r0,156(r3)
|
| + ; save CR registers
|
| + mfcr r0
|
| + stw r0,136(r3)
|
| + ; save CTR register
|
| + mfctr r0
|
| + stw r0,148(r3)
|
| +
|
| + ; save float registers
|
| + stfd f0, 160(r3)
|
| + stfd f1, 168(r3)
|
| + stfd f2, 176(r3)
|
| + stfd f3, 184(r3)
|
| + stfd f4, 192(r3)
|
| + stfd f5, 200(r3)
|
| + stfd f6, 208(r3)
|
| + stfd f7, 216(r3)
|
| + stfd f8, 224(r3)
|
| + stfd f9, 232(r3)
|
| + stfd f10,240(r3)
|
| + stfd f11,248(r3)
|
| + stfd f12,256(r3)
|
| + stfd f13,264(r3)
|
| + stfd f14,272(r3)
|
| + stfd f15,280(r3)
|
| + stfd f16,288(r3)
|
| + stfd f17,296(r3)
|
| + stfd f18,304(r3)
|
| + stfd f19,312(r3)
|
| + stfd f20,320(r3)
|
| + stfd f21,328(r3)
|
| + stfd f22,336(r3)
|
| + stfd f23,344(r3)
|
| + stfd f24,352(r3)
|
| + stfd f25,360(r3)
|
| + stfd f26,368(r3)
|
| + stfd f27,376(r3)
|
| + stfd f28,384(r3)
|
| + stfd f29,392(r3)
|
| + stfd f30,400(r3)
|
| + stfd f31,408(r3)
|
| +
|
| +
|
| + ; save vector registers
|
| +
|
| + subi r4,r1,16
|
| + rlwinm r4,r4,0,0,27 ; mask low 4-bits
|
| + ; r4 is now a 16-byte aligned pointer into the red zone
|
| +
|
| +#define SAVE_VECTOR_UNALIGNED(_vec, _offset) \
|
| + stvx _vec,0,r4 @\
|
| + lwz r5, 0(r4) @\
|
| + stw r5, _offset(r3) @\
|
| + lwz r5, 4(r4) @\
|
| + stw r5, _offset+4(r3) @\
|
| + lwz r5, 8(r4) @\
|
| + stw r5, _offset+8(r3) @\
|
| + lwz r5, 12(r4) @\
|
| + stw r5, _offset+12(r3)
|
| +
|
| + SAVE_VECTOR_UNALIGNED( v0, 424+0x000)
|
| + SAVE_VECTOR_UNALIGNED( v1, 424+0x010)
|
| + SAVE_VECTOR_UNALIGNED( v2, 424+0x020)
|
| + SAVE_VECTOR_UNALIGNED( v3, 424+0x030)
|
| + SAVE_VECTOR_UNALIGNED( v4, 424+0x040)
|
| + SAVE_VECTOR_UNALIGNED( v5, 424+0x050)
|
| + SAVE_VECTOR_UNALIGNED( v6, 424+0x060)
|
| + SAVE_VECTOR_UNALIGNED( v7, 424+0x070)
|
| + SAVE_VECTOR_UNALIGNED( v8, 424+0x080)
|
| + SAVE_VECTOR_UNALIGNED( v9, 424+0x090)
|
| + SAVE_VECTOR_UNALIGNED(v10, 424+0x0A0)
|
| + SAVE_VECTOR_UNALIGNED(v11, 424+0x0B0)
|
| + SAVE_VECTOR_UNALIGNED(v12, 424+0x0C0)
|
| + SAVE_VECTOR_UNALIGNED(v13, 424+0x0D0)
|
| + SAVE_VECTOR_UNALIGNED(v14, 424+0x0E0)
|
| + SAVE_VECTOR_UNALIGNED(v15, 424+0x0F0)
|
| + SAVE_VECTOR_UNALIGNED(v16, 424+0x100)
|
| + SAVE_VECTOR_UNALIGNED(v17, 424+0x110)
|
| + SAVE_VECTOR_UNALIGNED(v18, 424+0x120)
|
| + SAVE_VECTOR_UNALIGNED(v19, 424+0x130)
|
| + SAVE_VECTOR_UNALIGNED(v20, 424+0x140)
|
| + SAVE_VECTOR_UNALIGNED(v21, 424+0x150)
|
| + SAVE_VECTOR_UNALIGNED(v22, 424+0x160)
|
| + SAVE_VECTOR_UNALIGNED(v23, 424+0x170)
|
| + SAVE_VECTOR_UNALIGNED(v24, 424+0x180)
|
| + SAVE_VECTOR_UNALIGNED(v25, 424+0x190)
|
| + SAVE_VECTOR_UNALIGNED(v26, 424+0x1A0)
|
| + SAVE_VECTOR_UNALIGNED(v27, 424+0x1B0)
|
| + SAVE_VECTOR_UNALIGNED(v28, 424+0x1C0)
|
| + SAVE_VECTOR_UNALIGNED(v29, 424+0x1D0)
|
| + SAVE_VECTOR_UNALIGNED(v30, 424+0x1E0)
|
| + SAVE_VECTOR_UNALIGNED(v31, 424+0x1F0)
|
| +
|
| + li r3, 0 ; return UNW_ESUCCESS
|
| + blr
|
| +
|
| +
|
| +#elif __arm64__
|
| +
|
| +;
|
| +; extern int unw_getcontext(unw_context_t* thread_state)
|
| +;
|
| +; On entry:
|
| +; thread_state pointer is in x0
|
| +;
|
| + .globl _unw_getcontext
|
| +_unw_getcontext:
|
| + stp x0, x1, [x0, #0x000]
|
| + stp x2, x3, [x0, #0x010]
|
| + stp x4, x5, [x0, #0x020]
|
| + stp x6, x7, [x0, #0x030]
|
| + stp x8, x9, [x0, #0x040]
|
| + stp x10,x11, [x0, #0x050]
|
| + stp x12,x13, [x0, #0x060]
|
| + stp x14,x15, [x0, #0x070]
|
| + stp x16,x17, [x0, #0x080]
|
| + stp x18,x19, [x0, #0x090]
|
| + stp x20,x21, [x0, #0x0A0]
|
| + stp x22,x23, [x0, #0x0B0]
|
| + stp x24,x25, [x0, #0x0C0]
|
| + stp x26,x27, [x0, #0x0D0]
|
| + stp x28,fp, [x0, #0x0E0]
|
| + str lr, [x0, #0x0F0]
|
| + mov x1,sp
|
| + str x1, [x0, #0x0F8]
|
| + str lr, [x0, #0x100] ; store return address as pc
|
| + ; skip cpsr
|
| + stp d0, d1, [x0, #0x110]
|
| + stp d2, d3, [x0, #0x120]
|
| + stp d4, d5, [x0, #0x130]
|
| + stp d6, d7, [x0, #0x140]
|
| + stp d8, d9, [x0, #0x150]
|
| + stp d10,d11, [x0, #0x160]
|
| + stp d12,d13, [x0, #0x170]
|
| + stp d14,d15, [x0, #0x180]
|
| + stp d16,d17, [x0, #0x190]
|
| + stp d18,d19, [x0, #0x1A0]
|
| + stp d20,d21, [x0, #0x1B0]
|
| + stp d22,d23, [x0, #0x1C0]
|
| + stp d24,d25, [x0, #0x1D0]
|
| + stp d26,d27, [x0, #0x1E0]
|
| + stp d28,d29, [x0, #0x1F0]
|
| + str d30, [x0, #0x200]
|
| + str d31, [x0, #0x208]
|
| + ldr x0, #0 ; return UNW_ESUCCESS
|
| + ret
|
| +
|
| +#endif
|
| +
|
|
|
| Property changes on: third_party/libc++abi/src/Unwind/UnwindRegistersSave.s
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|