1/* Native-dependent code for MIPS systems running NetBSD. 2 3 Copyright (C) 2000, 2001, 2002, 2004, 2007 Free Software Foundation, 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 3 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, see <http://www.gnu.org/licenses/>. */ 19 20#include "defs.h" 21#include "inferior.h" 22#include "regcache.h" 23#include "target.h" 24 25#include <sys/types.h> 26#include <sys/ptrace.h> 27#include <machine/reg.h> 28 29#include "mips-tdep.h" 30#include "mipsnbsd-tdep.h" 31#include "inf-ptrace.h" 32 33/* Determine if PT_GETREGS fetches this register. */ 34static int 35getregs_supplies (int regno) 36{ 37 return ((regno) >= MIPS_ZERO_REGNUM 38 && (regno) <= gdbarch_pc_regnum (current_gdbarch)); 39} 40 41static void 42mipsnbsd_fetch_inferior_registers (struct regcache *regcache, int regno) 43{ 44 if (regno == -1 || getregs_supplies (regno)) 45 { 46 struct reg regs; 47 48 if (ptrace (PT_GETREGS, PIDGET (inferior_ptid), 49 (PTRACE_TYPE_ARG3) ®s, 0) == -1) 50 perror_with_name (_("Couldn't get registers")); 51 52 mipsnbsd_supply_reg (regcache, (char *) ®s, regno); 53 if (regno != -1) 54 return; 55 } 56 57 if (regno == -1 || regno >= gdbarch_fp0_regnum (current_gdbarch)) 58 { 59 struct fpreg fpregs; 60 61 if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid), 62 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) 63 perror_with_name (_("Couldn't get floating point status")); 64 65 mipsnbsd_supply_fpreg (regcache, (char *) &fpregs, regno); 66 } 67} 68 69static void 70mipsnbsd_store_inferior_registers (struct regcache *regcache, int regno) 71{ 72 if (regno == -1 || getregs_supplies (regno)) 73 { 74 struct reg regs; 75 76 if (ptrace (PT_GETREGS, PIDGET (inferior_ptid), 77 (PTRACE_TYPE_ARG3) ®s, 0) == -1) 78 perror_with_name (_("Couldn't get registers")); 79 80 mipsnbsd_fill_reg (regcache, (char *) ®s, regno); 81 82 if (ptrace (PT_SETREGS, PIDGET (inferior_ptid), 83 (PTRACE_TYPE_ARG3) ®s, 0) == -1) 84 perror_with_name (_("Couldn't write registers")); 85 86 if (regno != -1) 87 return; 88 } 89 90 if (regno == -1 || regno >= gdbarch_fp0_regnum (current_gdbarch)) 91 { 92 struct fpreg fpregs; 93 94 if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid), 95 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) 96 perror_with_name (_("Couldn't get floating point status")); 97 98 mipsnbsd_fill_fpreg (regcache, (char *) &fpregs, regno); 99 100 if (ptrace (PT_SETFPREGS, PIDGET (inferior_ptid), 101 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) 102 perror_with_name (_("Couldn't write floating point status")); 103 } 104} 105 106 107/* Provide a prototype to silence -Wmissing-prototypes. */ 108void _initialize_mipsnbsd_nat (void); 109 110void 111_initialize_mipsnbsd_nat (void) 112{ 113 struct target_ops *t; 114 115 t = inf_ptrace_target (); 116 t->to_fetch_registers = mipsnbsd_fetch_inferior_registers; 117 t->to_store_registers = mipsnbsd_store_inferior_registers; 118 add_target (t); 119} 120