libunwind-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Libunwind-devel] [PATCH 2/3] Adjust use_prev_instr for syscall and fram


From: Konstantin Belousov
Subject: [Libunwind-devel] [PATCH 2/3] Adjust use_prev_instr for syscall and frame-chain frames.
Date: Sat, 28 Jun 2014 23:28:09 +0300

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 aafdfc9..284148c 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 0965db2..fb1d6a2 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 71695c6..776c54b 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 809d60b..c019e45 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;

reply via email to

[Prev in Thread] Current Thread [Next in Thread]