|
@@ -0,0 +1,145 @@
|
|
|
+diff --git a/src/aarch64/Gos-linux.c b/src/aarch64/Gos-linux.c
|
|
|
+index 7cd8c87..b750180 100644
|
|
|
+--- a/src/aarch64/Gos-linux.c
|
|
|
++++ b/src/aarch64/Gos-linux.c
|
|
|
+@@ -28,73 +28,70 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
|
|
+
|
|
|
+ #ifndef UNW_REMOTE_ONLY
|
|
|
+
|
|
|
+-HIDDEN int
|
|
|
++HIDDEN inline int
|
|
|
+ aarch64_local_resume (unw_addr_space_t as, unw_cursor_t *cursor, void *arg)
|
|
|
+ {
|
|
|
++#ifdef __linux__
|
|
|
+ struct cursor *c = (struct cursor *) cursor;
|
|
|
+- unw_context_t *uc = c->uc;
|
|
|
++ unw_tdep_context_t *uc = c->uc;
|
|
|
+
|
|
|
+ if (c->sigcontext_format == AARCH64_SCF_NONE)
|
|
|
+ {
|
|
|
+ /* Since there are no signals involved here we restore EH and non scratch
|
|
|
+ registers only. */
|
|
|
++ unsigned long regs[24];
|
|
|
++ regs[0] = uc->uc_mcontext.regs[0];
|
|
|
++ regs[1] = uc->uc_mcontext.regs[1];
|
|
|
++ regs[2] = uc->uc_mcontext.regs[2];
|
|
|
++ regs[3] = uc->uc_mcontext.regs[3];
|
|
|
++ regs[4] = uc->uc_mcontext.regs[19];
|
|
|
++ regs[5] = uc->uc_mcontext.regs[20];
|
|
|
++ regs[6] = uc->uc_mcontext.regs[21];
|
|
|
++ regs[7] = uc->uc_mcontext.regs[22];
|
|
|
++ regs[8] = uc->uc_mcontext.regs[23];
|
|
|
++ regs[9] = uc->uc_mcontext.regs[24];
|
|
|
++ regs[10] = uc->uc_mcontext.regs[25];
|
|
|
++ regs[11] = uc->uc_mcontext.regs[26];
|
|
|
++ regs[12] = uc->uc_mcontext.regs[27];
|
|
|
++ regs[13] = uc->uc_mcontext.regs[28];
|
|
|
++ regs[14] = uc->uc_mcontext.regs[29]; /* FP */
|
|
|
++ regs[15] = uc->uc_mcontext.regs[30]; /* LR */
|
|
|
++ regs[16] = GET_FPCTX(uc)->vregs[8];
|
|
|
++ regs[17] = GET_FPCTX(uc)->vregs[9];
|
|
|
++ regs[18] = GET_FPCTX(uc)->vregs[10];
|
|
|
++ regs[19] = GET_FPCTX(uc)->vregs[11];
|
|
|
++ regs[20] = GET_FPCTX(uc)->vregs[12];
|
|
|
++ regs[21] = GET_FPCTX(uc)->vregs[13];
|
|
|
++ regs[22] = GET_FPCTX(uc)->vregs[14];
|
|
|
++ regs[23] = GET_FPCTX(uc)->vregs[15];
|
|
|
++ unsigned long sp = uc->uc_mcontext.sp;
|
|
|
++
|
|
|
++ struct regs_overlay {
|
|
|
++ char x[sizeof(regs)];
|
|
|
++ };
|
|
|
++
|
|
|
+ __asm__ __volatile__ (
|
|
|
+- "ldr x0, %[x0]\n\t"
|
|
|
+- "ldr x1, %[x1]\n\t"
|
|
|
+- "ldr x2, %[x2]\n\t"
|
|
|
+- "ldr x3, %[x3]\n\t"
|
|
|
+- "ldr x19, %[x19]\n\t"
|
|
|
+- "ldr x20, %[x20]\n\t"
|
|
|
+- "ldr x21, %[x21]\n\t"
|
|
|
+- "ldr x22, %[x22]\n\t"
|
|
|
+- "ldr x23, %[x23]\n\t"
|
|
|
+- "ldr x24, %[x24]\n\t"
|
|
|
+- "ldr x25, %[x25]\n\t"
|
|
|
+- "ldr x26, %[x26]\n\t"
|
|
|
+- "ldr x27, %[x27]\n\t"
|
|
|
+- "ldr x28, %[x28]\n\t"
|
|
|
+- "ldr x29, %[x29]\n\t"
|
|
|
+- "ldr x30, %[x30]\n\t"
|
|
|
+- "ldr d8, %[d8]\n\t"
|
|
|
+- "ldr d9, %[d9]\n\t"
|
|
|
+- "ldr d10, %[d10]\n\t"
|
|
|
+- "ldr d11, %[d11]\n\t"
|
|
|
+- "ldr d12, %[d12]\n\t"
|
|
|
+- "ldr d13, %[d13]\n\t"
|
|
|
+- "ldr d14, %[d14]\n\t"
|
|
|
+- "ldr d15, %[d15]\n\t"
|
|
|
+- "ldr x5, %[sp]\n\t"
|
|
|
+- "mov sp, x5\n\t"
|
|
|
+- "ret\n"
|
|
|
++ "mov x4, %0\n"
|
|
|
++ "mov x5, %1\n"
|
|
|
++ "ldp x0, x1, [x4]\n"
|
|
|
++ "ldp x2, x3, [x4,16]\n"
|
|
|
++ "ldp x19, x20, [x4,32]\n"
|
|
|
++ "ldp x21, x22, [x4,48]\n"
|
|
|
++ "ldp x23, x24, [x4,64]\n"
|
|
|
++ "ldp x25, x26, [x4,80]\n"
|
|
|
++ "ldp x27, x28, [x4,96]\n"
|
|
|
++ "ldp x29, x30, [x4,112]\n"
|
|
|
++ "ldp d8, d9, [x4,128]\n"
|
|
|
++ "ldp d10, d11, [x4,144]\n"
|
|
|
++ "ldp d12, d13, [x4,160]\n"
|
|
|
++ "ldp d14, d15, [x4,176]\n"
|
|
|
++ "mov sp, x5\n"
|
|
|
++ "ret \n"
|
|
|
+ :
|
|
|
+- : [x0] "m"(uc->uc_mcontext.regs[0]),
|
|
|
+- [x1] "m"(uc->uc_mcontext.regs[1]),
|
|
|
+- [x2] "m"(uc->uc_mcontext.regs[2]),
|
|
|
+- [x3] "m"(uc->uc_mcontext.regs[3]),
|
|
|
+- [x19] "m"(uc->uc_mcontext.regs[19]),
|
|
|
+- [x20] "m"(uc->uc_mcontext.regs[20]),
|
|
|
+- [x21] "m"(uc->uc_mcontext.regs[21]),
|
|
|
+- [x22] "m"(uc->uc_mcontext.regs[22]),
|
|
|
+- [x23] "m"(uc->uc_mcontext.regs[23]),
|
|
|
+- [x24] "m"(uc->uc_mcontext.regs[24]),
|
|
|
+- [x25] "m"(uc->uc_mcontext.regs[25]),
|
|
|
+- [x26] "m"(uc->uc_mcontext.regs[26]),
|
|
|
+- [x27] "m"(uc->uc_mcontext.regs[27]),
|
|
|
+- [x28] "m"(uc->uc_mcontext.regs[28]),
|
|
|
+- [x29] "m"(uc->uc_mcontext.regs[29]), /* FP */
|
|
|
+- [x30] "m"(uc->uc_mcontext.regs[30]), /* LR */
|
|
|
+- [d8] "m"(GET_FPCTX(uc)->vregs[8]),
|
|
|
+- [d9] "m"(GET_FPCTX(uc)->vregs[9]),
|
|
|
+- [d10] "m"(GET_FPCTX(uc)->vregs[10]),
|
|
|
+- [d11] "m"(GET_FPCTX(uc)->vregs[11]),
|
|
|
+- [d12] "m"(GET_FPCTX(uc)->vregs[12]),
|
|
|
+- [d13] "m"(GET_FPCTX(uc)->vregs[13]),
|
|
|
+- [d14] "m"(GET_FPCTX(uc)->vregs[14]),
|
|
|
+- [d15] "m"(GET_FPCTX(uc)->vregs[15]),
|
|
|
+- [sp] "m"(uc->uc_mcontext.sp)
|
|
|
+- : "x0", "x1", "x2", "x3", "x19", "x20", "x21", "x22", "x23", "x24",
|
|
|
+- "x25", "x26", "x27", "x28", "x29", "x30"
|
|
|
+- );
|
|
|
++ : "r" (regs),
|
|
|
++ "r" (sp),
|
|
|
++ "m" (*(struct regs_overlay *)regs)
|
|
|
++ );
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+@@ -143,7 +140,10 @@ aarch64_local_resume (unw_addr_space_t as, unw_cursor_t *cursor, void *arg)
|
|
|
+ );
|
|
|
+ }
|
|
|
+ unreachable();
|
|
|
++#else
|
|
|
++ printf ("%s: implement me\n", __FUNCTION__);
|
|
|
++#endif
|
|
|
+ return -UNW_EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+-#endif /* !UNW_REMOTE_ONLY */
|
|
|
++#endif /* !UNW_REMOTE_ONLY */
|
|
|
+\ No newline at end of file
|