1 /* GNU/Linux/PowerPC specific low level interface, for the remote server for
3 Copyright (C) 1995-2019 Free Software Foundation, Inc.
5 This file is part of GDB.
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
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
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.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
21 #include "linux-low.h"
23 #include "elf/common.h"
26 #include <asm/ptrace.h>
28 #include "arch/ppc-linux-common.h"
29 #include "arch/ppc-linux-tdesc.h"
30 #include "nat/ppc-linux.h"
31 #include "nat/linux-ptrace.h"
32 #include "linux-ppc-tdesc-init.h"
34 #include "tracepoint.h"
36 #define PPC_FIELD(value, from, len) \
37 (((value) >> (32 - (from) - (len))) & ((1 << (len)) - 1))
38 #define PPC_SEXT(v, bs) \
39 ((((CORE_ADDR) (v) & (((CORE_ADDR) 1 << (bs)) - 1)) \
40 ^ ((CORE_ADDR) 1 << ((bs) - 1))) \
41 - ((CORE_ADDR) 1 << ((bs) - 1)))
42 #define PPC_OP6(insn) PPC_FIELD (insn, 0, 6)
43 #define PPC_BO(insn) PPC_FIELD (insn, 6, 5)
44 #define PPC_LI(insn) (PPC_SEXT (PPC_FIELD (insn, 6, 24), 24) << 2)
45 #define PPC_BD(insn) (PPC_SEXT (PPC_FIELD (insn, 16, 14), 14) << 2)
47 /* Holds the AT_HWCAP auxv entry. */
49 static unsigned long ppc_hwcap
;
51 /* Holds the AT_HWCAP2 auxv entry. */
53 static unsigned long ppc_hwcap2
;
56 #define ppc_num_regs 73
59 /* We use a constant for FPSCR instead of PT_FPSCR, because
60 many shipped PPC64 kernels had the wrong value in ptrace.h. */
61 static int ppc_regmap
[] =
62 {PT_R0
* 8, PT_R1
* 8, PT_R2
* 8, PT_R3
* 8,
63 PT_R4
* 8, PT_R5
* 8, PT_R6
* 8, PT_R7
* 8,
64 PT_R8
* 8, PT_R9
* 8, PT_R10
* 8, PT_R11
* 8,
65 PT_R12
* 8, PT_R13
* 8, PT_R14
* 8, PT_R15
* 8,
66 PT_R16
* 8, PT_R17
* 8, PT_R18
* 8, PT_R19
* 8,
67 PT_R20
* 8, PT_R21
* 8, PT_R22
* 8, PT_R23
* 8,
68 PT_R24
* 8, PT_R25
* 8, PT_R26
* 8, PT_R27
* 8,
69 PT_R28
* 8, PT_R29
* 8, PT_R30
* 8, PT_R31
* 8,
70 PT_FPR0
*8, PT_FPR0
*8 + 8, PT_FPR0
*8+16, PT_FPR0
*8+24,
71 PT_FPR0
*8+32, PT_FPR0
*8+40, PT_FPR0
*8+48, PT_FPR0
*8+56,
72 PT_FPR0
*8+64, PT_FPR0
*8+72, PT_FPR0
*8+80, PT_FPR0
*8+88,
73 PT_FPR0
*8+96, PT_FPR0
*8+104, PT_FPR0
*8+112, PT_FPR0
*8+120,
74 PT_FPR0
*8+128, PT_FPR0
*8+136, PT_FPR0
*8+144, PT_FPR0
*8+152,
75 PT_FPR0
*8+160, PT_FPR0
*8+168, PT_FPR0
*8+176, PT_FPR0
*8+184,
76 PT_FPR0
*8+192, PT_FPR0
*8+200, PT_FPR0
*8+208, PT_FPR0
*8+216,
77 PT_FPR0
*8+224, PT_FPR0
*8+232, PT_FPR0
*8+240, PT_FPR0
*8+248,
78 PT_NIP
* 8, PT_MSR
* 8, PT_CCR
* 8, PT_LNK
* 8,
79 PT_CTR
* 8, PT_XER
* 8, PT_FPR0
*8 + 256,
80 PT_ORIG_R3
* 8, PT_TRAP
* 8 };
82 /* Currently, don't check/send MQ. */
83 static int ppc_regmap
[] =
84 {PT_R0
* 4, PT_R1
* 4, PT_R2
* 4, PT_R3
* 4,
85 PT_R4
* 4, PT_R5
* 4, PT_R6
* 4, PT_R7
* 4,
86 PT_R8
* 4, PT_R9
* 4, PT_R10
* 4, PT_R11
* 4,
87 PT_R12
* 4, PT_R13
* 4, PT_R14
* 4, PT_R15
* 4,
88 PT_R16
* 4, PT_R17
* 4, PT_R18
* 4, PT_R19
* 4,
89 PT_R20
* 4, PT_R21
* 4, PT_R22
* 4, PT_R23
* 4,
90 PT_R24
* 4, PT_R25
* 4, PT_R26
* 4, PT_R27
* 4,
91 PT_R28
* 4, PT_R29
* 4, PT_R30
* 4, PT_R31
* 4,
92 PT_FPR0
*4, PT_FPR0
*4 + 8, PT_FPR0
*4+16, PT_FPR0
*4+24,
93 PT_FPR0
*4+32, PT_FPR0
*4+40, PT_FPR0
*4+48, PT_FPR0
*4+56,
94 PT_FPR0
*4+64, PT_FPR0
*4+72, PT_FPR0
*4+80, PT_FPR0
*4+88,
95 PT_FPR0
*4+96, PT_FPR0
*4+104, PT_FPR0
*4+112, PT_FPR0
*4+120,
96 PT_FPR0
*4+128, PT_FPR0
*4+136, PT_FPR0
*4+144, PT_FPR0
*4+152,
97 PT_FPR0
*4+160, PT_FPR0
*4+168, PT_FPR0
*4+176, PT_FPR0
*4+184,
98 PT_FPR0
*4+192, PT_FPR0
*4+200, PT_FPR0
*4+208, PT_FPR0
*4+216,
99 PT_FPR0
*4+224, PT_FPR0
*4+232, PT_FPR0
*4+240, PT_FPR0
*4+248,
100 PT_NIP
* 4, PT_MSR
* 4, PT_CCR
* 4, PT_LNK
* 4,
101 PT_CTR
* 4, PT_XER
* 4, PT_FPSCR
* 4,
102 PT_ORIG_R3
* 4, PT_TRAP
* 4
105 static int ppc_regmap_e500
[] =
106 {PT_R0
* 4, PT_R1
* 4, PT_R2
* 4, PT_R3
* 4,
107 PT_R4
* 4, PT_R5
* 4, PT_R6
* 4, PT_R7
* 4,
108 PT_R8
* 4, PT_R9
* 4, PT_R10
* 4, PT_R11
* 4,
109 PT_R12
* 4, PT_R13
* 4, PT_R14
* 4, PT_R15
* 4,
110 PT_R16
* 4, PT_R17
* 4, PT_R18
* 4, PT_R19
* 4,
111 PT_R20
* 4, PT_R21
* 4, PT_R22
* 4, PT_R23
* 4,
112 PT_R24
* 4, PT_R25
* 4, PT_R26
* 4, PT_R27
* 4,
113 PT_R28
* 4, PT_R29
* 4, PT_R30
* 4, PT_R31
* 4,
122 PT_NIP
* 4, PT_MSR
* 4, PT_CCR
* 4, PT_LNK
* 4,
123 PT_CTR
* 4, PT_XER
* 4, -1,
124 PT_ORIG_R3
* 4, PT_TRAP
* 4
128 /* Check whether the kernel provides a register set with number
129 REGSET_ID of size REGSETSIZE for process/thread TID. */
132 ppc_check_regset (int tid
, int regset_id
, int regsetsize
)
134 void *buf
= alloca (regsetsize
);
138 iov
.iov_len
= regsetsize
;
140 if (ptrace (PTRACE_GETREGSET
, tid
, regset_id
, &iov
) >= 0
147 ppc_cannot_store_register (int regno
)
149 const struct target_desc
*tdesc
= current_process ()->tdesc
;
151 #ifndef __powerpc64__
152 /* Some kernels do not allow us to store fpscr. */
153 if (!(ppc_hwcap
& PPC_FEATURE_HAS_SPE
)
154 && regno
== find_regno (tdesc
, "fpscr"))
158 /* Some kernels do not allow us to store orig_r3 or trap. */
159 if (regno
== find_regno (tdesc
, "orig_r3")
160 || regno
== find_regno (tdesc
, "trap"))
167 ppc_cannot_fetch_register (int regno
)
173 ppc_collect_ptrace_register (struct regcache
*regcache
, int regno
, char *buf
)
175 memset (buf
, 0, sizeof (long));
177 if (__BYTE_ORDER
== __LITTLE_ENDIAN
)
179 /* Little-endian values always sit at the left end of the buffer. */
180 collect_register (regcache
, regno
, buf
);
182 else if (__BYTE_ORDER
== __BIG_ENDIAN
)
184 /* Big-endian values sit at the right end of the buffer. In case of
185 registers whose sizes are smaller than sizeof (long), we must use a
186 padding to access them correctly. */
187 int size
= register_size (regcache
->tdesc
, regno
);
189 if (size
< sizeof (long))
190 collect_register (regcache
, regno
, buf
+ sizeof (long) - size
);
192 collect_register (regcache
, regno
, buf
);
195 perror_with_name ("Unexpected byte order");
199 ppc_supply_ptrace_register (struct regcache
*regcache
,
200 int regno
, const char *buf
)
202 if (__BYTE_ORDER
== __LITTLE_ENDIAN
)
204 /* Little-endian values always sit at the left end of the buffer. */
205 supply_register (regcache
, regno
, buf
);
207 else if (__BYTE_ORDER
== __BIG_ENDIAN
)
209 /* Big-endian values sit at the right end of the buffer. In case of
210 registers whose sizes are smaller than sizeof (long), we must use a
211 padding to access them correctly. */
212 int size
= register_size (regcache
->tdesc
, regno
);
214 if (size
< sizeof (long))
215 supply_register (regcache
, regno
, buf
+ sizeof (long) - size
);
217 supply_register (regcache
, regno
, buf
);
220 perror_with_name ("Unexpected byte order");
224 #define INSTR_SC 0x44000002
225 #define NR_spu_run 0x0116
227 /* If the PPU thread is currently stopped on a spu_run system call,
228 return to FD and ADDR the file handle and NPC parameter address
229 used with the system call. Return non-zero if successful. */
231 parse_spufs_run (struct regcache
*regcache
, int *fd
, CORE_ADDR
*addr
)
237 if (register_size (regcache
->tdesc
, 0) == 4)
239 unsigned int pc
, r0
, r3
, r4
;
240 collect_register_by_name (regcache
, "pc", &pc
);
241 collect_register_by_name (regcache
, "r0", &r0
);
242 collect_register_by_name (regcache
, "orig_r3", &r3
);
243 collect_register_by_name (regcache
, "r4", &r4
);
244 curr_pc
= (CORE_ADDR
) pc
;
247 *addr
= (CORE_ADDR
) r4
;
251 unsigned long pc
, r0
, r3
, r4
;
252 collect_register_by_name (regcache
, "pc", &pc
);
253 collect_register_by_name (regcache
, "r0", &r0
);
254 collect_register_by_name (regcache
, "orig_r3", &r3
);
255 collect_register_by_name (regcache
, "r4", &r4
);
256 curr_pc
= (CORE_ADDR
) pc
;
259 *addr
= (CORE_ADDR
) r4
;
262 /* Fetch instruction preceding current NIP. */
263 if ((*the_target
->read_memory
) (curr_pc
- 4,
264 (unsigned char *) &curr_insn
, 4) != 0)
266 /* It should be a "sc" instruction. */
267 if (curr_insn
!= INSTR_SC
)
269 /* System call number should be NR_spu_run. */
270 if (curr_r0
!= NR_spu_run
)
277 ppc_get_pc (struct regcache
*regcache
)
282 if (parse_spufs_run (regcache
, &fd
, &addr
))
285 (*the_target
->read_memory
) (addr
, (unsigned char *) &pc
, 4);
286 return ((CORE_ADDR
)1 << 63)
287 | ((CORE_ADDR
)fd
<< 32) | (CORE_ADDR
) (pc
- 4);
289 else if (register_size (regcache
->tdesc
, 0) == 4)
292 collect_register_by_name (regcache
, "pc", &pc
);
293 return (CORE_ADDR
) pc
;
298 collect_register_by_name (regcache
, "pc", &pc
);
299 return (CORE_ADDR
) pc
;
304 ppc_set_pc (struct regcache
*regcache
, CORE_ADDR pc
)
309 if (parse_spufs_run (regcache
, &fd
, &addr
))
311 unsigned int newpc
= pc
;
312 (*the_target
->write_memory
) (addr
, (unsigned char *) &newpc
, 4);
314 else if (register_size (regcache
->tdesc
, 0) == 4)
316 unsigned int newpc
= pc
;
317 supply_register_by_name (regcache
, "pc", &newpc
);
321 unsigned long newpc
= pc
;
322 supply_register_by_name (regcache
, "pc", &newpc
);
326 #ifndef __powerpc64__
327 static int ppc_regmap_adjusted
;
331 /* Correct in either endianness.
332 This instruction is "twge r2, r2", which GDB uses as a software
334 static const unsigned int ppc_breakpoint
= 0x7d821008;
335 #define ppc_breakpoint_len 4
337 /* Implementation of linux_target_ops method "sw_breakpoint_from_kind". */
339 static const gdb_byte
*
340 ppc_sw_breakpoint_from_kind (int kind
, int *size
)
342 *size
= ppc_breakpoint_len
;
343 return (const gdb_byte
*) &ppc_breakpoint
;
347 ppc_breakpoint_at (CORE_ADDR where
)
351 if (where
& ((CORE_ADDR
)1 << 63))
354 sprintf (mem_annex
, "%d/mem", (int)((where
>> 32) & 0x7fffffff));
355 (*the_target
->qxfer_spu
) (mem_annex
, (unsigned char *) &insn
,
356 NULL
, where
& 0xffffffff, 4);
362 (*the_target
->read_memory
) (where
, (unsigned char *) &insn
, 4);
363 if (insn
== ppc_breakpoint
)
365 /* If necessary, recognize more trap instructions here. GDB only uses
372 /* Implement supports_z_point_type target-ops.
373 Returns true if type Z_TYPE breakpoint is supported.
375 Handling software breakpoint at server side, so tracepoints
376 and breakpoints can be inserted at the same location. */
379 ppc_supports_z_point_type (char z_type
)
386 case Z_PACKET_WRITE_WP
:
387 case Z_PACKET_ACCESS_WP
:
393 /* Implement insert_point target-ops.
394 Returns 0 on success, -1 on failure and 1 on unsupported. */
397 ppc_insert_point (enum raw_bkpt_type type
, CORE_ADDR addr
,
398 int size
, struct raw_breakpoint
*bp
)
402 case raw_bkpt_type_sw
:
403 return insert_memory_breakpoint (bp
);
405 case raw_bkpt_type_hw
:
406 case raw_bkpt_type_write_wp
:
407 case raw_bkpt_type_access_wp
:
414 /* Implement remove_point target-ops.
415 Returns 0 on success, -1 on failure and 1 on unsupported. */
418 ppc_remove_point (enum raw_bkpt_type type
, CORE_ADDR addr
,
419 int size
, struct raw_breakpoint
*bp
)
423 case raw_bkpt_type_sw
:
424 return remove_memory_breakpoint (bp
);
426 case raw_bkpt_type_hw
:
427 case raw_bkpt_type_write_wp
:
428 case raw_bkpt_type_access_wp
:
435 /* Provide only a fill function for the general register set. ps_lgetregs
436 will use this for NPTL support. */
438 static void ppc_fill_gregset (struct regcache
*regcache
, void *buf
)
442 for (i
= 0; i
< 32; i
++)
443 ppc_collect_ptrace_register (regcache
, i
, (char *) buf
+ ppc_regmap
[i
]);
445 for (i
= 64; i
< 70; i
++)
446 ppc_collect_ptrace_register (regcache
, i
, (char *) buf
+ ppc_regmap
[i
]);
448 for (i
= 71; i
< 73; i
++)
449 ppc_collect_ptrace_register (regcache
, i
, (char *) buf
+ ppc_regmap
[i
]);
452 /* Program Priority Register regset fill function. */
455 ppc_fill_pprregset (struct regcache
*regcache
, void *buf
)
457 char *ppr
= (char *) buf
;
459 collect_register_by_name (regcache
, "ppr", ppr
);
462 /* Program Priority Register regset store function. */
465 ppc_store_pprregset (struct regcache
*regcache
, const void *buf
)
467 const char *ppr
= (const char *) buf
;
469 supply_register_by_name (regcache
, "ppr", ppr
);
472 /* Data Stream Control Register regset fill function. */
475 ppc_fill_dscrregset (struct regcache
*regcache
, void *buf
)
477 char *dscr
= (char *) buf
;
479 collect_register_by_name (regcache
, "dscr", dscr
);
482 /* Data Stream Control Register regset store function. */
485 ppc_store_dscrregset (struct regcache
*regcache
, const void *buf
)
487 const char *dscr
= (const char *) buf
;
489 supply_register_by_name (regcache
, "dscr", dscr
);
492 /* Target Address Register regset fill function. */
495 ppc_fill_tarregset (struct regcache
*regcache
, void *buf
)
497 char *tar
= (char *) buf
;
499 collect_register_by_name (regcache
, "tar", tar
);
502 /* Target Address Register regset store function. */
505 ppc_store_tarregset (struct regcache
*regcache
, const void *buf
)
507 const char *tar
= (const char *) buf
;
509 supply_register_by_name (regcache
, "tar", tar
);
512 /* Event-Based Branching regset store function. Unless the inferior
513 has a perf event open, ptrace can return in error when reading and
514 writing to the regset, with ENODATA. For reading, the registers
515 will correctly show as unavailable. For writing, gdbserver
516 currently only caches any register writes from P and G packets and
517 the stub always tries to write all the regsets when resuming the
518 inferior, which would result in frequent warnings. For this
519 reason, we don't define a fill function. This also means that the
520 client-side regcache will be dirty if the user tries to write to
521 the EBB registers. G packets that the client sends to write to
522 unrelated registers will also include data for EBB registers, even
523 if they are unavailable. */
526 ppc_store_ebbregset (struct regcache
*regcache
, const void *buf
)
528 const char *regset
= (const char *) buf
;
530 /* The order in the kernel regset is: EBBRR, EBBHR, BESCR. In the
531 .dat file is BESCR, EBBHR, EBBRR. */
532 supply_register_by_name (regcache
, "ebbrr", ®set
[0]);
533 supply_register_by_name (regcache
, "ebbhr", ®set
[8]);
534 supply_register_by_name (regcache
, "bescr", ®set
[16]);
537 /* Performance Monitoring Unit regset fill function. */
540 ppc_fill_pmuregset (struct regcache
*regcache
, void *buf
)
542 char *regset
= (char *) buf
;
544 /* The order in the kernel regset is SIAR, SDAR, SIER, MMCR2, MMCR0.
545 In the .dat file is MMCR0, MMCR2, SIAR, SDAR, SIER. */
546 collect_register_by_name (regcache
, "siar", ®set
[0]);
547 collect_register_by_name (regcache
, "sdar", ®set
[8]);
548 collect_register_by_name (regcache
, "sier", ®set
[16]);
549 collect_register_by_name (regcache
, "mmcr2", ®set
[24]);
550 collect_register_by_name (regcache
, "mmcr0", ®set
[32]);
553 /* Performance Monitoring Unit regset store function. */
556 ppc_store_pmuregset (struct regcache
*regcache
, const void *buf
)
558 const char *regset
= (const char *) buf
;
560 supply_register_by_name (regcache
, "siar", ®set
[0]);
561 supply_register_by_name (regcache
, "sdar", ®set
[8]);
562 supply_register_by_name (regcache
, "sier", ®set
[16]);
563 supply_register_by_name (regcache
, "mmcr2", ®set
[24]);
564 supply_register_by_name (regcache
, "mmcr0", ®set
[32]);
567 /* Hardware Transactional Memory special-purpose register regset fill
571 ppc_fill_tm_sprregset (struct regcache
*regcache
, void *buf
)
574 char *regset
= (char *) buf
;
576 base
= find_regno (regcache
->tdesc
, "tfhar");
577 for (i
= 0; i
< 3; i
++)
578 collect_register (regcache
, base
+ i
, ®set
[i
* 8]);
581 /* Hardware Transactional Memory special-purpose register regset store
585 ppc_store_tm_sprregset (struct regcache
*regcache
, const void *buf
)
588 const char *regset
= (const char *) buf
;
590 base
= find_regno (regcache
->tdesc
, "tfhar");
591 for (i
= 0; i
< 3; i
++)
592 supply_register (regcache
, base
+ i
, ®set
[i
* 8]);
595 /* For the same reasons as the EBB regset, none of the HTM
596 checkpointed regsets have a fill function. These registers are
597 only available if the inferior is in a transaction. */
599 /* Hardware Transactional Memory checkpointed general-purpose regset
603 ppc_store_tm_cgprregset (struct regcache
*regcache
, const void *buf
)
605 int i
, base
, size
, endian_offset
;
606 const char *regset
= (const char *) buf
;
608 base
= find_regno (regcache
->tdesc
, "cr0");
609 size
= register_size (regcache
->tdesc
, base
);
611 gdb_assert (size
== 4 || size
== 8);
613 for (i
= 0; i
< 32; i
++)
614 supply_register (regcache
, base
+ i
, ®set
[i
* size
]);
618 if ((size
== 8) && (__BYTE_ORDER
== __BIG_ENDIAN
))
621 supply_register_by_name (regcache
, "ccr",
622 ®set
[PT_CCR
* size
+ endian_offset
]);
624 supply_register_by_name (regcache
, "cxer",
625 ®set
[PT_XER
* size
+ endian_offset
]);
627 supply_register_by_name (regcache
, "clr", ®set
[PT_LNK
* size
]);
628 supply_register_by_name (regcache
, "cctr", ®set
[PT_CTR
* size
]);
631 /* Hardware Transactional Memory checkpointed floating-point regset
635 ppc_store_tm_cfprregset (struct regcache
*regcache
, const void *buf
)
638 const char *regset
= (const char *) buf
;
640 base
= find_regno (regcache
->tdesc
, "cf0");
642 for (i
= 0; i
< 32; i
++)
643 supply_register (regcache
, base
+ i
, ®set
[i
* 8]);
645 supply_register_by_name (regcache
, "cfpscr", ®set
[32 * 8]);
648 /* Hardware Transactional Memory checkpointed vector regset store
652 ppc_store_tm_cvrregset (struct regcache
*regcache
, const void *buf
)
655 const char *regset
= (const char *) buf
;
658 base
= find_regno (regcache
->tdesc
, "cvr0");
660 for (i
= 0; i
< 32; i
++)
661 supply_register (regcache
, base
+ i
, ®set
[i
* 16]);
663 if (__BYTE_ORDER
== __BIG_ENDIAN
)
666 supply_register_by_name (regcache
, "cvscr",
667 ®set
[32 * 16 + vscr_offset
]);
669 supply_register_by_name (regcache
, "cvrsave", ®set
[33 * 16]);
672 /* Hardware Transactional Memory checkpointed vector-scalar regset
676 ppc_store_tm_cvsxregset (struct regcache
*regcache
, const void *buf
)
679 const char *regset
= (const char *) buf
;
681 base
= find_regno (regcache
->tdesc
, "cvs0h");
682 for (i
= 0; i
< 32; i
++)
683 supply_register (regcache
, base
+ i
, ®set
[i
* 8]);
686 /* Hardware Transactional Memory checkpointed Program Priority
687 Register regset store function. */
690 ppc_store_tm_cpprregset (struct regcache
*regcache
, const void *buf
)
692 const char *cppr
= (const char *) buf
;
694 supply_register_by_name (regcache
, "cppr", cppr
);
697 /* Hardware Transactional Memory checkpointed Data Stream Control
698 Register regset store function. */
701 ppc_store_tm_cdscrregset (struct regcache
*regcache
, const void *buf
)
703 const char *cdscr
= (const char *) buf
;
705 supply_register_by_name (regcache
, "cdscr", cdscr
);
708 /* Hardware Transactional Memory checkpointed Target Address Register
709 regset store function. */
712 ppc_store_tm_ctarregset (struct regcache
*regcache
, const void *buf
)
714 const char *ctar
= (const char *) buf
;
716 supply_register_by_name (regcache
, "ctar", ctar
);
720 ppc_fill_vsxregset (struct regcache
*regcache
, void *buf
)
723 char *regset
= (char *) buf
;
725 base
= find_regno (regcache
->tdesc
, "vs0h");
726 for (i
= 0; i
< 32; i
++)
727 collect_register (regcache
, base
+ i
, ®set
[i
* 8]);
731 ppc_store_vsxregset (struct regcache
*regcache
, const void *buf
)
734 const char *regset
= (const char *) buf
;
736 base
= find_regno (regcache
->tdesc
, "vs0h");
737 for (i
= 0; i
< 32; i
++)
738 supply_register (regcache
, base
+ i
, ®set
[i
* 8]);
742 ppc_fill_vrregset (struct regcache
*regcache
, void *buf
)
745 char *regset
= (char *) buf
;
748 base
= find_regno (regcache
->tdesc
, "vr0");
749 for (i
= 0; i
< 32; i
++)
750 collect_register (regcache
, base
+ i
, ®set
[i
* 16]);
752 if (__BYTE_ORDER
== __BIG_ENDIAN
)
755 collect_register_by_name (regcache
, "vscr",
756 ®set
[32 * 16 + vscr_offset
]);
758 collect_register_by_name (regcache
, "vrsave", ®set
[33 * 16]);
762 ppc_store_vrregset (struct regcache
*regcache
, const void *buf
)
765 const char *regset
= (const char *) buf
;
768 base
= find_regno (regcache
->tdesc
, "vr0");
769 for (i
= 0; i
< 32; i
++)
770 supply_register (regcache
, base
+ i
, ®set
[i
* 16]);
772 if (__BYTE_ORDER
== __BIG_ENDIAN
)
775 supply_register_by_name (regcache
, "vscr",
776 ®set
[32 * 16 + vscr_offset
]);
777 supply_register_by_name (regcache
, "vrsave", ®set
[33 * 16]);
780 struct gdb_evrregset_t
782 unsigned long evr
[32];
783 unsigned long long acc
;
784 unsigned long spefscr
;
788 ppc_fill_evrregset (struct regcache
*regcache
, void *buf
)
791 struct gdb_evrregset_t
*regset
= (struct gdb_evrregset_t
*) buf
;
793 ev0
= find_regno (regcache
->tdesc
, "ev0h");
794 for (i
= 0; i
< 32; i
++)
795 collect_register (regcache
, ev0
+ i
, ®set
->evr
[i
]);
797 collect_register_by_name (regcache
, "acc", ®set
->acc
);
798 collect_register_by_name (regcache
, "spefscr", ®set
->spefscr
);
802 ppc_store_evrregset (struct regcache
*regcache
, const void *buf
)
805 const struct gdb_evrregset_t
*regset
= (const struct gdb_evrregset_t
*) buf
;
807 ev0
= find_regno (regcache
->tdesc
, "ev0h");
808 for (i
= 0; i
< 32; i
++)
809 supply_register (regcache
, ev0
+ i
, ®set
->evr
[i
]);
811 supply_register_by_name (regcache
, "acc", ®set
->acc
);
812 supply_register_by_name (regcache
, "spefscr", ®set
->spefscr
);
815 /* Support for hardware single step. */
818 ppc_supports_hardware_single_step (void)
823 static struct regset_info ppc_regsets
[] = {
824 /* List the extra register sets before GENERAL_REGS. That way we will
825 fetch them every time, but still fall back to PTRACE_PEEKUSER for the
826 general registers. Some kernels support these, but not the newer
827 PPC_PTRACE_GETREGS. */
828 { PTRACE_GETREGSET
, PTRACE_SETREGSET
, NT_PPC_TM_CTAR
, 0, EXTENDED_REGS
,
829 NULL
, ppc_store_tm_ctarregset
},
830 { PTRACE_GETREGSET
, PTRACE_SETREGSET
, NT_PPC_TM_CDSCR
, 0, EXTENDED_REGS
,
831 NULL
, ppc_store_tm_cdscrregset
},
832 { PTRACE_GETREGSET
, PTRACE_SETREGSET
, NT_PPC_TM_CPPR
, 0, EXTENDED_REGS
,
833 NULL
, ppc_store_tm_cpprregset
},
834 { PTRACE_GETREGSET
, PTRACE_SETREGSET
, NT_PPC_TM_CVSX
, 0, EXTENDED_REGS
,
835 NULL
, ppc_store_tm_cvsxregset
},
836 { PTRACE_GETREGSET
, PTRACE_SETREGSET
, NT_PPC_TM_CVMX
, 0, EXTENDED_REGS
,
837 NULL
, ppc_store_tm_cvrregset
},
838 { PTRACE_GETREGSET
, PTRACE_SETREGSET
, NT_PPC_TM_CFPR
, 0, EXTENDED_REGS
,
839 NULL
, ppc_store_tm_cfprregset
},
840 { PTRACE_GETREGSET
, PTRACE_SETREGSET
, NT_PPC_TM_CGPR
, 0, EXTENDED_REGS
,
841 NULL
, ppc_store_tm_cgprregset
},
842 { PTRACE_GETREGSET
, PTRACE_SETREGSET
, NT_PPC_TM_SPR
, 0, EXTENDED_REGS
,
843 ppc_fill_tm_sprregset
, ppc_store_tm_sprregset
},
844 { PTRACE_GETREGSET
, PTRACE_SETREGSET
, NT_PPC_EBB
, 0, EXTENDED_REGS
,
845 NULL
, ppc_store_ebbregset
},
846 { PTRACE_GETREGSET
, PTRACE_SETREGSET
, NT_PPC_PMU
, 0, EXTENDED_REGS
,
847 ppc_fill_pmuregset
, ppc_store_pmuregset
},
848 { PTRACE_GETREGSET
, PTRACE_SETREGSET
, NT_PPC_TAR
, 0, EXTENDED_REGS
,
849 ppc_fill_tarregset
, ppc_store_tarregset
},
850 { PTRACE_GETREGSET
, PTRACE_SETREGSET
, NT_PPC_PPR
, 0, EXTENDED_REGS
,
851 ppc_fill_pprregset
, ppc_store_pprregset
},
852 { PTRACE_GETREGSET
, PTRACE_SETREGSET
, NT_PPC_DSCR
, 0, EXTENDED_REGS
,
853 ppc_fill_dscrregset
, ppc_store_dscrregset
},
854 { PTRACE_GETVSXREGS
, PTRACE_SETVSXREGS
, 0, 0, EXTENDED_REGS
,
855 ppc_fill_vsxregset
, ppc_store_vsxregset
},
856 { PTRACE_GETVRREGS
, PTRACE_SETVRREGS
, 0, 0, EXTENDED_REGS
,
857 ppc_fill_vrregset
, ppc_store_vrregset
},
858 { PTRACE_GETEVRREGS
, PTRACE_SETEVRREGS
, 0, 0, EXTENDED_REGS
,
859 ppc_fill_evrregset
, ppc_store_evrregset
},
860 { 0, 0, 0, 0, GENERAL_REGS
, ppc_fill_gregset
, NULL
},
864 static struct usrregs_info ppc_usrregs_info
=
870 static struct regsets_info ppc_regsets_info
=
872 ppc_regsets
, /* regsets */
874 NULL
, /* disabled_regsets */
877 static struct regs_info regs_info
=
879 NULL
, /* regset_bitmap */
884 static const struct regs_info
*
891 ppc_arch_setup (void)
893 const struct target_desc
*tdesc
;
894 struct regset_info
*regset
;
895 struct ppc_linux_features features
= ppc_linux_no_features
;
897 int tid
= lwpid_of (current_thread
);
899 features
.wordsize
= ppc_linux_target_wordsize (tid
);
901 if (features
.wordsize
== 4)
902 tdesc
= tdesc_powerpc_32l
;
904 tdesc
= tdesc_powerpc_64l
;
906 current_process ()->tdesc
= tdesc
;
908 /* The value of current_process ()->tdesc needs to be set for this
910 ppc_hwcap
= linux_get_hwcap (features
.wordsize
);
911 ppc_hwcap2
= linux_get_hwcap2 (features
.wordsize
);
913 features
.isa205
= ppc_linux_has_isa205 (ppc_hwcap
);
915 if (ppc_hwcap
& PPC_FEATURE_HAS_VSX
)
918 if (ppc_hwcap
& PPC_FEATURE_HAS_ALTIVEC
)
919 features
.altivec
= true;
921 if ((ppc_hwcap2
& PPC_FEATURE2_DSCR
)
922 && ppc_check_regset (tid
, NT_PPC_DSCR
, PPC_LINUX_SIZEOF_DSCRREGSET
)
923 && ppc_check_regset (tid
, NT_PPC_PPR
, PPC_LINUX_SIZEOF_PPRREGSET
))
925 features
.ppr_dscr
= true;
926 if ((ppc_hwcap2
& PPC_FEATURE2_ARCH_2_07
)
927 && (ppc_hwcap2
& PPC_FEATURE2_TAR
)
928 && (ppc_hwcap2
& PPC_FEATURE2_EBB
)
929 && ppc_check_regset (tid
, NT_PPC_TAR
,
930 PPC_LINUX_SIZEOF_TARREGSET
)
931 && ppc_check_regset (tid
, NT_PPC_EBB
,
932 PPC_LINUX_SIZEOF_EBBREGSET
)
933 && ppc_check_regset (tid
, NT_PPC_PMU
,
934 PPC_LINUX_SIZEOF_PMUREGSET
))
936 features
.isa207
= true;
937 if ((ppc_hwcap2
& PPC_FEATURE2_HTM
)
938 && ppc_check_regset (tid
, NT_PPC_TM_SPR
,
939 PPC_LINUX_SIZEOF_TM_SPRREGSET
))
944 if (ppc_hwcap
& PPC_FEATURE_CELL
)
945 features
.cell
= true;
947 tdesc
= ppc_linux_match_description (features
);
949 /* On 32-bit machines, check for SPE registers.
950 Set the low target's regmap field as appropriately. */
951 #ifndef __powerpc64__
952 if (ppc_hwcap
& PPC_FEATURE_HAS_SPE
)
953 tdesc
= tdesc_powerpc_e500l
;
955 if (!ppc_regmap_adjusted
)
957 if (ppc_hwcap
& PPC_FEATURE_HAS_SPE
)
958 ppc_usrregs_info
.regmap
= ppc_regmap_e500
;
960 /* If the FPSCR is 64-bit wide, we need to fetch the whole
961 64-bit slot and not just its second word. The PT_FPSCR
962 supplied in a 32-bit GDB compilation doesn't reflect
964 if (register_size (tdesc
, 70) == 8)
965 ppc_regmap
[70] = (48 + 2*32) * sizeof (long);
967 ppc_regmap_adjusted
= 1;
971 current_process ()->tdesc
= tdesc
;
973 for (regset
= ppc_regsets
; regset
->size
>= 0; regset
++)
974 switch (regset
->get_request
)
976 case PTRACE_GETVRREGS
:
977 regset
->size
= features
.altivec
? PPC_LINUX_SIZEOF_VRREGSET
: 0;
979 case PTRACE_GETVSXREGS
:
980 regset
->size
= features
.vsx
? PPC_LINUX_SIZEOF_VSXREGSET
: 0;
982 case PTRACE_GETEVRREGS
:
983 if (ppc_hwcap
& PPC_FEATURE_HAS_SPE
)
984 regset
->size
= 32 * 4 + 8 + 4;
988 case PTRACE_GETREGSET
:
989 switch (regset
->nt_type
)
992 regset
->size
= (features
.ppr_dscr
?
993 PPC_LINUX_SIZEOF_PPRREGSET
: 0);
996 regset
->size
= (features
.ppr_dscr
?
997 PPC_LINUX_SIZEOF_DSCRREGSET
: 0);
1000 regset
->size
= (features
.isa207
?
1001 PPC_LINUX_SIZEOF_TARREGSET
: 0);
1004 regset
->size
= (features
.isa207
?
1005 PPC_LINUX_SIZEOF_EBBREGSET
: 0);
1008 regset
->size
= (features
.isa207
?
1009 PPC_LINUX_SIZEOF_PMUREGSET
: 0);
1012 regset
->size
= (features
.htm
?
1013 PPC_LINUX_SIZEOF_TM_SPRREGSET
: 0);
1015 case NT_PPC_TM_CGPR
:
1016 if (features
.wordsize
== 4)
1017 regset
->size
= (features
.htm
?
1018 PPC32_LINUX_SIZEOF_CGPRREGSET
: 0);
1020 regset
->size
= (features
.htm
?
1021 PPC64_LINUX_SIZEOF_CGPRREGSET
: 0);
1023 case NT_PPC_TM_CFPR
:
1024 regset
->size
= (features
.htm
?
1025 PPC_LINUX_SIZEOF_CFPRREGSET
: 0);
1027 case NT_PPC_TM_CVMX
:
1028 regset
->size
= (features
.htm
?
1029 PPC_LINUX_SIZEOF_CVMXREGSET
: 0);
1031 case NT_PPC_TM_CVSX
:
1032 regset
->size
= (features
.htm
?
1033 PPC_LINUX_SIZEOF_CVSXREGSET
: 0);
1035 case NT_PPC_TM_CPPR
:
1036 regset
->size
= (features
.htm
?
1037 PPC_LINUX_SIZEOF_CPPRREGSET
: 0);
1039 case NT_PPC_TM_CDSCR
:
1040 regset
->size
= (features
.htm
?
1041 PPC_LINUX_SIZEOF_CDSCRREGSET
: 0);
1043 case NT_PPC_TM_CTAR
:
1044 regset
->size
= (features
.htm
?
1045 PPC_LINUX_SIZEOF_CTARREGSET
: 0);
1056 /* Implementation of linux_target_ops method "supports_tracepoints". */
1059 ppc_supports_tracepoints (void)
1064 /* Get the thread area address. This is used to recognize which
1065 thread is which when tracing with the in-process agent library. We
1066 don't read anything from the address, and treat it as opaque; it's
1067 the address itself that we assume is unique per-thread. */
1070 ppc_get_thread_area (int lwpid
, CORE_ADDR
*addr
)
1072 struct lwp_info
*lwp
= find_lwp_pid (ptid_t (lwpid
));
1073 struct thread_info
*thr
= get_lwp_thread (lwp
);
1074 struct regcache
*regcache
= get_thread_regcache (thr
, 1);
1077 #ifdef __powerpc64__
1078 if (register_size (regcache
->tdesc
, 0) == 8)
1079 collect_register_by_name (regcache
, "r13", &tp
);
1082 collect_register_by_name (regcache
, "r2", &tp
);
1089 #ifdef __powerpc64__
1091 /* Older glibc doesn't provide this. */
1093 #ifndef EF_PPC64_ABI
1094 #define EF_PPC64_ABI 3
1097 /* Returns 1 if inferior is using ELFv2 ABI. Undefined for 32-bit
1101 is_elfv2_inferior (void)
1103 /* To be used as fallback if we're unable to determine the right result -
1104 assume inferior uses the same ABI as gdbserver. */
1106 const int def_res
= 1;
1108 const int def_res
= 0;
1113 const struct target_desc
*tdesc
= current_process ()->tdesc
;
1114 int wordsize
= register_size (tdesc
, 0);
1116 if (!linux_get_auxv (wordsize
, AT_PHDR
, &phdr
))
1119 /* Assume ELF header is at the beginning of the page where program headers
1120 are located. If it doesn't look like one, bail. */
1122 read_inferior_memory (phdr
& ~0xfff, (unsigned char *) &ehdr
, sizeof ehdr
);
1123 if (memcmp(ehdr
.e_ident
, ELFMAG
, SELFMAG
))
1126 return (ehdr
.e_flags
& EF_PPC64_ABI
) == 2;
1131 /* Generate a ds-form instruction in BUF and return the number of bytes written
1134 | OPCD | RST | RA | DS |XO| */
1136 __attribute__((unused
)) /* Maybe unused due to conditional compilation. */
1138 gen_ds_form (uint32_t *buf
, int opcd
, int rst
, int ra
, int ds
, int xo
)
1142 gdb_assert ((opcd
& ~0x3f) == 0);
1143 gdb_assert ((rst
& ~0x1f) == 0);
1144 gdb_assert ((ra
& ~0x1f) == 0);
1145 gdb_assert ((xo
& ~0x3) == 0);
1147 insn
= (rst
<< 21) | (ra
<< 16) | (ds
& 0xfffc) | (xo
& 0x3);
1148 *buf
= (opcd
<< 26) | insn
;
1152 /* Followings are frequently used ds-form instructions. */
1154 #define GEN_STD(buf, rs, ra, offset) gen_ds_form (buf, 62, rs, ra, offset, 0)
1155 #define GEN_STDU(buf, rs, ra, offset) gen_ds_form (buf, 62, rs, ra, offset, 1)
1156 #define GEN_LD(buf, rt, ra, offset) gen_ds_form (buf, 58, rt, ra, offset, 0)
1157 #define GEN_LDU(buf, rt, ra, offset) gen_ds_form (buf, 58, rt, ra, offset, 1)
1159 /* Generate a d-form instruction in BUF.
1162 | OPCD | RST | RA | D | */
1165 gen_d_form (uint32_t *buf
, int opcd
, int rst
, int ra
, int si
)
1169 gdb_assert ((opcd
& ~0x3f) == 0);
1170 gdb_assert ((rst
& ~0x1f) == 0);
1171 gdb_assert ((ra
& ~0x1f) == 0);
1173 insn
= (rst
<< 21) | (ra
<< 16) | (si
& 0xffff);
1174 *buf
= (opcd
<< 26) | insn
;
1178 /* Followings are frequently used d-form instructions. */
1180 #define GEN_ADDI(buf, rt, ra, si) gen_d_form (buf, 14, rt, ra, si)
1181 #define GEN_ADDIS(buf, rt, ra, si) gen_d_form (buf, 15, rt, ra, si)
1182 #define GEN_LI(buf, rt, si) GEN_ADDI (buf, rt, 0, si)
1183 #define GEN_LIS(buf, rt, si) GEN_ADDIS (buf, rt, 0, si)
1184 #define GEN_ORI(buf, rt, ra, si) gen_d_form (buf, 24, rt, ra, si)
1185 #define GEN_ORIS(buf, rt, ra, si) gen_d_form (buf, 25, rt, ra, si)
1186 #define GEN_LWZ(buf, rt, ra, si) gen_d_form (buf, 32, rt, ra, si)
1187 #define GEN_STW(buf, rt, ra, si) gen_d_form (buf, 36, rt, ra, si)
1188 #define GEN_STWU(buf, rt, ra, si) gen_d_form (buf, 37, rt, ra, si)
1190 /* Generate a xfx-form instruction in BUF and return the number of bytes
1194 | OPCD | RST | RI | XO |/| */
1197 gen_xfx_form (uint32_t *buf
, int opcd
, int rst
, int ri
, int xo
)
1200 unsigned int n
= ((ri
& 0x1f) << 5) | ((ri
>> 5) & 0x1f);
1202 gdb_assert ((opcd
& ~0x3f) == 0);
1203 gdb_assert ((rst
& ~0x1f) == 0);
1204 gdb_assert ((xo
& ~0x3ff) == 0);
1206 insn
= (rst
<< 21) | (n
<< 11) | (xo
<< 1);
1207 *buf
= (opcd
<< 26) | insn
;
1211 /* Followings are frequently used xfx-form instructions. */
1213 #define GEN_MFSPR(buf, rt, spr) gen_xfx_form (buf, 31, rt, spr, 339)
1214 #define GEN_MTSPR(buf, rt, spr) gen_xfx_form (buf, 31, rt, spr, 467)
1215 #define GEN_MFCR(buf, rt) gen_xfx_form (buf, 31, rt, 0, 19)
1216 #define GEN_MTCR(buf, rt) gen_xfx_form (buf, 31, rt, 0x3cf, 144)
1217 #define GEN_SYNC(buf, L, E) gen_xfx_form (buf, 31, L & 0x3, \
1219 #define GEN_LWSYNC(buf) GEN_SYNC (buf, 1, 0)
1222 /* Generate a x-form instruction in BUF and return the number of bytes written.
1225 | OPCD | RST | RA | RB | XO |RC| */
1228 gen_x_form (uint32_t *buf
, int opcd
, int rst
, int ra
, int rb
, int xo
, int rc
)
1232 gdb_assert ((opcd
& ~0x3f) == 0);
1233 gdb_assert ((rst
& ~0x1f) == 0);
1234 gdb_assert ((ra
& ~0x1f) == 0);
1235 gdb_assert ((rb
& ~0x1f) == 0);
1236 gdb_assert ((xo
& ~0x3ff) == 0);
1237 gdb_assert ((rc
& ~1) == 0);
1239 insn
= (rst
<< 21) | (ra
<< 16) | (rb
<< 11) | (xo
<< 1) | rc
;
1240 *buf
= (opcd
<< 26) | insn
;
1244 /* Followings are frequently used x-form instructions. */
1246 #define GEN_OR(buf, ra, rs, rb) gen_x_form (buf, 31, rs, ra, rb, 444, 0)
1247 #define GEN_MR(buf, ra, rs) GEN_OR (buf, ra, rs, rs)
1248 #define GEN_LWARX(buf, rt, ra, rb) gen_x_form (buf, 31, rt, ra, rb, 20, 0)
1249 #define GEN_STWCX(buf, rs, ra, rb) gen_x_form (buf, 31, rs, ra, rb, 150, 1)
1250 /* Assume bf = cr7. */
1251 #define GEN_CMPW(buf, ra, rb) gen_x_form (buf, 31, 28, ra, rb, 0, 0)
1254 /* Generate a md-form instruction in BUF and return the number of bytes written.
1256 0 6 11 16 21 27 30 31 32
1257 | OPCD | RS | RA | sh | mb | XO |sh|Rc| */
1260 gen_md_form (uint32_t *buf
, int opcd
, int rs
, int ra
, int sh
, int mb
,
1264 unsigned int n
= ((mb
& 0x1f) << 1) | ((mb
>> 5) & 0x1);
1265 unsigned int sh0_4
= sh
& 0x1f;
1266 unsigned int sh5
= (sh
>> 5) & 1;
1268 gdb_assert ((opcd
& ~0x3f) == 0);
1269 gdb_assert ((rs
& ~0x1f) == 0);
1270 gdb_assert ((ra
& ~0x1f) == 0);
1271 gdb_assert ((sh
& ~0x3f) == 0);
1272 gdb_assert ((mb
& ~0x3f) == 0);
1273 gdb_assert ((xo
& ~0x7) == 0);
1274 gdb_assert ((rc
& ~0x1) == 0);
1276 insn
= (rs
<< 21) | (ra
<< 16) | (sh0_4
<< 11) | (n
<< 5)
1277 | (sh5
<< 1) | (xo
<< 2) | (rc
& 1);
1278 *buf
= (opcd
<< 26) | insn
;
1282 /* The following are frequently used md-form instructions. */
1284 #define GEN_RLDICL(buf, ra, rs ,sh, mb) \
1285 gen_md_form (buf, 30, rs, ra, sh, mb, 0, 0)
1286 #define GEN_RLDICR(buf, ra, rs ,sh, mb) \
1287 gen_md_form (buf, 30, rs, ra, sh, mb, 1, 0)
1289 /* Generate a i-form instruction in BUF and return the number of bytes written.
1292 | OPCD | LI |AA|LK| */
1295 gen_i_form (uint32_t *buf
, int opcd
, int li
, int aa
, int lk
)
1299 gdb_assert ((opcd
& ~0x3f) == 0);
1301 insn
= (li
& 0x3fffffc) | (aa
& 1) | (lk
& 1);
1302 *buf
= (opcd
<< 26) | insn
;
1306 /* The following are frequently used i-form instructions. */
1308 #define GEN_B(buf, li) gen_i_form (buf, 18, li, 0, 0)
1309 #define GEN_BL(buf, li) gen_i_form (buf, 18, li, 0, 1)
1311 /* Generate a b-form instruction in BUF and return the number of bytes written.
1314 | OPCD | BO | BI | BD |AA|LK| */
1317 gen_b_form (uint32_t *buf
, int opcd
, int bo
, int bi
, int bd
,
1322 gdb_assert ((opcd
& ~0x3f) == 0);
1323 gdb_assert ((bo
& ~0x1f) == 0);
1324 gdb_assert ((bi
& ~0x1f) == 0);
1326 insn
= (bo
<< 21) | (bi
<< 16) | (bd
& 0xfffc) | (aa
& 1) | (lk
& 1);
1327 *buf
= (opcd
<< 26) | insn
;
1331 /* The following are frequently used b-form instructions. */
1332 /* Assume bi = cr7. */
1333 #define GEN_BNE(buf, bd) gen_b_form (buf, 16, 0x4, (7 << 2) | 2, bd, 0 ,0)
1335 /* GEN_LOAD and GEN_STORE generate 64- or 32-bit load/store for ppc64 or ppc32
1336 respectively. They are primary used for save/restore GPRs in jump-pad,
1337 not used for bytecode compiling. */
1339 #ifdef __powerpc64__
1340 #define GEN_LOAD(buf, rt, ra, si, is_64) (is_64 ? \
1341 GEN_LD (buf, rt, ra, si) : \
1342 GEN_LWZ (buf, rt, ra, si))
1343 #define GEN_STORE(buf, rt, ra, si, is_64) (is_64 ? \
1344 GEN_STD (buf, rt, ra, si) : \
1345 GEN_STW (buf, rt, ra, si))
1347 #define GEN_LOAD(buf, rt, ra, si, is_64) GEN_LWZ (buf, rt, ra, si)
1348 #define GEN_STORE(buf, rt, ra, si, is_64) GEN_STW (buf, rt, ra, si)
1351 /* Generate a sequence of instructions to load IMM in the register REG.
1352 Write the instructions in BUF and return the number of bytes written. */
1355 gen_limm (uint32_t *buf
, int reg
, uint64_t imm
, int is_64
)
1359 if ((imm
+ 32768) < 65536)
1361 /* li reg, imm[15:0] */
1362 p
+= GEN_LI (p
, reg
, imm
);
1364 else if ((imm
>> 32) == 0)
1366 /* lis reg, imm[31:16]
1367 ori reg, reg, imm[15:0]
1368 rldicl reg, reg, 0, 32 */
1369 p
+= GEN_LIS (p
, reg
, (imm
>> 16) & 0xffff);
1370 if ((imm
& 0xffff) != 0)
1371 p
+= GEN_ORI (p
, reg
, reg
, imm
& 0xffff);
1372 /* Clear upper 32-bit if sign-bit is set. */
1373 if (imm
& (1u << 31) && is_64
)
1374 p
+= GEN_RLDICL (p
, reg
, reg
, 0, 32);
1379 /* lis reg, <imm[63:48]>
1380 ori reg, reg, <imm[48:32]>
1381 rldicr reg, reg, 32, 31
1382 oris reg, reg, <imm[31:16]>
1383 ori reg, reg, <imm[15:0]> */
1384 p
+= GEN_LIS (p
, reg
, ((imm
>> 48) & 0xffff));
1385 if (((imm
>> 32) & 0xffff) != 0)
1386 p
+= GEN_ORI (p
, reg
, reg
, ((imm
>> 32) & 0xffff));
1387 p
+= GEN_RLDICR (p
, reg
, reg
, 32, 31);
1388 if (((imm
>> 16) & 0xffff) != 0)
1389 p
+= GEN_ORIS (p
, reg
, reg
, ((imm
>> 16) & 0xffff));
1390 if ((imm
& 0xffff) != 0)
1391 p
+= GEN_ORI (p
, reg
, reg
, (imm
& 0xffff));
1397 /* Generate a sequence for atomically exchange at location LOCK.
1398 This code sequence clobbers r6, r7, r8. LOCK is the location for
1399 the atomic-xchg, OLD_VALUE is expected old value stored in the
1400 location, and R_NEW is a register for the new value. */
1403 gen_atomic_xchg (uint32_t *buf
, CORE_ADDR lock
, int old_value
, int r_new
,
1406 const int r_lock
= 6;
1407 const int r_old
= 7;
1408 const int r_tmp
= 8;
1412 1: lwarx TMP, 0, LOCK
1418 p
+= gen_limm (p
, r_lock
, lock
, is_64
);
1419 p
+= gen_limm (p
, r_old
, old_value
, is_64
);
1421 p
+= GEN_LWARX (p
, r_tmp
, 0, r_lock
);
1422 p
+= GEN_CMPW (p
, r_tmp
, r_old
);
1423 p
+= GEN_BNE (p
, -8);
1424 p
+= GEN_STWCX (p
, r_new
, 0, r_lock
);
1425 p
+= GEN_BNE (p
, -16);
1430 /* Generate a sequence of instructions for calling a function
1431 at address of FN. Return the number of bytes are written in BUF. */
1434 gen_call (uint32_t *buf
, CORE_ADDR fn
, int is_64
, int is_opd
)
1438 /* Must be called by r12 for caller to calculate TOC address. */
1439 p
+= gen_limm (p
, 12, fn
, is_64
);
1442 p
+= GEN_LOAD (p
, 11, 12, 16, is_64
);
1443 p
+= GEN_LOAD (p
, 2, 12, 8, is_64
);
1444 p
+= GEN_LOAD (p
, 12, 12, 0, is_64
);
1446 p
+= GEN_MTSPR (p
, 12, 9); /* mtctr r12 */
1447 *p
++ = 0x4e800421; /* bctrl */
1452 /* Copy the instruction from OLDLOC to *TO, and update *TO to *TO + size
1453 of instruction. This function is used to adjust pc-relative instructions
1457 ppc_relocate_instruction (CORE_ADDR
*to
, CORE_ADDR oldloc
)
1462 read_inferior_memory (oldloc
, (unsigned char *) &insn
, 4);
1463 op6
= PPC_OP6 (insn
);
1465 if (op6
== 18 && (insn
& 2) == 0)
1467 /* branch && AA = 0 */
1468 rel
= PPC_LI (insn
);
1469 newrel
= (oldloc
- *to
) + rel
;
1471 /* Out of range. Cannot relocate instruction. */
1472 if (newrel
>= (1 << 25) || newrel
< -(1 << 25))
1475 insn
= (insn
& ~0x3fffffc) | (newrel
& 0x3fffffc);
1477 else if (op6
== 16 && (insn
& 2) == 0)
1479 /* conditional branch && AA = 0 */
1481 /* If the new relocation is too big for even a 26-bit unconditional
1482 branch, there is nothing we can do. Just abort.
1484 Otherwise, if it can be fit in 16-bit conditional branch, just
1485 copy the instruction and relocate the address.
1487 If the it's big for conditional-branch (16-bit), try to invert the
1488 condition and jump with 26-bit branch. For example,
1499 After this transform, we are actually jump from *TO+4 instead of *TO,
1500 so check the relocation again because it will be 1-insn farther then
1501 before if *TO is after OLDLOC.
1504 For BDNZT (or so) is transformed from
1516 See also "BO field encodings". */
1518 rel
= PPC_BD (insn
);
1519 newrel
= (oldloc
- *to
) + rel
;
1521 if (newrel
< (1 << 15) && newrel
>= -(1 << 15))
1522 insn
= (insn
& ~0xfffc) | (newrel
& 0xfffc);
1523 else if ((PPC_BO (insn
) & 0x14) == 0x4 || (PPC_BO (insn
) & 0x14) == 0x10)
1527 /* Out of range. Cannot relocate instruction. */
1528 if (newrel
>= (1 << 25) || newrel
< -(1 << 25))
1531 if ((PPC_BO (insn
) & 0x14) == 0x4)
1533 else if ((PPC_BO (insn
) & 0x14) == 0x10)
1536 /* Jump over the unconditional branch. */
1537 insn
= (insn
& ~0xfffc) | 0x8;
1538 write_inferior_memory (*to
, (unsigned char *) &insn
, 4);
1541 /* Build a unconditional branch and copy LK bit. */
1542 insn
= (18 << 26) | (0x3fffffc & newrel
) | (insn
& 0x3);
1543 write_inferior_memory (*to
, (unsigned char *) &insn
, 4);
1548 else if ((PPC_BO (insn
) & 0x14) == 0)
1550 uint32_t bdnz_insn
= (16 << 26) | (0x10 << 21) | 12;
1551 uint32_t bf_insn
= (16 << 26) | (0x4 << 21) | 8;
1555 /* Out of range. Cannot relocate instruction. */
1556 if (newrel
>= (1 << 25) || newrel
< -(1 << 25))
1559 /* Copy BI field. */
1560 bf_insn
|= (insn
& 0x1f0000);
1562 /* Invert condition. */
1563 bdnz_insn
|= (insn
^ (1 << 22)) & (1 << 22);
1564 bf_insn
|= (insn
^ (1 << 24)) & (1 << 24);
1566 write_inferior_memory (*to
, (unsigned char *) &bdnz_insn
, 4);
1568 write_inferior_memory (*to
, (unsigned char *) &bf_insn
, 4);
1571 /* Build a unconditional branch and copy LK bit. */
1572 insn
= (18 << 26) | (0x3fffffc & newrel
) | (insn
& 0x3);
1573 write_inferior_memory (*to
, (unsigned char *) &insn
, 4);
1578 else /* (BO & 0x14) == 0x14, branch always. */
1580 /* Out of range. Cannot relocate instruction. */
1581 if (newrel
>= (1 << 25) || newrel
< -(1 << 25))
1584 /* Build a unconditional branch and copy LK bit. */
1585 insn
= (18 << 26) | (0x3fffffc & newrel
) | (insn
& 0x3);
1586 write_inferior_memory (*to
, (unsigned char *) &insn
, 4);
1593 write_inferior_memory (*to
, (unsigned char *) &insn
, 4);
1597 /* Implement install_fast_tracepoint_jump_pad of target_ops.
1598 See target.h for details. */
1601 ppc_install_fast_tracepoint_jump_pad (CORE_ADDR tpoint
, CORE_ADDR tpaddr
,
1602 CORE_ADDR collector
,
1605 CORE_ADDR
*jump_entry
,
1606 CORE_ADDR
*trampoline
,
1607 ULONGEST
*trampoline_size
,
1608 unsigned char *jjump_pad_insn
,
1609 ULONGEST
*jjump_pad_insn_size
,
1610 CORE_ADDR
*adjusted_insn_addr
,
1611 CORE_ADDR
*adjusted_insn_addr_end
,
1617 CORE_ADDR buildaddr
= *jump_entry
;
1618 const CORE_ADDR entryaddr
= *jump_entry
;
1619 int rsz
, min_frame
, frame_size
, tp_reg
;
1620 #ifdef __powerpc64__
1621 struct regcache
*regcache
= get_thread_regcache (current_thread
, 0);
1622 int is_64
= register_size (regcache
->tdesc
, 0) == 8;
1623 int is_opd
= is_64
&& !is_elfv2_inferior ();
1625 int is_64
= 0, is_opd
= 0;
1628 #ifdef __powerpc64__
1631 /* Minimum frame size is 32 bytes for ELFv2, and 112 bytes for ELFv1. */
1634 frame_size
= (40 * rsz
) + min_frame
;
1642 frame_size
= (40 * rsz
) + min_frame
;
1644 #ifdef __powerpc64__
1648 /* Stack frame layout for this jump pad,
1650 High thread_area (r13/r2) |
1651 tpoint - collecting_t obj
1661 R0 - collected registers
1667 The code flow of this jump pad,
1672 4. Call gdb_collector
1673 5. Restore GPR and SPR
1675 7. Build a jump for back to the program
1676 8. Copy/relocate original instruction
1677 9. Build a jump for replacing orignal instruction. */
1679 /* Adjust stack pointer. */
1681 p
+= GEN_STDU (p
, 1, 1, -frame_size
); /* stdu r1,-frame_size(r1) */
1683 p
+= GEN_STWU (p
, 1, 1, -frame_size
); /* stwu r1,-frame_size(r1) */
1685 /* Store GPRs. Save R1 later, because it had just been modified, but
1686 we want the original value. */
1687 for (j
= 2; j
< 32; j
++)
1688 p
+= GEN_STORE (p
, j
, 1, min_frame
+ j
* rsz
, is_64
);
1689 p
+= GEN_STORE (p
, 0, 1, min_frame
+ 0 * rsz
, is_64
);
1690 /* Set r0 to the original value of r1 before adjusting stack frame,
1691 and then save it. */
1692 p
+= GEN_ADDI (p
, 0, 1, frame_size
);
1693 p
+= GEN_STORE (p
, 0, 1, min_frame
+ 1 * rsz
, is_64
);
1695 /* Save CR, XER, LR, and CTR. */
1696 p
+= GEN_MFCR (p
, 3); /* mfcr r3 */
1697 p
+= GEN_MFSPR (p
, 4, 1); /* mfxer r4 */
1698 p
+= GEN_MFSPR (p
, 5, 8); /* mflr r5 */
1699 p
+= GEN_MFSPR (p
, 6, 9); /* mfctr r6 */
1700 p
+= GEN_STORE (p
, 3, 1, min_frame
+ 32 * rsz
, is_64
);/* std r3, 32(r1) */
1701 p
+= GEN_STORE (p
, 4, 1, min_frame
+ 33 * rsz
, is_64
);/* std r4, 33(r1) */
1702 p
+= GEN_STORE (p
, 5, 1, min_frame
+ 34 * rsz
, is_64
);/* std r5, 34(r1) */
1703 p
+= GEN_STORE (p
, 6, 1, min_frame
+ 35 * rsz
, is_64
);/* std r6, 35(r1) */
1705 /* Save PC<tpaddr> */
1706 p
+= gen_limm (p
, 3, tpaddr
, is_64
);
1707 p
+= GEN_STORE (p
, 3, 1, min_frame
+ 36 * rsz
, is_64
);
1710 /* Setup arguments to collector. */
1711 /* Set r4 to collected registers. */
1712 p
+= GEN_ADDI (p
, 4, 1, min_frame
);
1713 /* Set r3 to TPOINT. */
1714 p
+= gen_limm (p
, 3, tpoint
, is_64
);
1716 /* Prepare collecting_t object for lock. */
1717 p
+= GEN_STORE (p
, 3, 1, min_frame
+ 37 * rsz
, is_64
);
1718 p
+= GEN_STORE (p
, tp_reg
, 1, min_frame
+ 38 * rsz
, is_64
);
1719 /* Set R5 to collecting object. */
1720 p
+= GEN_ADDI (p
, 5, 1, 37 * rsz
);
1722 p
+= GEN_LWSYNC (p
);
1723 p
+= gen_atomic_xchg (p
, lockaddr
, 0, 5, is_64
);
1724 p
+= GEN_LWSYNC (p
);
1726 /* Call to collector. */
1727 p
+= gen_call (p
, collector
, is_64
, is_opd
);
1729 /* Simply write 0 to release the lock. */
1730 p
+= gen_limm (p
, 3, lockaddr
, is_64
);
1731 p
+= gen_limm (p
, 4, 0, is_64
);
1732 p
+= GEN_LWSYNC (p
);
1733 p
+= GEN_STORE (p
, 4, 3, 0, is_64
);
1735 /* Restore stack and registers. */
1736 p
+= GEN_LOAD (p
, 3, 1, min_frame
+ 32 * rsz
, is_64
); /* ld r3, 32(r1) */
1737 p
+= GEN_LOAD (p
, 4, 1, min_frame
+ 33 * rsz
, is_64
); /* ld r4, 33(r1) */
1738 p
+= GEN_LOAD (p
, 5, 1, min_frame
+ 34 * rsz
, is_64
); /* ld r5, 34(r1) */
1739 p
+= GEN_LOAD (p
, 6, 1, min_frame
+ 35 * rsz
, is_64
); /* ld r6, 35(r1) */
1740 p
+= GEN_MTCR (p
, 3); /* mtcr r3 */
1741 p
+= GEN_MTSPR (p
, 4, 1); /* mtxer r4 */
1742 p
+= GEN_MTSPR (p
, 5, 8); /* mtlr r5 */
1743 p
+= GEN_MTSPR (p
, 6, 9); /* mtctr r6 */
1746 for (j
= 2; j
< 32; j
++)
1747 p
+= GEN_LOAD (p
, j
, 1, min_frame
+ j
* rsz
, is_64
);
1748 p
+= GEN_LOAD (p
, 0, 1, min_frame
+ 0 * rsz
, is_64
);
1750 p
+= GEN_ADDI (p
, 1, 1, frame_size
);
1752 /* Flush instructions to inferior memory. */
1753 write_inferior_memory (buildaddr
, (unsigned char *) buf
, (p
- buf
) * 4);
1755 /* Now, insert the original instruction to execute in the jump pad. */
1756 *adjusted_insn_addr
= buildaddr
+ (p
- buf
) * 4;
1757 *adjusted_insn_addr_end
= *adjusted_insn_addr
;
1758 ppc_relocate_instruction (adjusted_insn_addr_end
, tpaddr
);
1760 /* Verify the relocation size. If should be 4 for normal copy,
1761 8 or 12 for some conditional branch. */
1762 if ((*adjusted_insn_addr_end
- *adjusted_insn_addr
== 0)
1763 || (*adjusted_insn_addr_end
- *adjusted_insn_addr
> 12))
1765 sprintf (err
, "E.Unexpected instruction length = %d"
1766 "when relocate instruction.",
1767 (int) (*adjusted_insn_addr_end
- *adjusted_insn_addr
));
1771 buildaddr
= *adjusted_insn_addr_end
;
1773 /* Finally, write a jump back to the program. */
1774 offset
= (tpaddr
+ 4) - buildaddr
;
1775 if (offset
>= (1 << 25) || offset
< -(1 << 25))
1777 sprintf (err
, "E.Jump back from jump pad too far from tracepoint "
1778 "(offset 0x%x > 26-bit).", offset
);
1782 p
+= GEN_B (p
, offset
);
1783 write_inferior_memory (buildaddr
, (unsigned char *) buf
, (p
- buf
) * 4);
1784 *jump_entry
= buildaddr
+ (p
- buf
) * 4;
1786 /* The jump pad is now built. Wire in a jump to our jump pad. This
1787 is always done last (by our caller actually), so that we can
1788 install fast tracepoints with threads running. This relies on
1789 the agent's atomic write support. */
1790 offset
= entryaddr
- tpaddr
;
1791 if (offset
>= (1 << 25) || offset
< -(1 << 25))
1793 sprintf (err
, "E.Jump back from jump pad too far from tracepoint "
1794 "(offset 0x%x > 26-bit).", offset
);
1798 GEN_B ((uint32_t *) jjump_pad_insn
, offset
);
1799 *jjump_pad_insn_size
= 4;
1804 /* Returns the minimum instruction length for installing a tracepoint. */
1807 ppc_get_min_fast_tracepoint_insn_len (void)
1812 /* Emits a given buffer into the target at current_insn_ptr. Length
1813 is in units of 32-bit words. */
1816 emit_insns (uint32_t *buf
, int n
)
1818 n
= n
* sizeof (uint32_t);
1819 write_inferior_memory (current_insn_ptr
, (unsigned char *) buf
, n
);
1820 current_insn_ptr
+= n
;
1823 #define __EMIT_ASM(NAME, INSNS) \
1826 extern uint32_t start_bcax_ ## NAME []; \
1827 extern uint32_t end_bcax_ ## NAME []; \
1828 emit_insns (start_bcax_ ## NAME, \
1829 end_bcax_ ## NAME - start_bcax_ ## NAME); \
1830 __asm__ (".section .text.__ppcbcax\n\t" \
1831 "start_bcax_" #NAME ":\n\t" \
1833 "end_bcax_" #NAME ":\n\t" \
1837 #define _EMIT_ASM(NAME, INSNS) __EMIT_ASM (NAME, INSNS)
1838 #define EMIT_ASM(INSNS) _EMIT_ASM (__LINE__, INSNS)
1842 Bytecode execution stack frame - 32-bit
1844 | LR save area (SP + 4)
1845 SP' -> +- Back chain (SP + 0)
1846 | Save r31 for access saved arguments
1847 | Save r30 for bytecode stack pointer
1848 | Save r4 for incoming argument *value
1849 | Save r3 for incoming argument regs
1850 r30 -> +- Bytecode execution stack
1852 | 64-byte (8 doublewords) at initial.
1853 | Expand stack as needed.
1856 | Some padding for minimum stack frame and 16-byte alignment.
1858 SP +- Back-chain (SP')
1864 r30 is the stack-pointer for bytecode machine.
1865 It should point to next-empty, so we can use LDU for pop.
1866 r3 is used for cache of the high part of TOP value.
1867 It was the first argument, pointer to regs.
1868 r4 is used for cache of the low part of TOP value.
1869 It was the second argument, pointer to the result.
1870 We should set *result = TOP after leaving this function.
1873 * To restore stack at epilogue
1875 * To check stack is big enough for bytecode execution.
1877 * To return execution result.
1882 /* Regardless of endian, register 3 is always high part, 4 is low part.
1883 These defines are used when the register pair is stored/loaded.
1884 Likewise, to simplify code, have a similiar define for 5:6. */
1886 #if __BYTE_ORDER == __LITTLE_ENDIAN
1887 #define TOP_FIRST "4"
1888 #define TOP_SECOND "3"
1889 #define TMP_FIRST "6"
1890 #define TMP_SECOND "5"
1892 #define TOP_FIRST "3"
1893 #define TOP_SECOND "4"
1894 #define TMP_FIRST "5"
1895 #define TMP_SECOND "6"
1898 /* Emit prologue in inferior memory. See above comments. */
1901 ppc_emit_prologue (void)
1903 EMIT_ASM (/* Save return address. */
1906 /* Adjust SP. 96 is the initial frame size. */
1908 /* Save r30 and incoming arguments. */
1909 "stw 31, 96-4(1) \n"
1910 "stw 30, 96-8(1) \n"
1911 "stw 4, 96-12(1) \n"
1912 "stw 3, 96-16(1) \n"
1913 /* Point r31 to original r1 for access arguments. */
1915 /* Set r30 to pointing stack-top. */
1917 /* Initial r3/TOP to 0. */
1922 /* Emit epilogue in inferior memory. See above comments. */
1925 ppc_emit_epilogue (void)
1927 EMIT_ASM (/* *result = TOP */
1929 "stw " TOP_FIRST
", 0(5) \n"
1930 "stw " TOP_SECOND
", 4(5) \n"
1931 /* Restore registers. */
1938 /* Return 0 for no-error. */
1944 /* TOP = stack[--sp] + TOP */
1949 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
1950 "lwz " TMP_SECOND
", 4(30)\n"
1955 /* TOP = stack[--sp] - TOP */
1960 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
1961 "lwz " TMP_SECOND
", 4(30) \n"
1963 "subfe 3, 3, 5 \n");
1966 /* TOP = stack[--sp] * TOP */
1971 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
1972 "lwz " TMP_SECOND
", 4(30) \n"
1981 /* TOP = stack[--sp] << TOP */
1986 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
1987 "lwz " TMP_SECOND
", 4(30) \n"
1988 "subfic 3, 4, 32\n" /* r3 = 32 - TOP */
1989 "addi 7, 4, -32\n" /* r7 = TOP - 32 */
1990 "slw 5, 5, 4\n" /* Shift high part left */
1991 "slw 4, 6, 4\n" /* Shift low part left */
1992 "srw 3, 6, 3\n" /* Shift low to high if shift < 32 */
1993 "slw 7, 6, 7\n" /* Shift low to high if shift >= 32 */
1995 "or 3, 7, 3\n"); /* Assemble high part */
1998 /* Top = stack[--sp] >> TOP
1999 (Arithmetic shift right) */
2002 ppc_emit_rsh_signed (void)
2004 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
2005 "lwz " TMP_SECOND
", 4(30) \n"
2006 "addi 7, 4, -32\n" /* r7 = TOP - 32 */
2007 "sraw 3, 5, 4\n" /* Shift high part right */
2009 "blt 0, 1f\n" /* If shift <= 32, goto 1: */
2010 "sraw 4, 5, 7\n" /* Shift high to low */
2013 "subfic 7, 4, 32\n" /* r7 = 32 - TOP */
2014 "srw 4, 6, 4\n" /* Shift low part right */
2015 "slw 5, 5, 7\n" /* Shift high to low */
2016 "or 4, 4, 5\n" /* Assemble low part */
2020 /* Top = stack[--sp] >> TOP
2021 (Logical shift right) */
2024 ppc_emit_rsh_unsigned (void)
2026 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
2027 "lwz " TMP_SECOND
", 4(30) \n"
2028 "subfic 3, 4, 32\n" /* r3 = 32 - TOP */
2029 "addi 7, 4, -32\n" /* r7 = TOP - 32 */
2030 "srw 6, 6, 4\n" /* Shift low part right */
2031 "slw 3, 5, 3\n" /* Shift high to low if shift < 32 */
2032 "srw 7, 5, 7\n" /* Shift high to low if shift >= 32 */
2034 "srw 3, 5, 4\n" /* Shift high part right */
2035 "or 4, 6, 7\n"); /* Assemble low part */
2038 /* Emit code for signed-extension specified by ARG. */
2041 ppc_emit_ext (int arg
)
2046 EMIT_ASM ("extsb 4, 4\n"
2050 EMIT_ASM ("extsh 4, 4\n"
2054 EMIT_ASM ("srawi 3, 4, 31");
2061 /* Emit code for zero-extension specified by ARG. */
2064 ppc_emit_zero_ext (int arg
)
2069 EMIT_ASM ("clrlwi 4,4,24\n"
2073 EMIT_ASM ("clrlwi 4,4,16\n"
2077 EMIT_ASM ("li 3, 0");
2085 i.e., TOP = (TOP == 0) ? 1 : 0; */
2088 ppc_emit_log_not (void)
2090 EMIT_ASM ("or 4, 3, 4 \n"
2096 /* TOP = stack[--sp] & TOP */
2099 ppc_emit_bit_and (void)
2101 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
2102 "lwz " TMP_SECOND
", 4(30) \n"
2107 /* TOP = stack[--sp] | TOP */
2110 ppc_emit_bit_or (void)
2112 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
2113 "lwz " TMP_SECOND
", 4(30) \n"
2118 /* TOP = stack[--sp] ^ TOP */
2121 ppc_emit_bit_xor (void)
2123 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
2124 "lwz " TMP_SECOND
", 4(30) \n"
2130 i.e., TOP = ~(TOP | TOP) */
2133 ppc_emit_bit_not (void)
2135 EMIT_ASM ("nor 3, 3, 3 \n"
2139 /* TOP = stack[--sp] == TOP */
2142 ppc_emit_equal (void)
2144 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
2145 "lwz " TMP_SECOND
", 4(30) \n"
2154 /* TOP = stack[--sp] < TOP
2155 (Signed comparison) */
2158 ppc_emit_less_signed (void)
2160 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
2161 "lwz " TMP_SECOND
", 4(30) \n"
2164 /* CR6 bit 0 = low less and high equal */
2165 "crand 6*4+0, 6*4+0, 7*4+2\n"
2166 /* CR7 bit 0 = (low less and high equal) or high less */
2167 "cror 7*4+0, 7*4+0, 6*4+0\n"
2169 "rlwinm 4, 4, 29, 31, 31 \n"
2173 /* TOP = stack[--sp] < TOP
2174 (Unsigned comparison) */
2177 ppc_emit_less_unsigned (void)
2179 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
2180 "lwz " TMP_SECOND
", 4(30) \n"
2183 /* CR6 bit 0 = low less and high equal */
2184 "crand 6*4+0, 6*4+0, 7*4+2\n"
2185 /* CR7 bit 0 = (low less and high equal) or high less */
2186 "cror 7*4+0, 7*4+0, 6*4+0\n"
2188 "rlwinm 4, 4, 29, 31, 31 \n"
2192 /* Access the memory address in TOP in size of SIZE.
2193 Zero-extend the read value. */
2196 ppc_emit_ref (int size
)
2201 EMIT_ASM ("lbz 4, 0(4)\n"
2205 EMIT_ASM ("lhz 4, 0(4)\n"
2209 EMIT_ASM ("lwz 4, 0(4)\n"
2213 if (__BYTE_ORDER
== __LITTLE_ENDIAN
)
2214 EMIT_ASM ("lwz 3, 4(4)\n"
2217 EMIT_ASM ("lwz 3, 0(4)\n"
2226 ppc_emit_const (LONGEST num
)
2231 p
+= gen_limm (p
, 3, num
>> 32 & 0xffffffff, 0);
2232 p
+= gen_limm (p
, 4, num
& 0xffffffff, 0);
2234 emit_insns (buf
, p
- buf
);
2235 gdb_assert ((p
- buf
) <= (sizeof (buf
) / sizeof (*buf
)));
2238 /* Set TOP to the value of register REG by calling get_raw_reg function
2239 with two argument, collected buffer and register number. */
2242 ppc_emit_reg (int reg
)
2247 /* fctx->regs is passed in r3 and then saved in -16(31). */
2248 p
+= GEN_LWZ (p
, 3, 31, -16);
2249 p
+= GEN_LI (p
, 4, reg
); /* li r4, reg */
2250 p
+= gen_call (p
, get_raw_reg_func_addr (), 0, 0);
2252 emit_insns (buf
, p
- buf
);
2253 gdb_assert ((p
- buf
) <= (sizeof (buf
) / sizeof (*buf
)));
2255 if (__BYTE_ORDER
== __LITTLE_ENDIAN
)
2257 EMIT_ASM ("mr 5, 4\n"
2263 /* TOP = stack[--sp] */
2268 EMIT_ASM ("lwzu " TOP_FIRST
", 8(30) \n"
2269 "lwz " TOP_SECOND
", 4(30) \n");
2272 /* stack[sp++] = TOP
2274 Because we may use up bytecode stack, expand 8 doublewords more
2278 ppc_emit_stack_flush (void)
2280 /* Make sure bytecode stack is big enough before push.
2281 Otherwise, expand 64-byte more. */
2283 EMIT_ASM (" stw " TOP_FIRST
", 0(30) \n"
2284 " stw " TOP_SECOND
", 4(30)\n"
2285 " addi 5, 30, -(8 + 8) \n"
2288 " stwu 31, -64(1) \n"
2289 "1:addi 30, 30, -8 \n");
2292 /* Swap TOP and stack[sp-1] */
2295 ppc_emit_swap (void)
2297 EMIT_ASM ("lwz " TMP_FIRST
", 8(30) \n"
2298 "lwz " TMP_SECOND
", 12(30) \n"
2299 "stw " TOP_FIRST
", 8(30) \n"
2300 "stw " TOP_SECOND
", 12(30) \n"
2305 /* Discard N elements in the stack. Also used for ppc64. */
2308 ppc_emit_stack_adjust (int n
)
2320 p
+= GEN_ADDI (p
, 30, 30, n
);
2322 emit_insns (buf
, p
- buf
);
2323 gdb_assert ((p
- buf
) <= (sizeof (buf
) / sizeof (*buf
)));
2326 /* Call function FN. */
2329 ppc_emit_call (CORE_ADDR fn
)
2334 p
+= gen_call (p
, fn
, 0, 0);
2336 emit_insns (buf
, p
- buf
);
2337 gdb_assert ((p
- buf
) <= (sizeof (buf
) / sizeof (*buf
)));
2340 /* FN's prototype is `LONGEST(*fn)(int)'.
2345 ppc_emit_int_call_1 (CORE_ADDR fn
, int arg1
)
2350 /* Setup argument. arg1 is a 16-bit value. */
2351 p
+= gen_limm (p
, 3, (uint32_t) arg1
, 0);
2352 p
+= gen_call (p
, fn
, 0, 0);
2354 emit_insns (buf
, p
- buf
);
2355 gdb_assert ((p
- buf
) <= (sizeof (buf
) / sizeof (*buf
)));
2357 if (__BYTE_ORDER
== __LITTLE_ENDIAN
)
2359 EMIT_ASM ("mr 5, 4\n"
2365 /* FN's prototype is `void(*fn)(int,LONGEST)'.
2368 TOP should be preserved/restored before/after the call. */
2371 ppc_emit_void_call_2 (CORE_ADDR fn
, int arg1
)
2376 /* Save TOP. 0(30) is next-empty. */
2377 p
+= GEN_STW (p
, 3, 30, 0);
2378 p
+= GEN_STW (p
, 4, 30, 4);
2380 /* Setup argument. arg1 is a 16-bit value. */
2381 if (__BYTE_ORDER
== __LITTLE_ENDIAN
)
2383 p
+= GEN_MR (p
, 5, 4);
2384 p
+= GEN_MR (p
, 6, 3);
2388 p
+= GEN_MR (p
, 5, 3);
2389 p
+= GEN_MR (p
, 6, 4);
2391 p
+= gen_limm (p
, 3, (uint32_t) arg1
, 0);
2392 p
+= gen_call (p
, fn
, 0, 0);
2395 p
+= GEN_LWZ (p
, 3, 30, 0);
2396 p
+= GEN_LWZ (p
, 4, 30, 4);
2398 emit_insns (buf
, p
- buf
);
2399 gdb_assert ((p
- buf
) <= (sizeof (buf
) / sizeof (*buf
)));
2402 /* Note in the following goto ops:
2404 When emitting goto, the target address is later relocated by
2405 write_goto_address. OFFSET_P is the offset of the branch instruction
2406 in the code sequence, and SIZE_P is how to relocate the instruction,
2407 recognized by ppc_write_goto_address. In current implementation,
2408 SIZE can be either 24 or 14 for branch of conditional-branch instruction.
2411 /* If TOP is true, goto somewhere. Otherwise, just fall-through. */
2414 ppc_emit_if_goto (int *offset_p
, int *size_p
)
2416 EMIT_ASM ("or. 3, 3, 4 \n"
2417 "lwzu " TOP_FIRST
", 8(30) \n"
2418 "lwz " TOP_SECOND
", 4(30) \n"
2427 /* Unconditional goto. Also used for ppc64. */
2430 ppc_emit_goto (int *offset_p
, int *size_p
)
2432 EMIT_ASM ("1:b 1b");
2440 /* Goto if stack[--sp] == TOP */
2443 ppc_emit_eq_goto (int *offset_p
, int *size_p
)
2445 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
2446 "lwz " TMP_SECOND
", 4(30) \n"
2450 "lwzu " TOP_FIRST
", 8(30) \n"
2451 "lwz " TOP_SECOND
", 4(30) \n"
2460 /* Goto if stack[--sp] != TOP */
2463 ppc_emit_ne_goto (int *offset_p
, int *size_p
)
2465 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
2466 "lwz " TMP_SECOND
", 4(30) \n"
2470 "lwzu " TOP_FIRST
", 8(30) \n"
2471 "lwz " TOP_SECOND
", 4(30) \n"
2480 /* Goto if stack[--sp] < TOP */
2483 ppc_emit_lt_goto (int *offset_p
, int *size_p
)
2485 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
2486 "lwz " TMP_SECOND
", 4(30) \n"
2489 /* CR6 bit 0 = low less and high equal */
2490 "crand 6*4+0, 6*4+0, 7*4+2\n"
2491 /* CR7 bit 0 = (low less and high equal) or high less */
2492 "cror 7*4+0, 7*4+0, 6*4+0\n"
2493 "lwzu " TOP_FIRST
", 8(30) \n"
2494 "lwz " TOP_SECOND
", 4(30)\n"
2503 /* Goto if stack[--sp] <= TOP */
2506 ppc_emit_le_goto (int *offset_p
, int *size_p
)
2508 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
2509 "lwz " TMP_SECOND
", 4(30) \n"
2512 /* CR6 bit 0 = low less/equal and high equal */
2513 "crandc 6*4+0, 7*4+2, 6*4+1\n"
2514 /* CR7 bit 0 = (low less/eq and high equal) or high less */
2515 "cror 7*4+0, 7*4+0, 6*4+0\n"
2516 "lwzu " TOP_FIRST
", 8(30) \n"
2517 "lwz " TOP_SECOND
", 4(30)\n"
2526 /* Goto if stack[--sp] > TOP */
2529 ppc_emit_gt_goto (int *offset_p
, int *size_p
)
2531 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
2532 "lwz " TMP_SECOND
", 4(30) \n"
2535 /* CR6 bit 0 = low greater and high equal */
2536 "crand 6*4+0, 6*4+1, 7*4+2\n"
2537 /* CR7 bit 0 = (low greater and high equal) or high greater */
2538 "cror 7*4+0, 7*4+1, 6*4+0\n"
2539 "lwzu " TOP_FIRST
", 8(30) \n"
2540 "lwz " TOP_SECOND
", 4(30)\n"
2549 /* Goto if stack[--sp] >= TOP */
2552 ppc_emit_ge_goto (int *offset_p
, int *size_p
)
2554 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
2555 "lwz " TMP_SECOND
", 4(30) \n"
2558 /* CR6 bit 0 = low ge and high equal */
2559 "crandc 6*4+0, 7*4+2, 6*4+0\n"
2560 /* CR7 bit 0 = (low ge and high equal) or high greater */
2561 "cror 7*4+0, 7*4+1, 6*4+0\n"
2562 "lwzu " TOP_FIRST
", 8(30)\n"
2563 "lwz " TOP_SECOND
", 4(30)\n"
2572 /* Relocate previous emitted branch instruction. FROM is the address
2573 of the branch instruction, TO is the goto target address, and SIZE
2574 if the value we set by *SIZE_P before. Currently, it is either
2575 24 or 14 of branch and conditional-branch instruction.
2576 Also used for ppc64. */
2579 ppc_write_goto_address (CORE_ADDR from
, CORE_ADDR to
, int size
)
2581 long rel
= to
- from
;
2585 read_inferior_memory (from
, (unsigned char *) &insn
, 4);
2586 opcd
= (insn
>> 26) & 0x3f;
2592 || (rel
>= (1 << 15) || rel
< -(1 << 15)))
2594 insn
= (insn
& ~0xfffc) | (rel
& 0xfffc);
2598 || (rel
>= (1 << 25) || rel
< -(1 << 25)))
2600 insn
= (insn
& ~0x3fffffc) | (rel
& 0x3fffffc);
2607 write_inferior_memory (from
, (unsigned char *) &insn
, 4);
2610 /* Table of emit ops for 32-bit. */
2612 static struct emit_ops ppc_emit_ops_impl
=
2620 ppc_emit_rsh_signed
,
2621 ppc_emit_rsh_unsigned
,
2629 ppc_emit_less_signed
,
2630 ppc_emit_less_unsigned
,
2634 ppc_write_goto_address
,
2639 ppc_emit_stack_flush
,
2642 ppc_emit_stack_adjust
,
2643 ppc_emit_int_call_1
,
2644 ppc_emit_void_call_2
,
2653 #ifdef __powerpc64__
2657 Bytecode execution stack frame - 64-bit
2659 | LR save area (SP + 16)
2660 | CR save area (SP + 8)
2661 SP' -> +- Back chain (SP + 0)
2662 | Save r31 for access saved arguments
2663 | Save r30 for bytecode stack pointer
2664 | Save r4 for incoming argument *value
2665 | Save r3 for incoming argument regs
2666 r30 -> +- Bytecode execution stack
2668 | 64-byte (8 doublewords) at initial.
2669 | Expand stack as needed.
2672 | Some padding for minimum stack frame.
2674 SP +- Back-chain (SP')
2677 = 112 + (4 * 8) + 64
2680 r30 is the stack-pointer for bytecode machine.
2681 It should point to next-empty, so we can use LDU for pop.
2682 r3 is used for cache of TOP value.
2683 It was the first argument, pointer to regs.
2684 r4 is the second argument, pointer to the result.
2685 We should set *result = TOP after leaving this function.
2688 * To restore stack at epilogue
2690 * To check stack is big enough for bytecode execution.
2691 => r30 - 8 > SP + 112
2692 * To return execution result.
2697 /* Emit prologue in inferior memory. See above comments. */
2700 ppc64v1_emit_prologue (void)
2702 /* On ELFv1, function pointers really point to function descriptor,
2703 so emit one here. We don't care about contents of words 1 and 2,
2704 so let them just overlap out code. */
2705 uint64_t opd
= current_insn_ptr
+ 8;
2708 /* Mind the strict aliasing rules. */
2709 memcpy (buf
, &opd
, sizeof buf
);
2711 EMIT_ASM (/* Save return address. */
2714 /* Save r30 and incoming arguments. */
2719 /* Point r31 to current r1 for access arguments. */
2721 /* Adjust SP. 208 is the initial frame size. */
2722 "stdu 1, -208(1) \n"
2723 /* Set r30 to pointing stack-top. */
2724 "addi 30, 1, 168 \n"
2725 /* Initial r3/TOP to 0. */
2729 /* Emit prologue in inferior memory. See above comments. */
2732 ppc64v2_emit_prologue (void)
2734 EMIT_ASM (/* Save return address. */
2737 /* Save r30 and incoming arguments. */
2742 /* Point r31 to current r1 for access arguments. */
2744 /* Adjust SP. 208 is the initial frame size. */
2745 "stdu 1, -208(1) \n"
2746 /* Set r30 to pointing stack-top. */
2747 "addi 30, 1, 168 \n"
2748 /* Initial r3/TOP to 0. */
2752 /* Emit epilogue in inferior memory. See above comments. */
2755 ppc64_emit_epilogue (void)
2757 EMIT_ASM (/* Restore SP. */
2762 /* Restore registers. */
2767 /* Return 0 for no-error. */
2773 /* TOP = stack[--sp] + TOP */
2776 ppc64_emit_add (void)
2778 EMIT_ASM ("ldu 4, 8(30) \n"
2782 /* TOP = stack[--sp] - TOP */
2785 ppc64_emit_sub (void)
2787 EMIT_ASM ("ldu 4, 8(30) \n"
2791 /* TOP = stack[--sp] * TOP */
2794 ppc64_emit_mul (void)
2796 EMIT_ASM ("ldu 4, 8(30) \n"
2797 "mulld 3, 4, 3 \n");
2800 /* TOP = stack[--sp] << TOP */
2803 ppc64_emit_lsh (void)
2805 EMIT_ASM ("ldu 4, 8(30) \n"
2809 /* Top = stack[--sp] >> TOP
2810 (Arithmetic shift right) */
2813 ppc64_emit_rsh_signed (void)
2815 EMIT_ASM ("ldu 4, 8(30) \n"
2819 /* Top = stack[--sp] >> TOP
2820 (Logical shift right) */
2823 ppc64_emit_rsh_unsigned (void)
2825 EMIT_ASM ("ldu 4, 8(30) \n"
2829 /* Emit code for signed-extension specified by ARG. */
2832 ppc64_emit_ext (int arg
)
2837 EMIT_ASM ("extsb 3, 3");
2840 EMIT_ASM ("extsh 3, 3");
2843 EMIT_ASM ("extsw 3, 3");
2850 /* Emit code for zero-extension specified by ARG. */
2853 ppc64_emit_zero_ext (int arg
)
2858 EMIT_ASM ("rldicl 3,3,0,56");
2861 EMIT_ASM ("rldicl 3,3,0,48");
2864 EMIT_ASM ("rldicl 3,3,0,32");
2872 i.e., TOP = (TOP == 0) ? 1 : 0; */
2875 ppc64_emit_log_not (void)
2877 EMIT_ASM ("cntlzd 3, 3 \n"
2881 /* TOP = stack[--sp] & TOP */
2884 ppc64_emit_bit_and (void)
2886 EMIT_ASM ("ldu 4, 8(30) \n"
2890 /* TOP = stack[--sp] | TOP */
2893 ppc64_emit_bit_or (void)
2895 EMIT_ASM ("ldu 4, 8(30) \n"
2899 /* TOP = stack[--sp] ^ TOP */
2902 ppc64_emit_bit_xor (void)
2904 EMIT_ASM ("ldu 4, 8(30) \n"
2909 i.e., TOP = ~(TOP | TOP) */
2912 ppc64_emit_bit_not (void)
2914 EMIT_ASM ("nor 3, 3, 3 \n");
2917 /* TOP = stack[--sp] == TOP */
2920 ppc64_emit_equal (void)
2922 EMIT_ASM ("ldu 4, 8(30) \n"
2928 /* TOP = stack[--sp] < TOP
2929 (Signed comparison) */
2932 ppc64_emit_less_signed (void)
2934 EMIT_ASM ("ldu 4, 8(30) \n"
2937 "rlwinm 3, 3, 29, 31, 31 \n");
2940 /* TOP = stack[--sp] < TOP
2941 (Unsigned comparison) */
2944 ppc64_emit_less_unsigned (void)
2946 EMIT_ASM ("ldu 4, 8(30) \n"
2949 "rlwinm 3, 3, 29, 31, 31 \n");
2952 /* Access the memory address in TOP in size of SIZE.
2953 Zero-extend the read value. */
2956 ppc64_emit_ref (int size
)
2961 EMIT_ASM ("lbz 3, 0(3)");
2964 EMIT_ASM ("lhz 3, 0(3)");
2967 EMIT_ASM ("lwz 3, 0(3)");
2970 EMIT_ASM ("ld 3, 0(3)");
2978 ppc64_emit_const (LONGEST num
)
2983 p
+= gen_limm (p
, 3, num
, 1);
2985 emit_insns (buf
, p
- buf
);
2986 gdb_assert ((p
- buf
) <= (sizeof (buf
) / sizeof (*buf
)));
2989 /* Set TOP to the value of register REG by calling get_raw_reg function
2990 with two argument, collected buffer and register number. */
2993 ppc64v1_emit_reg (int reg
)
2998 /* fctx->regs is passed in r3 and then saved in 176(1). */
2999 p
+= GEN_LD (p
, 3, 31, -32);
3000 p
+= GEN_LI (p
, 4, reg
);
3001 p
+= GEN_STD (p
, 2, 1, 40); /* Save TOC. */
3002 p
+= gen_call (p
, get_raw_reg_func_addr (), 1, 1);
3003 p
+= GEN_LD (p
, 2, 1, 40); /* Restore TOC. */
3005 emit_insns (buf
, p
- buf
);
3006 gdb_assert ((p
- buf
) <= (sizeof (buf
) / sizeof (*buf
)));
3009 /* Likewise, for ELFv2. */
3012 ppc64v2_emit_reg (int reg
)
3017 /* fctx->regs is passed in r3 and then saved in 176(1). */
3018 p
+= GEN_LD (p
, 3, 31, -32);
3019 p
+= GEN_LI (p
, 4, reg
);
3020 p
+= GEN_STD (p
, 2, 1, 24); /* Save TOC. */
3021 p
+= gen_call (p
, get_raw_reg_func_addr (), 1, 0);
3022 p
+= GEN_LD (p
, 2, 1, 24); /* Restore TOC. */
3024 emit_insns (buf
, p
- buf
);
3025 gdb_assert ((p
- buf
) <= (sizeof (buf
) / sizeof (*buf
)));
3028 /* TOP = stack[--sp] */
3031 ppc64_emit_pop (void)
3033 EMIT_ASM ("ldu 3, 8(30)");
3036 /* stack[sp++] = TOP
3038 Because we may use up bytecode stack, expand 8 doublewords more
3042 ppc64_emit_stack_flush (void)
3044 /* Make sure bytecode stack is big enough before push.
3045 Otherwise, expand 64-byte more. */
3047 EMIT_ASM (" std 3, 0(30) \n"
3048 " addi 4, 30, -(112 + 8) \n"
3051 " stdu 31, -64(1) \n"
3052 "1:addi 30, 30, -8 \n");
3055 /* Swap TOP and stack[sp-1] */
3058 ppc64_emit_swap (void)
3060 EMIT_ASM ("ld 4, 8(30) \n"
3065 /* Call function FN - ELFv1. */
3068 ppc64v1_emit_call (CORE_ADDR fn
)
3073 p
+= GEN_STD (p
, 2, 1, 40); /* Save TOC. */
3074 p
+= gen_call (p
, fn
, 1, 1);
3075 p
+= GEN_LD (p
, 2, 1, 40); /* Restore TOC. */
3077 emit_insns (buf
, p
- buf
);
3078 gdb_assert ((p
- buf
) <= (sizeof (buf
) / sizeof (*buf
)));
3081 /* Call function FN - ELFv2. */
3084 ppc64v2_emit_call (CORE_ADDR fn
)
3089 p
+= GEN_STD (p
, 2, 1, 24); /* Save TOC. */
3090 p
+= gen_call (p
, fn
, 1, 0);
3091 p
+= GEN_LD (p
, 2, 1, 24); /* Restore TOC. */
3093 emit_insns (buf
, p
- buf
);
3094 gdb_assert ((p
- buf
) <= (sizeof (buf
) / sizeof (*buf
)));
3097 /* FN's prototype is `LONGEST(*fn)(int)'.
3102 ppc64v1_emit_int_call_1 (CORE_ADDR fn
, int arg1
)
3107 /* Setup argument. arg1 is a 16-bit value. */
3108 p
+= gen_limm (p
, 3, arg1
, 1);
3109 p
+= GEN_STD (p
, 2, 1, 40); /* Save TOC. */
3110 p
+= gen_call (p
, fn
, 1, 1);
3111 p
+= GEN_LD (p
, 2, 1, 40); /* Restore TOC. */
3113 emit_insns (buf
, p
- buf
);
3114 gdb_assert ((p
- buf
) <= (sizeof (buf
) / sizeof (*buf
)));
3117 /* Likewise for ELFv2. */
3120 ppc64v2_emit_int_call_1 (CORE_ADDR fn
, int arg1
)
3125 /* Setup argument. arg1 is a 16-bit value. */
3126 p
+= gen_limm (p
, 3, arg1
, 1);
3127 p
+= GEN_STD (p
, 2, 1, 24); /* Save TOC. */
3128 p
+= gen_call (p
, fn
, 1, 0);
3129 p
+= GEN_LD (p
, 2, 1, 24); /* Restore TOC. */
3131 emit_insns (buf
, p
- buf
);
3132 gdb_assert ((p
- buf
) <= (sizeof (buf
) / sizeof (*buf
)));
3135 /* FN's prototype is `void(*fn)(int,LONGEST)'.
3138 TOP should be preserved/restored before/after the call. */
3141 ppc64v1_emit_void_call_2 (CORE_ADDR fn
, int arg1
)
3146 /* Save TOP. 0(30) is next-empty. */
3147 p
+= GEN_STD (p
, 3, 30, 0);
3149 /* Setup argument. arg1 is a 16-bit value. */
3150 p
+= GEN_MR (p
, 4, 3); /* mr r4, r3 */
3151 p
+= gen_limm (p
, 3, arg1
, 1);
3152 p
+= GEN_STD (p
, 2, 1, 40); /* Save TOC. */
3153 p
+= gen_call (p
, fn
, 1, 1);
3154 p
+= GEN_LD (p
, 2, 1, 40); /* Restore TOC. */
3157 p
+= GEN_LD (p
, 3, 30, 0);
3159 emit_insns (buf
, p
- buf
);
3160 gdb_assert ((p
- buf
) <= (sizeof (buf
) / sizeof (*buf
)));
3163 /* Likewise for ELFv2. */
3166 ppc64v2_emit_void_call_2 (CORE_ADDR fn
, int arg1
)
3171 /* Save TOP. 0(30) is next-empty. */
3172 p
+= GEN_STD (p
, 3, 30, 0);
3174 /* Setup argument. arg1 is a 16-bit value. */
3175 p
+= GEN_MR (p
, 4, 3); /* mr r4, r3 */
3176 p
+= gen_limm (p
, 3, arg1
, 1);
3177 p
+= GEN_STD (p
, 2, 1, 24); /* Save TOC. */
3178 p
+= gen_call (p
, fn
, 1, 0);
3179 p
+= GEN_LD (p
, 2, 1, 24); /* Restore TOC. */
3182 p
+= GEN_LD (p
, 3, 30, 0);
3184 emit_insns (buf
, p
- buf
);
3185 gdb_assert ((p
- buf
) <= (sizeof (buf
) / sizeof (*buf
)));
3188 /* If TOP is true, goto somewhere. Otherwise, just fall-through. */
3191 ppc64_emit_if_goto (int *offset_p
, int *size_p
)
3193 EMIT_ASM ("cmpdi 7, 3, 0 \n"
3203 /* Goto if stack[--sp] == TOP */
3206 ppc64_emit_eq_goto (int *offset_p
, int *size_p
)
3208 EMIT_ASM ("ldu 4, 8(30) \n"
3219 /* Goto if stack[--sp] != TOP */
3222 ppc64_emit_ne_goto (int *offset_p
, int *size_p
)
3224 EMIT_ASM ("ldu 4, 8(30) \n"
3235 /* Goto if stack[--sp] < TOP */
3238 ppc64_emit_lt_goto (int *offset_p
, int *size_p
)
3240 EMIT_ASM ("ldu 4, 8(30) \n"
3251 /* Goto if stack[--sp] <= TOP */
3254 ppc64_emit_le_goto (int *offset_p
, int *size_p
)
3256 EMIT_ASM ("ldu 4, 8(30) \n"
3267 /* Goto if stack[--sp] > TOP */
3270 ppc64_emit_gt_goto (int *offset_p
, int *size_p
)
3272 EMIT_ASM ("ldu 4, 8(30) \n"
3283 /* Goto if stack[--sp] >= TOP */
3286 ppc64_emit_ge_goto (int *offset_p
, int *size_p
)
3288 EMIT_ASM ("ldu 4, 8(30) \n"
3299 /* Table of emit ops for 64-bit ELFv1. */
3301 static struct emit_ops ppc64v1_emit_ops_impl
=
3303 ppc64v1_emit_prologue
,
3304 ppc64_emit_epilogue
,
3309 ppc64_emit_rsh_signed
,
3310 ppc64_emit_rsh_unsigned
,
3318 ppc64_emit_less_signed
,
3319 ppc64_emit_less_unsigned
,
3323 ppc_write_goto_address
,
3328 ppc64_emit_stack_flush
,
3329 ppc64_emit_zero_ext
,
3331 ppc_emit_stack_adjust
,
3332 ppc64v1_emit_int_call_1
,
3333 ppc64v1_emit_void_call_2
,
3342 /* Table of emit ops for 64-bit ELFv2. */
3344 static struct emit_ops ppc64v2_emit_ops_impl
=
3346 ppc64v2_emit_prologue
,
3347 ppc64_emit_epilogue
,
3352 ppc64_emit_rsh_signed
,
3353 ppc64_emit_rsh_unsigned
,
3361 ppc64_emit_less_signed
,
3362 ppc64_emit_less_unsigned
,
3366 ppc_write_goto_address
,
3371 ppc64_emit_stack_flush
,
3372 ppc64_emit_zero_ext
,
3374 ppc_emit_stack_adjust
,
3375 ppc64v2_emit_int_call_1
,
3376 ppc64v2_emit_void_call_2
,
3387 /* Implementation of linux_target_ops method "emit_ops". */
3389 static struct emit_ops
*
3392 #ifdef __powerpc64__
3393 struct regcache
*regcache
= get_thread_regcache (current_thread
, 0);
3395 if (register_size (regcache
->tdesc
, 0) == 8)
3397 if (is_elfv2_inferior ())
3398 return &ppc64v2_emit_ops_impl
;
3400 return &ppc64v1_emit_ops_impl
;
3403 return &ppc_emit_ops_impl
;
3406 /* Implementation of linux_target_ops method "get_ipa_tdesc_idx". */
3409 ppc_get_ipa_tdesc_idx (void)
3411 struct regcache
*regcache
= get_thread_regcache (current_thread
, 0);
3412 const struct target_desc
*tdesc
= regcache
->tdesc
;
3414 #ifdef __powerpc64__
3415 if (tdesc
== tdesc_powerpc_64l
)
3416 return PPC_TDESC_BASE
;
3417 if (tdesc
== tdesc_powerpc_altivec64l
)
3418 return PPC_TDESC_ALTIVEC
;
3419 if (tdesc
== tdesc_powerpc_cell64l
)
3420 return PPC_TDESC_CELL
;
3421 if (tdesc
== tdesc_powerpc_vsx64l
)
3422 return PPC_TDESC_VSX
;
3423 if (tdesc
== tdesc_powerpc_isa205_64l
)
3424 return PPC_TDESC_ISA205
;
3425 if (tdesc
== tdesc_powerpc_isa205_altivec64l
)
3426 return PPC_TDESC_ISA205_ALTIVEC
;
3427 if (tdesc
== tdesc_powerpc_isa205_vsx64l
)
3428 return PPC_TDESC_ISA205_VSX
;
3429 if (tdesc
== tdesc_powerpc_isa205_ppr_dscr_vsx64l
)
3430 return PPC_TDESC_ISA205_PPR_DSCR_VSX
;
3431 if (tdesc
== tdesc_powerpc_isa207_vsx64l
)
3432 return PPC_TDESC_ISA207_VSX
;
3433 if (tdesc
== tdesc_powerpc_isa207_htm_vsx64l
)
3434 return PPC_TDESC_ISA207_HTM_VSX
;
3437 if (tdesc
== tdesc_powerpc_32l
)
3438 return PPC_TDESC_BASE
;
3439 if (tdesc
== tdesc_powerpc_altivec32l
)
3440 return PPC_TDESC_ALTIVEC
;
3441 if (tdesc
== tdesc_powerpc_cell32l
)
3442 return PPC_TDESC_CELL
;
3443 if (tdesc
== tdesc_powerpc_vsx32l
)
3444 return PPC_TDESC_VSX
;
3445 if (tdesc
== tdesc_powerpc_isa205_32l
)
3446 return PPC_TDESC_ISA205
;
3447 if (tdesc
== tdesc_powerpc_isa205_altivec32l
)
3448 return PPC_TDESC_ISA205_ALTIVEC
;
3449 if (tdesc
== tdesc_powerpc_isa205_vsx32l
)
3450 return PPC_TDESC_ISA205_VSX
;
3451 if (tdesc
== tdesc_powerpc_isa205_ppr_dscr_vsx32l
)
3452 return PPC_TDESC_ISA205_PPR_DSCR_VSX
;
3453 if (tdesc
== tdesc_powerpc_isa207_vsx32l
)
3454 return PPC_TDESC_ISA207_VSX
;
3455 if (tdesc
== tdesc_powerpc_isa207_htm_vsx32l
)
3456 return PPC_TDESC_ISA207_HTM_VSX
;
3457 if (tdesc
== tdesc_powerpc_e500l
)
3458 return PPC_TDESC_E500
;
3463 struct linux_target_ops the_low_target
= {
3466 ppc_cannot_fetch_register
,
3467 ppc_cannot_store_register
,
3468 NULL
, /* fetch_register */
3471 NULL
, /* breakpoint_kind_from_pc */
3472 ppc_sw_breakpoint_from_kind
,
3476 ppc_supports_z_point_type
,
3481 ppc_collect_ptrace_register
,
3482 ppc_supply_ptrace_register
,
3483 NULL
, /* siginfo_fixup */
3484 NULL
, /* new_process */
3485 NULL
, /* delete_process */
3486 NULL
, /* new_thread */
3487 NULL
, /* delete_thread */
3488 NULL
, /* new_fork */
3489 NULL
, /* prepare_to_resume */
3490 NULL
, /* process_qsupported */
3491 ppc_supports_tracepoints
,
3492 ppc_get_thread_area
,
3493 ppc_install_fast_tracepoint_jump_pad
,
3495 ppc_get_min_fast_tracepoint_insn_len
,
3496 NULL
, /* supports_range_stepping */
3497 NULL
, /* breakpoint_kind_from_current_state */
3498 ppc_supports_hardware_single_step
,
3499 NULL
, /* get_syscall_trapinfo */
3500 ppc_get_ipa_tdesc_idx
,
3504 initialize_low_arch (void)
3506 /* Initialize the Linux target descriptions. */
3508 init_registers_powerpc_32l ();
3509 init_registers_powerpc_altivec32l ();
3510 init_registers_powerpc_cell32l ();
3511 init_registers_powerpc_vsx32l ();
3512 init_registers_powerpc_isa205_32l ();
3513 init_registers_powerpc_isa205_altivec32l ();
3514 init_registers_powerpc_isa205_vsx32l ();
3515 init_registers_powerpc_isa205_ppr_dscr_vsx32l ();
3516 init_registers_powerpc_isa207_vsx32l ();
3517 init_registers_powerpc_isa207_htm_vsx32l ();
3518 init_registers_powerpc_e500l ();
3520 init_registers_powerpc_64l ();
3521 init_registers_powerpc_altivec64l ();
3522 init_registers_powerpc_cell64l ();
3523 init_registers_powerpc_vsx64l ();
3524 init_registers_powerpc_isa205_64l ();
3525 init_registers_powerpc_isa205_altivec64l ();
3526 init_registers_powerpc_isa205_vsx64l ();
3527 init_registers_powerpc_isa205_ppr_dscr_vsx64l ();
3528 init_registers_powerpc_isa207_vsx64l ();
3529 init_registers_powerpc_isa207_htm_vsx64l ();
3532 initialize_regsets_info (&ppc_regsets_info
);