diff options
Diffstat (limited to 'libunwind/src/UnwindRegistersSave.S')
-rw-r--r-- | libunwind/src/UnwindRegistersSave.S | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/libunwind/src/UnwindRegistersSave.S b/libunwind/src/UnwindRegistersSave.S index 4583f505b29..d6247394fe9 100644 --- a/libunwind/src/UnwindRegistersSave.S +++ b/libunwind/src/UnwindRegistersSave.S @@ -237,6 +237,109 @@ DEFINE_LIBUNWIND_FUNCTION(unw_getcontext) DEFINE_LIBUNWIND_FUNCTION(unw_getcontext) teq $0, $0 +#elif defined(__powerpc64__) + +// +// extern int unw_getcontext(unw_context_t* thread_state) +// +// On entry: +// thread_state pointer is in r3 +// +DEFINE_LIBUNWIND_FUNCTION(unw_getcontext) + std %r0, 16(%r3) + mflr %r0 + std %r0, 0(%r3) // store lr as ssr0 + std %r1, 24(%r3) + std %r2, 32(%r3) + std %r3, 40(%r3) + std %r4, 48(%r3) + std %r5, 56(%r3) + std %r6, 64(%r3) + std %r7, 72(%r3) + std %r8, 80(%r3) + std %r9, 88(%r3) + std %r10, 96(%r3) + std %r11, 104(%r3) + std %r12, 112(%r3) + std %r13, 120(%r3) + std %r14, 128(%r3) + std %r15, 136(%r3) + std %r16, 144(%r3) + std %r17, 152(%r3) + std %r18, 160(%r3) + std %r19, 168(%r3) + std %r20, 176(%r3) + std %r21, 184(%r3) + std %r22, 192(%r3) + std %r23, 200(%r3) + std %r24, 208(%r3) + std %r25, 216(%r3) + std %r26, 224(%r3) + std %r27, 232(%r3) + std %r28, 240(%r3) + std %r29, 248(%r3) + std %r30, 256(%r3) + std %r31, 264(%r3) + + mfcr %r0 + std %r0, 272(%r3) + + mfxer %r0 + std %r0, 280(%r3) + + mflr %r0 + std %r0, 288(%r3) + + mfctr %r0 + std %r0, 296(%r3) + + mfvrsave %r0 + std %r0, 304(%r3) + + // save float registers + stfd %f0, 312(%r3) + stfd %f1, 320(%r3) + stfd %f2, 328(%r3) + stfd %f3, 336(%r3) + stfd %f4, 344(%r3) + stfd %f5, 352(%r3) + stfd %f6, 360(%r3) + stfd %f7, 368(%r3) + stfd %f8, 376(%r3) + stfd %f9, 384(%r3) + stfd %f10, 392(%r3) + stfd %f11, 400(%r3) + stfd %f12, 408(%r3) + stfd %f13, 416(%r3) + stfd %f14, 424(%r3) + stfd %f15, 432(%r3) + stfd %f16, 440(%r3) + stfd %f17, 448(%r3) + stfd %f18, 456(%r3) + stfd %f19, 464(%r3) + stfd %f20, 472(%r3) + stfd %f21, 480(%r3) + stfd %f22, 488(%r3) + stfd %f23, 496(%r3) + stfd %f24, 504(%r3) + stfd %f25, 512(%r3) + stfd %f26, 520(%r3) + stfd %f27, 528(%r3) + stfd %f28, 536(%r3) + stfd %f29, 544(%r3) + stfd %f30, 552(%r3) + stfd %f31, 560(%r3) + + mffs %f0 + stfd %f0, 568(%r3) + + //TODO: save vector registers + + + li %r3, 0 // return UNW_ESUCCESS + blr + + #elif defined(__ppc__) ; |