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