X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;ds=sidebyside;f=gdb%2Fi386bsd-nat.c;h=b6b143b6227032e8f3a25be3d0f6e9ef32fd204a;hb=f515a1d643b599ebb8a23d3d95e9f0dfc8261a11;hp=8dc2713411dfc5bb100ef9365d4850f69f90049c;hpb=56be38147cbe5a85a4d2d4d9cf402696826a4392;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/i386bsd-nat.c b/gdb/i386bsd-nat.c index 8dc2713411..b6b143b622 100644 --- a/gdb/i386bsd-nat.c +++ b/gdb/i386bsd-nat.c @@ -1,13 +1,12 @@ /* Native-dependent code for modern i386 BSD's. - Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2007 - Free Software Foundation, Inc. + Copyright (C) 2000-2016 Free Software Foundation, Inc. This file is part of GDB. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -16,17 +15,13 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. */ + along with this program. If not, see . */ #include "defs.h" #include "inferior.h" #include "regcache.h" -#include "gdb_assert.h" #include -#include #include #include #include @@ -34,6 +29,7 @@ #include "i386-tdep.h" #include "i387-tdep.h" +#include "x86bsd-nat.h" #include "i386bsd-nat.h" #include "inf-ptrace.h" @@ -93,7 +89,7 @@ static int have_ptrace_xmmregs = -1; static void i386bsd_supply_gregset (struct regcache *regcache, const void *gregs) { - const char *regs = gregs; + const char *regs = (const char *) gregs; int regnum; for (regnum = 0; regnum < ARRAY_SIZE (i386bsd_r_reg_offset); regnum++) @@ -113,7 +109,7 @@ static void i386bsd_collect_gregset (const struct regcache *regcache, void *gregs, int regnum) { - char *regs = gregs; + char *regs = (char *) gregs; int i; for (i = 0; i < ARRAY_SIZE (i386bsd_r_reg_offset); i++) @@ -132,13 +128,14 @@ i386bsd_collect_gregset (const struct regcache *regcache, for all registers (including the floating point registers). */ static void -i386bsd_fetch_inferior_registers (struct regcache *regcache, int regnum) +i386bsd_fetch_inferior_registers (struct target_ops *ops, + struct regcache *regcache, int regnum) { if (regnum == -1 || GETREGS_SUPPLIES (regnum)) { struct reg regs; - if (ptrace (PT_GETREGS, PIDGET (inferior_ptid), + if (ptrace (PT_GETREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't get registers")); @@ -152,9 +149,26 @@ i386bsd_fetch_inferior_registers (struct regcache *regcache, int regnum) struct fpreg fpregs; #ifdef HAVE_PT_GETXMMREGS char xmmregs[512]; +#endif + +#ifdef PT_GETXSTATE_INFO + if (x86bsd_xsave_len != 0) + { + void *xstateregs; + + xstateregs = alloca (x86bsd_xsave_len); + if (ptrace (PT_GETXSTATE, get_ptrace_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) xstateregs, 0) == -1) + perror_with_name (_("Couldn't get extended state status")); + i387_supply_xsave (regcache, -1, xstateregs); + return; + } +#endif + +#ifdef HAVE_PT_GETXMMREGS if (have_ptrace_xmmregs != 0 - && ptrace(PT_GETXMMREGS, PIDGET (inferior_ptid), + && ptrace(PT_GETXMMREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) xmmregs, 0) == 0) { have_ptrace_xmmregs = 1; @@ -162,18 +176,15 @@ i386bsd_fetch_inferior_registers (struct regcache *regcache, int regnum) } else { - if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid), + have_ptrace_xmmregs = 0; +#endif + if (ptrace (PT_GETFPREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) perror_with_name (_("Couldn't get floating point status")); i387_supply_fsave (regcache, -1, &fpregs); +#ifdef HAVE_PT_GETXMMREGS } -#else - if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid), - (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) - perror_with_name (_("Couldn't get floating point status")); - - i387_supply_fsave (regcache, -1, &fpregs); #endif } } @@ -182,19 +193,20 @@ i386bsd_fetch_inferior_registers (struct regcache *regcache, int regnum) this for all registers (including the floating point registers). */ static void -i386bsd_store_inferior_registers (struct regcache *regcache, int regnum) +i386bsd_store_inferior_registers (struct target_ops *ops, + struct regcache *regcache, int regnum) { if (regnum == -1 || GETREGS_SUPPLIES (regnum)) { struct reg regs; - if (ptrace (PT_GETREGS, PIDGET (inferior_ptid), + if (ptrace (PT_GETREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't get registers")); i386bsd_collect_gregset (regcache, ®s, regnum); - if (ptrace (PT_SETREGS, PIDGET (inferior_ptid), + if (ptrace (PT_SETREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't write registers")); @@ -207,16 +219,37 @@ i386bsd_store_inferior_registers (struct regcache *regcache, int regnum) struct fpreg fpregs; #ifdef HAVE_PT_GETXMMREGS char xmmregs[512]; +#endif +#ifdef PT_GETXSTATE_INFO + if (x86bsd_xsave_len != 0) + { + void *xstateregs; + + xstateregs = alloca (x86bsd_xsave_len); + if (ptrace (PT_GETXSTATE, get_ptrace_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) xstateregs, 0) == -1) + perror_with_name (_("Couldn't get extended state status")); + + i387_collect_xsave (regcache, -1, xstateregs, 0); + + if (ptrace (PT_SETXSTATE, get_ptrace_pid (inferior_ptid), + (PTRACE_TYPE_ARG3) xstateregs, x86bsd_xsave_len) == -1) + perror_with_name (_("Couldn't write extended state status")); + return; + } +#endif + +#ifdef HAVE_PT_GETXMMREGS if (have_ptrace_xmmregs != 0 - && ptrace(PT_GETXMMREGS, PIDGET (inferior_ptid), + && ptrace(PT_GETXMMREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) xmmregs, 0) == 0) { have_ptrace_xmmregs = 1; i387_collect_fxsave (regcache, regnum, xmmregs); - if (ptrace (PT_SETXMMREGS, PIDGET (inferior_ptid), + if (ptrace (PT_SETXMMREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) xmmregs, 0) == -1) perror_with_name (_("Couldn't write XMM registers")); } @@ -224,13 +257,13 @@ i386bsd_store_inferior_registers (struct regcache *regcache, int regnum) { have_ptrace_xmmregs = 0; #endif - if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid), + if (ptrace (PT_GETFPREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) perror_with_name (_("Couldn't get floating point status")); i387_collect_fsave (regcache, regnum, &fpregs); - if (ptrace (PT_SETFPREGS, PIDGET (inferior_ptid), + if (ptrace (PT_SETFPREGS, get_ptrace_pid (inferior_ptid), (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) perror_with_name (_("Couldn't write floating point status")); #ifdef HAVE_PT_GETXMMREGS @@ -247,89 +280,15 @@ i386bsd_target (void) { struct target_ops *t; - t = inf_ptrace_target (); + t = x86bsd_target (); t->to_fetch_registers = i386bsd_fetch_inferior_registers; t->to_store_registers = i386bsd_store_inferior_registers; return t; } -/* Support for debug registers. */ - -#ifdef HAVE_PT_GETDBREGS - -/* Not all versions of FreeBSD/i386 that support the debug registers - have this macro. */ -#ifndef DBREG_DRX -#define DBREG_DRX(d, x) ((&d->dr0)[x]) -#endif - -static void -i386bsd_dr_set (int regnum, unsigned int 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) &= ~(0x0000fc00); - - 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 -i386bsd_dr_set_control (unsigned long control) -{ - i386bsd_dr_set (7, control); -} - -void -i386bsd_dr_set_addr (int regnum, CORE_ADDR addr) -{ - gdb_assert (regnum >= 0 && regnum <= 4); - - i386bsd_dr_set (regnum, addr); -} - -void -i386bsd_dr_reset_addr (int regnum) -{ - gdb_assert (regnum >= 0 && regnum <= 4); - - i386bsd_dr_set (regnum, 0); -} - -unsigned long -i386bsd_dr_get_status (void) -{ - struct dbreg dbregs; - - /* FIXME: kettenis/2001-03-31: Calling perror_with_name if the - ptrace call fails breaks debugging remote targets. The correct - way to fix this is to add the hardware breakpoint and watchpoint - stuff to the target vector. For now, just return zero if the - ptrace call fails. */ - if (ptrace (PT_GETDBREGS, PIDGET (inferior_ptid), - (PTRACE_TYPE_ARG3) &dbregs, 0) == -1) -#if 0 - perror_with_name (_("Couldn't read debug registers")); -#else - return 0; -#endif - - return DBREG_DRX ((&dbregs), 6); -} - -#endif /* PT_GETDBREGS */ - +/* Provide a prototype to silence -Wmissing-prototypes. */ +void _initialize_i386bsd_nat (void); void _initialize_i386bsd_nat (void)