X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Famd64obsd-tdep.c;h=94463180b488e8543054fd863a136cdebdbca490;hb=93ffa5b939aef24f7530a8a400f877bfb24f0a73;hp=1938bdd72793b4c3fea265a0d6bdd3abdcfaae43;hpb=e17a4113357102b55cfa5b80557d590a46a43300;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/amd64obsd-tdep.c b/gdb/amd64obsd-tdep.c index 1938bdd727..94463180b4 100644 --- a/gdb/amd64obsd-tdep.c +++ b/gdb/amd64obsd-tdep.c @@ -1,7 +1,6 @@ /* Target-dependent code for OpenBSD/amd64. - Copyright (C) 2003, 2004, 2005, 2007, 2008, 2009 - Free Software Foundation, Inc. + Copyright (C) 2003-2014 Free Software Foundation, Inc. This file is part of GDB. @@ -31,8 +30,9 @@ #include "trad-frame.h" #include "gdb_assert.h" -#include "gdb_string.h" +#include +#include "obsd-tdep.h" #include "amd64-tdep.h" #include "i387-tdep.h" #include "solib-svr4.h" @@ -88,15 +88,21 @@ amd64obsd_sigtramp_p (struct frame_info *this_frame) { CORE_ADDR pc = get_frame_pc (this_frame); CORE_ADDR start_pc = (pc & ~(amd64obsd_page_size - 1)); - const gdb_byte sigreturn[] = + const gdb_byte osigreturn[] = { 0x48, 0xc7, 0xc0, 0x67, 0x00, 0x00, 0x00, /* movq $SYS_sigreturn, %rax */ 0xcd, 0x80 /* int $0x80 */ }; + const gdb_byte sigreturn[] = + { + 0x48, 0xc7, 0xc0, + 0x67, 0x00, 0x00, 0x00, /* movq $SYS_sigreturn, %rax */ + 0x0f, 0x05 /* syscall */ + }; size_t buflen = (sizeof sigreturn) + 1; gdb_byte *buf; - char *name; + const char *name; /* If the function has a valid symbol name, it isn't a trampoline. */ @@ -116,9 +122,12 @@ amd64obsd_sigtramp_p (struct frame_info *this_frame) /* Check for sigreturn(2). Depending on how the assembler encoded the `movq %rsp, %rdi' instruction, the code starts at offset 6 or - 7. */ + 7. OpenBSD 5.0 and later use the `syscall' instruction. Older + versions use `int $0x80'. Check for both. */ if (memcmp (buf, sigreturn, sizeof sigreturn) - && memcpy (buf + 1, sigreturn, sizeof sigreturn)) + && memcmp (buf + 1, sigreturn, sizeof sigreturn) + && memcmp (buf, osigreturn, sizeof osigreturn) + && memcmp (buf + 1, osigreturn, sizeof osigreturn)) return 0; return 1; @@ -167,7 +176,7 @@ int amd64obsd_r_reg_offset[] = 0 * 8, /* %rdi */ 12 * 8, /* %rbp */ 15 * 8, /* %rsp */ - 4 * 8, /* %r8 .. */ + 4 * 8, /* %r8 .. */ 5 * 8, 6 * 8, 7 * 8, @@ -196,7 +205,7 @@ static int amd64obsd_sc_reg_offset[] = 0 * 8, /* %rdi */ 12 * 8, /* %rbp */ 24 * 8, /* %rsp */ - 4 * 8, /* %r8 ... */ + 4 * 8, /* %r8 ... */ 5 * 8, 6 * 8, 7 * 8, @@ -225,7 +234,7 @@ static int amd64obsd_uthread_reg_offset[] = 13 * 8, /* %rdi */ 15 * 8, /* %rbp */ -1, /* %rsp */ - 12 * 8, /* %r8 ... */ + 12 * 8, /* %r8 ... */ 11 * 8, 10 * 8, 9 * 8, @@ -352,7 +361,7 @@ amd64obsd_trapframe_cache (struct frame_info *this_frame, void **this_cache) struct trad_frame_cache *cache; CORE_ADDR func, sp, addr; ULONGEST cs; - char *name; + const char *name; int i; if (*this_cache) @@ -380,7 +389,7 @@ amd64obsd_trapframe_cache (struct frame_info *this_frame, void **this_cache) if ((cs & I386_SEL_RPL) == I386_SEL_UPL) { /* Trap from user space; terminate backtrace. */ - trad_frame_set_id (cache, null_frame_id); + trad_frame_set_id (cache, outer_frame_id); } else { @@ -417,7 +426,7 @@ amd64obsd_trapframe_sniffer (const struct frame_unwind *self, void **this_prologue_cache) { ULONGEST cs; - char *name; + const char *name; /* Check Current Privilege Level and bail out if we're not executing in kernel space. */ @@ -437,6 +446,7 @@ static const struct frame_unwind amd64obsd_trapframe_unwind = { frame, but SIGTRAMP_FRAME would print , which really is not what we want here. */ NORMAL_FRAME, + default_frame_unwind_stop_reason, amd64obsd_trapframe_this_id, amd64obsd_trapframe_prev_register, NULL, @@ -450,15 +460,13 @@ amd64obsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); amd64_init_abi (info, gdbarch); + obsd_init_abi (info, gdbarch); /* Initialize general-purpose register set details. */ tdep->gregset_reg_offset = amd64obsd_r_reg_offset; tdep->gregset_num_regs = ARRAY_SIZE (amd64obsd_r_reg_offset); tdep->sizeof_gregset = 24 * 8; - set_gdbarch_regset_from_core_section (gdbarch, - amd64obsd_regset_from_core_section); - tdep->jb_pc_offset = 7 * 8; tdep->sigtramp_p = amd64obsd_sigtramp_p; @@ -477,6 +485,17 @@ amd64obsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) /* Unwind kernel trap frames correctly. */ frame_unwind_prepend_unwinder (gdbarch, &amd64obsd_trapframe_unwind); } + +/* Traditional (a.out) NetBSD-style core dumps. */ + +static void +amd64obsd_core_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) +{ + amd64obsd_init_abi (info, gdbarch); + + set_gdbarch_regset_from_core_section + (gdbarch, amd64obsd_regset_from_core_section); +} /* Provide a prototype to silence -Wmissing-prototypes. */ @@ -493,5 +512,5 @@ _initialize_amd64obsd_tdep (void) /* OpenBSD uses traditional (a.out) NetBSD-style core dumps. */ gdbarch_register_osabi (bfd_arch_i386, bfd_mach_x86_64, - GDB_OSABI_NETBSD_AOUT, amd64obsd_init_abi); + GDB_OSABI_NETBSD_AOUT, amd64obsd_core_init_abi); }