1130803Smarcel/* Target-dependent code for SPARC. 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#ifndef SPARC_TDEP_H 23130803Smarcel#define SPARC_TDEP_H 1 24130803Smarcel 25130803Smarcelstruct frame_info; 26130803Smarcelstruct gdbarch; 27130803Smarcelstruct regcache; 28130803Smarcelstruct regset; 29130803Smarcelstruct trad_frame_saved_reg; 30130803Smarcel 31130803Smarcel/* Register offsets for the general-purpose register set. */ 32130803Smarcel 33130803Smarcelstruct sparc_gregset 34130803Smarcel{ 35130803Smarcel int r_psr_offset; 36130803Smarcel int r_pc_offset; 37130803Smarcel int r_npc_offset; 38130803Smarcel int r_y_offset; 39130803Smarcel int r_wim_offset; 40130803Smarcel int r_tbr_offset; 41130803Smarcel int r_g1_offset; 42130803Smarcel int r_l0_offset; 43130803Smarcel int r_y_size; 44130803Smarcel}; 45130803Smarcel 46130803Smarcel/* SPARC architecture-specific information. */ 47130803Smarcel 48130803Smarcelstruct gdbarch_tdep 49130803Smarcel{ 50130803Smarcel /* Register numbers for the PN and nPC registers. The definitions 51130803Smarcel for (64-bit) UltraSPARC differ from the (32-bit) SPARC 52130803Smarcel definitions. */ 53130803Smarcel int pc_regnum; 54130803Smarcel int npc_regnum; 55130803Smarcel 56130803Smarcel /* Register sets. */ 57130803Smarcel struct regset *gregset; 58130803Smarcel size_t sizeof_gregset; 59130803Smarcel struct regset *fpregset; 60130803Smarcel size_t sizeof_fpregset; 61130803Smarcel 62130803Smarcel /* Offset of saved PC in jmp_buf. */ 63130803Smarcel int jb_pc_offset; 64130803Smarcel 65130803Smarcel /* Size of an Procedure Linkage Table (PLT) entry, 0 if we shouldn't 66130803Smarcel treat the PLT special when doing prologue analysis. */ 67130803Smarcel size_t plt_entry_size; 68130803Smarcel}; 69130803Smarcel 70130803Smarcel/* Register numbers of various important registers. */ 71130803Smarcel 72130803Smarcelenum sparc_regnum 73130803Smarcel{ 74130803Smarcel SPARC_G0_REGNUM, /* %g0 */ 75130803Smarcel SPARC_G1_REGNUM, 76130803Smarcel SPARC_G2_REGNUM, 77130803Smarcel SPARC_G3_REGNUM, 78130803Smarcel SPARC_G4_REGNUM, 79130803Smarcel SPARC_G5_REGNUM, 80130803Smarcel SPARC_G6_REGNUM, 81130803Smarcel SPARC_G7_REGNUM, /* %g7 */ 82130803Smarcel SPARC_O0_REGNUM, /* %o0 */ 83130803Smarcel SPARC_O1_REGNUM, 84130803Smarcel SPARC_O2_REGNUM, 85130803Smarcel SPARC_O3_REGNUM, 86130803Smarcel SPARC_O4_REGNUM, 87130803Smarcel SPARC_O5_REGNUM, 88130803Smarcel SPARC_SP_REGNUM, /* %sp (%o6) */ 89130803Smarcel SPARC_O7_REGNUM, /* %o7 */ 90130803Smarcel SPARC_L0_REGNUM, /* %l0 */ 91130803Smarcel SPARC_L1_REGNUM, 92130803Smarcel SPARC_L2_REGNUM, 93130803Smarcel SPARC_L3_REGNUM, 94130803Smarcel SPARC_L4_REGNUM, 95130803Smarcel SPARC_L5_REGNUM, 96130803Smarcel SPARC_L6_REGNUM, 97130803Smarcel SPARC_L7_REGNUM, /* %l7 */ 98130803Smarcel SPARC_I0_REGNUM, /* %i0 */ 99130803Smarcel SPARC_I1_REGNUM, 100130803Smarcel SPARC_I2_REGNUM, 101130803Smarcel SPARC_I3_REGNUM, 102130803Smarcel SPARC_I4_REGNUM, 103130803Smarcel SPARC_I5_REGNUM, 104130803Smarcel SPARC_FP_REGNUM, /* %fp (%i6) */ 105130803Smarcel SPARC_I7_REGNUM, /* %i7 */ 106130803Smarcel SPARC_F0_REGNUM, /* %f0 */ 107130803Smarcel SPARC_F1_REGNUM, 108130803Smarcel SPARC_F31_REGNUM /* %f31 */ 109130803Smarcel = SPARC_F0_REGNUM + 31 110130803Smarcel}; 111130803Smarcel 112130803Smarcelenum sparc32_regnum 113130803Smarcel{ 114130803Smarcel SPARC32_Y_REGNUM /* %y */ 115130803Smarcel = SPARC_F31_REGNUM + 1, 116130803Smarcel SPARC32_PSR_REGNUM, /* %psr */ 117130803Smarcel SPARC32_WIM_REGNUM, /* %wim */ 118130803Smarcel SPARC32_TBR_REGNUM, /* %tbr */ 119130803Smarcel SPARC32_PC_REGNUM, /* %pc */ 120130803Smarcel SPARC32_NPC_REGNUM, /* %npc */ 121130803Smarcel SPARC32_FSR_REGNUM, /* %fsr */ 122130803Smarcel SPARC32_CSR_REGNUM, /* %csr */ 123130803Smarcel 124130803Smarcel /* Pseudo registers. */ 125130803Smarcel SPARC32_D0_REGNUM, /* %d0 */ 126130803Smarcel SPARC32_D30_REGNUM /* %d30 */ 127130803Smarcel = SPARC32_D0_REGNUM + 15 128130803Smarcel}; 129130803Smarcel 130130803Smarcel 131130803Smarcelstruct sparc_frame_cache 132130803Smarcel{ 133130803Smarcel /* Base address. */ 134130803Smarcel CORE_ADDR base; 135130803Smarcel CORE_ADDR pc; 136130803Smarcel 137130803Smarcel /* Do we have a frame? */ 138130803Smarcel int frameless_p; 139130803Smarcel 140130803Smarcel /* Do we have a Structure, Union or Quad-Precision return value?. */ 141130803Smarcel int struct_return_p; 142130803Smarcel 143130803Smarcel /* Table of saved registers. */ 144130803Smarcel struct trad_frame_saved_reg *saved_regs; 145130803Smarcel}; 146130803Smarcel 147130803Smarcel/* Fetch the instruction at PC. */ 148130803Smarcelextern unsigned long sparc_fetch_instruction (CORE_ADDR pc); 149130803Smarcel 150130803Smarcel/* Fetch StackGhost Per-Process XOR cookie. */ 151130803Smarcelextern ULONGEST sparc_fetch_wcookie (void); 152130803Smarcel 153130803Smarcelextern CORE_ADDR sparc_analyze_prologue (CORE_ADDR pc, CORE_ADDR current_pc, 154130803Smarcel struct sparc_frame_cache *cache); 155130803Smarcel 156130803Smarcelextern struct sparc_frame_cache * 157130803Smarcel sparc_frame_cache (struct frame_info *next_frame, void **this_cache); 158130803Smarcel 159130803Smarcelextern struct sparc_frame_cache * 160130803Smarcel sparc32_frame_cache (struct frame_info *next_frame, void **this_cache); 161130803Smarcel 162130803Smarcel 163130803Smarcel 164130803Smarcelextern void sparc_software_single_step (enum target_signal sig, 165130803Smarcel int insert_breakpoints_p); 166130803Smarcel 167130803Smarcelextern void sparc_supply_rwindow (struct regcache *regcache, 168130803Smarcel CORE_ADDR sp, int regnum); 169130803Smarcelextern void sparc_collect_rwindow (const struct regcache *regcache, 170130803Smarcel CORE_ADDR sp, int regnum); 171130803Smarcel 172130803Smarcel/* Register offsets for SunOS 4. */ 173130803Smarcelextern const struct sparc_gregset sparc32_sunos4_gregset; 174130803Smarcel 175130803Smarcelextern void sparc32_supply_gregset (const struct sparc_gregset *gregset, 176130803Smarcel struct regcache *regcache, 177130803Smarcel int regnum, const void *gregs); 178130803Smarcelextern void sparc32_collect_gregset (const struct sparc_gregset *gregset, 179130803Smarcel const struct regcache *regcache, 180130803Smarcel int regnum, void *gregs); 181130803Smarcelextern void sparc32_supply_fpregset (struct regcache *regcache, 182130803Smarcel int regnum, const void *fpregs); 183130803Smarcelextern void sparc32_collect_fpregset (const struct regcache *regcache, 184130803Smarcel int regnum, void *fpregs); 185130803Smarcel 186130803Smarcel/* Functions and variables exported from sparc-sol2-tdep.c. */ 187130803Smarcel 188130803Smarcel/* Register offsets for Solaris 2. */ 189130803Smarcelextern const struct sparc_gregset sparc32_sol2_gregset; 190130803Smarcel 191130803Smarcelextern int sparc_sol2_pc_in_sigtramp (CORE_ADDR pc, char *name); 192130803Smarcel 193130803Smarcelextern void sparc32_sol2_init_abi (struct gdbarch_info info, 194130803Smarcel struct gdbarch *gdbarch); 195130803Smarcel 196130803Smarcel/* Functions and variables exported from sparcnbsd-tdep.c. */ 197130803Smarcel 198130803Smarcel/* Register offsets for NetBSD. */ 199130803Smarcelextern const struct sparc_gregset sparc32nbsd_gregset; 200130803Smarcel 201130803Smarcelextern struct trad_frame_saved_reg * 202130803Smarcel sparc32nbsd_sigcontext_saved_regs (struct frame_info *next_frame); 203130803Smarcel 204130803Smarcel#endif /* sparc-tdep.h */ 205