X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fppc-obsd-nat.c;h=7c8335c9ad7e76a94b60d56735de4da182fb95de;hb=d16c467a501547e37b111f775396e28f8bf27c1e;hp=eb39e7ce26d069cfc580160ec177c32db5c67415;hpb=03b62bbbce3dc5f15131d9e78f77d035cd1cffb3;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/ppc-obsd-nat.c b/gdb/ppc-obsd-nat.c index eb39e7ce26..7c8335c9ad 100644 --- a/gdb/ppc-obsd-nat.c +++ b/gdb/ppc-obsd-nat.c @@ -1,6 +1,6 @@ /* Native-dependent code for OpenBSD/powerpc. - Copyright (C) 2004-2016 Free Software Foundation, Inc. + Copyright (C) 2004-2020 Free Software Foundation, Inc. This file is part of GDB. @@ -35,6 +35,14 @@ #include "obsd-nat.h" #include "bsd-kvm.h" +struct ppc_obsd_nat_target final : public obsd_nat_target +{ + void fetch_registers (struct regcache *, int) override; + void store_registers (struct regcache *, int) override; +}; + +static ppc_obsd_nat_target the_ppc_obsd_nat_target; + /* 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.. */ @@ -70,14 +78,13 @@ getfpregs_supplies (struct gdbarch *gdbarch, int regnum) /* Fetch register REGNUM from the inferior. If REGNUM is -1, do this for all registers. */ -static void -ppcobsd_fetch_registers (struct target_ops *ops, - struct regcache *regcache, int regnum) +void +ppc_obsd_nat_target::fetch_registers (struct regcache *regcache, int regnum) { struct reg regs; + pid_t pid = regcache->ptid ().pid (); - if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid), - (PTRACE_TYPE_ARG3) ®s, 0) == -1) + if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't get registers")); ppc_supply_gregset (&ppcobsd_gregset, regcache, -1, @@ -89,12 +96,11 @@ ppcobsd_fetch_registers (struct target_ops *ops, #ifdef PT_GETFPREGS if (regnum == -1 - || getfpregs_supplies (get_regcache_arch (regcache), regnum)) + || getfpregs_supplies (regcache->arch (), regnum)) { struct fpreg fpregs; - if (ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid), - (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) + if (ptrace (PT_GETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) perror_with_name (_("Couldn't get floating point status")); ppc_supply_fpregset (&ppcobsd_fpregset, regcache, -1, @@ -106,14 +112,13 @@ ppcobsd_fetch_registers (struct target_ops *ops, /* Store register REGNUM back into the inferior. If REGNUM is -1, do this for all registers. */ -static void -ppcobsd_store_registers (struct target_ops *ops, - struct regcache *regcache, int regnum) +void +ppc_obsd_nat_target::store_registers (struct regcache *regcache, int regnum) { struct reg regs; + pid_t pid = regcache->ptid ().pid (); - if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid), - (PTRACE_TYPE_ARG3) ®s, 0) == -1) + if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't get registers")); ppc_collect_gregset (&ppcobsd_gregset, regcache, @@ -123,25 +128,22 @@ ppcobsd_store_registers (struct target_ops *ops, regnum, ®s, sizeof regs); #endif - if (ptrace (PT_SETREGS, ptid_get_pid (inferior_ptid), - (PTRACE_TYPE_ARG3) ®s, 0) == -1) + if (ptrace (PT_SETREGS, pid, (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't write registers")); #ifdef PT_GETFPREGS if (regnum == -1 - || getfpregs_supplies (get_regcache_arch (regcache), regnum)) + || getfpregs_supplies (regcache->arch (), regnum)) { struct fpreg fpregs; - if (ptrace (PT_GETFPREGS, ptid_get_pid (inferior_ptid), - (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) + if (ptrace (PT_GETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) perror_with_name (_("Couldn't get floating point status")); ppc_collect_fpregset (&ppcobsd_fpregset, regcache, regnum, &fpregs, sizeof fpregs); - if (ptrace (PT_SETFPREGS, ptid_get_pid (inferior_ptid), - (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) + if (ptrace (PT_SETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) perror_with_name (_("Couldn't write floating point status")); } #endif @@ -151,7 +153,7 @@ ppcobsd_store_registers (struct target_ops *ops, static int ppcobsd_supply_pcb (struct regcache *regcache, struct pcb *pcb) { - struct gdbarch *gdbarch = get_regcache_arch (regcache); + struct gdbarch *gdbarch = regcache->arch (); struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); struct switchframe sf; struct callframe cf; @@ -171,34 +173,24 @@ ppcobsd_supply_pcb (struct regcache *regcache, struct pcb *pcb) return 0; read_memory (pcb->pcb_sp, (gdb_byte *)&sf, sizeof sf); - regcache_raw_supply (regcache, gdbarch_sp_regnum (gdbarch), &sf.sp); - regcache_raw_supply (regcache, tdep->ppc_cr_regnum, &sf.cr); - regcache_raw_supply (regcache, tdep->ppc_gp0_regnum + 2, &sf.fixreg2); + regcache->raw_supply (gdbarch_sp_regnum (gdbarch), &sf.sp); + regcache->raw_supply (tdep->ppc_cr_regnum, &sf.cr); + regcache->raw_supply (tdep->ppc_gp0_regnum + 2, &sf.fixreg2); for (i = 0, regnum = tdep->ppc_gp0_regnum + 13; i < 19; i++, regnum++) - regcache_raw_supply (regcache, regnum, &sf.fixreg[i]); + regcache->raw_supply (regnum, &sf.fixreg[i]); read_memory (sf.sp, (gdb_byte *)&cf, sizeof cf); - regcache_raw_supply (regcache, gdbarch_pc_regnum (gdbarch), &cf.lr); - regcache_raw_supply (regcache, tdep->ppc_gp0_regnum + 30, &cf.r30); - regcache_raw_supply (regcache, tdep->ppc_gp0_regnum + 31, &cf.r31); + regcache->raw_supply (gdbarch_pc_regnum (gdbarch), &cf.lr); + regcache->raw_supply (tdep->ppc_gp0_regnum + 30, &cf.r30); + regcache->raw_supply (tdep->ppc_gp0_regnum + 31, &cf.r31); return 1; } - - -/* Provide a prototype to silence -Wmissing-prototypes. */ -void _initialize_ppcobsd_nat (void); void _initialize_ppcobsd_nat (void) { - struct target_ops *t; - - /* Add in local overrides. */ - t = inf_ptrace_target (); - t->to_fetch_registers = ppcobsd_fetch_registers; - t->to_store_registers = ppcobsd_store_registers; - obsd_add_target (t); + add_inf_child_target (&the_ppc_obsd_nat_target); /* General-purpose registers. */ ppcobsd_reg_offsets.r0_offset = offsetof (struct reg, gpr); @@ -221,11 +213,6 @@ _initialize_ppcobsd_nat (void) ppcobsd_fpreg_offsets.fpscr_size = 4; #endif - /* AltiVec registers. */ - ppcobsd_reg_offsets.vr0_offset = offsetof (struct vreg, vreg); - ppcobsd_reg_offsets.vscr_offset = offsetof (struct vreg, vscr); - ppcobsd_reg_offsets.vrsave_offset = offsetof (struct vreg, vrsave); - /* Support debugging kernel virtual memory images. */ bsd_kvm_add_target (ppcobsd_supply_pcb); }