1/* Native-dependent code for PowerPC's running NetBSD, for GDB. 2 Copyright 2002 Free Software Foundation, Inc. 3 Contributed by Wasabi Systems, Inc. 4 5 This file is part of GDB. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 2 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program; if not, write to the Free Software 19 Foundation, Inc., 59 Temple Place - Suite 330, 20 Boston, MA 02111-1307, USA. */ 21 22#include <sys/types.h> 23#include <sys/ptrace.h> 24#include <machine/reg.h> 25 26#include "defs.h" 27#include "inferior.h" 28 29#include "ppc-tdep.h" 30#include "ppcnbsd-tdep.h" 31 32/* Returns true if PT_GETREGS fetches this register. */ 33static int 34getregs_supplies (int regno) 35{ 36 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); 37 38 return ((regno >= 0 && regno <= 31) 39 || regno == tdep->ppc_lr_regnum 40 || regno == tdep->ppc_cr_regnum 41 || regno == tdep->ppc_xer_regnum 42 || regno == tdep->ppc_ctr_regnum 43 || regno == PC_REGNUM); 44} 45 46/* Like above, but for PT_GETFPREGS. */ 47static int 48getfpregs_supplies (int regno) 49{ 50 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); 51 52 return ((regno >= FP0_REGNUM && regno <= FP0_REGNUM + 31) 53 || regno == tdep->ppc_fpscr_regnum); 54} 55 56void 57fetch_inferior_registers (int regno) 58{ 59 if (regno == -1 || getregs_supplies (regno)) 60 { 61 struct reg regs; 62 63 if (ptrace (PT_GETREGS, PIDGET (inferior_ptid), 64 (PTRACE_ARG3_TYPE) ®s, 0) == -1) 65 perror_with_name ("Couldn't get registers"); 66 67 ppcnbsd_supply_reg ((char *) ®s, regno); 68 if (regno != -1) 69 return; 70 } 71 72 if (regno == -1 || getfpregs_supplies (regno)) 73 { 74 struct fpreg fpregs; 75 76 if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid), 77 (PTRACE_ARG3_TYPE) &fpregs, 0) == -1) 78 perror_with_name ("Couldn't get FP registers"); 79 80 ppcnbsd_supply_fpreg ((char *) &fpregs, regno); 81 if (regno != -1) 82 return; 83 } 84} 85 86void 87store_inferior_registers (int regno) 88{ 89 if (regno == -1 || getregs_supplies (regno)) 90 { 91 struct reg regs; 92 93 if (ptrace (PT_GETREGS, PIDGET (inferior_ptid), 94 (PTRACE_ARG3_TYPE) ®s, 0) == -1) 95 perror_with_name ("Couldn't get registers"); 96 97 ppcnbsd_fill_reg ((char *) ®s, regno); 98 99 if (ptrace (PT_SETREGS, PIDGET (inferior_ptid), 100 (PTRACE_ARG3_TYPE) ®s, 0) == -1) 101 perror_with_name ("Couldn't write registers"); 102 103 if (regno != -1) 104 return; 105 } 106 107 if (regno == -1 || getfpregs_supplies (regno)) 108 { 109 struct fpreg fpregs; 110 111 if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid), 112 (PTRACE_ARG3_TYPE) &fpregs, 0) == -1) 113 perror_with_name ("Couldn't get FP registers"); 114 115 ppcnbsd_fill_fpreg ((char *) &fpregs, regno); 116 117 if (ptrace (PT_SETFPREGS, PIDGET (inferior_ptid), 118 (PTRACE_ARG3_TYPE) &fpregs, 0) == -1) 119 perror_with_name ("Couldn't set FP registers"); 120 } 121} 122