5832dc7ade7a52725c07fa0ed6d4f24aaf16225f
[deliverable/binutils-gdb.git] / gdb / gdbserver / linux-ppc-low.c
1 /* GNU/Linux/PowerPC specific low level interface, for the remote server for
2 GDB.
3 Copyright (C) 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2005, 2007, 2008,
4 2009, 2010 Free Software Foundation, Inc.
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20
21 #include "server.h"
22 #include "linux-low.h"
23
24 #include <elf.h>
25 #include <asm/ptrace.h>
26
27 /* These are in <asm/cputable.h> in current kernels. */
28 #define PPC_FEATURE_HAS_VSX 0x00000080
29 #define PPC_FEATURE_HAS_ALTIVEC 0x10000000
30 #define PPC_FEATURE_HAS_SPE 0x00800000
31 #define PPC_FEATURE_CELL 0x00010000
32 #define PPC_FEATURE_HAS_DFP 0x00000400
33
34 static unsigned long ppc_hwcap;
35
36
37 /* Defined in auto-generated file powerpc-32l.c. */
38 void init_registers_powerpc_32l (void);
39 /* Defined in auto-generated file powerpc-altivec32l.c. */
40 void init_registers_powerpc_altivec32l (void);
41 /* Defined in auto-generated file powerpc-cell32l.c. */
42 void init_registers_powerpc_cell32l (void);
43 /* Defined in auto-generated file powerpc-vsx32l.c. */
44 void init_registers_powerpc_vsx32l (void);
45 /* Defined in auto-generated file powerpc-isa205-32l.c. */
46 void init_registers_powerpc_isa205_32l (void);
47 /* Defined in auto-generated file powerpc-isa205-altivec32l.c. */
48 void init_registers_powerpc_isa205_altivec32l (void);
49 /* Defined in auto-generated file powerpc-isa205-vsx32l.c. */
50 void init_registers_powerpc_isa205_vsx32l (void);
51 /* Defined in auto-generated file powerpc-e500l.c. */
52 void init_registers_powerpc_e500l (void);
53 /* Defined in auto-generated file powerpc-64l.c. */
54 void init_registers_powerpc_64l (void);
55 /* Defined in auto-generated file powerpc-altivec64l.c. */
56 void init_registers_powerpc_altivec64l (void);
57 /* Defined in auto-generated file powerpc-cell64l.c. */
58 void init_registers_powerpc_cell64l (void);
59 /* Defined in auto-generated file powerpc-vsx64l.c. */
60 void init_registers_powerpc_vsx64l (void);
61 /* Defined in auto-generated file powerpc-isa205-64l.c. */
62 void init_registers_powerpc_isa205_64l (void);
63 /* Defined in auto-generated file powerpc-isa205-altivec64l.c. */
64 void init_registers_powerpc_isa205_altivec64l (void);
65 /* Defined in auto-generated file powerpc-isa205-vsx64l.c. */
66 void init_registers_powerpc_isa205_vsx64l (void);
67
68 #define ppc_num_regs 73
69
70 /* This sometimes isn't defined. */
71 #ifndef PT_ORIG_R3
72 #define PT_ORIG_R3 34
73 #endif
74 #ifndef PT_TRAP
75 #define PT_TRAP 40
76 #endif
77
78 #ifdef __powerpc64__
79 /* We use a constant for FPSCR instead of PT_FPSCR, because
80 many shipped PPC64 kernels had the wrong value in ptrace.h. */
81 static int ppc_regmap[] =
82 {PT_R0 * 8, PT_R1 * 8, PT_R2 * 8, PT_R3 * 8,
83 PT_R4 * 8, PT_R5 * 8, PT_R6 * 8, PT_R7 * 8,
84 PT_R8 * 8, PT_R9 * 8, PT_R10 * 8, PT_R11 * 8,
85 PT_R12 * 8, PT_R13 * 8, PT_R14 * 8, PT_R15 * 8,
86 PT_R16 * 8, PT_R17 * 8, PT_R18 * 8, PT_R19 * 8,
87 PT_R20 * 8, PT_R21 * 8, PT_R22 * 8, PT_R23 * 8,
88 PT_R24 * 8, PT_R25 * 8, PT_R26 * 8, PT_R27 * 8,
89 PT_R28 * 8, PT_R29 * 8, PT_R30 * 8, PT_R31 * 8,
90 PT_FPR0*8, PT_FPR0*8 + 8, PT_FPR0*8+16, PT_FPR0*8+24,
91 PT_FPR0*8+32, PT_FPR0*8+40, PT_FPR0*8+48, PT_FPR0*8+56,
92 PT_FPR0*8+64, PT_FPR0*8+72, PT_FPR0*8+80, PT_FPR0*8+88,
93 PT_FPR0*8+96, PT_FPR0*8+104, PT_FPR0*8+112, PT_FPR0*8+120,
94 PT_FPR0*8+128, PT_FPR0*8+136, PT_FPR0*8+144, PT_FPR0*8+152,
95 PT_FPR0*8+160, PT_FPR0*8+168, PT_FPR0*8+176, PT_FPR0*8+184,
96 PT_FPR0*8+192, PT_FPR0*8+200, PT_FPR0*8+208, PT_FPR0*8+216,
97 PT_FPR0*8+224, PT_FPR0*8+232, PT_FPR0*8+240, PT_FPR0*8+248,
98 PT_NIP * 8, PT_MSR * 8, PT_CCR * 8, PT_LNK * 8,
99 PT_CTR * 8, PT_XER * 8, PT_FPR0*8 + 256,
100 PT_ORIG_R3 * 8, PT_TRAP * 8 };
101 #else
102 /* Currently, don't check/send MQ. */
103 static int ppc_regmap[] =
104 {PT_R0 * 4, PT_R1 * 4, PT_R2 * 4, PT_R3 * 4,
105 PT_R4 * 4, PT_R5 * 4, PT_R6 * 4, PT_R7 * 4,
106 PT_R8 * 4, PT_R9 * 4, PT_R10 * 4, PT_R11 * 4,
107 PT_R12 * 4, PT_R13 * 4, PT_R14 * 4, PT_R15 * 4,
108 PT_R16 * 4, PT_R17 * 4, PT_R18 * 4, PT_R19 * 4,
109 PT_R20 * 4, PT_R21 * 4, PT_R22 * 4, PT_R23 * 4,
110 PT_R24 * 4, PT_R25 * 4, PT_R26 * 4, PT_R27 * 4,
111 PT_R28 * 4, PT_R29 * 4, PT_R30 * 4, PT_R31 * 4,
112 PT_FPR0*4, PT_FPR0*4 + 8, PT_FPR0*4+16, PT_FPR0*4+24,
113 PT_FPR0*4+32, PT_FPR0*4+40, PT_FPR0*4+48, PT_FPR0*4+56,
114 PT_FPR0*4+64, PT_FPR0*4+72, PT_FPR0*4+80, PT_FPR0*4+88,
115 PT_FPR0*4+96, PT_FPR0*4+104, PT_FPR0*4+112, PT_FPR0*4+120,
116 PT_FPR0*4+128, PT_FPR0*4+136, PT_FPR0*4+144, PT_FPR0*4+152,
117 PT_FPR0*4+160, PT_FPR0*4+168, PT_FPR0*4+176, PT_FPR0*4+184,
118 PT_FPR0*4+192, PT_FPR0*4+200, PT_FPR0*4+208, PT_FPR0*4+216,
119 PT_FPR0*4+224, PT_FPR0*4+232, PT_FPR0*4+240, PT_FPR0*4+248,
120 PT_NIP * 4, PT_MSR * 4, PT_CCR * 4, PT_LNK * 4,
121 PT_CTR * 4, PT_XER * 4, PT_FPSCR * 4,
122 PT_ORIG_R3 * 4, PT_TRAP * 4
123 };
124
125 static int ppc_regmap_e500[] =
126 {PT_R0 * 4, PT_R1 * 4, PT_R2 * 4, PT_R3 * 4,
127 PT_R4 * 4, PT_R5 * 4, PT_R6 * 4, PT_R7 * 4,
128 PT_R8 * 4, PT_R9 * 4, PT_R10 * 4, PT_R11 * 4,
129 PT_R12 * 4, PT_R13 * 4, PT_R14 * 4, PT_R15 * 4,
130 PT_R16 * 4, PT_R17 * 4, PT_R18 * 4, PT_R19 * 4,
131 PT_R20 * 4, PT_R21 * 4, PT_R22 * 4, PT_R23 * 4,
132 PT_R24 * 4, PT_R25 * 4, PT_R26 * 4, PT_R27 * 4,
133 PT_R28 * 4, PT_R29 * 4, PT_R30 * 4, PT_R31 * 4,
134 -1, -1, -1, -1,
135 -1, -1, -1, -1,
136 -1, -1, -1, -1,
137 -1, -1, -1, -1,
138 -1, -1, -1, -1,
139 -1, -1, -1, -1,
140 -1, -1, -1, -1,
141 -1, -1, -1, -1,
142 PT_NIP * 4, PT_MSR * 4, PT_CCR * 4, PT_LNK * 4,
143 PT_CTR * 4, PT_XER * 4, -1,
144 PT_ORIG_R3 * 4, PT_TRAP * 4
145 };
146 #endif
147
148 static int
149 ppc_cannot_store_register (int regno)
150 {
151 #ifndef __powerpc64__
152 /* Some kernels do not allow us to store fpscr. */
153 if (!(ppc_hwcap & PPC_FEATURE_HAS_SPE) && regno == find_regno ("fpscr"))
154 return 2;
155 #endif
156
157 /* Some kernels do not allow us to store orig_r3 or trap. */
158 if (regno == find_regno ("orig_r3")
159 || regno == find_regno ("trap"))
160 return 2;
161
162 return 0;
163 }
164
165 static int
166 ppc_cannot_fetch_register (int regno)
167 {
168 return 0;
169 }
170
171 static void
172 ppc_collect_ptrace_register (struct regcache *regcache, int regno, char *buf)
173 {
174 int size = register_size (regno);
175
176 memset (buf, 0, sizeof (long));
177
178 if (size < sizeof (long))
179 collect_register (regcache, regno, buf + sizeof (long) - size);
180 else
181 collect_register (regcache, regno, buf);
182 }
183
184 static void
185 ppc_supply_ptrace_register (struct regcache *regcache,
186 int regno, const char *buf)
187 {
188 int size = register_size (regno);
189 if (size < sizeof (long))
190 supply_register (regcache, regno, buf + sizeof (long) - size);
191 else
192 supply_register (regcache, regno, buf);
193 }
194
195
196 #define INSTR_SC 0x44000002
197 #define NR_spu_run 0x0116
198
199 /* If the PPU thread is currently stopped on a spu_run system call,
200 return to FD and ADDR the file handle and NPC parameter address
201 used with the system call. Return non-zero if successful. */
202 static int
203 parse_spufs_run (struct regcache *regcache, int *fd, CORE_ADDR *addr)
204 {
205 CORE_ADDR curr_pc;
206 int curr_insn;
207 int curr_r0;
208
209 if (register_size (0) == 4)
210 {
211 unsigned int pc, r0, r3, r4;
212 collect_register_by_name (regcache, "pc", &pc);
213 collect_register_by_name (regcache, "r0", &r0);
214 collect_register_by_name (regcache, "orig_r3", &r3);
215 collect_register_by_name (regcache, "r4", &r4);
216 curr_pc = (CORE_ADDR) pc;
217 curr_r0 = (int) r0;
218 *fd = (int) r3;
219 *addr = (CORE_ADDR) r4;
220 }
221 else
222 {
223 unsigned long pc, r0, r3, r4;
224 collect_register_by_name (regcache, "pc", &pc);
225 collect_register_by_name (regcache, "r0", &r0);
226 collect_register_by_name (regcache, "orig_r3", &r3);
227 collect_register_by_name (regcache, "r4", &r4);
228 curr_pc = (CORE_ADDR) pc;
229 curr_r0 = (int) r0;
230 *fd = (int) r3;
231 *addr = (CORE_ADDR) r4;
232 }
233
234 /* Fetch instruction preceding current NIP. */
235 if ((*the_target->read_memory) (curr_pc - 4,
236 (unsigned char *) &curr_insn, 4) != 0)
237 return 0;
238 /* It should be a "sc" instruction. */
239 if (curr_insn != INSTR_SC)
240 return 0;
241 /* System call number should be NR_spu_run. */
242 if (curr_r0 != NR_spu_run)
243 return 0;
244
245 return 1;
246 }
247
248 static CORE_ADDR
249 ppc_get_pc (struct regcache *regcache)
250 {
251 CORE_ADDR addr;
252 int fd;
253
254 if (parse_spufs_run (regcache, &fd, &addr))
255 {
256 unsigned int pc;
257 (*the_target->read_memory) (addr, (unsigned char *) &pc, 4);
258 return ((CORE_ADDR)1 << 63) | ((CORE_ADDR)fd << 32) | (CORE_ADDR) (pc - 4);
259 }
260 else if (register_size (0) == 4)
261 {
262 unsigned int pc;
263 collect_register_by_name (regcache, "pc", &pc);
264 return (CORE_ADDR) pc;
265 }
266 else
267 {
268 unsigned long pc;
269 collect_register_by_name (regcache, "pc", &pc);
270 return (CORE_ADDR) pc;
271 }
272 }
273
274 static void
275 ppc_set_pc (struct regcache *regcache, CORE_ADDR pc)
276 {
277 CORE_ADDR addr;
278 int fd;
279
280 if (parse_spufs_run (regcache, &fd, &addr))
281 {
282 unsigned int newpc = pc;
283 (*the_target->write_memory) (addr, (unsigned char *) &newpc, 4);
284 }
285 else if (register_size (0) == 4)
286 {
287 unsigned int newpc = pc;
288 supply_register_by_name (regcache, "pc", &newpc);
289 }
290 else
291 {
292 unsigned long newpc = pc;
293 supply_register_by_name (regcache, "pc", &newpc);
294 }
295 }
296
297
298 static int
299 ppc_get_hwcap (unsigned long *valp)
300 {
301 int wordsize = register_size (0);
302 unsigned char *data = alloca (2 * wordsize);
303 int offset = 0;
304
305 while ((*the_target->read_auxv) (offset, data, 2 * wordsize) == 2 * wordsize)
306 {
307 if (wordsize == 4)
308 {
309 unsigned int *data_p = (unsigned int *)data;
310 if (data_p[0] == AT_HWCAP)
311 {
312 *valp = data_p[1];
313 return 1;
314 }
315 }
316 else
317 {
318 unsigned long *data_p = (unsigned long *)data;
319 if (data_p[0] == AT_HWCAP)
320 {
321 *valp = data_p[1];
322 return 1;
323 }
324 }
325
326 offset += 2 * wordsize;
327 }
328
329 *valp = 0;
330 return 0;
331 }
332
333 static void
334 ppc_arch_setup (void)
335 {
336 #ifdef __powerpc64__
337 long msr;
338
339 /* On a 64-bit host, assume 64-bit inferior process with no
340 AltiVec registers. Reset ppc_hwcap to ensure that the
341 collect_register call below does not fail. */
342 init_registers_powerpc_64l ();
343 ppc_hwcap = 0;
344
345 /* Only if the high bit of the MSR is set, we actually have
346 a 64-bit inferior. */
347 collect_register_by_name ("msr", &msr);
348 if (msr < 0)
349 {
350 ppc_get_hwcap (&ppc_hwcap);
351 if (ppc_hwcap & PPC_FEATURE_CELL)
352 init_registers_powerpc_cell64l ();
353 else if (ppc_hwcap & PPC_FEATURE_HAS_VSX)
354 {
355 /* Power ISA 2.05 (implemented by Power 6 and newer processors)
356 increases the FPSCR from 32 bits to 64 bits. Even though Power 7
357 supports this ISA version, it doesn't have PPC_FEATURE_ARCH_2_05
358 set, only PPC_FEATURE_ARCH_2_06. Since for now the only bits
359 used in the higher half of the register are for Decimal Floating
360 Point, we check if that feature is available to decide the size
361 of the FPSCR. */
362 if (ppc_hwcap & PPC_FEATURE_HAS_DFP)
363 init_registers_powerpc_isa205_vsx64l ();
364 else
365 init_registers_powerpc_vsx64l ();
366 }
367 else if (ppc_hwcap & PPC_FEATURE_HAS_ALTIVEC)
368 {
369 if (ppc_hwcap & PPC_FEATURE_HAS_DFP)
370 init_registers_powerpc_isa205_altivec64l ();
371 else
372 init_registers_powerpc_altivec64l ();
373 }
374
375 return;
376 }
377 #endif
378
379 /* OK, we have a 32-bit inferior. */
380 init_registers_powerpc_32l ();
381
382 ppc_get_hwcap (&ppc_hwcap);
383 if (ppc_hwcap & PPC_FEATURE_CELL)
384 init_registers_powerpc_cell32l ();
385 else if (ppc_hwcap & PPC_FEATURE_HAS_VSX)
386 {
387 if (ppc_hwcap & PPC_FEATURE_HAS_DFP)
388 init_registers_powerpc_isa205_vsx32l ();
389 else
390 init_registers_powerpc_vsx32l ();
391 }
392 else if (ppc_hwcap & PPC_FEATURE_HAS_ALTIVEC)
393 {
394 if (ppc_hwcap & PPC_FEATURE_HAS_DFP)
395 init_registers_powerpc_isa205_altivec32l ();
396 else
397 init_registers_powerpc_altivec32l ();
398 }
399
400 /* On 32-bit machines, check for SPE registers.
401 Set the low target's regmap field as appropriately. */
402 #ifndef __powerpc64__
403 the_low_target.regmap = ppc_regmap;
404 if (ppc_hwcap & PPC_FEATURE_HAS_SPE)
405 {
406 init_registers_powerpc_e500l ();
407 the_low_target.regmap = ppc_regmap_e500;
408 }
409
410 /* If the FPSCR is 64-bit wide, we need to fetch the whole 64-bit
411 slot and not just its second word. The PT_FPSCR supplied in a
412 32-bit GDB compilation doesn't reflect this. */
413 if (register_size (70) == 8)
414 ppc_regmap[70] = (48 + 2*32) * sizeof (long);
415 #endif
416 }
417
418 /* Correct in either endianness.
419 This instruction is "twge r2, r2", which GDB uses as a software
420 breakpoint. */
421 static const unsigned int ppc_breakpoint = 0x7d821008;
422 #define ppc_breakpoint_len 4
423
424 static int
425 ppc_breakpoint_at (CORE_ADDR where)
426 {
427 unsigned int insn;
428
429 if (where & ((CORE_ADDR)1 << 63))
430 {
431 char mem_annex[32];
432 sprintf (mem_annex, "%d/mem", (int)((where >> 32) & 0x7fffffff));
433 (*the_target->qxfer_spu) (mem_annex, (unsigned char *) &insn,
434 NULL, where & 0xffffffff, 4);
435 if (insn == 0x3fff)
436 return 1;
437 }
438 else
439 {
440 (*the_target->read_memory) (where, (unsigned char *) &insn, 4);
441 if (insn == ppc_breakpoint)
442 return 1;
443 /* If necessary, recognize more trap instructions here. GDB only uses
444 the one. */
445 }
446
447 return 0;
448 }
449
450 /* Provide only a fill function for the general register set. ps_lgetregs
451 will use this for NPTL support. */
452
453 static void ppc_fill_gregset (struct regcache *regcache, void *buf)
454 {
455 int i;
456
457 for (i = 0; i < 32; i++)
458 ppc_collect_ptrace_register (regcache, i, (char *) buf + ppc_regmap[i]);
459
460 for (i = 64; i < 70; i++)
461 ppc_collect_ptrace_register (regcache, i, (char *) buf + ppc_regmap[i]);
462
463 for (i = 71; i < 73; i++)
464 ppc_collect_ptrace_register (regcache, i, (char *) buf + ppc_regmap[i]);
465 }
466
467 #ifndef PTRACE_GETVSXREGS
468 #define PTRACE_GETVSXREGS 27
469 #define PTRACE_SETVSXREGS 28
470 #endif
471
472 #define SIZEOF_VSXREGS 32*8
473
474 static void
475 ppc_fill_vsxregset (struct regcache *regcache, void *buf)
476 {
477 int i, base;
478 char *regset = buf;
479
480 if (!(ppc_hwcap & PPC_FEATURE_HAS_VSX))
481 return;
482
483 base = find_regno ("vs0h");
484 for (i = 0; i < 32; i++)
485 collect_register (regcache, base + i, &regset[i * 8]);
486 }
487
488 static void
489 ppc_store_vsxregset (struct regcache *regcache, const void *buf)
490 {
491 int i, base;
492 const char *regset = buf;
493
494 if (!(ppc_hwcap & PPC_FEATURE_HAS_VSX))
495 return;
496
497 base = find_regno ("vs0h");
498 for (i = 0; i < 32; i++)
499 supply_register (regcache, base + i, &regset[i * 8]);
500 }
501
502 #ifndef PTRACE_GETVRREGS
503 #define PTRACE_GETVRREGS 18
504 #define PTRACE_SETVRREGS 19
505 #endif
506
507 #define SIZEOF_VRREGS 33*16+4
508
509 static void
510 ppc_fill_vrregset (struct regcache *regcache, void *buf)
511 {
512 int i, base;
513 char *regset = buf;
514
515 if (!(ppc_hwcap & PPC_FEATURE_HAS_ALTIVEC))
516 return;
517
518 base = find_regno ("vr0");
519 for (i = 0; i < 32; i++)
520 collect_register (regcache, base + i, &regset[i * 16]);
521
522 collect_register_by_name (regcache, "vscr", &regset[32 * 16 + 12]);
523 collect_register_by_name (regcache, "vrsave", &regset[33 * 16]);
524 }
525
526 static void
527 ppc_store_vrregset (struct regcache *regcache, const void *buf)
528 {
529 int i, base;
530 const char *regset = buf;
531
532 if (!(ppc_hwcap & PPC_FEATURE_HAS_ALTIVEC))
533 return;
534
535 base = find_regno ("vr0");
536 for (i = 0; i < 32; i++)
537 supply_register (regcache, base + i, &regset[i * 16]);
538
539 supply_register_by_name (regcache, "vscr", &regset[32 * 16 + 12]);
540 supply_register_by_name (regcache, "vrsave", &regset[33 * 16]);
541 }
542
543 #ifndef PTRACE_GETEVRREGS
544 #define PTRACE_GETEVRREGS 20
545 #define PTRACE_SETEVRREGS 21
546 #endif
547
548 struct gdb_evrregset_t
549 {
550 unsigned long evr[32];
551 unsigned long long acc;
552 unsigned long spefscr;
553 };
554
555 static void
556 ppc_fill_evrregset (struct regcache *regcache, void *buf)
557 {
558 int i, ev0;
559 struct gdb_evrregset_t *regset = buf;
560
561 if (!(ppc_hwcap & PPC_FEATURE_HAS_SPE))
562 return;
563
564 ev0 = find_regno ("ev0h");
565 for (i = 0; i < 32; i++)
566 collect_register (regcache, ev0 + i, &regset->evr[i]);
567
568 collect_register_by_name (regcache, "acc", &regset->acc);
569 collect_register_by_name (regcache, "spefscr", &regset->spefscr);
570 }
571
572 static void
573 ppc_store_evrregset (struct regcache *regcache, const void *buf)
574 {
575 int i, ev0;
576 const struct gdb_evrregset_t *regset = buf;
577
578 if (!(ppc_hwcap & PPC_FEATURE_HAS_SPE))
579 return;
580
581 ev0 = find_regno ("ev0h");
582 for (i = 0; i < 32; i++)
583 supply_register (regcache, ev0 + i, &regset->evr[i]);
584
585 supply_register_by_name (regcache, "acc", &regset->acc);
586 supply_register_by_name (regcache, "spefscr", &regset->spefscr);
587 }
588
589 struct regset_info target_regsets[] = {
590 /* List the extra register sets before GENERAL_REGS. That way we will
591 fetch them every time, but still fall back to PTRACE_PEEKUSER for the
592 general registers. Some kernels support these, but not the newer
593 PPC_PTRACE_GETREGS. */
594 { PTRACE_GETVSXREGS, PTRACE_SETVSXREGS, SIZEOF_VSXREGS, EXTENDED_REGS,
595 ppc_fill_vsxregset, ppc_store_vsxregset },
596 { PTRACE_GETVRREGS, PTRACE_SETVRREGS, SIZEOF_VRREGS, EXTENDED_REGS,
597 ppc_fill_vrregset, ppc_store_vrregset },
598 { PTRACE_GETEVRREGS, PTRACE_SETEVRREGS, 32 * 4 + 8 + 4, EXTENDED_REGS,
599 ppc_fill_evrregset, ppc_store_evrregset },
600 { 0, 0, 0, GENERAL_REGS, ppc_fill_gregset, NULL },
601 { 0, 0, -1, -1, NULL, NULL }
602 };
603
604 struct linux_target_ops the_low_target = {
605 ppc_arch_setup,
606 ppc_num_regs,
607 ppc_regmap,
608 ppc_cannot_fetch_register,
609 ppc_cannot_store_register,
610 ppc_get_pc,
611 ppc_set_pc,
612 (const unsigned char *) &ppc_breakpoint,
613 ppc_breakpoint_len,
614 NULL,
615 0,
616 ppc_breakpoint_at,
617 NULL,
618 NULL,
619 NULL,
620 NULL,
621 ppc_collect_ptrace_register,
622 ppc_supply_ptrace_register,
623 };
This page took 0.043903 seconds and 4 git commands to generate.