PR binutils/13558
[deliverable/binutils-gdb.git] / gdb / ppc-tdep.h
CommitLineData
9aa1e687 1/* Target-dependent code for GDB, the GNU debugger.
f9be684a 2
0b302171 3 Copyright (C) 2000-2005, 2007-2012 Free Software Foundation, Inc.
9aa1e687
KB
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
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
9aa1e687
KB
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
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
9aa1e687 19
3a1c5313
AC
20#ifndef PPC_TDEP_H
21#define PPC_TDEP_H
22
da3331ec 23struct gdbarch;
3a1c5313
AC
24struct frame_info;
25struct value;
4a4b3fed 26struct regcache;
221c12ff 27struct type;
3a1c5313 28
0df8b418 29/* From ppc-sysv-tdep.c ... */
05580c65 30enum return_value_convention ppc_sysv_abi_return_value (struct gdbarch *gdbarch,
c055b101 31 struct type *func_type,
05580c65
AC
32 struct type *valtype,
33 struct regcache *regcache,
50fd1280
AC
34 gdb_byte *readbuf,
35 const gdb_byte *writebuf);
05580c65 36enum return_value_convention ppc_sysv_abi_broken_return_value (struct gdbarch *gdbarch,
c055b101 37 struct type *func_type,
05580c65
AC
38 struct type *valtype,
39 struct regcache *regcache,
50fd1280
AC
40 gdb_byte *readbuf,
41 const gdb_byte *writebuf);
77b2b6d4 42CORE_ADDR ppc_sysv_abi_push_dummy_call (struct gdbarch *gdbarch,
7d9b040b 43 struct value *function,
77b2b6d4
AC
44 struct regcache *regcache,
45 CORE_ADDR bp_addr, int nargs,
46 struct value **args, CORE_ADDR sp,
47 int struct_return,
48 CORE_ADDR struct_addr);
8be9034a 49CORE_ADDR ppc64_sysv_abi_push_dummy_call (struct gdbarch *gdbarch,
7d9b040b 50 struct value *function,
8be9034a
AC
51 struct regcache *regcache,
52 CORE_ADDR bp_addr, int nargs,
53 struct value **args, CORE_ADDR sp,
54 int struct_return,
55 CORE_ADDR struct_addr);
05580c65 56enum return_value_convention ppc64_sysv_abi_return_value (struct gdbarch *gdbarch,
c055b101 57 struct type *func_type,
05580c65
AC
58 struct type *valtype,
59 struct regcache *regcache,
50fd1280
AC
60 gdb_byte *readbuf,
61 const gdb_byte *writebuf);
9aa1e687 62
0df8b418 63/* From rs6000-tdep.c... */
be8626e0 64int altivec_register_p (struct gdbarch *gdbarch, int regno);
604c2f83 65int vsx_register_p (struct gdbarch *gdbarch, int regno);
be8626e0 66int spe_register_p (struct gdbarch *gdbarch, int regno);
9aa1e687 67
383f0f5b
JB
68/* Return non-zero if the architecture described by GDBARCH has
69 floating-point registers (f0 --- f31 and fpscr). */
0a613259
AC
70int ppc_floating_point_unit_p (struct gdbarch *gdbarch);
71
06caf7d2
CES
72/* Return non-zero if the architecture described by GDBARCH has
73 Altivec registers (vr0 --- vr31, vrsave and vscr). */
74int ppc_altivec_support_p (struct gdbarch *gdbarch);
75
604c2f83
LM
76/* Return non-zero if the architecture described by GDBARCH has
77 VSX registers (vsr0 --- vsr63). */
78int vsx_support_p (struct gdbarch *gdbarch);
4a7622d1
UW
79int ppc_deal_with_atomic_sequence (struct frame_info *frame);
80
81
d195bc9f
MK
82/* Register set description. */
83
84struct ppc_reg_offsets
85{
86 /* General-purpose registers. */
87 int r0_offset;
f2db237a
AM
88 int gpr_size; /* size for r0-31, pc, ps, lr, ctr. */
89 int xr_size; /* size for cr, xer, mq. */
d195bc9f
MK
90 int pc_offset;
91 int ps_offset;
92 int cr_offset;
93 int lr_offset;
94 int ctr_offset;
95 int xer_offset;
96 int mq_offset;
97
98 /* Floating-point registers. */
99 int f0_offset;
100 int fpscr_offset;
f2db237a 101 int fpscr_size;
d195bc9f
MK
102
103 /* AltiVec registers. */
104 int vr0_offset;
105 int vscr_offset;
106 int vrsave_offset;
107};
108
7284e1be
UW
109extern void ppc_supply_reg (struct regcache *regcache, int regnum,
110 const gdb_byte *regs, size_t offset, int regsize);
111
112extern void ppc_collect_reg (const struct regcache *regcache, int regnum,
113 gdb_byte *regs, size_t offset, int regsize);
114
d195bc9f
MK
115/* Supply register REGNUM in the general-purpose register set REGSET
116 from the buffer specified by GREGS and LEN to register cache
117 REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
118
119extern void ppc_supply_gregset (const struct regset *regset,
120 struct regcache *regcache,
121 int regnum, const void *gregs, size_t len);
122
123/* Supply register REGNUM in the floating-point register set REGSET
124 from the buffer specified by FPREGS and LEN to register cache
125 REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
126
127extern void ppc_supply_fpregset (const struct regset *regset,
128 struct regcache *regcache,
129 int regnum, const void *fpregs, size_t len);
130
06caf7d2
CES
131/* Supply register REGNUM in the Altivec register set REGSET
132 from the buffer specified by VRREGS and LEN to register cache
133 REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
134
135extern void ppc_supply_vrregset (const struct regset *regset,
136 struct regcache *regcache,
137 int regnum, const void *vrregs, size_t len);
138
604c2f83
LM
139/* Supply register REGNUM in the VSX register set REGSET
140 from the buffer specified by VSXREGS and LEN to register cache
141 REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
142
143extern void ppc_supply_vsxregset (const struct regset *regset,
144 struct regcache *regcache,
145 int regnum, const void *vsxregs, size_t len);
146
d195bc9f 147/* Collect register REGNUM in the general-purpose register set
0df8b418 148 REGSET, from register cache REGCACHE into the buffer specified by
d195bc9f
MK
149 GREGS and LEN. If REGNUM is -1, do this for all registers in
150 REGSET. */
151
152extern void ppc_collect_gregset (const struct regset *regset,
153 const struct regcache *regcache,
154 int regnum, void *gregs, size_t len);
155
156/* Collect register REGNUM in the floating-point register set
0df8b418 157 REGSET, from register cache REGCACHE into the buffer specified by
d195bc9f
MK
158 FPREGS and LEN. If REGNUM is -1, do this for all registers in
159 REGSET. */
160
161extern void ppc_collect_fpregset (const struct regset *regset,
162 const struct regcache *regcache,
163 int regnum, void *fpregs, size_t len);
164
06caf7d2
CES
165/* Collect register REGNUM in the Altivec register set
166 REGSET from register cache REGCACHE into the buffer specified by
167 VRREGS and LEN. If REGNUM is -1, do this for all registers in
168 REGSET. */
169
170extern void ppc_collect_vrregset (const struct regset *regset,
171 const struct regcache *regcache,
172 int regnum, void *vrregs, size_t len);
173
604c2f83
LM
174/* Collect register REGNUM in the VSX register set
175 REGSET from register cache REGCACHE into the buffer specified by
176 VSXREGS and LEN. If REGNUM is -1, do this for all registers in
177 REGSET. */
178
179extern void ppc_collect_vsxregset (const struct regset *regset,
180 const struct regcache *regcache,
181 int regnum, void *vsxregs, size_t len);
182
0df8b418 183/* Private data that this module attaches to struct gdbarch. */
2188cbdd 184
55eddb0f
DJ
185/* Vector ABI used by the inferior. */
186enum powerpc_vector_abi
187{
188 POWERPC_VEC_AUTO,
189 POWERPC_VEC_GENERIC,
190 POWERPC_VEC_ALTIVEC,
191 POWERPC_VEC_SPE,
192 POWERPC_VEC_LAST
193};
194
2188cbdd
EZ
195struct gdbarch_tdep
196 {
55eddb0f
DJ
197 int wordsize; /* Size in bytes of fixed-point word. */
198 int soft_float; /* Avoid FP registers for arguments? */
199
200 /* How to pass vector arguments. Never set to AUTO or LAST. */
201 enum powerpc_vector_abi vector_abi;
202
2188cbdd 203 int ppc_gp0_regnum; /* GPR register 0 */
2188cbdd
EZ
204 int ppc_toc_regnum; /* TOC register */
205 int ppc_ps_regnum; /* Processor (or machine) status (%msr) */
206 int ppc_cr_regnum; /* Condition register */
207 int ppc_lr_regnum; /* Link register */
208 int ppc_ctr_regnum; /* Count register */
209 int ppc_xer_regnum; /* Integer exception register */
383f0f5b 210
826d5376
PG
211 /* Not all PPC and RS6000 variants will have the registers
212 represented below. A -1 is used to indicate that the register
213 is not present in this variant. */
214
215 /* Floating-point registers. */
0df8b418
MS
216 int ppc_fp0_regnum; /* Floating-point register 0. */
217 int ppc_fpscr_regnum; /* fp status and condition register. */
826d5376 218
826d5376
PG
219 /* Multiplier-Quotient Register (older POWER architectures only). */
220 int ppc_mq_regnum;
f86a7158 221
604c2f83
LM
222 /* POWER7 VSX registers. */
223 int ppc_vsr0_regnum; /* First VSX register. */
224 int ppc_vsr0_upper_regnum; /* First right most dword vsx register. */
225 int ppc_efpr0_regnum; /* First Extended FP register. */
226
826d5376 227 /* Altivec registers. */
0df8b418
MS
228 int ppc_vr0_regnum; /* First AltiVec register. */
229 int ppc_vrsave_regnum; /* Last AltiVec register. */
826d5376
PG
230
231 /* SPE registers. */
0df8b418
MS
232 int ppc_ev0_upper_regnum; /* First GPR upper half register. */
233 int ppc_ev0_regnum; /* First ev register. */
234 int ppc_acc_regnum; /* SPE 'acc' register. */
235 int ppc_spefscr_regnum; /* SPE 'spefscr' register. */
826d5376 236
f949c649
TJB
237 /* Decimal 128 registers. */
238 int ppc_dl0_regnum; /* First Decimal128 argument register pair. */
239
826d5376
PG
240 /* Offset to ABI specific location where link register is saved. */
241 int lr_frame_offset;
9f643768
JB
242
243 /* An array of integers, such that sim_regno[I] is the simulator
244 register number for GDB register number I, or -1 if the
245 simulator does not implement that register. */
246 int *sim_regno;
6f7f3f0d 247
794ac428
UW
248 /* ISA-specific types. */
249 struct type *ppc_builtin_type_vec64;
604c2f83 250 struct type *ppc_builtin_type_vec128;
2188cbdd 251};
3a1c5313 252
b967e06f
JB
253
254/* Constants for register set sizes. */
255enum
256 {
604c2f83
LM
257 ppc_num_gprs = 32, /* 32 general-purpose registers. */
258 ppc_num_fprs = 32, /* 32 floating-point registers. */
259 ppc_num_srs = 16, /* 16 segment registers. */
260 ppc_num_vrs = 32, /* 32 Altivec vector registers. */
261 ppc_num_vshrs = 32, /* 32 doublewords (dword 1 of vs0~vs31). */
262 ppc_num_vsrs = 64, /* 64 VSX vector registers. */
263 ppc_num_efprs = 32 /* 32 Extended FP registers. */
b967e06f
JB
264 };
265
0ea0ec5f 266
7cc46491
DJ
267/* Register number constants. These are GDB internal register
268 numbers; they are not used for the simulator or remote targets.
269 Extra SPRs (those other than MQ, CTR, LR, XER, SPEFSCR) are given
270 numbers above PPC_NUM_REGS. So are segment registers and other
271 target-defined registers. */
272enum {
273 PPC_R0_REGNUM = 0,
274 PPC_F0_REGNUM = 32,
275 PPC_PC_REGNUM = 64,
276 PPC_MSR_REGNUM = 65,
277 PPC_CR_REGNUM = 66,
278 PPC_LR_REGNUM = 67,
279 PPC_CTR_REGNUM = 68,
280 PPC_XER_REGNUM = 69,
281 PPC_FPSCR_REGNUM = 70,
282 PPC_MQ_REGNUM = 71,
283 PPC_SPE_UPPER_GP0_REGNUM = 72,
284 PPC_SPE_ACC_REGNUM = 104,
285 PPC_SPE_FSCR_REGNUM = 105,
286 PPC_VR0_REGNUM = 106,
287 PPC_VSCR_REGNUM = 138,
288 PPC_VRSAVE_REGNUM = 139,
604c2f83
LM
289 PPC_VSR0_UPPER_REGNUM = 140,
290 PPC_VSR31_UPPER_REGNUM = 171,
7cc46491
DJ
291 PPC_NUM_REGS
292};
0ea0ec5f 293
0ea0ec5f 294
a0c75879
MK
295/* Instruction size. */
296#define PPC_INSN_SIZE 4
297
0d1243d9
PG
298/* Estimate for the maximum number of instrctions in a function epilogue. */
299#define PPC_MAX_EPILOGUE_INSTRUCTIONS 52
300
a0c75879 301#endif /* ppc-tdep.h */
This page took 1.319333 seconds and 4 git commands to generate.