fix-arm64.patch 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. diff --git a/src/aarch64/Gos-linux.c b/src/aarch64/Gos-linux.c
  2. index 7cd8c87..b750180 100644
  3. --- a/src/aarch64/Gos-linux.c
  4. +++ b/src/aarch64/Gos-linux.c
  5. @@ -28,73 +28,70 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
  6. #ifndef UNW_REMOTE_ONLY
  7. -HIDDEN int
  8. +HIDDEN inline int
  9. aarch64_local_resume (unw_addr_space_t as, unw_cursor_t *cursor, void *arg)
  10. {
  11. +#ifdef __linux__
  12. struct cursor *c = (struct cursor *) cursor;
  13. - unw_context_t *uc = c->uc;
  14. + unw_tdep_context_t *uc = c->uc;
  15. if (c->sigcontext_format == AARCH64_SCF_NONE)
  16. {
  17. /* Since there are no signals involved here we restore EH and non scratch
  18. registers only. */
  19. + unsigned long regs[24];
  20. + regs[0] = uc->uc_mcontext.regs[0];
  21. + regs[1] = uc->uc_mcontext.regs[1];
  22. + regs[2] = uc->uc_mcontext.regs[2];
  23. + regs[3] = uc->uc_mcontext.regs[3];
  24. + regs[4] = uc->uc_mcontext.regs[19];
  25. + regs[5] = uc->uc_mcontext.regs[20];
  26. + regs[6] = uc->uc_mcontext.regs[21];
  27. + regs[7] = uc->uc_mcontext.regs[22];
  28. + regs[8] = uc->uc_mcontext.regs[23];
  29. + regs[9] = uc->uc_mcontext.regs[24];
  30. + regs[10] = uc->uc_mcontext.regs[25];
  31. + regs[11] = uc->uc_mcontext.regs[26];
  32. + regs[12] = uc->uc_mcontext.regs[27];
  33. + regs[13] = uc->uc_mcontext.regs[28];
  34. + regs[14] = uc->uc_mcontext.regs[29]; /* FP */
  35. + regs[15] = uc->uc_mcontext.regs[30]; /* LR */
  36. + regs[16] = GET_FPCTX(uc)->vregs[8];
  37. + regs[17] = GET_FPCTX(uc)->vregs[9];
  38. + regs[18] = GET_FPCTX(uc)->vregs[10];
  39. + regs[19] = GET_FPCTX(uc)->vregs[11];
  40. + regs[20] = GET_FPCTX(uc)->vregs[12];
  41. + regs[21] = GET_FPCTX(uc)->vregs[13];
  42. + regs[22] = GET_FPCTX(uc)->vregs[14];
  43. + regs[23] = GET_FPCTX(uc)->vregs[15];
  44. + unsigned long sp = uc->uc_mcontext.sp;
  45. +
  46. + struct regs_overlay {
  47. + char x[sizeof(regs)];
  48. + };
  49. +
  50. __asm__ __volatile__ (
  51. - "ldr x0, %[x0]\n\t"
  52. - "ldr x1, %[x1]\n\t"
  53. - "ldr x2, %[x2]\n\t"
  54. - "ldr x3, %[x3]\n\t"
  55. - "ldr x19, %[x19]\n\t"
  56. - "ldr x20, %[x20]\n\t"
  57. - "ldr x21, %[x21]\n\t"
  58. - "ldr x22, %[x22]\n\t"
  59. - "ldr x23, %[x23]\n\t"
  60. - "ldr x24, %[x24]\n\t"
  61. - "ldr x25, %[x25]\n\t"
  62. - "ldr x26, %[x26]\n\t"
  63. - "ldr x27, %[x27]\n\t"
  64. - "ldr x28, %[x28]\n\t"
  65. - "ldr x29, %[x29]\n\t"
  66. - "ldr x30, %[x30]\n\t"
  67. - "ldr d8, %[d8]\n\t"
  68. - "ldr d9, %[d9]\n\t"
  69. - "ldr d10, %[d10]\n\t"
  70. - "ldr d11, %[d11]\n\t"
  71. - "ldr d12, %[d12]\n\t"
  72. - "ldr d13, %[d13]\n\t"
  73. - "ldr d14, %[d14]\n\t"
  74. - "ldr d15, %[d15]\n\t"
  75. - "ldr x5, %[sp]\n\t"
  76. - "mov sp, x5\n\t"
  77. - "ret\n"
  78. + "mov x4, %0\n"
  79. + "mov x5, %1\n"
  80. + "ldp x0, x1, [x4]\n"
  81. + "ldp x2, x3, [x4,16]\n"
  82. + "ldp x19, x20, [x4,32]\n"
  83. + "ldp x21, x22, [x4,48]\n"
  84. + "ldp x23, x24, [x4,64]\n"
  85. + "ldp x25, x26, [x4,80]\n"
  86. + "ldp x27, x28, [x4,96]\n"
  87. + "ldp x29, x30, [x4,112]\n"
  88. + "ldp d8, d9, [x4,128]\n"
  89. + "ldp d10, d11, [x4,144]\n"
  90. + "ldp d12, d13, [x4,160]\n"
  91. + "ldp d14, d15, [x4,176]\n"
  92. + "mov sp, x5\n"
  93. + "ret \n"
  94. :
  95. - : [x0] "m"(uc->uc_mcontext.regs[0]),
  96. - [x1] "m"(uc->uc_mcontext.regs[1]),
  97. - [x2] "m"(uc->uc_mcontext.regs[2]),
  98. - [x3] "m"(uc->uc_mcontext.regs[3]),
  99. - [x19] "m"(uc->uc_mcontext.regs[19]),
  100. - [x20] "m"(uc->uc_mcontext.regs[20]),
  101. - [x21] "m"(uc->uc_mcontext.regs[21]),
  102. - [x22] "m"(uc->uc_mcontext.regs[22]),
  103. - [x23] "m"(uc->uc_mcontext.regs[23]),
  104. - [x24] "m"(uc->uc_mcontext.regs[24]),
  105. - [x25] "m"(uc->uc_mcontext.regs[25]),
  106. - [x26] "m"(uc->uc_mcontext.regs[26]),
  107. - [x27] "m"(uc->uc_mcontext.regs[27]),
  108. - [x28] "m"(uc->uc_mcontext.regs[28]),
  109. - [x29] "m"(uc->uc_mcontext.regs[29]), /* FP */
  110. - [x30] "m"(uc->uc_mcontext.regs[30]), /* LR */
  111. - [d8] "m"(GET_FPCTX(uc)->vregs[8]),
  112. - [d9] "m"(GET_FPCTX(uc)->vregs[9]),
  113. - [d10] "m"(GET_FPCTX(uc)->vregs[10]),
  114. - [d11] "m"(GET_FPCTX(uc)->vregs[11]),
  115. - [d12] "m"(GET_FPCTX(uc)->vregs[12]),
  116. - [d13] "m"(GET_FPCTX(uc)->vregs[13]),
  117. - [d14] "m"(GET_FPCTX(uc)->vregs[14]),
  118. - [d15] "m"(GET_FPCTX(uc)->vregs[15]),
  119. - [sp] "m"(uc->uc_mcontext.sp)
  120. - : "x0", "x1", "x2", "x3", "x19", "x20", "x21", "x22", "x23", "x24",
  121. - "x25", "x26", "x27", "x28", "x29", "x30"
  122. - );
  123. + : "r" (regs),
  124. + "r" (sp),
  125. + "m" (*(struct regs_overlay *)regs)
  126. + );
  127. }
  128. else
  129. {
  130. @@ -143,7 +140,10 @@ aarch64_local_resume (unw_addr_space_t as, unw_cursor_t *cursor, void *arg)
  131. );
  132. }
  133. unreachable();
  134. +#else
  135. + printf ("%s: implement me\n", __FUNCTION__);
  136. +#endif
  137. return -UNW_EINVAL;
  138. }
  139. -#endif /* !UNW_REMOTE_ONLY */
  140. +#endif /* !UNW_REMOTE_ONLY */
  141. \ No newline at end of file