X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Famd64bsd-nat.c;h=1cd9207486dff89b3193148581b1b40d26d4afe7;hb=fc16f8cc9b44c198b6f753e4f39ad2334502893f;hp=7eb2b4d7ca1413ef7a251f70b307b91b8978582c;hpb=f8028488ab18db040894f2e616282d8bbb4aed1f;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/amd64bsd-nat.c b/gdb/amd64bsd-nat.c index 7eb2b4d7ca..1cd9207486 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, 2008 Free Software Foundation, Inc. + Copyright (C) 2003-2013 Free Software Foundation, Inc. This file is part of GDB. @@ -32,6 +32,7 @@ #include "amd64-tdep.h" #include "amd64-nat.h" +#include "amd64bsd-nat.h" #include "inf-ptrace.h" @@ -39,7 +40,8 @@ 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) { struct gdbarch *gdbarch = get_regcache_arch (regcache); @@ -72,7 +74,8 @@ 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) { struct gdbarch *gdbarch = get_regcache_arch (regcache); @@ -123,3 +126,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, PIDGET (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, PIDGET (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, PIDGET (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 */