/* Target-dependent code for FreeBSD/amd64.
- Copyright 2003 Free Software Foundation, Inc.
+
+ Copyright 2003, 2004 Free Software Foundation, Inc.
This file is part of GDB.
#include "gdb_string.h"
-#include "x86-64-tdep.h"
+#include "amd64-tdep.h"
+#include "solib-svr4.h"
/* Support for signal handlers. */
static CORE_ADDR
amd64fbsd_sigcontext_addr (struct frame_info *next_frame)
{
- char buf[8];
CORE_ADDR sp;
- frame_unwind_register (next_frame, X86_64_RSP_REGNUM, buf);
- sp = extract_unsigned_integer (buf, 8);
-
- return read_memory_unsigned_integer (sp + 16, 8);
+ /* The `struct sigcontext' (which really is an `ucontext_t' on
+ FreeBSD/amd64) lives at a fixed offset in the signal frame. See
+ <machine/sigframe.h>. */
+ sp = frame_unwind_register_unsigned (next_frame, AMD64_RSP_REGNUM);
+ return sp + 16;
}
\f
/* FreeBSD 5.1-RELEASE or later. */
+/* Mapping between the general-purpose registers in `struct reg'
+ format and GDB's register cache layout.
+
+ Note that some registers are 32-bit, but since we're little-endian
+ we get away with that. */
+
+/* From <machine/reg.h>. */
+static int amd64fbsd_r_reg_offset[] =
+{
+ 14 * 8, /* %rax */
+ 11 * 8, /* %rbx */
+ 13 * 8, /* %rcx */
+ 12 * 8, /* %rdx */
+ 9 * 8, /* %rsi */
+ 8 * 8, /* %rdi */
+ 10 * 8, /* %rbp */
+ 20 * 8, /* %rsp */
+ 7 * 8, /* %r8 ... */
+ 6 * 8,
+ 5 * 8,
+ 4 * 8,
+ 3 * 8,
+ 2 * 8,
+ 1 * 8,
+ 0 * 8, /* ... %r15 */
+ 17 * 8, /* %rip */
+ 19 * 8, /* %eflags */
+ 18 * 8, /* %cs */
+ 21 * 8, /* %ss */
+ -1, /* %ds */
+ -1, /* %es */
+ -1, /* %fs */
+ -1 /* %gs */
+};
+
/* Location of the signal trampoline. */
-CORE_ADDR amd64fbsd_sigtramp_start = 0x7fffffffc0;
-CORE_ADDR amd64fbsd_sigtramp_end = 0x7fffffffe0;
+CORE_ADDR amd64fbsd_sigtramp_start_addr = 0x7fffffffffc0;
+CORE_ADDR amd64fbsd_sigtramp_end_addr = 0x7fffffffffe0;
/* From <machine/signal.h>. */
-int amd64fbsd_sc_reg_offset[X86_64_NUM_GREGS] =
+int amd64fbsd_sc_reg_offset[] =
{
- 24 + 14 * 8, /* %rax */
- 24 + 11 * 8, /* %rbx */
- 24 + 13 * 8, /* %rcx */
- 24 + 12 * 8, /* %rdx */
- 24 + 9 * 8, /* %rsi */
- 24 + 8 * 8, /* %rdi */
- 24 + 10 * 8, /* %rbp */
- 24 + 20 * 8, /* %rsp */
- 24 + 7 * 8, /* %r8 */
- 24 + 6 * 8, /* %r9 */
- 24 + 5 * 8, /* %r10 */
- 24 + 4 * 8, /* %r11 */
- 24 + 3 * 8, /* %r12 */
- 24 + 2 * 8, /* %r13 */
- 24 + 1 * 8, /* %r14 */
- 24 + 0 * 8, /* %r15 */
- 24 + 17 * 8, /* %rip */
- 24 + 19 * 8, /* %eflags */
+ 24 + 6 * 8, /* %rax */
+ 24 + 7 * 8, /* %rbx */
+ 24 + 3 * 8, /* %rcx */
+ 24 + 2 * 8, /* %rdx */
+ 24 + 1 * 8, /* %rsi */
+ 24 + 0 * 8, /* %rdi */
+ 24 + 8 * 8, /* %rbp */
+ 24 + 22 * 8, /* %rsp */
+ 24 + 4 * 8, /* %r8 ... */
+ 24 + 5 * 8,
+ 24 + 9 * 8,
+ 24 + 10 * 8,
+ 24 + 11 * 8,
+ 24 + 12 * 8,
+ 24 + 13 * 8,
+ 24 + 14 * 8, /* ... %r15 */
+ 24 + 19 * 8, /* %rip */
+ 24 + 21 * 8, /* %eflags */
+ 24 + 20 * 8, /* %cs */
+ 24 + 23 * 8, /* %ss */
-1, /* %ds */
-1, /* %es */
-1, /* %fs */
/* Obviously FreeBSD is BSD-based. */
i386bsd_init_abi (info, gdbarch);
- x86_64_init_abi (info, gdbarch);
+ tdep->gregset_reg_offset = amd64fbsd_r_reg_offset;
+ tdep->gregset_num_regs = ARRAY_SIZE (amd64fbsd_r_reg_offset);
+ tdep->sizeof_gregset = 22 * 8;
+
+ amd64_init_abi (info, gdbarch);
- tdep->sigtramp_start = amd64fbsd_sigtramp_start;
- tdep->sigtramp_end = amd64fbsd_sigtramp_start;
+ tdep->sigtramp_start = amd64fbsd_sigtramp_start_addr;
+ tdep->sigtramp_end = amd64fbsd_sigtramp_end_addr;
tdep->sigcontext_addr = amd64fbsd_sigcontext_addr;
tdep->sc_reg_offset = amd64fbsd_sc_reg_offset;
- tdep->sc_num_regs = X86_64_NUM_GREGS;
+ tdep->sc_num_regs = ARRAY_SIZE (amd64fbsd_sc_reg_offset);
+
+ /* FreeBSD uses SVR4-style shared libraries. */
+ set_solib_svr4_fetch_link_map_offsets
+ (gdbarch, svr4_lp64_fetch_link_map_offsets);
}
\f