fix aarch64 getcontext functionality
Previously the PC value was being set to the LR instead, causing many
tests to fail.
@@ -224,9 +224,9 @@ typedef ucontext_t unw_tdep_context_t;
#include "libunwind-common.h"
#include "libunwind-dynamic.h"
-#define unw_tdep_getcontext(uc) (({ \
+#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; \
+ 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" \
@@ -243,11 +243,14 @@ typedef ucontext_t unw_tdep_context_t;
"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" \
+ "stp x30, x1, [%[base], #240]\n" \
+ "adr x1, ret%=\n" \
+ "str x1, [%[base], #256]\n" \
+ "mov %[base], #0\n" \
+ "ret%=:\n" \
: [base] "+r" (unw_base) : : "x1", "memory"); \
- }), 0)
+ (int)unw_base; })
#define unw_tdep_is_fpreg UNW_ARCH_OBJ(is_fpreg)
extern int unw_tdep_is_fpreg (int);
