| Index: gdb/amd64bsd-nat.c
|
| diff --git a/gdb/amd64bsd-nat.c b/gdb/amd64bsd-nat.c
|
| index b7283e9f614dafd2c9c03643e38ab97de79bae48..83e7ec2429de7a6ee0da6f1d6d6a83d4f78fea2a 100644
|
| --- a/gdb/amd64bsd-nat.c
|
| +++ b/gdb/amd64bsd-nat.c
|
| @@ -32,6 +32,7 @@
|
|
|
| #include "amd64-tdep.h"
|
| #include "amd64-nat.h"
|
| +#include "amd64bsd-nat.h"
|
| #include "inf-ptrace.h"
|
|
|
|
|
| @@ -125,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 */
|
|
|