1/* Native-dependent code for Alpha BSD's. 2 3 Copyright 2000, 2001, 2002, 2004 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 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 "defs.h" 23#include "inferior.h" 24#include "regcache.h" 25 26#include "alpha-tdep.h" 27#include "alphabsd-tdep.h" 28 29#include <sys/types.h> 30#include <sys/ptrace.h> 31#include <machine/reg.h> 32 33#ifdef HAVE_SYS_PROCFS_H 34#include <sys/procfs.h> 35#endif 36 37#ifndef HAVE_GREGSET_T 38typedef struct reg gregset_t; 39#endif 40 41#ifndef HAVE_FPREGSET_T 42typedef struct fpreg fpregset_t; 43#endif 44 45#include "gregset.h" 46 47/* Provide *regset() wrappers around the generic Alpha BSD register 48 supply/fill routines. */ 49 50void 51supply_gregset (gregset_t *gregsetp) 52{ 53 alphabsd_supply_reg ((char *) gregsetp, -1); 54} 55 56void 57fill_gregset (gregset_t *gregsetp, int regno) 58{ 59 alphabsd_fill_reg ((char *) gregsetp, regno); 60} 61 62void 63supply_fpregset (fpregset_t *fpregsetp) 64{ 65 alphabsd_supply_fpreg ((char *) fpregsetp, -1); 66} 67 68void 69fill_fpregset (fpregset_t *fpregsetp, int regno) 70{ 71 alphabsd_fill_fpreg ((char *) fpregsetp, regno); 72} 73 74/* Determine if PT_GETREGS fetches this register. */ 75 76static int 77getregs_supplies (int regno) 78{ 79 return ((regno >= ALPHA_V0_REGNUM && regno <= ALPHA_ZERO_REGNUM) 80 || regno >= ALPHA_PC_REGNUM); 81} 82 83/* Fetch register REGNO from the inferior. If REGNO is -1, do this 84 for all registers (including the floating point registers). */ 85 86void 87fetch_inferior_registers (int regno) 88{ 89 if (regno == -1 || getregs_supplies (regno)) 90 { 91 struct reg gregs; 92 93 if (ptrace (PT_GETREGS, PIDGET (inferior_ptid), 94 (PTRACE_TYPE_ARG3) &gregs, 0) == -1) 95 perror_with_name ("Couldn't get registers"); 96 97 alphabsd_supply_reg ((char *) &gregs, regno); 98 if (regno != -1) 99 return; 100 } 101 102 if (regno == -1 || regno >= FP0_REGNUM) 103 { 104 struct fpreg fpregs; 105 106 if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid), 107 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) 108 perror_with_name ("Couldn't get floating point status"); 109 110 alphabsd_supply_fpreg ((char *) &fpregs, regno); 111 } 112} 113 114/* Store register REGNO back into the inferior. If REGNO is -1, do 115 this for all registers (including the floating point registers). */ 116 117void 118store_inferior_registers (int regno) 119{ 120 if (regno == -1 || getregs_supplies (regno)) 121 { 122 struct reg gregs; 123 if (ptrace (PT_GETREGS, PIDGET (inferior_ptid), 124 (PTRACE_TYPE_ARG3) &gregs, 0) == -1) 125 perror_with_name ("Couldn't get registers"); 126 127 alphabsd_fill_reg ((char *) &gregs, regno); 128 129 if (ptrace (PT_SETREGS, PIDGET (inferior_ptid), 130 (PTRACE_TYPE_ARG3) &gregs, 0) == -1) 131 perror_with_name ("Couldn't write registers"); 132 133 if (regno != -1) 134 return; 135 } 136 137 if (regno == -1 || regno >= FP0_REGNUM) 138 { 139 struct fpreg fpregs; 140 141 if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid), 142 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) 143 perror_with_name ("Couldn't get floating point status"); 144 145 alphabsd_fill_fpreg ((char *) &fpregs, regno); 146 147 if (ptrace (PT_SETFPREGS, PIDGET (inferior_ptid), 148 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1) 149 perror_with_name ("Couldn't write floating point status"); 150 } 151} 152