1 /* Native-dependent code for Alpha BSD's. 2 Copyright 2000, 2001, 2002 Free Software Foundation, Inc. 3 4 This file is part of GDB. 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 2 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program; if not, write to the Free Software 18 Foundation, Inc., 59 Temple Place - Suite 330, 19 Boston, MA 02111-1307, USA. */ 20 21 #include "defs.h" 22 #include "inferior.h" 23 #include "regcache.h" 24 25 #include "alpha-tdep.h" 26 #include "alphabsd-tdep.h" 27 28 #include <sys/types.h> 29 #include <sys/ptrace.h> 30 #include <machine/reg.h> 31 32 #ifdef HAVE_SYS_PROCFS_H 33 #include <sys/procfs.h> 34 #endif 35 36 #ifndef HAVE_GREGSET_T 37 typedef struct reg gregset_t; 38 #endif 39 40 #ifndef HAVE_FPREGSET_T 41 typedef struct fpreg fpregset_t; 42 #endif 43 44 #include "gregset.h" 45 46 /* Provide *regset() wrappers around the generic Alpha BSD register 47 supply/fill routines. */ 48 49 void 50 supply_gregset (gregset_t *gregsetp) 51 { 52 alphabsd_supply_reg ((char *) gregsetp, -1); 53 } 54 55 void 56 fill_gregset (gregset_t *gregsetp, int regno) 57 { 58 alphabsd_fill_reg ((char *) gregsetp, regno); 59 } 60 61 void 62 supply_fpregset (fpregset_t *fpregsetp) 63 { 64 alphabsd_supply_fpreg ((char *) fpregsetp, -1); 65 } 66 67 void 68 fill_fpregset (fpregset_t *fpregsetp, int regno) 69 { 70 alphabsd_fill_fpreg ((char *) fpregsetp, regno); 71 } 72 73 /* Determine if PT_GETREGS fetches this register. */ 74 75 static int 76 getregs_supplies (int regno) 77 { 78 return ((regno >= ALPHA_V0_REGNUM && regno <= ALPHA_ZERO_REGNUM) 79 || regno >= PC_REGNUM); 80 } 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 86 void 87 fetch_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_ARG3_TYPE) &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_ARG3_TYPE) &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 117 void 118 store_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_ARG3_TYPE) &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_ARG3_TYPE) &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_ARG3_TYPE) &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_ARG3_TYPE) &fpregs, 0) == -1) 149 perror_with_name ("Couldn't write floating point status"); 150 } 151 } 152