1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- --- 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
|