1130803Smarcel/* Native-dependent code for NetBSD/sparc64. 2130803Smarcel 3130803Smarcel Copyright 2003, 2004 Free Software Foundation, Inc. 4130803Smarcel 5130803Smarcel This file is part of GDB. 6130803Smarcel 7130803Smarcel This program is free software; you can redistribute it and/or modify 8130803Smarcel it under the terms of the GNU General Public License as published by 9130803Smarcel the Free Software Foundation; either version 2 of the License, or 10130803Smarcel (at your option) any later version. 11130803Smarcel 12130803Smarcel This program is distributed in the hope that it will be useful, 13130803Smarcel but WITHOUT ANY WARRANTY; without even the implied warranty of 14130803Smarcel MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15130803Smarcel GNU General Public License for more details. 16130803Smarcel 17130803Smarcel You should have received a copy of the GNU General Public License 18130803Smarcel along with this program; if not, write to the Free Software 19130803Smarcel Foundation, Inc., 59 Temple Place - Suite 330, 20130803Smarcel Boston, MA 02111-1307, USA. */ 21130803Smarcel 22130803Smarcel#include "defs.h" 23130803Smarcel 24130803Smarcel#include "sparc64-tdep.h" 25130803Smarcel#include "sparc-nat.h" 26130803Smarcel 27130803Smarcel/* NetBSD is different from the other OSes that support both SPARC and 28130803Smarcel UltraSPARC in that the result of ptrace(2) depends on whether the 29130803Smarcel traced process is 32-bit or 64-bit. */ 30130803Smarcel 31130803Smarcelstatic void 32130803Smarcelsparc64nbsd_supply_gregset (const struct sparc_gregset *gregset, 33130803Smarcel struct regcache *regcache, 34130803Smarcel int regnum, const void *gregs) 35130803Smarcel{ 36130803Smarcel int sparc32 = (gdbarch_ptr_bit (current_gdbarch) == 32); 37130803Smarcel 38130803Smarcel if (sparc32) 39130803Smarcel sparc32_supply_gregset (&sparc32nbsd_gregset, regcache, regnum, gregs); 40130803Smarcel else 41130803Smarcel sparc64_supply_gregset (&sparc64nbsd_gregset, regcache, regnum, gregs); 42130803Smarcel} 43130803Smarcel 44130803Smarcelstatic void 45130803Smarcelsparc64nbsd_collect_gregset (const struct sparc_gregset *gregset, 46130803Smarcel const struct regcache *regcache, 47130803Smarcel int regnum, void *gregs) 48130803Smarcel{ 49130803Smarcel int sparc32 = (gdbarch_ptr_bit (current_gdbarch) == 32); 50130803Smarcel 51130803Smarcel if (sparc32) 52130803Smarcel sparc32_collect_gregset (&sparc32nbsd_gregset, regcache, regnum, gregs); 53130803Smarcel else 54130803Smarcel sparc64_collect_gregset (&sparc64nbsd_gregset, regcache, regnum, gregs); 55130803Smarcel} 56130803Smarcel 57130803Smarcelstatic void 58130803Smarcelsparc64nbsd_supply_fpregset (struct regcache *regcache, 59130803Smarcel int regnum, const void *fpregs) 60130803Smarcel{ 61130803Smarcel int sparc32 = (gdbarch_ptr_bit (current_gdbarch) == 32); 62130803Smarcel 63130803Smarcel if (sparc32) 64130803Smarcel sparc32_supply_fpregset (regcache, regnum, fpregs); 65130803Smarcel else 66130803Smarcel sparc64_supply_fpregset (regcache, regnum, fpregs); 67130803Smarcel} 68130803Smarcel 69130803Smarcelstatic void 70130803Smarcelsparc64nbsd_collect_fpregset (const struct regcache *regcache, 71130803Smarcel int regnum, void *fpregs) 72130803Smarcel{ 73130803Smarcel int sparc32 = (gdbarch_ptr_bit (current_gdbarch) == 32); 74130803Smarcel 75130803Smarcel if (sparc32) 76130803Smarcel sparc32_collect_fpregset (regcache, regnum, fpregs); 77130803Smarcel else 78130803Smarcel sparc64_collect_fpregset (regcache, regnum, fpregs); 79130803Smarcel} 80130803Smarcel 81130803Smarcel/* Determine whether `gregset_t' contains register REGNUM. */ 82130803Smarcel 83130803Smarcelstatic int 84130803Smarcelsparc64nbsd_gregset_supplies_p (int regnum) 85130803Smarcel{ 86130803Smarcel if (gdbarch_ptr_bit (current_gdbarch) == 32) 87130803Smarcel return sparc32_gregset_supplies_p (regnum); 88130803Smarcel 89130803Smarcel /* Integer registers. */ 90130803Smarcel if ((regnum >= SPARC_G1_REGNUM && regnum <= SPARC_G7_REGNUM) 91130803Smarcel || (regnum >= SPARC_O0_REGNUM && regnum <= SPARC_O7_REGNUM) 92130803Smarcel || (regnum >= SPARC_L0_REGNUM && regnum <= SPARC_L7_REGNUM) 93130803Smarcel || (regnum >= SPARC_I0_REGNUM && regnum <= SPARC_I7_REGNUM)) 94130803Smarcel return 1; 95130803Smarcel 96130803Smarcel /* Control registers. */ 97130803Smarcel if (regnum == SPARC64_PC_REGNUM 98130803Smarcel || regnum == SPARC64_NPC_REGNUM 99130803Smarcel || regnum == SPARC64_STATE_REGNUM 100130803Smarcel || regnum == SPARC64_Y_REGNUM) 101130803Smarcel return 1; 102130803Smarcel 103130803Smarcel return 0; 104130803Smarcel} 105130803Smarcel 106130803Smarcel/* Determine whether `fpregset_t' contains register REGNUM. */ 107130803Smarcel 108130803Smarcelstatic int 109130803Smarcelsparc64nbsd_fpregset_supplies_p (int regnum) 110130803Smarcel{ 111130803Smarcel if (gdbarch_ptr_bit (current_gdbarch) == 32) 112130803Smarcel return sparc32_fpregset_supplies_p (regnum); 113130803Smarcel 114130803Smarcel /* Floating-point registers. */ 115130803Smarcel if ((regnum >= SPARC_F0_REGNUM && regnum <= SPARC_F31_REGNUM) 116130803Smarcel || (regnum >= SPARC64_F32_REGNUM && regnum <= SPARC64_F62_REGNUM)) 117130803Smarcel return 1; 118130803Smarcel 119130803Smarcel /* Control registers. */ 120130803Smarcel if (regnum == SPARC64_FSR_REGNUM) 121130803Smarcel return 1; 122130803Smarcel 123130803Smarcel return 0; 124130803Smarcel} 125130803Smarcel 126130803Smarcel 127130803Smarcel/* Provide a prototype to silence -Wmissing-prototypes. */ 128130803Smarcelvoid _initialize_sparcnbsd_nat (void); 129130803Smarcel 130130803Smarcelvoid 131130803Smarcel_initialize_sparcnbsd_nat (void) 132130803Smarcel{ 133130803Smarcel sparc_supply_gregset = sparc64nbsd_supply_gregset; 134130803Smarcel sparc_collect_gregset = sparc64nbsd_collect_gregset; 135130803Smarcel sparc_supply_fpregset = sparc64nbsd_supply_fpregset; 136130803Smarcel sparc_collect_fpregset = sparc64nbsd_collect_fpregset; 137130803Smarcel sparc_gregset_supplies_p = sparc64nbsd_gregset_supplies_p; 138130803Smarcel sparc_fpregset_supplies_p = sparc64nbsd_fpregset_supplies_p; 139130803Smarcel} 140