2004-04-10 Mark Kettenis <kettenis@gnu.org>
+ * amd64nbsd-tdep.c (amd64nbsd_sigcontext_addr): Remove function.
+ (amd64nbsd_mcontext_addr): New function.
+ (amd64nbsd_init_abi): Initialize TDEP->sigcontext_addr as
+ amd64nbsd_mcontext_addr. Directly initialize TDEP->sc_reg_offset
+ with amd64nbsd_r_reg_offset, instead of building it on the fly.
+
* corelow.c (core_xfer_partial): Fix coding standards violation.
Add support for TARGET_OBJECT_WCOOKIE.
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;
}
\f
/* NetBSD 2.0 or later. */
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;
/* 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