]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/gdbserver/linux-ppc-low.c
linux-ppc-low.c: Remove forward declaration, move ppc_arch_setup lower
[thirdparty/binutils-gdb.git] / gdb / gdbserver / linux-ppc-low.c
CommitLineData
0a30fbc4
DJ
1/* GNU/Linux/PowerPC specific low level interface, for the remote server for
2 GDB.
32d0add0 3 Copyright (C) 1995-2015 Free Software Foundation, Inc.
0a30fbc4
DJ
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
0a30fbc4
DJ
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/>. */
0a30fbc4
DJ
19
20#include "server.h"
58caa3dc 21#include "linux-low.h"
0a30fbc4 22
b6430ec3 23#include <elf.h>
0a30fbc4
DJ
24#include <asm/ptrace.h>
25
514c5338 26#include "nat/ppc-linux.h"
b6430ec3
UW
27
28static unsigned long ppc_hwcap;
29
30
7284e1be
UW
31/* Defined in auto-generated file powerpc-32l.c. */
32void init_registers_powerpc_32l (void);
3aee8918
PA
33extern const struct target_desc *tdesc_powerpc_32l;
34
7284e1be
UW
35/* Defined in auto-generated file powerpc-altivec32l.c. */
36void init_registers_powerpc_altivec32l (void);
3aee8918
PA
37extern const struct target_desc *tdesc_powerpc_altivec32l;
38
f4d9bade
UW
39/* Defined in auto-generated file powerpc-cell32l.c. */
40void init_registers_powerpc_cell32l (void);
3aee8918
PA
41extern const struct target_desc *tdesc_powerpc_cell32l;
42
677c5bb1
LM
43/* Defined in auto-generated file powerpc-vsx32l.c. */
44void init_registers_powerpc_vsx32l (void);
3aee8918
PA
45extern const struct target_desc *tdesc_powerpc_vsx32l;
46
2c4ad781
TJB
47/* Defined in auto-generated file powerpc-isa205-32l.c. */
48void init_registers_powerpc_isa205_32l (void);
3aee8918
PA
49extern const struct target_desc *tdesc_powerpc_isa205_32l;
50
2c4ad781
TJB
51/* Defined in auto-generated file powerpc-isa205-altivec32l.c. */
52void init_registers_powerpc_isa205_altivec32l (void);
3aee8918
PA
53extern const struct target_desc *tdesc_powerpc_isa205_altivec32l;
54
2c4ad781
TJB
55/* Defined in auto-generated file powerpc-isa205-vsx32l.c. */
56void init_registers_powerpc_isa205_vsx32l (void);
3aee8918
PA
57extern const struct target_desc *tdesc_powerpc_isa205_vsx32l;
58
7284e1be
UW
59/* Defined in auto-generated file powerpc-e500l.c. */
60void init_registers_powerpc_e500l (void);
3aee8918
PA
61extern const struct target_desc *tdesc_powerpc_e500l;
62
7284e1be
UW
63/* Defined in auto-generated file powerpc-64l.c. */
64void init_registers_powerpc_64l (void);
3aee8918
PA
65extern const struct target_desc *tdesc_powerpc_64l;
66
7284e1be
UW
67/* Defined in auto-generated file powerpc-altivec64l.c. */
68void init_registers_powerpc_altivec64l (void);
3aee8918
PA
69extern const struct target_desc *tdesc_powerpc_altivec64l;
70
f4d9bade
UW
71/* Defined in auto-generated file powerpc-cell64l.c. */
72void init_registers_powerpc_cell64l (void);
3aee8918
PA
73extern const struct target_desc *tdesc_powerpc_cell64l;
74
677c5bb1
LM
75/* Defined in auto-generated file powerpc-vsx64l.c. */
76void init_registers_powerpc_vsx64l (void);
3aee8918
PA
77extern const struct target_desc *tdesc_powerpc_vsx64l;
78
2c4ad781
TJB
79/* Defined in auto-generated file powerpc-isa205-64l.c. */
80void init_registers_powerpc_isa205_64l (void);
3aee8918
PA
81extern const struct target_desc *tdesc_powerpc_isa205_64l;
82
2c4ad781
TJB
83/* Defined in auto-generated file powerpc-isa205-altivec64l.c. */
84void init_registers_powerpc_isa205_altivec64l (void);
3aee8918
PA
85extern const struct target_desc *tdesc_powerpc_isa205_altivec64l;
86
2c4ad781
TJB
87/* Defined in auto-generated file powerpc-isa205-vsx64l.c. */
88void init_registers_powerpc_isa205_vsx64l (void);
3aee8918 89extern const struct target_desc *tdesc_powerpc_isa205_vsx64l;
7284e1be
UW
90
91#define ppc_num_regs 73
92
5b0a002e
UW
93#ifdef __powerpc64__
94/* We use a constant for FPSCR instead of PT_FPSCR, because
95 many shipped PPC64 kernels had the wrong value in ptrace.h. */
96static int ppc_regmap[] =
97 {PT_R0 * 8, PT_R1 * 8, PT_R2 * 8, PT_R3 * 8,
98 PT_R4 * 8, PT_R5 * 8, PT_R6 * 8, PT_R7 * 8,
99 PT_R8 * 8, PT_R9 * 8, PT_R10 * 8, PT_R11 * 8,
100 PT_R12 * 8, PT_R13 * 8, PT_R14 * 8, PT_R15 * 8,
101 PT_R16 * 8, PT_R17 * 8, PT_R18 * 8, PT_R19 * 8,
102 PT_R20 * 8, PT_R21 * 8, PT_R22 * 8, PT_R23 * 8,
103 PT_R24 * 8, PT_R25 * 8, PT_R26 * 8, PT_R27 * 8,
104 PT_R28 * 8, PT_R29 * 8, PT_R30 * 8, PT_R31 * 8,
105 PT_FPR0*8, PT_FPR0*8 + 8, PT_FPR0*8+16, PT_FPR0*8+24,
106 PT_FPR0*8+32, PT_FPR0*8+40, PT_FPR0*8+48, PT_FPR0*8+56,
107 PT_FPR0*8+64, PT_FPR0*8+72, PT_FPR0*8+80, PT_FPR0*8+88,
108 PT_FPR0*8+96, PT_FPR0*8+104, PT_FPR0*8+112, PT_FPR0*8+120,
109 PT_FPR0*8+128, PT_FPR0*8+136, PT_FPR0*8+144, PT_FPR0*8+152,
110 PT_FPR0*8+160, PT_FPR0*8+168, PT_FPR0*8+176, PT_FPR0*8+184,
111 PT_FPR0*8+192, PT_FPR0*8+200, PT_FPR0*8+208, PT_FPR0*8+216,
112 PT_FPR0*8+224, PT_FPR0*8+232, PT_FPR0*8+240, PT_FPR0*8+248,
113 PT_NIP * 8, PT_MSR * 8, PT_CCR * 8, PT_LNK * 8,
7284e1be
UW
114 PT_CTR * 8, PT_XER * 8, PT_FPR0*8 + 256,
115 PT_ORIG_R3 * 8, PT_TRAP * 8 };
5b0a002e 116#else
0a30fbc4 117/* Currently, don't check/send MQ. */
2ec06d2e 118static int ppc_regmap[] =
0a30fbc4
DJ
119 {PT_R0 * 4, PT_R1 * 4, PT_R2 * 4, PT_R3 * 4,
120 PT_R4 * 4, PT_R5 * 4, PT_R6 * 4, PT_R7 * 4,
121 PT_R8 * 4, PT_R9 * 4, PT_R10 * 4, PT_R11 * 4,
122 PT_R12 * 4, PT_R13 * 4, PT_R14 * 4, PT_R15 * 4,
123 PT_R16 * 4, PT_R17 * 4, PT_R18 * 4, PT_R19 * 4,
124 PT_R20 * 4, PT_R21 * 4, PT_R22 * 4, PT_R23 * 4,
125 PT_R24 * 4, PT_R25 * 4, PT_R26 * 4, PT_R27 * 4,
126 PT_R28 * 4, PT_R29 * 4, PT_R30 * 4, PT_R31 * 4,
127 PT_FPR0*4, PT_FPR0*4 + 8, PT_FPR0*4+16, PT_FPR0*4+24,
128 PT_FPR0*4+32, PT_FPR0*4+40, PT_FPR0*4+48, PT_FPR0*4+56,
129 PT_FPR0*4+64, PT_FPR0*4+72, PT_FPR0*4+80, PT_FPR0*4+88,
130 PT_FPR0*4+96, PT_FPR0*4+104, PT_FPR0*4+112, PT_FPR0*4+120,
131 PT_FPR0*4+128, PT_FPR0*4+136, PT_FPR0*4+144, PT_FPR0*4+152,
132 PT_FPR0*4+160, PT_FPR0*4+168, PT_FPR0*4+176, PT_FPR0*4+184,
133 PT_FPR0*4+192, PT_FPR0*4+200, PT_FPR0*4+208, PT_FPR0*4+216,
134 PT_FPR0*4+224, PT_FPR0*4+232, PT_FPR0*4+240, PT_FPR0*4+248,
135 PT_NIP * 4, PT_MSR * 4, PT_CCR * 4, PT_LNK * 4,
7284e1be
UW
136 PT_CTR * 4, PT_XER * 4, PT_FPSCR * 4,
137 PT_ORIG_R3 * 4, PT_TRAP * 4
b6430ec3
UW
138 };
139
140static int ppc_regmap_e500[] =
141 {PT_R0 * 4, PT_R1 * 4, PT_R2 * 4, PT_R3 * 4,
142 PT_R4 * 4, PT_R5 * 4, PT_R6 * 4, PT_R7 * 4,
143 PT_R8 * 4, PT_R9 * 4, PT_R10 * 4, PT_R11 * 4,
144 PT_R12 * 4, PT_R13 * 4, PT_R14 * 4, PT_R15 * 4,
145 PT_R16 * 4, PT_R17 * 4, PT_R18 * 4, PT_R19 * 4,
146 PT_R20 * 4, PT_R21 * 4, PT_R22 * 4, PT_R23 * 4,
147 PT_R24 * 4, PT_R25 * 4, PT_R26 * 4, PT_R27 * 4,
148 PT_R28 * 4, PT_R29 * 4, PT_R30 * 4, PT_R31 * 4,
149 -1, -1, -1, -1,
150 -1, -1, -1, -1,
151 -1, -1, -1, -1,
152 -1, -1, -1, -1,
153 -1, -1, -1, -1,
154 -1, -1, -1, -1,
155 -1, -1, -1, -1,
156 -1, -1, -1, -1,
157 PT_NIP * 4, PT_MSR * 4, PT_CCR * 4, PT_LNK * 4,
7284e1be
UW
158 PT_CTR * 4, PT_XER * 4, -1,
159 PT_ORIG_R3 * 4, PT_TRAP * 4
30ed0a8f 160 };
5b0a002e 161#endif
0a30fbc4 162
2ec06d2e
DJ
163static int
164ppc_cannot_store_register (int regno)
0a30fbc4 165{
3aee8918
PA
166 const struct target_desc *tdesc = current_process ()->tdesc;
167
b6430ec3 168#ifndef __powerpc64__
bc1e36ca 169 /* Some kernels do not allow us to store fpscr. */
3aee8918
PA
170 if (!(ppc_hwcap & PPC_FEATURE_HAS_SPE)
171 && regno == find_regno (tdesc, "fpscr"))
bc1e36ca 172 return 2;
30ed0a8f 173#endif
bc1e36ca 174
7284e1be 175 /* Some kernels do not allow us to store orig_r3 or trap. */
3aee8918
PA
176 if (regno == find_regno (tdesc, "orig_r3")
177 || regno == find_regno (tdesc, "trap"))
7284e1be
UW
178 return 2;
179
0a30fbc4
DJ
180 return 0;
181}
182
2ec06d2e
DJ
183static int
184ppc_cannot_fetch_register (int regno)
0a30fbc4
DJ
185{
186 return 0;
187}
188
5b0a002e 189static void
442ea881 190ppc_collect_ptrace_register (struct regcache *regcache, int regno, char *buf)
5b0a002e 191{
76b233dd
UW
192 memset (buf, 0, sizeof (long));
193
2e4bb98a
EBM
194 if (__BYTE_ORDER == __LITTLE_ENDIAN)
195 {
196 /* Little-endian values always sit at the left end of the buffer. */
197 collect_register (regcache, regno, buf);
198 }
199 else if (__BYTE_ORDER == __BIG_ENDIAN)
200 {
201 /* Big-endian values sit at the right end of the buffer. In case of
202 registers whose sizes are smaller than sizeof (long), we must use a
203 padding to access them correctly. */
204 int size = register_size (regcache->tdesc, regno);
205
206 if (size < sizeof (long))
207 collect_register (regcache, regno, buf + sizeof (long) - size);
208 else
209 collect_register (regcache, regno, buf);
210 }
5b0a002e 211 else
2e4bb98a 212 perror_with_name ("Unexpected byte order");
5b0a002e
UW
213}
214
215static void
442ea881
PA
216ppc_supply_ptrace_register (struct regcache *regcache,
217 int regno, const char *buf)
5b0a002e 218{
2e4bb98a
EBM
219 if (__BYTE_ORDER == __LITTLE_ENDIAN)
220 {
221 /* Little-endian values always sit at the left end of the buffer. */
222 supply_register (regcache, regno, buf);
223 }
224 else if (__BYTE_ORDER == __BIG_ENDIAN)
225 {
226 /* Big-endian values sit at the right end of the buffer. In case of
227 registers whose sizes are smaller than sizeof (long), we must use a
228 padding to access them correctly. */
229 int size = register_size (regcache->tdesc, regno);
230
231 if (size < sizeof (long))
232 supply_register (regcache, regno, buf + sizeof (long) - size);
233 else
234 supply_register (regcache, regno, buf);
235 }
5b0a002e 236 else
2e4bb98a 237 perror_with_name ("Unexpected byte order");
5b0a002e
UW
238}
239
0b9ff2c0
UW
240
241#define INSTR_SC 0x44000002
242#define NR_spu_run 0x0116
243
244/* If the PPU thread is currently stopped on a spu_run system call,
245 return to FD and ADDR the file handle and NPC parameter address
246 used with the system call. Return non-zero if successful. */
247static int
442ea881 248parse_spufs_run (struct regcache *regcache, int *fd, CORE_ADDR *addr)
0b9ff2c0
UW
249{
250 CORE_ADDR curr_pc;
251 int curr_insn;
252 int curr_r0;
253
3aee8918 254 if (register_size (regcache->tdesc, 0) == 4)
0b9ff2c0
UW
255 {
256 unsigned int pc, r0, r3, r4;
442ea881
PA
257 collect_register_by_name (regcache, "pc", &pc);
258 collect_register_by_name (regcache, "r0", &r0);
259 collect_register_by_name (regcache, "orig_r3", &r3);
260 collect_register_by_name (regcache, "r4", &r4);
0b9ff2c0
UW
261 curr_pc = (CORE_ADDR) pc;
262 curr_r0 = (int) r0;
263 *fd = (int) r3;
264 *addr = (CORE_ADDR) r4;
265 }
266 else
267 {
268 unsigned long pc, r0, r3, r4;
442ea881
PA
269 collect_register_by_name (regcache, "pc", &pc);
270 collect_register_by_name (regcache, "r0", &r0);
271 collect_register_by_name (regcache, "orig_r3", &r3);
272 collect_register_by_name (regcache, "r4", &r4);
0b9ff2c0
UW
273 curr_pc = (CORE_ADDR) pc;
274 curr_r0 = (int) r0;
275 *fd = (int) r3;
276 *addr = (CORE_ADDR) r4;
277 }
278
279 /* Fetch instruction preceding current NIP. */
280 if ((*the_target->read_memory) (curr_pc - 4,
281 (unsigned char *) &curr_insn, 4) != 0)
282 return 0;
283 /* It should be a "sc" instruction. */
284 if (curr_insn != INSTR_SC)
285 return 0;
286 /* System call number should be NR_spu_run. */
287 if (curr_r0 != NR_spu_run)
288 return 0;
289
290 return 1;
291}
292
0d62e5e8 293static CORE_ADDR
442ea881 294ppc_get_pc (struct regcache *regcache)
0d62e5e8 295{
0b9ff2c0
UW
296 CORE_ADDR addr;
297 int fd;
298
442ea881 299 if (parse_spufs_run (regcache, &fd, &addr))
0b9ff2c0
UW
300 {
301 unsigned int pc;
302 (*the_target->read_memory) (addr, (unsigned char *) &pc, 4);
493e2a69
MS
303 return ((CORE_ADDR)1 << 63)
304 | ((CORE_ADDR)fd << 32) | (CORE_ADDR) (pc - 4);
0b9ff2c0 305 }
3aee8918 306 else if (register_size (regcache->tdesc, 0) == 4)
6fe305f7
UW
307 {
308 unsigned int pc;
442ea881 309 collect_register_by_name (regcache, "pc", &pc);
6fe305f7
UW
310 return (CORE_ADDR) pc;
311 }
312 else
313 {
314 unsigned long pc;
442ea881 315 collect_register_by_name (regcache, "pc", &pc);
6fe305f7
UW
316 return (CORE_ADDR) pc;
317 }
0d62e5e8
DJ
318}
319
320static void
442ea881 321ppc_set_pc (struct regcache *regcache, CORE_ADDR pc)
0d62e5e8 322{
0b9ff2c0
UW
323 CORE_ADDR addr;
324 int fd;
325
442ea881 326 if (parse_spufs_run (regcache, &fd, &addr))
0b9ff2c0
UW
327 {
328 unsigned int newpc = pc;
329 (*the_target->write_memory) (addr, (unsigned char *) &newpc, 4);
330 }
3aee8918 331 else if (register_size (regcache->tdesc, 0) == 4)
6fe305f7
UW
332 {
333 unsigned int newpc = pc;
442ea881 334 supply_register_by_name (regcache, "pc", &newpc);
6fe305f7
UW
335 }
336 else
337 {
338 unsigned long newpc = pc;
442ea881 339 supply_register_by_name (regcache, "pc", &newpc);
6fe305f7
UW
340 }
341}
342
b6430ec3
UW
343
344static int
345ppc_get_hwcap (unsigned long *valp)
346{
3aee8918
PA
347 const struct target_desc *tdesc = current_process ()->tdesc;
348 int wordsize = register_size (tdesc, 0);
b6430ec3
UW
349 unsigned char *data = alloca (2 * wordsize);
350 int offset = 0;
351
352 while ((*the_target->read_auxv) (offset, data, 2 * wordsize) == 2 * wordsize)
353 {
354 if (wordsize == 4)
355 {
356 unsigned int *data_p = (unsigned int *)data;
357 if (data_p[0] == AT_HWCAP)
358 {
359 *valp = data_p[1];
360 return 1;
361 }
362 }
363 else
364 {
365 unsigned long *data_p = (unsigned long *)data;
366 if (data_p[0] == AT_HWCAP)
367 {
368 *valp = data_p[1];
369 return 1;
370 }
371 }
372
373 offset += 2 * wordsize;
374 }
375
376 *valp = 0;
377 return 0;
378}
379
3aee8918
PA
380#ifndef __powerpc64__
381static int ppc_regmap_adjusted;
382#endif
383
0d62e5e8 384
5b0a002e 385/* Correct in either endianness.
0d62e5e8
DJ
386 This instruction is "twge r2, r2", which GDB uses as a software
387 breakpoint. */
5b0a002e 388static const unsigned int ppc_breakpoint = 0x7d821008;
0d62e5e8
DJ
389#define ppc_breakpoint_len 4
390
dd373349
AT
391/* Implementation of linux_target_ops method "sw_breakpoint_from_kind". */
392
393static const gdb_byte *
394ppc_sw_breakpoint_from_kind (int kind, int *size)
395{
396 *size = ppc_breakpoint_len;
397 return (const gdb_byte *) &ppc_breakpoint;
398}
399
0d62e5e8
DJ
400static int
401ppc_breakpoint_at (CORE_ADDR where)
402{
5b0a002e 403 unsigned int insn;
0d62e5e8 404
0b9ff2c0
UW
405 if (where & ((CORE_ADDR)1 << 63))
406 {
407 char mem_annex[32];
408 sprintf (mem_annex, "%d/mem", (int)((where >> 32) & 0x7fffffff));
409 (*the_target->qxfer_spu) (mem_annex, (unsigned char *) &insn,
410 NULL, where & 0xffffffff, 4);
411 if (insn == 0x3fff)
412 return 1;
413 }
414 else
415 {
416 (*the_target->read_memory) (where, (unsigned char *) &insn, 4);
417 if (insn == ppc_breakpoint)
418 return 1;
419 /* If necessary, recognize more trap instructions here. GDB only uses
420 the one. */
421 }
422
0d62e5e8
DJ
423 return 0;
424}
425
e9d25b98
DJ
426/* Provide only a fill function for the general register set. ps_lgetregs
427 will use this for NPTL support. */
428
442ea881 429static void ppc_fill_gregset (struct regcache *regcache, void *buf)
e9d25b98
DJ
430{
431 int i;
432
433 for (i = 0; i < 32; i++)
442ea881 434 ppc_collect_ptrace_register (regcache, i, (char *) buf + ppc_regmap[i]);
e9d25b98
DJ
435
436 for (i = 64; i < 70; i++)
442ea881 437 ppc_collect_ptrace_register (regcache, i, (char *) buf + ppc_regmap[i]);
7284e1be
UW
438
439 for (i = 71; i < 73; i++)
442ea881 440 ppc_collect_ptrace_register (regcache, i, (char *) buf + ppc_regmap[i]);
e9d25b98
DJ
441}
442
677c5bb1
LM
443#define SIZEOF_VSXREGS 32*8
444
445static void
442ea881 446ppc_fill_vsxregset (struct regcache *regcache, void *buf)
677c5bb1
LM
447{
448 int i, base;
449 char *regset = buf;
450
451 if (!(ppc_hwcap & PPC_FEATURE_HAS_VSX))
452 return;
453
3aee8918 454 base = find_regno (regcache->tdesc, "vs0h");
677c5bb1 455 for (i = 0; i < 32; i++)
442ea881 456 collect_register (regcache, base + i, &regset[i * 8]);
677c5bb1
LM
457}
458
459static void
442ea881 460ppc_store_vsxregset (struct regcache *regcache, const void *buf)
677c5bb1
LM
461{
462 int i, base;
463 const char *regset = buf;
464
465 if (!(ppc_hwcap & PPC_FEATURE_HAS_VSX))
466 return;
467
3aee8918 468 base = find_regno (regcache->tdesc, "vs0h");
677c5bb1 469 for (i = 0; i < 32; i++)
442ea881 470 supply_register (regcache, base + i, &regset[i * 8]);
677c5bb1
LM
471}
472
30ed0a8f
DJ
473#define SIZEOF_VRREGS 33*16+4
474
475static void
442ea881 476ppc_fill_vrregset (struct regcache *regcache, void *buf)
30ed0a8f
DJ
477{
478 int i, base;
479 char *regset = buf;
480
b6430ec3
UW
481 if (!(ppc_hwcap & PPC_FEATURE_HAS_ALTIVEC))
482 return;
483
3aee8918 484 base = find_regno (regcache->tdesc, "vr0");
30ed0a8f 485 for (i = 0; i < 32; i++)
442ea881 486 collect_register (regcache, base + i, &regset[i * 16]);
30ed0a8f 487
442ea881
PA
488 collect_register_by_name (regcache, "vscr", &regset[32 * 16 + 12]);
489 collect_register_by_name (regcache, "vrsave", &regset[33 * 16]);
30ed0a8f
DJ
490}
491
492static void
442ea881 493ppc_store_vrregset (struct regcache *regcache, const void *buf)
30ed0a8f
DJ
494{
495 int i, base;
496 const char *regset = buf;
497
b6430ec3
UW
498 if (!(ppc_hwcap & PPC_FEATURE_HAS_ALTIVEC))
499 return;
500
3aee8918 501 base = find_regno (regcache->tdesc, "vr0");
30ed0a8f 502 for (i = 0; i < 32; i++)
442ea881 503 supply_register (regcache, base + i, &regset[i * 16]);
30ed0a8f 504
442ea881
PA
505 supply_register_by_name (regcache, "vscr", &regset[32 * 16 + 12]);
506 supply_register_by_name (regcache, "vrsave", &regset[33 * 16]);
30ed0a8f
DJ
507}
508
30ed0a8f
DJ
509struct gdb_evrregset_t
510{
511 unsigned long evr[32];
512 unsigned long long acc;
513 unsigned long spefscr;
514};
515
516static void
442ea881 517ppc_fill_evrregset (struct regcache *regcache, void *buf)
30ed0a8f
DJ
518{
519 int i, ev0;
520 struct gdb_evrregset_t *regset = buf;
521
b6430ec3
UW
522 if (!(ppc_hwcap & PPC_FEATURE_HAS_SPE))
523 return;
524
3aee8918 525 ev0 = find_regno (regcache->tdesc, "ev0h");
30ed0a8f 526 for (i = 0; i < 32; i++)
442ea881 527 collect_register (regcache, ev0 + i, &regset->evr[i]);
30ed0a8f 528
442ea881
PA
529 collect_register_by_name (regcache, "acc", &regset->acc);
530 collect_register_by_name (regcache, "spefscr", &regset->spefscr);
30ed0a8f
DJ
531}
532
533static void
442ea881 534ppc_store_evrregset (struct regcache *regcache, const void *buf)
30ed0a8f
DJ
535{
536 int i, ev0;
537 const struct gdb_evrregset_t *regset = buf;
538
b6430ec3
UW
539 if (!(ppc_hwcap & PPC_FEATURE_HAS_SPE))
540 return;
541
3aee8918 542 ev0 = find_regno (regcache->tdesc, "ev0h");
30ed0a8f 543 for (i = 0; i < 32; i++)
442ea881 544 supply_register (regcache, ev0 + i, &regset->evr[i]);
30ed0a8f 545
442ea881
PA
546 supply_register_by_name (regcache, "acc", &regset->acc);
547 supply_register_by_name (regcache, "spefscr", &regset->spefscr);
30ed0a8f 548}
30ed0a8f 549
3aee8918 550static struct regset_info ppc_regsets[] = {
30ed0a8f
DJ
551 /* List the extra register sets before GENERAL_REGS. That way we will
552 fetch them every time, but still fall back to PTRACE_PEEKUSER for the
553 general registers. Some kernels support these, but not the newer
554 PPC_PTRACE_GETREGS. */
1570b33e 555 { PTRACE_GETVSXREGS, PTRACE_SETVSXREGS, 0, SIZEOF_VSXREGS, EXTENDED_REGS,
677c5bb1 556 ppc_fill_vsxregset, ppc_store_vsxregset },
1570b33e 557 { PTRACE_GETVRREGS, PTRACE_SETVRREGS, 0, SIZEOF_VRREGS, EXTENDED_REGS,
30ed0a8f 558 ppc_fill_vrregset, ppc_store_vrregset },
1570b33e 559 { PTRACE_GETEVRREGS, PTRACE_SETEVRREGS, 0, 32 * 4 + 8 + 4, EXTENDED_REGS,
30ed0a8f 560 ppc_fill_evrregset, ppc_store_evrregset },
1570b33e 561 { 0, 0, 0, 0, GENERAL_REGS, ppc_fill_gregset, NULL },
50bc912a 562 NULL_REGSET
e9d25b98
DJ
563};
564
3aee8918
PA
565static struct usrregs_info ppc_usrregs_info =
566 {
567 ppc_num_regs,
568 ppc_regmap,
569 };
570
571static struct regsets_info ppc_regsets_info =
572 {
573 ppc_regsets, /* regsets */
574 0, /* num_regsets */
575 NULL, /* disabled_regsets */
576 };
577
578static struct regs_info regs_info =
579 {
580 NULL, /* regset_bitmap */
581 &ppc_usrregs_info,
582 &ppc_regsets_info
583 };
584
585static const struct regs_info *
586ppc_regs_info (void)
587{
588 return &regs_info;
589}
590
e6c5bb05
SM
591static void
592ppc_arch_setup (void)
593{
594 const struct target_desc *tdesc;
595#ifdef __powerpc64__
596 long msr;
597 struct regcache *regcache;
598
599 /* On a 64-bit host, assume 64-bit inferior process with no
600 AltiVec registers. Reset ppc_hwcap to ensure that the
601 collect_register call below does not fail. */
602 tdesc = tdesc_powerpc_64l;
603 current_process ()->tdesc = tdesc;
604 ppc_hwcap = 0;
605
606 regcache = new_register_cache (tdesc);
607 fetch_inferior_registers (regcache, find_regno (tdesc, "msr"));
608 collect_register_by_name (regcache, "msr", &msr);
609 free_register_cache (regcache);
610 if (ppc64_64bit_inferior_p (msr))
611 {
612 ppc_get_hwcap (&ppc_hwcap);
613 if (ppc_hwcap & PPC_FEATURE_CELL)
614 tdesc = tdesc_powerpc_cell64l;
615 else if (ppc_hwcap & PPC_FEATURE_HAS_VSX)
616 {
617 /* Power ISA 2.05 (implemented by Power 6 and newer processors)
618 increases the FPSCR from 32 bits to 64 bits. Even though Power 7
619 supports this ISA version, it doesn't have PPC_FEATURE_ARCH_2_05
620 set, only PPC_FEATURE_ARCH_2_06. Since for now the only bits
621 used in the higher half of the register are for Decimal Floating
622 Point, we check if that feature is available to decide the size
623 of the FPSCR. */
624 if (ppc_hwcap & PPC_FEATURE_HAS_DFP)
625 tdesc = tdesc_powerpc_isa205_vsx64l;
626 else
627 tdesc = tdesc_powerpc_vsx64l;
628 }
629 else if (ppc_hwcap & PPC_FEATURE_HAS_ALTIVEC)
630 {
631 if (ppc_hwcap & PPC_FEATURE_HAS_DFP)
632 tdesc = tdesc_powerpc_isa205_altivec64l;
633 else
634 tdesc = tdesc_powerpc_altivec64l;
635 }
636
637 current_process ()->tdesc = tdesc;
638 return;
639 }
640#endif
641
642 /* OK, we have a 32-bit inferior. */
643 tdesc = tdesc_powerpc_32l;
644 current_process ()->tdesc = tdesc;
645
646 ppc_get_hwcap (&ppc_hwcap);
647 if (ppc_hwcap & PPC_FEATURE_CELL)
648 tdesc = tdesc_powerpc_cell32l;
649 else if (ppc_hwcap & PPC_FEATURE_HAS_VSX)
650 {
651 if (ppc_hwcap & PPC_FEATURE_HAS_DFP)
652 tdesc = tdesc_powerpc_isa205_vsx32l;
653 else
654 tdesc = tdesc_powerpc_vsx32l;
655 }
656 else if (ppc_hwcap & PPC_FEATURE_HAS_ALTIVEC)
657 {
658 if (ppc_hwcap & PPC_FEATURE_HAS_DFP)
659 tdesc = tdesc_powerpc_isa205_altivec32l;
660 else
661 tdesc = tdesc_powerpc_altivec32l;
662 }
663
664 /* On 32-bit machines, check for SPE registers.
665 Set the low target's regmap field as appropriately. */
666#ifndef __powerpc64__
667 if (ppc_hwcap & PPC_FEATURE_HAS_SPE)
668 tdesc = tdesc_powerpc_e500l;
669
670 if (!ppc_regmap_adjusted)
671 {
672 if (ppc_hwcap & PPC_FEATURE_HAS_SPE)
673 ppc_usrregs_info.regmap = ppc_regmap_e500;
674
675 /* If the FPSCR is 64-bit wide, we need to fetch the whole
676 64-bit slot and not just its second word. The PT_FPSCR
677 supplied in a 32-bit GDB compilation doesn't reflect
678 this. */
679 if (register_size (tdesc, 70) == 8)
680 ppc_regmap[70] = (48 + 2*32) * sizeof (long);
681
682 ppc_regmap_adjusted = 1;
683 }
684#endif
685 current_process ()->tdesc = tdesc;
686}
687
2ec06d2e 688struct linux_target_ops the_low_target = {
6fe305f7 689 ppc_arch_setup,
3aee8918 690 ppc_regs_info,
2ec06d2e
DJ
691 ppc_cannot_fetch_register,
692 ppc_cannot_store_register,
c14dfd32 693 NULL, /* fetch_register */
0d62e5e8
DJ
694 ppc_get_pc,
695 ppc_set_pc,
dd373349
AT
696 NULL, /* breakpoint_kind_from_pc */
697 ppc_sw_breakpoint_from_kind,
0d62e5e8
DJ
698 NULL,
699 0,
700 ppc_breakpoint_at,
802e8e6d 701 NULL, /* supports_z_point_type */
5b0a002e
UW
702 NULL,
703 NULL,
704 NULL,
705 NULL,
706 ppc_collect_ptrace_register,
707 ppc_supply_ptrace_register,
2ec06d2e 708};
3aee8918
PA
709
710void
711initialize_low_arch (void)
712{
713 /* Initialize the Linux target descriptions. */
714
715 init_registers_powerpc_32l ();
716 init_registers_powerpc_altivec32l ();
717 init_registers_powerpc_cell32l ();
718 init_registers_powerpc_vsx32l ();
719 init_registers_powerpc_isa205_32l ();
720 init_registers_powerpc_isa205_altivec32l ();
721 init_registers_powerpc_isa205_vsx32l ();
722 init_registers_powerpc_e500l ();
723 init_registers_powerpc_64l ();
724 init_registers_powerpc_altivec64l ();
725 init_registers_powerpc_cell64l ();
726 init_registers_powerpc_vsx64l ();
727 init_registers_powerpc_isa205_64l ();
728 init_registers_powerpc_isa205_altivec64l ();
729 init_registers_powerpc_isa205_vsx64l ();
730
731 initialize_regsets_info (&ppc_regsets_info);
732}