aboutsummaryrefslogtreecommitdiff
path: root/gdb/amd64nbsd-tdep.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/amd64nbsd-tdep.c')
-rw-r--r--gdb/amd64nbsd-tdep.c35
1 files changed, 12 insertions, 23 deletions
diff --git a/gdb/amd64nbsd-tdep.c b/gdb/amd64nbsd-tdep.c
index cc90aee..ffa9110 100644
--- a/gdb/amd64nbsd-tdep.c
+++ b/gdb/amd64nbsd-tdep.c
@@ -47,18 +47,21 @@ amd64nbsd_sigtramp_p (struct frame_info *next_frame)
return nbsd_pc_in_sigtramp (pc, name);
}
-/* Assuming NEXT_FRAME is for a frame following a BSD sigtramp
- routine, return the address of the associated sigcontext structure. */
+/* Assuming NEXT_FRAME is preceded by a frame corresponding to a
+ NetBSD sigtramp routine, return the address of the associated
+ mcontext structure. */
static CORE_ADDR
-amd64nbsd_sigcontext_addr (struct frame_info *next_frame)
+amd64nbsd_mcontext_addr (struct frame_info *next_frame)
{
- CORE_ADDR sp;
+ CORE_ADDR addr;
- /* The stack pointer points at `struct sigcontext' upon entry of a
+ /* The register %r15 points at `struct ucontext' upon entry of a
signal trampoline. */
- sp = frame_unwind_register_unsigned (next_frame, AMD64_RSP_REGNUM);
- return sp;
+ addr = frame_unwind_register_unsigned (next_frame, AMD64_R15_REGNUM);
+
+ /* The mcontext structure lives as offset 56 in `struct ucontext'. */
+ return addr + 56;
}
/* NetBSD 2.0 or later. */
@@ -99,8 +102,6 @@ static void
amd64nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
- int *sc_reg_offset;
- int i;
/* Initialize general-purpose register set details first. */
tdep->gregset_reg_offset = amd64nbsd_r_reg_offset;
@@ -113,21 +114,9 @@ amd64nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
/* NetBSD has its own convention for signal trampolines. */
tdep->sigtramp_p = amd64nbsd_sigtramp_p;
- tdep->sigcontext_addr = amd64nbsd_sigcontext_addr;
-
- /* Initialize the array with register offsets in `struct
- sigcontext'. This `struct sigcontext' has an sc_mcontext member
- at offset 32, and in <machine/reg.h> we have an explicit comment
- saying that `struct reg' is the same as mcontext.__gregs. */
+ tdep->sigcontext_addr = amd64nbsd_mcontext_addr;
+ tdep->sc_reg_offset = amd64nbsd_r_reg_offset;
tdep->sc_num_regs = ARRAY_SIZE (amd64nbsd_r_reg_offset);
- tdep->sc_reg_offset = XCALLOC (tdep->sc_num_regs, int);
- for (i = 0; i < tdep->sc_num_regs; i++)
- {
- if (amd64nbsd_r_reg_offset[i] < 0)
- tdep->sc_reg_offset[i] = -1;
- else
- tdep->sc_reg_offset[i] = 32 + amd64nbsd_r_reg_offset[i];
- }
/* NetBSD uses SVR4-style shared libraries. */
set_solib_svr4_fetch_link_map_offsets