From 8599da2d51649d4e39103345404d6eee11872929 Mon Sep 17 00:00:00 2001 From: Mark Kettenis Date: Mon, 15 May 2006 21:53:20 +0000 Subject: [PATCH] * ppcobsd-nat.c: Include "gdb_assert.h". [PT_GETFPREGS] (getfpregs_supplies): New function. (ppcobsd_fetch_registers, ppcobsd_fetch_registers): Hanlde OS versions that have PT_GETFPREGS. (_initialize_ppcobsd_nat) [PT_GETFPREGS]: Initialize ppcobsd_fpreg_offsets. * ppcobsd-tdep.h (ppcobsd_fpreg_offsets, ppcobsd_fpregset): Declare. * ppcobsd-tdep.c (ppcobsd_fpreg_offsets, ppcobsd_fpregset): New variables. (_initialize_ppcobsd_tdep): Initialize ppcobsd_fpreg_offsets. * Makefile.in (ppcobsd-nat.o): Update dependencies. --- gdb/ChangeLog | 15 ++++++++ gdb/Makefile.in | 4 +-- gdb/ppcobsd-nat.c | 88 ++++++++++++++++++++++++++++++++++++++++++---- gdb/ppcobsd-tdep.c | 16 ++++++++- gdb/ppcobsd-tdep.h | 4 ++- 5 files changed, 116 insertions(+), 11 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 82fa385871e..1f21f486584 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,18 @@ +2006-05-15 Mark Kettenis + + * ppcobsd-nat.c: Include "gdb_assert.h". + [PT_GETFPREGS] (getfpregs_supplies): New function. + (ppcobsd_fetch_registers, ppcobsd_fetch_registers): Hanlde OS + versions that have PT_GETFPREGS. + (_initialize_ppcobsd_nat) [PT_GETFPREGS]: Initialize + ppcobsd_fpreg_offsets. + * ppcobsd-tdep.h (ppcobsd_fpreg_offsets, ppcobsd_fpregset): + Declare. + * ppcobsd-tdep.c (ppcobsd_fpreg_offsets, ppcobsd_fpregset): New + variables. + (_initialize_ppcobsd_tdep): Initialize ppcobsd_fpreg_offsets. + * Makefile.in (ppcobsd-nat.o): Update dependencies. + 2006-05-15 Daniel Jacobowitz * configure.ac: Use GCC_HEADER_STDINT. diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 44d74769d63..9b4bb812418 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -2440,8 +2440,8 @@ ppcnbsd-tdep.o: ppcnbsd-tdep.c $(defs_h) $(gdbcore_h) $(gdb_types_h) \ $(tramp_frame_h) $(gdb_assert_h) $(gdb_string_h) \ $(ppc_tdep_h) $(ppcnbsd_tdep_h) $(solib_svr4_h) ppcobsd-nat.o: ppcobsd-nat.c $(defs_h) $(gdbcore_h) $(inferior_h) \ - $(regcache_h) $(ppc_tdep_h) $(ppcobsd_tdep_h) $(bsd_kvm_h) \ - $(inf_ptrace_h) + $(regcache_h) $(gdb_assert_h) $(ppc_tdep_h) $(ppcobsd_tdep_h) \ + $(bsd_kvm_h) $(inf_ptrace_h) ppcobsd-tdep.o: ppcobsd-tdep.c $(defs_h) $(arch_utils_h) $(floatformat_h) \ $(frame_h) $(frame_unwind_h) $(osabi_h) $(regcache_h) $(regset_h) \ $(symtab_h) $(trad_frame_h) $(gdb_assert_h) $(gdb_string_h) \ diff --git a/gdb/ppcobsd-nat.c b/gdb/ppcobsd-nat.c index dd7ca354312..bdca4cafe4c 100644 --- a/gdb/ppcobsd-nat.c +++ b/gdb/ppcobsd-nat.c @@ -1,6 +1,6 @@ /* Native-dependent code for OpenBSD/powerpc. - Copyright (C) 2004, 2005 Free Software Foundation, Inc. + Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc. This file is part of GDB. @@ -24,6 +24,7 @@ #include "inferior.h" #include "regcache.h" +#include "gdb_assert.h" #include #include #include @@ -37,8 +38,37 @@ #include "inf-ptrace.h" #include "bsd-kvm.h" -/* OpenBSD/powerpc doesn't have PT_GETFPREGS/PT_SETFPREGS like - NetBSD/powerpc and FreeBSD/powerpc. */ +/* OpenBSD/powerpc didn't have PT_GETFPREGS/PT_SETFPREGS until release + 4.0. On older releases the floating-point registers are handled by + PT_GETREGS/PT_SETREGS, but fpscr wasn't available.. */ + +#ifdef PT_GETFPREGS + +/* Returns true if PT_GETFPREGS fetches this register. */ + +static int +getfpregs_supplies (int regnum) +{ + struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); + + /* FIXME: jimb/2004-05-05: Some PPC variants don't have floating + point registers. Traditionally, GDB's register set has still + listed the floating point registers for such machines, so this + code is harmless. However, the new E500 port actually omits the + floating point registers entirely from the register set --- they + don't even have register numbers assigned to them. + + It's not clear to me how best to update this code, so this assert + will alert the first person to encounter the NetBSD/E500 + combination to the problem. */ + gdb_assert (ppc_floating_point_unit_p (current_gdbarch)); + + return ((regnum >= tdep->ppc_fp0_regnum + && regnum < tdep->ppc_fp0_regnum + ppc_num_fprs) + || regnum == tdep->ppc_fpscr_regnum); +} + +#endif /* PT_GETFPREGS */ /* Fetch register REGNUM from the inferior. If REGNUM is -1, do this for all registers. */ @@ -52,8 +82,26 @@ ppcobsd_fetch_registers (int regnum) (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't get registers")); - ppcobsd_supply_gregset (&ppcobsd_gregset, current_regcache, -1, - ®s, sizeof regs); + ppc_supply_gregset (&ppcobsd_gregset, current_regcache, -1, + ®s, sizeof regs); +#ifndef PT_GETFPREGS + ppc_supply_fpregset (&ppcobsd_gregset, current_regcache, -1, + ®s, sizeof regs); +#endif + +#ifdef PT_GETFPREGS + if (regnum == -1 || getfpregs_supplies (regnum)) + { + struct fpreg fpregs; + + if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid), + (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) + perror_with_name (_("Couldn't get floating point status")); + + ppc_supply_fpregset (&ppcobsd_fpregset, current_regcache, -1, + &fpregs, sizeof fpregs); + } +#endif } /* Store register REGNUM back into the inferior. If REGNUM is -1, do @@ -68,12 +116,34 @@ ppcobsd_store_registers (int regnum) (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't get registers")); - ppcobsd_collect_gregset (&ppcobsd_gregset, current_regcache, - regnum, ®s, sizeof regs); + ppc_collect_gregset (&ppcobsd_gregset, current_regcache, + regnum, ®s, sizeof regs); +#ifndef PT_GETFPREGS + ppc_collect_fpregset (&ppcobsd_gregset, current_regcache, + regnum, ®s, sizeof regs); +#endif if (ptrace (PT_SETREGS, PIDGET (inferior_ptid), (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't write registers")); + +#ifdef PT_GETFPREGS + if (regnum == -1 || getfpregs_supplies (regnum)) + { + struct fpreg fpregs; + + if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid), + (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) + perror_with_name (_("Couldn't get floating point status")); + + ppc_collect_fpregset (&ppcobsd_fpregset, current_regcache, + regnum, &fpregs, sizeof fpregs); + + if (ptrace (PT_SETFPREGS, PIDGET (inferior_ptid), + (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) + perror_with_name (_("Couldn't write floating point status")); + } +#endif } @@ -141,6 +211,10 @@ _initialize_ppcobsd_nat (void) /* Floating-point registers. */ ppcobsd_reg_offsets.f0_offset = offsetof (struct reg, fpr); ppcobsd_reg_offsets.fpscr_offset = -1; +#ifdef PT_GETFPREGS + ppcobsd_fpreg_offsets.f0_offset = offsetof (struct fpreg, fpr); + ppcobsd_fpreg_offsets.fpscr_offset = offsetof (struct fpreg, fpscr); +#endif /* AltiVec registers. */ ppcobsd_reg_offsets.vr0_offset = offsetof (struct vreg, vreg); diff --git a/gdb/ppcobsd-tdep.c b/gdb/ppcobsd-tdep.c index 4b752b86b0f..b4bc4197e8b 100644 --- a/gdb/ppcobsd-tdep.c +++ b/gdb/ppcobsd-tdep.c @@ -1,6 +1,6 @@ /* Target-dependent code for OpenBSD/powerpc. - Copyright (C) 2004, 2005 Free Software Foundation, Inc. + Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc. This file is part of GDB. @@ -39,6 +39,7 @@ /* Register offsets from . */ struct ppc_reg_offsets ppcobsd_reg_offsets; +struct ppc_reg_offsets ppcobsd_fpreg_offsets; /* Core file support. */ @@ -102,6 +103,12 @@ struct regset ppcobsd_gregset = ppcobsd_supply_gregset }; +struct regset ppcobsd_fpregset = +{ + &ppcobsd_fpreg_offsets, + ppc_supply_fpregset +}; + /* Return the appropriate register set for the core section identified by SECT_NAME and SECT_SIZE. */ @@ -341,4 +348,11 @@ _initialize_ppcobsd_tdep (void) ppcobsd_reg_offsets.vscr_offset = 512; ppcobsd_reg_offsets.vrsave_offset = 520; } + + if (ppcobsd_fpreg_offsets.fpscr_offset == 0) + { + /* Floating-point registers. */ + ppcobsd_reg_offsets.f0_offset = 0; + ppcobsd_reg_offsets.fpscr_offset = 256; + } } diff --git a/gdb/ppcobsd-tdep.h b/gdb/ppcobsd-tdep.h index 899d653b918..b1a7f8b7330 100644 --- a/gdb/ppcobsd-tdep.h +++ b/gdb/ppcobsd-tdep.h @@ -1,6 +1,6 @@ /* Target-dependent code for OpenBSD/powerpc. - Copyright (C) 2004 Free Software Foundation, Inc. + Copyright (C) 2004, 2006 Free Software Foundation, Inc. This file is part of GDB. @@ -29,9 +29,11 @@ struct regcache; /* Register offsets for OpenBSD/powerpc. */ extern struct ppc_reg_offsets ppcobsd_reg_offsets; +extern struct ppc_reg_offsets ppcobsd_fpreg_offsets; /* Register sets for OpenBSD/powerpc. */ extern struct regset ppcobsd_gregset; +extern struct regset ppcobsd_fpregset; /* Supply register REGNUM in the general-purpose register set REGSET -- 2.30.2