X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fppcnbsd-nat.c;h=ce097d7a59da75d16d9a5226d255c48d75f54581;hb=8758dec1c5c5119a4f9cb59da8375596f0314f94;hp=b754fa71a4893d1b5541053c555c83f40353146a;hpb=d0352a18a504a4e7b761f6b3264cf11347d8d056;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/ppcnbsd-nat.c b/gdb/ppcnbsd-nat.c index b754fa71a4..ce097d7a59 100644 --- a/gdb/ppcnbsd-nat.c +++ b/gdb/ppcnbsd-nat.c @@ -1,5 +1,6 @@ /* Native-dependent code for PowerPC's running NetBSD, for GDB. - Copyright 1988, 1989, 1991, 1992, 1994, 1996, 2000 Free Software Foundation, Inc. + Copyright 2002 Free Software Foundation, Inc. + Contributed by Wasabi Systems, Inc. This file is part of GDB. @@ -21,115 +22,100 @@ #include #include #include -#include #include "defs.h" #include "inferior.h" -#include "gdbcore.h" -#define RF(dst, src) \ - memcpy(®isters[REGISTER_BYTE(dst)], &src, sizeof(src)) - -#define RS(src, dst) \ - memcpy(&dst, ®isters[REGISTER_BYTE(src)], sizeof(dst)) +#include "ppc-tdep.h" +#include "ppcnbsd-tdep.h" -void -fetch_inferior_registers (regno) - int regno; +/* Returns true if PT_GETREGS fetches this register. */ +static int +getregs_supplies (int regno) { - struct reg inferior_registers; - struct fpreg inferior_fp_registers; - int i; - - ptrace (PT_GETREGS, inferior_pid, - (PTRACE_ARG3_TYPE) & inferior_registers, 0); - for (i = 0; i < 32; i++) - RF (i, inferior_registers.fixreg[i]); - RF (LR_REGNUM, inferior_registers.lr); - RF (CR_REGNUM, inferior_registers.cr); - RF (XER_REGNUM, inferior_registers.xer); - RF (CTR_REGNUM, inferior_registers.ctr); - RF (PC_REGNUM, inferior_registers.pc); - - ptrace (PT_GETFPREGS, inferior_pid, - (PTRACE_ARG3_TYPE) & inferior_fp_registers, 0); - for (i = 0; i < 32; i++) - RF (FP0_REGNUM + i, inferior_fp_registers.r_regs[i]); - - registers_fetched (); + struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); + + return ((regno >= 0 && regno <= 31) + || regno == tdep->ppc_lr_regnum + || regno == tdep->ppc_cr_regnum + || regno == tdep->ppc_xer_regnum + || regno == tdep->ppc_ctr_regnum + || regno == PC_REGNUM); } -void -store_inferior_registers (regno) - int regno; +/* Like above, but for PT_GETFPREGS. */ +static int +getfpregs_supplies (int regno) { - struct reg inferior_registers; - struct fpreg inferior_fp_registers; - int i; - - for (i = 0; i < 32; i++) - RS (i, inferior_registers.fixreg[i]); - RS (LR_REGNUM, inferior_registers.lr); - RS (CR_REGNUM, inferior_registers.cr); - RS (XER_REGNUM, inferior_registers.xer); - RS (CTR_REGNUM, inferior_registers.ctr); - RS (PC_REGNUM, inferior_registers.pc); - - ptrace (PT_SETREGS, inferior_pid, - (PTRACE_ARG3_TYPE) & inferior_registers, 0); - - for (i = 0; i < 32; i++) - RS (FP0_REGNUM + i, inferior_fp_registers.r_regs[i]); - ptrace (PT_SETFPREGS, inferior_pid, - (PTRACE_ARG3_TYPE) & inferior_fp_registers, 0); -} + struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); -struct md_core -{ - struct reg intreg; - struct fpreg freg; -}; + return ((regno >= FP0_REGNUM && regno <= FP0_REGNUM + 31) + || regno == tdep->ppc_fpscr_regnum); +} void -fetch_core_registers (core_reg_sect, core_reg_size, which, ignore) - char *core_reg_sect; - unsigned core_reg_size; - int which; - CORE_ADDR ignore; +fetch_inferior_registers (int regno) { - struct md_core *core_reg = (struct md_core *) core_reg_sect; - int i; - - /* Integer registers */ - for (i = 0; i < 32; i++) - RF (i, core_reg->intreg.fixreg[i]); - RF (LR_REGNUM, core_reg->intreg.lr); - RF (CR_REGNUM, core_reg->intreg.cr); - RF (XER_REGNUM, core_reg->intreg.xer); - RF (CTR_REGNUM, core_reg->intreg.ctr); - RF (PC_REGNUM, core_reg->intreg.pc); - - /* Floating point registers */ - for (i = 0; i < 32; i++) - RF (FP0_REGNUM + i, core_reg->freg.r_regs[i]); - - registers_fetched (); + if (regno == -1 || getregs_supplies (regno)) + { + struct reg regs; + + if (ptrace (PT_GETREGS, PIDGET (inferior_ptid), + (PTRACE_ARG3_TYPE) ®s, 0) == -1) + perror_with_name ("Couldn't get registers"); + + ppcnbsd_supply_reg ((char *) ®s, regno); + if (regno != -1) + return; + } + + if (regno == -1 || getfpregs_supplies (regno)) + { + struct fpreg fpregs; + + if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid), + (PTRACE_ARG3_TYPE) &fpregs, 0) == -1) + perror_with_name ("Couldn't get FP registers"); + + ppcnbsd_supply_fpreg ((char *) &fpregs, regno); + if (regno != -1) + return; + } } -/* Register that we are able to handle ppcnbsd core file formats. - FIXME: is this really bfd_target_unknown_flavour? */ - -static struct core_fns ppcnbsd_core_fns = -{ - bfd_target_unknown_flavour, /* core_flavour */ - default_check_format, /* check_format */ - default_core_sniffer, /* core_sniffer */ - fetch_core_registers, /* core_read_registers */ - NULL /* next */ -}; - void -_initialize_ppcnbsd_nat () +store_inferior_registers (int regno) { - add_core_fns (&ppcnbsd_core_fns); + if (regno == -1 || getregs_supplies (regno)) + { + struct reg regs; + + if (ptrace (PT_GETREGS, PIDGET (inferior_ptid), + (PTRACE_ARG3_TYPE) ®s, 0) == -1) + perror_with_name ("Couldn't get registers"); + + ppcnbsd_fill_reg ((char *) ®s, regno); + + if (ptrace (PT_SETREGS, PIDGET (inferior_ptid), + (PTRACE_ARG3_TYPE) ®s, 0) == -1) + perror_with_name ("Couldn't write registers"); + + if (regno != -1) + return; + } + + if (regno == -1 || getfpregs_supplies (regno)) + { + struct fpreg fpregs; + + if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid), + (PTRACE_ARG3_TYPE) &fpregs, 0) == -1) + perror_with_name ("Couldn't get FP registers"); + + ppcnbsd_fill_fpreg ((char *) &fpregs, regno); + + if (ptrace (PT_SETFPREGS, PIDGET (inferior_ptid), + (PTRACE_ARG3_TYPE) &fpregs, 0) == -1) + perror_with_name ("Couldn't set FP registers"); + } }