X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gdb%2Famd64bsd-nat.c;h=f994ec4e95f13ab83edda7ca13998c5d49dc6ff0;hb=b16f7544121b8d4f0f98e0ff121aabe8a1509b93;hp=c06c5bfa2060d1b199287d089564587d84e063d3;hpb=a9762ec78a53fbe9209fe1654db42df0cd328d50;p=platform%2Fupstream%2Fbinutils.git diff --git a/gdb/amd64bsd-nat.c b/gdb/amd64bsd-nat.c index c06c5bf..f994ec4 100644 --- a/gdb/amd64bsd-nat.c +++ b/gdb/amd64bsd-nat.c @@ -1,6 +1,6 @@ /* Native-dependent code for AMD64 BSD's. - Copyright (C) 2003, 2004, 2007 Free Software Foundation, Inc. + Copyright (C) 2003-2014 Free Software Foundation, Inc. This file is part of GDB. @@ -24,7 +24,6 @@ /* We include to make sure `struct fxsave64' is defined on NetBSD, since NetBSD's needs it. */ -#include "gdb_assert.h" #include #include #include @@ -32,6 +31,7 @@ #include "amd64-tdep.h" #include "amd64-nat.h" +#include "amd64bsd-nat.h" #include "inf-ptrace.h" @@ -39,13 +39,16 @@ for all registers (including the floating-point registers). */ static void -amd64bsd_fetch_inferior_registers (struct regcache *regcache, int regnum) +amd64bsd_fetch_inferior_registers (struct target_ops *ops, + struct regcache *regcache, int regnum) { - if (regnum == -1 || amd64_native_gregset_supplies_p (regnum)) + struct gdbarch *gdbarch = get_regcache_arch (regcache); + + if (regnum == -1 || amd64_native_gregset_supplies_p (gdbarch, regnum)) { struct reg regs; - if (ptrace (PT_GETREGS, PIDGET (inferior_ptid), + if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid), (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't get registers")); @@ -54,11 +57,11 @@ amd64bsd_fetch_inferior_registers (struct regcache *regcache, int regnum) return; } - if (regnum == -1 || !amd64_native_gregset_supplies_p (regnum)) + if (regnum == -1 || !amd64_native_gregset_supplies_p (gdbarch, regnum)) { struct fpreg fpregs; - if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid), + if (ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) perror_with_name (_("Couldn't get floating point status")); @@ -70,19 +73,22 @@ amd64bsd_fetch_inferior_registers (struct regcache *regcache, int regnum) this for all registers (including the floating-point registers). */ static void -amd64bsd_store_inferior_registers (struct regcache *regcache, int regnum) +amd64bsd_store_inferior_registers (struct target_ops *ops, + struct regcache *regcache, int regnum) { - if (regnum == -1 || amd64_native_gregset_supplies_p (regnum)) + struct gdbarch *gdbarch = get_regcache_arch (regcache); + + if (regnum == -1 || amd64_native_gregset_supplies_p (gdbarch, regnum)) { struct reg regs; - if (ptrace (PT_GETREGS, PIDGET (inferior_ptid), + if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid), (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't get registers")); amd64_collect_native_gregset (regcache, ®s, regnum); - if (ptrace (PT_SETREGS, PIDGET (inferior_ptid), + if (ptrace (PT_SETREGS, ptid_get_pid (inferior_ptid), (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't write registers")); @@ -90,17 +96,17 @@ amd64bsd_store_inferior_registers (struct regcache *regcache, int regnum) return; } - if (regnum == -1 || !amd64_native_gregset_supplies_p (regnum)) + if (regnum == -1 || !amd64_native_gregset_supplies_p (gdbarch, regnum)) { struct fpreg fpregs; - if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid), + if (ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) perror_with_name (_("Couldn't get floating point status")); amd64_collect_fxsave (regcache, regnum, &fpregs); - if (ptrace (PT_SETFPREGS, PIDGET (inferior_ptid), + if (ptrace (PT_SETFPREGS, ptid_get_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) perror_with_name (_("Couldn't write floating point status")); } @@ -119,3 +125,75 @@ amd64bsd_target (void) t->to_store_registers = amd64bsd_store_inferior_registers; return t; } + + +/* Support for debug registers. */ + +#ifdef HAVE_PT_GETDBREGS + +static unsigned long +amd64bsd_dr_get (ptid_t ptid, int regnum) +{ + struct dbreg dbregs; + + if (ptrace (PT_GETDBREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) &dbregs, 0) == -1) + perror_with_name (_("Couldn't read debug registers")); + + return DBREG_DRX ((&dbregs), regnum); +} + +static void +amd64bsd_dr_set (int regnum, unsigned long value) +{ + struct dbreg dbregs; + + if (ptrace (PT_GETDBREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) &dbregs, 0) == -1) + perror_with_name (_("Couldn't get debug registers")); + + /* For some mysterious reason, some of the reserved bits in the + debug control register get set. Mask these off, otherwise the + ptrace call below will fail. */ + DBREG_DRX ((&dbregs), 7) &= ~(0xffffffff0000fc00); + + DBREG_DRX ((&dbregs), regnum) = value; + + if (ptrace (PT_SETDBREGS, ptid_get_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) &dbregs, 0) == -1) + perror_with_name (_("Couldn't write debug registers")); +} + +void +amd64bsd_dr_set_control (unsigned long control) +{ + amd64bsd_dr_set (7, control); +} + +void +amd64bsd_dr_set_addr (int regnum, CORE_ADDR addr) +{ + gdb_assert (regnum >= 0 && regnum <= 4); + + amd64bsd_dr_set (regnum, addr); +} + +CORE_ADDR +amd64bsd_dr_get_addr (int regnum) +{ + return amd64bsd_dr_get (inferior_ptid, regnum); +} + +unsigned long +amd64bsd_dr_get_status (void) +{ + return amd64bsd_dr_get (inferior_ptid, 6); +} + +unsigned long +amd64bsd_dr_get_control (void) +{ + return amd64bsd_dr_get (inferior_ptid, 7); +} + +#endif /* PT_GETDBREGS */