summaryrefslogtreecommitdiff
path: root/package/libunwind/patches/patch-src_x86_Gos-linux_c
blob: f5f3e53c593fe922a92be10b1b2c5e62e55d8e80 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
--- 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 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);
-    }
-  else
-    {
-      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