| --- libunwind/include/libunwind-aarch64.h 2015-08-03 19:24:10.000000000 +0300 |
| +++ patches/libunwind-aarch64.h 2015-08-05 05:22:46.000000000 +0300 |
| @@ -168,15 +168,37 @@ |
| } |
| unw_tdep_save_loc_t; |
| |
| - |
| /* On AArch64, we can directly use ucontext_t as the unwind context. */ |
| typedef ucontext_t unw_tdep_context_t; |
| |
| #include "libunwind-common.h" |
| #include "libunwind-dynamic.h" |
| |
| -#define unw_tdep_getcontext(uc) (getcontext (uc), 0) |
| -#define unw_tdep_is_fpreg UNW_ARCH_OBJ(is_fpreg) |
| +/* There is no getcontext in Android. */ |
| +#define unw_tdep_getcontext(uc) (({ \ |
| + unw_tdep_context_t *unw_ctx = (uc); \ |
| + register uint64_t *unw_base asm ("x0") = (uint64_t*) unw_ctx->uc_mcontext.regs; \ |
| + __asm__ __volatile__ ( \ |
| + "stp x0, x1, [%[base], #0]\n" \ |
| + "stp x2, x3, [%[base], #16]\n" \ |
| + "stp x4, x5, [%[base], #32]\n" \ |
| + "stp x6, x7, [%[base], #48]\n" \ |
| + "stp x8, x9, [%[base], #64]\n" \ |
| + "stp x10, x11, [%[base], #80]\n" \ |
| + "stp x12, x13, [%[base], #96]\n" \ |
| + "stp x14, x13, [%[base], #112]\n" \ |
| + "stp x16, x17, [%[base], #128]\n" \ |
| + "stp x18, x19, [%[base], #144]\n" \ |
| + "stp x20, x21, [%[base], #160]\n" \ |
| + "stp x22, x23, [%[base], #176]\n" \ |
| + "stp x24, x25, [%[base], #192]\n" \ |
| + "stp x26, x27, [%[base], #208]\n" \ |
| + "stp x28, x29, [%[base], #224]\n" \ |
| + "str x30, [%[base], #240]\n" \ |
| + "mov x1, sp\n" \ |
| + "stp x1, x30, [%[base], #248]\n" \ |
| + : [base] "+r" (unw_base) : : "x1", "memory"); \ |
| + }), 0) |
| |
| extern int unw_tdep_is_fpreg (int); |
| |