From 37235110037eed93c1b646995c7fe96d4e31a9a4 Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Sat, 28 Jun 2014 23:28:09 +0300 Subject: [PATCH] Adjust use_prev_instr for syscall and frame-chain frames. Mark frames which are unwound with the frame-chain walker or syscall frame code, as non-interrupted. The return PC in the frame points to the instruction after the call. --- src/x86/Gos-freebsd.c | 1 + src/x86/Gstep.c | 1 + src/x86_64/Gos-freebsd.c | 1 + src/x86_64/Gstep.c | 1 + 4 files changed, 4 insertions(+) diff --git a/src/x86/Gos-freebsd.c b/src/x86/Gos-freebsd.c index aafdfc9c..284148c2 100644 --- a/src/x86/Gos-freebsd.c +++ b/src/x86/Gos-freebsd.c @@ -140,6 +140,7 @@ unw_handle_signal_frame (unw_cursor_t *cursor) c->dwarf.loc[EIP] = DWARF_LOC (c->dwarf.cfa, 0); c->dwarf.loc[EAX] = DWARF_NULL_LOC; c->dwarf.cfa += 4; + c->dwarf.use_prev_instr = 1; } else { Debug (8, "Gstep: not handling frame format %d\n", c->sigcontext_format); abort(); diff --git a/src/x86/Gstep.c b/src/x86/Gstep.c index 0965db2f..fb1d6a26 100644 --- a/src/x86/Gstep.c +++ b/src/x86/Gstep.c @@ -88,6 +88,7 @@ unw_step (unw_cursor_t *cursor) c->dwarf.loc[EBP] = ebp_loc; c->dwarf.loc[EIP] = eip_loc; + c->dwarf.use_prev_instr = 1; } c->dwarf.ret_addr_column = EIP; diff --git a/src/x86_64/Gos-freebsd.c b/src/x86_64/Gos-freebsd.c index 71695c65..776c54b9 100644 --- a/src/x86_64/Gos-freebsd.c +++ b/src/x86_64/Gos-freebsd.c @@ -144,6 +144,7 @@ unw_handle_signal_frame (unw_cursor_t *cursor) return ret; } c->dwarf.cfa += 8; + c->dwarf.use_prev_instr = 1; return 1; } else diff --git a/src/x86_64/Gstep.c b/src/x86_64/Gstep.c index 809d60b0..c019e453 100644 --- a/src/x86_64/Gstep.c +++ b/src/x86_64/Gstep.c @@ -194,6 +194,7 @@ unw_step (unw_cursor_t *cursor) c->dwarf.loc[RBP] = rbp_loc; c->dwarf.loc[RSP] = rsp_loc; c->dwarf.loc[RIP] = rip_loc; + c->dwarf.use_prev_instr = 1; } c->dwarf.ret_addr_column = RIP;