summaryrefslogtreecommitdiff
path: root/package/libunwind/patches/patch-src_x86_Gos-linux_c
diff options
context:
space:
mode:
Diffstat (limited to 'package/libunwind/patches/patch-src_x86_Gos-linux_c')
-rw-r--r--package/libunwind/patches/patch-src_x86_Gos-linux_c39
1 files changed, 31 insertions, 8 deletions
diff --git a/package/libunwind/patches/patch-src_x86_Gos-linux_c b/package/libunwind/patches/patch-src_x86_Gos-linux_c
index ecce53e4d..f5f3e53c5 100644
--- a/package/libunwind/patches/patch-src_x86_Gos-linux_c
+++ b/package/libunwind/patches/patch-src_x86_Gos-linux_c
@@ -1,14 +1,31 @@
--- libunwind-1.2.orig/src/x86/Gos-linux.c 2016-11-18 04:28:29.000000000 +0100
-+++ libunwind-1.2/src/x86/Gos-linux.c 2017-04-17 16:59:08.339188080 +0200
-@@ -290,19 +290,8 @@ x86_local_resume (unw_addr_space_t as, u
- because the frame-chain still would let us do a backtrace at
- least. */
- dwarf_make_proc_info (&c->dwarf);
++++ libunwind-1.2/src/x86/Gos-linux.c 2017-04-17 18:57:50.832552016 +0200
+@@ -26,6 +26,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DE
+ #include "unwind_i.h"
+ #include "offsets.h"
+
++#include <sys/syscall.h>
++
+ PROTECTED int
+ unw_is_signal_frame (unw_cursor_t *cursor)
+ {
+@@ -283,26 +285,16 @@ HIDDEN int
+ x86_local_resume (unw_addr_space_t as, unw_cursor_t *cursor, void *arg)
+ {
+ struct cursor *c = (struct cursor *) cursor;
+- ucontext_t *uc = c->uc;
+-
+- /* Ensure c->pi is up-to-date. On x86, it's relatively common to be
+- missing DWARF unwind info. We don't want to fail in that case,
+- because the frame-chain still would let us do a backtrace at
+- least. */
+- dwarf_make_proc_info (&c->dwarf);
-
- if (unlikely (c->sigcontext_format != X86_SCF_NONE))
- {
- struct sigcontext *sc = (struct sigcontext *) c->sigcontext_addr;
--
++ struct sigcontext *sc = (struct sigcontext *) c->sigcontext_addr;
+
- Debug (8, "resuming at ip=%x via sigreturn(%p)\n", c->dwarf.ip, sc);
- sigreturn (sc);
- }
@@ -17,8 +34,14 @@
- Debug (8, "resuming at ip=%x via setcontext()\n", c->dwarf.ip);
- setcontext (uc);
- }
-+ Debug (8, "resuming at ip=%x via setcontext()\n", c->dwarf.ip);
-+ setcontext (uc);
++ Debug (8, "resuming at ip=%llx via sigreturn(%p)\n",
++ (unsigned long long) c->dwarf.ip, sc);
++ __asm__ __volatile__ (
++ "int $0x80"
++ : "=r" (sc)
++ : "0"(SYS_rt_sigreturn)
++ : "memory"
++ );
return -UNW_EINVAL;
}
#endif