diff options
Diffstat (limited to 'gdb/ppcnbsd-nat.c')
-rw-r--r-- | gdb/ppcnbsd-nat.c | 81 |
1 files changed, 42 insertions, 39 deletions
diff --git a/gdb/ppcnbsd-nat.c b/gdb/ppcnbsd-nat.c index ca19ca0..a200505 100644 --- a/gdb/ppcnbsd-nat.c +++ b/gdb/ppcnbsd-nat.c @@ -1,5 +1,7 @@ -/* Native-dependent code for PowerPC's running NetBSD, for GDB. - Copyright (C) 2002, 2004 Free Software Foundation, Inc. +/* Native-dependent code for NetBSD/powerpc. + + Copyright (C) 2002, 2004, 2005, 2006 Free Software Foundation, Inc. + Contributed by Wasabi Systems, Inc. This file is part of GDB. @@ -26,35 +28,37 @@ #include <machine/pcb.h> #include "defs.h" -#include "inferior.h" -#include "gdb_assert.h" #include "gdbcore.h" +#include "inferior.h" #include "regcache.h" -#include "bsd-kvm.h" + +#include "gdb_assert.h" #include "ppc-tdep.h" #include "ppcnbsd-tdep.h" - +#include "bsd-kvm.h" #include "inf-ptrace.h" /* Returns true if PT_GETREGS fetches this register. */ + static int -getregs_supplies (int regno) +getregs_supplies (int regnum) { struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); - return ((regno >= tdep->ppc_gp0_regnum - && regno < tdep->ppc_gp0_regnum + ppc_num_gprs) - || regno == tdep->ppc_lr_regnum - || regno == tdep->ppc_cr_regnum - || regno == tdep->ppc_xer_regnum - || regno == tdep->ppc_ctr_regnum - || regno == PC_REGNUM); + return ((regnum >= tdep->ppc_gp0_regnum + && regnum < tdep->ppc_gp0_regnum + ppc_num_gprs) + || regnum == tdep->ppc_lr_regnum + || regnum == tdep->ppc_cr_regnum + || regnum == tdep->ppc_xer_regnum + || regnum == tdep->ppc_ctr_regnum + || regnum == PC_REGNUM); } /* Like above, but for PT_GETFPREGS. */ + static int -getfpregs_supplies (int regno) +getfpregs_supplies (int regnum) { struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); @@ -70,15 +74,15 @@ getfpregs_supplies (int regno) combination to the problem. */ gdb_assert (ppc_floating_point_unit_p (current_gdbarch)); - return ((regno >= tdep->ppc_fp0_regnum - && regno < tdep->ppc_fp0_regnum + ppc_num_fprs) - || regno == tdep->ppc_fpscr_regnum); + return ((regnum >= tdep->ppc_fp0_regnum + && regnum < tdep->ppc_fp0_regnum + ppc_num_fprs) + || regnum == tdep->ppc_fpscr_regnum); } static void -ppcnbsd_fetch_inferior_registers (int regno) +ppcnbsd_fetch_inferior_registers (int regnum) { - if (regno == -1 || getregs_supplies (regno)) + if (regnum == -1 || getregs_supplies (regnum)) { struct reg regs; @@ -86,12 +90,11 @@ ppcnbsd_fetch_inferior_registers (int regno) (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't get registers")); - ppcnbsd_supply_reg ((char *) ®s, regno); - if (regno != -1) - return; + ppc_supply_gregset (&ppcnbsd_gregset, current_regcache, + regnum, ®s, sizeof regs); } - if (regno == -1 || getfpregs_supplies (regno)) + if (regnum == -1 || getfpregs_supplies (regnum)) { struct fpreg fpregs; @@ -99,16 +102,15 @@ ppcnbsd_fetch_inferior_registers (int regno) (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) perror_with_name (_("Couldn't get FP registers")); - ppcnbsd_supply_fpreg ((char *) &fpregs, regno); - if (regno != -1) - return; + ppc_supply_fpregset (&ppcnbsd_fpregset, current_regcache, + regnum, &fpregs, sizeof fpregs); } } static void -ppcnbsd_store_inferior_registers (int regno) +ppcnbsd_store_inferior_registers (int regnum) { - if (regno == -1 || getregs_supplies (regno)) + if (regnum == -1 || getregs_supplies (regnum)) { struct reg regs; @@ -116,17 +118,15 @@ ppcnbsd_store_inferior_registers (int regno) (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't get registers")); - ppcnbsd_fill_reg ((char *) ®s, regno); + ppc_collect_gregset (&ppcnbsd_gregset, current_regcache, + regnum, ®s, sizeof regs); if (ptrace (PT_SETREGS, PIDGET (inferior_ptid), (PTRACE_TYPE_ARG3) ®s, 0) == -1) perror_with_name (_("Couldn't write registers")); - - if (regno != -1) - return; } - if (regno == -1 || getfpregs_supplies (regno)) + if (regnum == -1 || getfpregs_supplies (regnum)) { struct fpreg fpregs; @@ -134,8 +134,9 @@ ppcnbsd_store_inferior_registers (int regno) (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) perror_with_name (_("Couldn't get FP registers")); - ppcnbsd_fill_fpreg ((char *) &fpregs, regno); - + ppc_collect_fpregset (&ppcnbsd_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 set FP registers")); @@ -154,19 +155,19 @@ ppcnbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb) if (pcb->pcb_sp == 0) return 0; - read_memory (pcb->pcb_sp, (char *) &sf, sizeof sf); + read_memory (pcb->pcb_sp, (gdb_byte *)&sf, sizeof sf); regcache_raw_supply (regcache, tdep->ppc_cr_regnum, &sf.cr); regcache_raw_supply (regcache, tdep->ppc_gp0_regnum + 2, &sf.fixreg2); for (i = 0 ; i < 19 ; i++) regcache_raw_supply (regcache, tdep->ppc_gp0_regnum + 13 + i, &sf.fixreg[i]); - read_memory(sf.sp, (char *)&cf, sizeof(cf)); + read_memory(sf.sp, (gdb_byte *)&cf, sizeof(cf)); 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 (regcache, tdep->ppc_gp0_regnum + 1, &cf.sp); - read_memory(cf.sp, (char *)&cf, sizeof(cf)); + read_memory(cf.sp, (gdb_byte *)&cf, sizeof(cf)); regcache_raw_supply (regcache, tdep->ppc_lr_regnum, &cf.lr); regcache_raw_supply (regcache, PC_REGNUM, &cf.lr); @@ -180,8 +181,10 @@ void _initialize_ppcnbsd_nat (void) { struct target_ops *t; + /* Support debugging kernel virtual memory images. */ bsd_kvm_add_target (ppcnbsd_supply_pcb); + /* Add in local overrides. */ t = inf_ptrace_target (); t->to_fetch_registers = ppcnbsd_fetch_inferior_registers; |