1 /* GNU/Linux/PowerPC specific low level interface, for the remote server for
3 Copyright (C) 1995-2020 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 /* Linux target op definitions for the PowerPC architecture. */
49 class ppc_target
: public linux_process_target
53 const regs_info
*get_regs_info () override
;
55 const gdb_byte
*sw_breakpoint_from_kind (int kind
, int *size
) override
;
57 bool supports_z_point_type (char z_type
) override
;
60 void low_collect_ptrace_register (regcache
*regcache
, int regno
,
63 void low_supply_ptrace_register (regcache
*regcache
, int regno
,
64 const char *buf
) override
;
66 bool supports_tracepoints () override
;
70 void low_arch_setup () override
;
72 bool low_cannot_fetch_register (int regno
) override
;
74 bool low_cannot_store_register (int regno
) override
;
76 bool low_supports_breakpoints () override
;
78 CORE_ADDR
low_get_pc (regcache
*regcache
) override
;
80 void low_set_pc (regcache
*regcache
, CORE_ADDR newpc
) override
;
82 bool low_breakpoint_at (CORE_ADDR pc
) override
;
84 int low_insert_point (raw_bkpt_type type
, CORE_ADDR addr
,
85 int size
, raw_breakpoint
*bp
) override
;
87 int low_remove_point (raw_bkpt_type type
, CORE_ADDR addr
,
88 int size
, raw_breakpoint
*bp
) override
;
90 int low_get_thread_area (int lwpid
, CORE_ADDR
*addrp
) override
;
93 /* The singleton target ops object. */
95 static ppc_target the_ppc_target
;
97 /* Holds the AT_HWCAP auxv entry. */
99 static unsigned long ppc_hwcap
;
101 /* Holds the AT_HWCAP2 auxv entry. */
103 static unsigned long ppc_hwcap2
;
106 #define ppc_num_regs 73
109 /* We use a constant for FPSCR instead of PT_FPSCR, because
110 many shipped PPC64 kernels had the wrong value in ptrace.h. */
111 static int ppc_regmap
[] =
112 {PT_R0
* 8, PT_R1
* 8, PT_R2
* 8, PT_R3
* 8,
113 PT_R4
* 8, PT_R5
* 8, PT_R6
* 8, PT_R7
* 8,
114 PT_R8
* 8, PT_R9
* 8, PT_R10
* 8, PT_R11
* 8,
115 PT_R12
* 8, PT_R13
* 8, PT_R14
* 8, PT_R15
* 8,
116 PT_R16
* 8, PT_R17
* 8, PT_R18
* 8, PT_R19
* 8,
117 PT_R20
* 8, PT_R21
* 8, PT_R22
* 8, PT_R23
* 8,
118 PT_R24
* 8, PT_R25
* 8, PT_R26
* 8, PT_R27
* 8,
119 PT_R28
* 8, PT_R29
* 8, PT_R30
* 8, PT_R31
* 8,
120 PT_FPR0
*8, PT_FPR0
*8 + 8, PT_FPR0
*8+16, PT_FPR0
*8+24,
121 PT_FPR0
*8+32, PT_FPR0
*8+40, PT_FPR0
*8+48, PT_FPR0
*8+56,
122 PT_FPR0
*8+64, PT_FPR0
*8+72, PT_FPR0
*8+80, PT_FPR0
*8+88,
123 PT_FPR0
*8+96, PT_FPR0
*8+104, PT_FPR0
*8+112, PT_FPR0
*8+120,
124 PT_FPR0
*8+128, PT_FPR0
*8+136, PT_FPR0
*8+144, PT_FPR0
*8+152,
125 PT_FPR0
*8+160, PT_FPR0
*8+168, PT_FPR0
*8+176, PT_FPR0
*8+184,
126 PT_FPR0
*8+192, PT_FPR0
*8+200, PT_FPR0
*8+208, PT_FPR0
*8+216,
127 PT_FPR0
*8+224, PT_FPR0
*8+232, PT_FPR0
*8+240, PT_FPR0
*8+248,
128 PT_NIP
* 8, PT_MSR
* 8, PT_CCR
* 8, PT_LNK
* 8,
129 PT_CTR
* 8, PT_XER
* 8, PT_FPR0
*8 + 256,
130 PT_ORIG_R3
* 8, PT_TRAP
* 8 };
132 /* Currently, don't check/send MQ. */
133 static int ppc_regmap
[] =
134 {PT_R0
* 4, PT_R1
* 4, PT_R2
* 4, PT_R3
* 4,
135 PT_R4
* 4, PT_R5
* 4, PT_R6
* 4, PT_R7
* 4,
136 PT_R8
* 4, PT_R9
* 4, PT_R10
* 4, PT_R11
* 4,
137 PT_R12
* 4, PT_R13
* 4, PT_R14
* 4, PT_R15
* 4,
138 PT_R16
* 4, PT_R17
* 4, PT_R18
* 4, PT_R19
* 4,
139 PT_R20
* 4, PT_R21
* 4, PT_R22
* 4, PT_R23
* 4,
140 PT_R24
* 4, PT_R25
* 4, PT_R26
* 4, PT_R27
* 4,
141 PT_R28
* 4, PT_R29
* 4, PT_R30
* 4, PT_R31
* 4,
142 PT_FPR0
*4, PT_FPR0
*4 + 8, PT_FPR0
*4+16, PT_FPR0
*4+24,
143 PT_FPR0
*4+32, PT_FPR0
*4+40, PT_FPR0
*4+48, PT_FPR0
*4+56,
144 PT_FPR0
*4+64, PT_FPR0
*4+72, PT_FPR0
*4+80, PT_FPR0
*4+88,
145 PT_FPR0
*4+96, PT_FPR0
*4+104, PT_FPR0
*4+112, PT_FPR0
*4+120,
146 PT_FPR0
*4+128, PT_FPR0
*4+136, PT_FPR0
*4+144, PT_FPR0
*4+152,
147 PT_FPR0
*4+160, PT_FPR0
*4+168, PT_FPR0
*4+176, PT_FPR0
*4+184,
148 PT_FPR0
*4+192, PT_FPR0
*4+200, PT_FPR0
*4+208, PT_FPR0
*4+216,
149 PT_FPR0
*4+224, PT_FPR0
*4+232, PT_FPR0
*4+240, PT_FPR0
*4+248,
150 PT_NIP
* 4, PT_MSR
* 4, PT_CCR
* 4, PT_LNK
* 4,
151 PT_CTR
* 4, PT_XER
* 4, PT_FPSCR
* 4,
152 PT_ORIG_R3
* 4, PT_TRAP
* 4
155 static int ppc_regmap_e500
[] =
156 {PT_R0
* 4, PT_R1
* 4, PT_R2
* 4, PT_R3
* 4,
157 PT_R4
* 4, PT_R5
* 4, PT_R6
* 4, PT_R7
* 4,
158 PT_R8
* 4, PT_R9
* 4, PT_R10
* 4, PT_R11
* 4,
159 PT_R12
* 4, PT_R13
* 4, PT_R14
* 4, PT_R15
* 4,
160 PT_R16
* 4, PT_R17
* 4, PT_R18
* 4, PT_R19
* 4,
161 PT_R20
* 4, PT_R21
* 4, PT_R22
* 4, PT_R23
* 4,
162 PT_R24
* 4, PT_R25
* 4, PT_R26
* 4, PT_R27
* 4,
163 PT_R28
* 4, PT_R29
* 4, PT_R30
* 4, PT_R31
* 4,
172 PT_NIP
* 4, PT_MSR
* 4, PT_CCR
* 4, PT_LNK
* 4,
173 PT_CTR
* 4, PT_XER
* 4, -1,
174 PT_ORIG_R3
* 4, PT_TRAP
* 4
178 /* Check whether the kernel provides a register set with number
179 REGSET_ID of size REGSETSIZE for process/thread TID. */
182 ppc_check_regset (int tid
, int regset_id
, int regsetsize
)
184 void *buf
= alloca (regsetsize
);
188 iov
.iov_len
= regsetsize
;
190 if (ptrace (PTRACE_GETREGSET
, tid
, regset_id
, &iov
) >= 0
197 ppc_target::low_cannot_store_register (int regno
)
199 const struct target_desc
*tdesc
= current_process ()->tdesc
;
201 #ifndef __powerpc64__
202 /* Some kernels do not allow us to store fpscr. */
203 if (!(ppc_hwcap
& PPC_FEATURE_HAS_SPE
)
204 && regno
== find_regno (tdesc
, "fpscr"))
208 /* Some kernels do not allow us to store orig_r3 or trap. */
209 if (regno
== find_regno (tdesc
, "orig_r3")
210 || regno
== find_regno (tdesc
, "trap"))
217 ppc_target::low_cannot_fetch_register (int regno
)
223 ppc_target::low_collect_ptrace_register (regcache
*regcache
, int regno
,
226 memset (buf
, 0, sizeof (long));
228 if (__BYTE_ORDER
== __LITTLE_ENDIAN
)
230 /* Little-endian values always sit at the left end of the buffer. */
231 collect_register (regcache
, regno
, buf
);
233 else if (__BYTE_ORDER
== __BIG_ENDIAN
)
235 /* Big-endian values sit at the right end of the buffer. In case of
236 registers whose sizes are smaller than sizeof (long), we must use a
237 padding to access them correctly. */
238 int size
= register_size (regcache
->tdesc
, regno
);
240 if (size
< sizeof (long))
241 collect_register (regcache
, regno
, buf
+ sizeof (long) - size
);
243 collect_register (regcache
, regno
, buf
);
246 perror_with_name ("Unexpected byte order");
250 ppc_target::low_supply_ptrace_register (regcache
*regcache
, int regno
,
253 if (__BYTE_ORDER
== __LITTLE_ENDIAN
)
255 /* Little-endian values always sit at the left end of the buffer. */
256 supply_register (regcache
, regno
, buf
);
258 else if (__BYTE_ORDER
== __BIG_ENDIAN
)
260 /* Big-endian values sit at the right end of the buffer. In case of
261 registers whose sizes are smaller than sizeof (long), we must use a
262 padding to access them correctly. */
263 int size
= register_size (regcache
->tdesc
, regno
);
265 if (size
< sizeof (long))
266 supply_register (regcache
, regno
, buf
+ sizeof (long) - size
);
268 supply_register (regcache
, regno
, buf
);
271 perror_with_name ("Unexpected byte order");
275 ppc_target::low_supports_breakpoints ()
281 ppc_target::low_get_pc (regcache
*regcache
)
283 if (register_size (regcache
->tdesc
, 0) == 4)
286 collect_register_by_name (regcache
, "pc", &pc
);
287 return (CORE_ADDR
) pc
;
292 collect_register_by_name (regcache
, "pc", &pc
);
293 return (CORE_ADDR
) pc
;
298 ppc_target::low_set_pc (regcache
*regcache
, CORE_ADDR pc
)
300 if (register_size (regcache
->tdesc
, 0) == 4)
302 unsigned int newpc
= pc
;
303 supply_register_by_name (regcache
, "pc", &newpc
);
307 unsigned long newpc
= pc
;
308 supply_register_by_name (regcache
, "pc", &newpc
);
312 #ifndef __powerpc64__
313 static int ppc_regmap_adjusted
;
317 /* Correct in either endianness.
318 This instruction is "twge r2, r2", which GDB uses as a software
320 static const unsigned int ppc_breakpoint
= 0x7d821008;
321 #define ppc_breakpoint_len 4
323 /* Implementation of target ops method "sw_breakpoint_from_kind". */
326 ppc_target::sw_breakpoint_from_kind (int kind
, int *size
)
328 *size
= ppc_breakpoint_len
;
329 return (const gdb_byte
*) &ppc_breakpoint
;
333 ppc_target::low_breakpoint_at (CORE_ADDR where
)
337 read_memory (where
, (unsigned char *) &insn
, 4);
338 if (insn
== ppc_breakpoint
)
340 /* If necessary, recognize more trap instructions here. GDB only uses
346 /* Implement supports_z_point_type target-ops.
347 Returns true if type Z_TYPE breakpoint is supported.
349 Handling software breakpoint at server side, so tracepoints
350 and breakpoints can be inserted at the same location. */
353 ppc_target::supports_z_point_type (char z_type
)
360 case Z_PACKET_WRITE_WP
:
361 case Z_PACKET_ACCESS_WP
:
367 /* Implement the low_insert_point linux target op.
368 Returns 0 on success, -1 on failure and 1 on unsupported. */
371 ppc_target::low_insert_point (raw_bkpt_type type
, CORE_ADDR addr
,
372 int size
, raw_breakpoint
*bp
)
376 case raw_bkpt_type_sw
:
377 return insert_memory_breakpoint (bp
);
379 case raw_bkpt_type_hw
:
380 case raw_bkpt_type_write_wp
:
381 case raw_bkpt_type_access_wp
:
388 /* Implement the low_remove_point linux target op.
389 Returns 0 on success, -1 on failure and 1 on unsupported. */
392 ppc_target::low_remove_point (raw_bkpt_type type
, CORE_ADDR addr
,
393 int size
, raw_breakpoint
*bp
)
397 case raw_bkpt_type_sw
:
398 return remove_memory_breakpoint (bp
);
400 case raw_bkpt_type_hw
:
401 case raw_bkpt_type_write_wp
:
402 case raw_bkpt_type_access_wp
:
409 /* Provide only a fill function for the general register set. ps_lgetregs
410 will use this for NPTL support. */
412 static void ppc_fill_gregset (struct regcache
*regcache
, void *buf
)
416 ppc_target
*my_ppc_target
= (ppc_target
*) the_linux_target
;
418 for (i
= 0; i
< 32; i
++)
419 my_ppc_target
->low_collect_ptrace_register (regcache
, i
,
420 (char *) buf
+ ppc_regmap
[i
]);
422 for (i
= 64; i
< 70; i
++)
423 my_ppc_target
->low_collect_ptrace_register (regcache
, i
,
424 (char *) buf
+ ppc_regmap
[i
]);
426 for (i
= 71; i
< 73; i
++)
427 my_ppc_target
->low_collect_ptrace_register (regcache
, i
,
428 (char *) buf
+ ppc_regmap
[i
]);
431 /* Program Priority Register regset fill function. */
434 ppc_fill_pprregset (struct regcache
*regcache
, void *buf
)
436 char *ppr
= (char *) buf
;
438 collect_register_by_name (regcache
, "ppr", ppr
);
441 /* Program Priority Register regset store function. */
444 ppc_store_pprregset (struct regcache
*regcache
, const void *buf
)
446 const char *ppr
= (const char *) buf
;
448 supply_register_by_name (regcache
, "ppr", ppr
);
451 /* Data Stream Control Register regset fill function. */
454 ppc_fill_dscrregset (struct regcache
*regcache
, void *buf
)
456 char *dscr
= (char *) buf
;
458 collect_register_by_name (regcache
, "dscr", dscr
);
461 /* Data Stream Control Register regset store function. */
464 ppc_store_dscrregset (struct regcache
*regcache
, const void *buf
)
466 const char *dscr
= (const char *) buf
;
468 supply_register_by_name (regcache
, "dscr", dscr
);
471 /* Target Address Register regset fill function. */
474 ppc_fill_tarregset (struct regcache
*regcache
, void *buf
)
476 char *tar
= (char *) buf
;
478 collect_register_by_name (regcache
, "tar", tar
);
481 /* Target Address Register regset store function. */
484 ppc_store_tarregset (struct regcache
*regcache
, const void *buf
)
486 const char *tar
= (const char *) buf
;
488 supply_register_by_name (regcache
, "tar", tar
);
491 /* Event-Based Branching regset store function. Unless the inferior
492 has a perf event open, ptrace can return in error when reading and
493 writing to the regset, with ENODATA. For reading, the registers
494 will correctly show as unavailable. For writing, gdbserver
495 currently only caches any register writes from P and G packets and
496 the stub always tries to write all the regsets when resuming the
497 inferior, which would result in frequent warnings. For this
498 reason, we don't define a fill function. This also means that the
499 client-side regcache will be dirty if the user tries to write to
500 the EBB registers. G packets that the client sends to write to
501 unrelated registers will also include data for EBB registers, even
502 if they are unavailable. */
505 ppc_store_ebbregset (struct regcache
*regcache
, const void *buf
)
507 const char *regset
= (const char *) buf
;
509 /* The order in the kernel regset is: EBBRR, EBBHR, BESCR. In the
510 .dat file is BESCR, EBBHR, EBBRR. */
511 supply_register_by_name (regcache
, "ebbrr", ®set
[0]);
512 supply_register_by_name (regcache
, "ebbhr", ®set
[8]);
513 supply_register_by_name (regcache
, "bescr", ®set
[16]);
516 /* Performance Monitoring Unit regset fill function. */
519 ppc_fill_pmuregset (struct regcache
*regcache
, void *buf
)
521 char *regset
= (char *) buf
;
523 /* The order in the kernel regset is SIAR, SDAR, SIER, MMCR2, MMCR0.
524 In the .dat file is MMCR0, MMCR2, SIAR, SDAR, SIER. */
525 collect_register_by_name (regcache
, "siar", ®set
[0]);
526 collect_register_by_name (regcache
, "sdar", ®set
[8]);
527 collect_register_by_name (regcache
, "sier", ®set
[16]);
528 collect_register_by_name (regcache
, "mmcr2", ®set
[24]);
529 collect_register_by_name (regcache
, "mmcr0", ®set
[32]);
532 /* Performance Monitoring Unit regset store function. */
535 ppc_store_pmuregset (struct regcache
*regcache
, const void *buf
)
537 const char *regset
= (const char *) buf
;
539 supply_register_by_name (regcache
, "siar", ®set
[0]);
540 supply_register_by_name (regcache
, "sdar", ®set
[8]);
541 supply_register_by_name (regcache
, "sier", ®set
[16]);
542 supply_register_by_name (regcache
, "mmcr2", ®set
[24]);
543 supply_register_by_name (regcache
, "mmcr0", ®set
[32]);
546 /* Hardware Transactional Memory special-purpose register regset fill
550 ppc_fill_tm_sprregset (struct regcache
*regcache
, void *buf
)
553 char *regset
= (char *) buf
;
555 base
= find_regno (regcache
->tdesc
, "tfhar");
556 for (i
= 0; i
< 3; i
++)
557 collect_register (regcache
, base
+ i
, ®set
[i
* 8]);
560 /* Hardware Transactional Memory special-purpose register regset store
564 ppc_store_tm_sprregset (struct regcache
*regcache
, const void *buf
)
567 const char *regset
= (const char *) buf
;
569 base
= find_regno (regcache
->tdesc
, "tfhar");
570 for (i
= 0; i
< 3; i
++)
571 supply_register (regcache
, base
+ i
, ®set
[i
* 8]);
574 /* For the same reasons as the EBB regset, none of the HTM
575 checkpointed regsets have a fill function. These registers are
576 only available if the inferior is in a transaction. */
578 /* Hardware Transactional Memory checkpointed general-purpose regset
582 ppc_store_tm_cgprregset (struct regcache
*regcache
, const void *buf
)
584 int i
, base
, size
, endian_offset
;
585 const char *regset
= (const char *) buf
;
587 base
= find_regno (regcache
->tdesc
, "cr0");
588 size
= register_size (regcache
->tdesc
, base
);
590 gdb_assert (size
== 4 || size
== 8);
592 for (i
= 0; i
< 32; i
++)
593 supply_register (regcache
, base
+ i
, ®set
[i
* size
]);
597 if ((size
== 8) && (__BYTE_ORDER
== __BIG_ENDIAN
))
600 supply_register_by_name (regcache
, "ccr",
601 ®set
[PT_CCR
* size
+ endian_offset
]);
603 supply_register_by_name (regcache
, "cxer",
604 ®set
[PT_XER
* size
+ endian_offset
]);
606 supply_register_by_name (regcache
, "clr", ®set
[PT_LNK
* size
]);
607 supply_register_by_name (regcache
, "cctr", ®set
[PT_CTR
* size
]);
610 /* Hardware Transactional Memory checkpointed floating-point regset
614 ppc_store_tm_cfprregset (struct regcache
*regcache
, const void *buf
)
617 const char *regset
= (const char *) buf
;
619 base
= find_regno (regcache
->tdesc
, "cf0");
621 for (i
= 0; i
< 32; i
++)
622 supply_register (regcache
, base
+ i
, ®set
[i
* 8]);
624 supply_register_by_name (regcache
, "cfpscr", ®set
[32 * 8]);
627 /* Hardware Transactional Memory checkpointed vector regset store
631 ppc_store_tm_cvrregset (struct regcache
*regcache
, const void *buf
)
634 const char *regset
= (const char *) buf
;
637 base
= find_regno (regcache
->tdesc
, "cvr0");
639 for (i
= 0; i
< 32; i
++)
640 supply_register (regcache
, base
+ i
, ®set
[i
* 16]);
642 if (__BYTE_ORDER
== __BIG_ENDIAN
)
645 supply_register_by_name (regcache
, "cvscr",
646 ®set
[32 * 16 + vscr_offset
]);
648 supply_register_by_name (regcache
, "cvrsave", ®set
[33 * 16]);
651 /* Hardware Transactional Memory checkpointed vector-scalar regset
655 ppc_store_tm_cvsxregset (struct regcache
*regcache
, const void *buf
)
658 const char *regset
= (const char *) buf
;
660 base
= find_regno (regcache
->tdesc
, "cvs0h");
661 for (i
= 0; i
< 32; i
++)
662 supply_register (regcache
, base
+ i
, ®set
[i
* 8]);
665 /* Hardware Transactional Memory checkpointed Program Priority
666 Register regset store function. */
669 ppc_store_tm_cpprregset (struct regcache
*regcache
, const void *buf
)
671 const char *cppr
= (const char *) buf
;
673 supply_register_by_name (regcache
, "cppr", cppr
);
676 /* Hardware Transactional Memory checkpointed Data Stream Control
677 Register regset store function. */
680 ppc_store_tm_cdscrregset (struct regcache
*regcache
, const void *buf
)
682 const char *cdscr
= (const char *) buf
;
684 supply_register_by_name (regcache
, "cdscr", cdscr
);
687 /* Hardware Transactional Memory checkpointed Target Address Register
688 regset store function. */
691 ppc_store_tm_ctarregset (struct regcache
*regcache
, const void *buf
)
693 const char *ctar
= (const char *) buf
;
695 supply_register_by_name (regcache
, "ctar", ctar
);
699 ppc_fill_vsxregset (struct regcache
*regcache
, void *buf
)
702 char *regset
= (char *) buf
;
704 base
= find_regno (regcache
->tdesc
, "vs0h");
705 for (i
= 0; i
< 32; i
++)
706 collect_register (regcache
, base
+ i
, ®set
[i
* 8]);
710 ppc_store_vsxregset (struct regcache
*regcache
, const void *buf
)
713 const char *regset
= (const char *) buf
;
715 base
= find_regno (regcache
->tdesc
, "vs0h");
716 for (i
= 0; i
< 32; i
++)
717 supply_register (regcache
, base
+ i
, ®set
[i
* 8]);
721 ppc_fill_vrregset (struct regcache
*regcache
, void *buf
)
724 char *regset
= (char *) buf
;
727 base
= find_regno (regcache
->tdesc
, "vr0");
728 for (i
= 0; i
< 32; i
++)
729 collect_register (regcache
, base
+ i
, ®set
[i
* 16]);
731 if (__BYTE_ORDER
== __BIG_ENDIAN
)
734 collect_register_by_name (regcache
, "vscr",
735 ®set
[32 * 16 + vscr_offset
]);
737 collect_register_by_name (regcache
, "vrsave", ®set
[33 * 16]);
741 ppc_store_vrregset (struct regcache
*regcache
, const void *buf
)
744 const char *regset
= (const char *) buf
;
747 base
= find_regno (regcache
->tdesc
, "vr0");
748 for (i
= 0; i
< 32; i
++)
749 supply_register (regcache
, base
+ i
, ®set
[i
* 16]);
751 if (__BYTE_ORDER
== __BIG_ENDIAN
)
754 supply_register_by_name (regcache
, "vscr",
755 ®set
[32 * 16 + vscr_offset
]);
756 supply_register_by_name (regcache
, "vrsave", ®set
[33 * 16]);
759 struct gdb_evrregset_t
761 unsigned long evr
[32];
762 unsigned long long acc
;
763 unsigned long spefscr
;
767 ppc_fill_evrregset (struct regcache
*regcache
, void *buf
)
770 struct gdb_evrregset_t
*regset
= (struct gdb_evrregset_t
*) buf
;
772 ev0
= find_regno (regcache
->tdesc
, "ev0h");
773 for (i
= 0; i
< 32; i
++)
774 collect_register (regcache
, ev0
+ i
, ®set
->evr
[i
]);
776 collect_register_by_name (regcache
, "acc", ®set
->acc
);
777 collect_register_by_name (regcache
, "spefscr", ®set
->spefscr
);
781 ppc_store_evrregset (struct regcache
*regcache
, const void *buf
)
784 const struct gdb_evrregset_t
*regset
= (const struct gdb_evrregset_t
*) buf
;
786 ev0
= find_regno (regcache
->tdesc
, "ev0h");
787 for (i
= 0; i
< 32; i
++)
788 supply_register (regcache
, ev0
+ i
, ®set
->evr
[i
]);
790 supply_register_by_name (regcache
, "acc", ®set
->acc
);
791 supply_register_by_name (regcache
, "spefscr", ®set
->spefscr
);
794 /* Support for hardware single step. */
797 ppc_supports_hardware_single_step (void)
802 static struct regset_info ppc_regsets
[] = {
803 /* List the extra register sets before GENERAL_REGS. That way we will
804 fetch them every time, but still fall back to PTRACE_PEEKUSER for the
805 general registers. Some kernels support these, but not the newer
806 PPC_PTRACE_GETREGS. */
807 { PTRACE_GETREGSET
, PTRACE_SETREGSET
, NT_PPC_TM_CTAR
, 0, EXTENDED_REGS
,
808 NULL
, ppc_store_tm_ctarregset
},
809 { PTRACE_GETREGSET
, PTRACE_SETREGSET
, NT_PPC_TM_CDSCR
, 0, EXTENDED_REGS
,
810 NULL
, ppc_store_tm_cdscrregset
},
811 { PTRACE_GETREGSET
, PTRACE_SETREGSET
, NT_PPC_TM_CPPR
, 0, EXTENDED_REGS
,
812 NULL
, ppc_store_tm_cpprregset
},
813 { PTRACE_GETREGSET
, PTRACE_SETREGSET
, NT_PPC_TM_CVSX
, 0, EXTENDED_REGS
,
814 NULL
, ppc_store_tm_cvsxregset
},
815 { PTRACE_GETREGSET
, PTRACE_SETREGSET
, NT_PPC_TM_CVMX
, 0, EXTENDED_REGS
,
816 NULL
, ppc_store_tm_cvrregset
},
817 { PTRACE_GETREGSET
, PTRACE_SETREGSET
, NT_PPC_TM_CFPR
, 0, EXTENDED_REGS
,
818 NULL
, ppc_store_tm_cfprregset
},
819 { PTRACE_GETREGSET
, PTRACE_SETREGSET
, NT_PPC_TM_CGPR
, 0, EXTENDED_REGS
,
820 NULL
, ppc_store_tm_cgprregset
},
821 { PTRACE_GETREGSET
, PTRACE_SETREGSET
, NT_PPC_TM_SPR
, 0, EXTENDED_REGS
,
822 ppc_fill_tm_sprregset
, ppc_store_tm_sprregset
},
823 { PTRACE_GETREGSET
, PTRACE_SETREGSET
, NT_PPC_EBB
, 0, EXTENDED_REGS
,
824 NULL
, ppc_store_ebbregset
},
825 { PTRACE_GETREGSET
, PTRACE_SETREGSET
, NT_PPC_PMU
, 0, EXTENDED_REGS
,
826 ppc_fill_pmuregset
, ppc_store_pmuregset
},
827 { PTRACE_GETREGSET
, PTRACE_SETREGSET
, NT_PPC_TAR
, 0, EXTENDED_REGS
,
828 ppc_fill_tarregset
, ppc_store_tarregset
},
829 { PTRACE_GETREGSET
, PTRACE_SETREGSET
, NT_PPC_PPR
, 0, EXTENDED_REGS
,
830 ppc_fill_pprregset
, ppc_store_pprregset
},
831 { PTRACE_GETREGSET
, PTRACE_SETREGSET
, NT_PPC_DSCR
, 0, EXTENDED_REGS
,
832 ppc_fill_dscrregset
, ppc_store_dscrregset
},
833 { PTRACE_GETVSXREGS
, PTRACE_SETVSXREGS
, 0, 0, EXTENDED_REGS
,
834 ppc_fill_vsxregset
, ppc_store_vsxregset
},
835 { PTRACE_GETVRREGS
, PTRACE_SETVRREGS
, 0, 0, EXTENDED_REGS
,
836 ppc_fill_vrregset
, ppc_store_vrregset
},
837 { PTRACE_GETEVRREGS
, PTRACE_SETEVRREGS
, 0, 0, EXTENDED_REGS
,
838 ppc_fill_evrregset
, ppc_store_evrregset
},
839 { 0, 0, 0, 0, GENERAL_REGS
, ppc_fill_gregset
, NULL
},
843 static struct usrregs_info ppc_usrregs_info
=
849 static struct regsets_info ppc_regsets_info
=
851 ppc_regsets
, /* regsets */
853 NULL
, /* disabled_regsets */
856 static struct regs_info myregs_info
=
858 NULL
, /* regset_bitmap */
864 ppc_target::get_regs_info ()
870 ppc_target::low_arch_setup ()
872 const struct target_desc
*tdesc
;
873 struct regset_info
*regset
;
874 struct ppc_linux_features features
= ppc_linux_no_features
;
876 int tid
= lwpid_of (current_thread
);
878 features
.wordsize
= ppc_linux_target_wordsize (tid
);
880 if (features
.wordsize
== 4)
881 tdesc
= tdesc_powerpc_32l
;
883 tdesc
= tdesc_powerpc_64l
;
885 current_process ()->tdesc
= tdesc
;
887 /* The value of current_process ()->tdesc needs to be set for this
889 ppc_hwcap
= linux_get_hwcap (features
.wordsize
);
890 ppc_hwcap2
= linux_get_hwcap2 (features
.wordsize
);
892 features
.isa205
= ppc_linux_has_isa205 (ppc_hwcap
);
894 if (ppc_hwcap
& PPC_FEATURE_HAS_VSX
)
897 if (ppc_hwcap
& PPC_FEATURE_HAS_ALTIVEC
)
898 features
.altivec
= true;
900 if ((ppc_hwcap2
& PPC_FEATURE2_DSCR
)
901 && ppc_check_regset (tid
, NT_PPC_DSCR
, PPC_LINUX_SIZEOF_DSCRREGSET
)
902 && ppc_check_regset (tid
, NT_PPC_PPR
, PPC_LINUX_SIZEOF_PPRREGSET
))
904 features
.ppr_dscr
= true;
905 if ((ppc_hwcap2
& PPC_FEATURE2_ARCH_2_07
)
906 && (ppc_hwcap2
& PPC_FEATURE2_TAR
)
907 && (ppc_hwcap2
& PPC_FEATURE2_EBB
)
908 && ppc_check_regset (tid
, NT_PPC_TAR
,
909 PPC_LINUX_SIZEOF_TARREGSET
)
910 && ppc_check_regset (tid
, NT_PPC_EBB
,
911 PPC_LINUX_SIZEOF_EBBREGSET
)
912 && ppc_check_regset (tid
, NT_PPC_PMU
,
913 PPC_LINUX_SIZEOF_PMUREGSET
))
915 features
.isa207
= true;
916 if ((ppc_hwcap2
& PPC_FEATURE2_HTM
)
917 && ppc_check_regset (tid
, NT_PPC_TM_SPR
,
918 PPC_LINUX_SIZEOF_TM_SPRREGSET
))
923 tdesc
= ppc_linux_match_description (features
);
925 /* On 32-bit machines, check for SPE registers.
926 Set the low target's regmap field as appropriately. */
927 #ifndef __powerpc64__
928 if (ppc_hwcap
& PPC_FEATURE_HAS_SPE
)
929 tdesc
= tdesc_powerpc_e500l
;
931 if (!ppc_regmap_adjusted
)
933 if (ppc_hwcap
& PPC_FEATURE_HAS_SPE
)
934 ppc_usrregs_info
.regmap
= ppc_regmap_e500
;
936 /* If the FPSCR is 64-bit wide, we need to fetch the whole
937 64-bit slot and not just its second word. The PT_FPSCR
938 supplied in a 32-bit GDB compilation doesn't reflect
940 if (register_size (tdesc
, 70) == 8)
941 ppc_regmap
[70] = (48 + 2*32) * sizeof (long);
943 ppc_regmap_adjusted
= 1;
947 current_process ()->tdesc
= tdesc
;
949 for (regset
= ppc_regsets
; regset
->size
>= 0; regset
++)
950 switch (regset
->get_request
)
952 case PTRACE_GETVRREGS
:
953 regset
->size
= features
.altivec
? PPC_LINUX_SIZEOF_VRREGSET
: 0;
955 case PTRACE_GETVSXREGS
:
956 regset
->size
= features
.vsx
? PPC_LINUX_SIZEOF_VSXREGSET
: 0;
958 case PTRACE_GETEVRREGS
:
959 if (ppc_hwcap
& PPC_FEATURE_HAS_SPE
)
960 regset
->size
= 32 * 4 + 8 + 4;
964 case PTRACE_GETREGSET
:
965 switch (regset
->nt_type
)
968 regset
->size
= (features
.ppr_dscr
?
969 PPC_LINUX_SIZEOF_PPRREGSET
: 0);
972 regset
->size
= (features
.ppr_dscr
?
973 PPC_LINUX_SIZEOF_DSCRREGSET
: 0);
976 regset
->size
= (features
.isa207
?
977 PPC_LINUX_SIZEOF_TARREGSET
: 0);
980 regset
->size
= (features
.isa207
?
981 PPC_LINUX_SIZEOF_EBBREGSET
: 0);
984 regset
->size
= (features
.isa207
?
985 PPC_LINUX_SIZEOF_PMUREGSET
: 0);
988 regset
->size
= (features
.htm
?
989 PPC_LINUX_SIZEOF_TM_SPRREGSET
: 0);
992 if (features
.wordsize
== 4)
993 regset
->size
= (features
.htm
?
994 PPC32_LINUX_SIZEOF_CGPRREGSET
: 0);
996 regset
->size
= (features
.htm
?
997 PPC64_LINUX_SIZEOF_CGPRREGSET
: 0);
1000 regset
->size
= (features
.htm
?
1001 PPC_LINUX_SIZEOF_CFPRREGSET
: 0);
1003 case NT_PPC_TM_CVMX
:
1004 regset
->size
= (features
.htm
?
1005 PPC_LINUX_SIZEOF_CVMXREGSET
: 0);
1007 case NT_PPC_TM_CVSX
:
1008 regset
->size
= (features
.htm
?
1009 PPC_LINUX_SIZEOF_CVSXREGSET
: 0);
1011 case NT_PPC_TM_CPPR
:
1012 regset
->size
= (features
.htm
?
1013 PPC_LINUX_SIZEOF_CPPRREGSET
: 0);
1015 case NT_PPC_TM_CDSCR
:
1016 regset
->size
= (features
.htm
?
1017 PPC_LINUX_SIZEOF_CDSCRREGSET
: 0);
1019 case NT_PPC_TM_CTAR
:
1020 regset
->size
= (features
.htm
?
1021 PPC_LINUX_SIZEOF_CTARREGSET
: 0);
1032 /* Implementation of target ops method "supports_tracepoints". */
1035 ppc_target::supports_tracepoints ()
1040 /* Get the thread area address. This is used to recognize which
1041 thread is which when tracing with the in-process agent library. We
1042 don't read anything from the address, and treat it as opaque; it's
1043 the address itself that we assume is unique per-thread. */
1046 ppc_target::low_get_thread_area (int lwpid
, CORE_ADDR
*addr
)
1048 struct lwp_info
*lwp
= find_lwp_pid (ptid_t (lwpid
));
1049 struct thread_info
*thr
= get_lwp_thread (lwp
);
1050 struct regcache
*regcache
= get_thread_regcache (thr
, 1);
1053 #ifdef __powerpc64__
1054 if (register_size (regcache
->tdesc
, 0) == 8)
1055 collect_register_by_name (regcache
, "r13", &tp
);
1058 collect_register_by_name (regcache
, "r2", &tp
);
1065 #ifdef __powerpc64__
1067 /* Older glibc doesn't provide this. */
1069 #ifndef EF_PPC64_ABI
1070 #define EF_PPC64_ABI 3
1073 /* Returns 1 if inferior is using ELFv2 ABI. Undefined for 32-bit
1077 is_elfv2_inferior (void)
1079 /* To be used as fallback if we're unable to determine the right result -
1080 assume inferior uses the same ABI as gdbserver. */
1082 const int def_res
= 1;
1084 const int def_res
= 0;
1089 const struct target_desc
*tdesc
= current_process ()->tdesc
;
1090 int wordsize
= register_size (tdesc
, 0);
1092 if (!linux_get_auxv (wordsize
, AT_PHDR
, &phdr
))
1095 /* Assume ELF header is at the beginning of the page where program headers
1096 are located. If it doesn't look like one, bail. */
1098 read_inferior_memory (phdr
& ~0xfff, (unsigned char *) &ehdr
, sizeof ehdr
);
1099 if (memcmp(ehdr
.e_ident
, ELFMAG
, SELFMAG
))
1102 return (ehdr
.e_flags
& EF_PPC64_ABI
) == 2;
1107 /* Generate a ds-form instruction in BUF and return the number of bytes written
1110 | OPCD | RST | RA | DS |XO| */
1112 __attribute__((unused
)) /* Maybe unused due to conditional compilation. */
1114 gen_ds_form (uint32_t *buf
, int opcd
, int rst
, int ra
, int ds
, int xo
)
1118 gdb_assert ((opcd
& ~0x3f) == 0);
1119 gdb_assert ((rst
& ~0x1f) == 0);
1120 gdb_assert ((ra
& ~0x1f) == 0);
1121 gdb_assert ((xo
& ~0x3) == 0);
1123 insn
= (rst
<< 21) | (ra
<< 16) | (ds
& 0xfffc) | (xo
& 0x3);
1124 *buf
= (opcd
<< 26) | insn
;
1128 /* Followings are frequently used ds-form instructions. */
1130 #define GEN_STD(buf, rs, ra, offset) gen_ds_form (buf, 62, rs, ra, offset, 0)
1131 #define GEN_STDU(buf, rs, ra, offset) gen_ds_form (buf, 62, rs, ra, offset, 1)
1132 #define GEN_LD(buf, rt, ra, offset) gen_ds_form (buf, 58, rt, ra, offset, 0)
1133 #define GEN_LDU(buf, rt, ra, offset) gen_ds_form (buf, 58, rt, ra, offset, 1)
1135 /* Generate a d-form instruction in BUF.
1138 | OPCD | RST | RA | D | */
1141 gen_d_form (uint32_t *buf
, int opcd
, int rst
, int ra
, int si
)
1145 gdb_assert ((opcd
& ~0x3f) == 0);
1146 gdb_assert ((rst
& ~0x1f) == 0);
1147 gdb_assert ((ra
& ~0x1f) == 0);
1149 insn
= (rst
<< 21) | (ra
<< 16) | (si
& 0xffff);
1150 *buf
= (opcd
<< 26) | insn
;
1154 /* Followings are frequently used d-form instructions. */
1156 #define GEN_ADDI(buf, rt, ra, si) gen_d_form (buf, 14, rt, ra, si)
1157 #define GEN_ADDIS(buf, rt, ra, si) gen_d_form (buf, 15, rt, ra, si)
1158 #define GEN_LI(buf, rt, si) GEN_ADDI (buf, rt, 0, si)
1159 #define GEN_LIS(buf, rt, si) GEN_ADDIS (buf, rt, 0, si)
1160 #define GEN_ORI(buf, rt, ra, si) gen_d_form (buf, 24, rt, ra, si)
1161 #define GEN_ORIS(buf, rt, ra, si) gen_d_form (buf, 25, rt, ra, si)
1162 #define GEN_LWZ(buf, rt, ra, si) gen_d_form (buf, 32, rt, ra, si)
1163 #define GEN_STW(buf, rt, ra, si) gen_d_form (buf, 36, rt, ra, si)
1164 #define GEN_STWU(buf, rt, ra, si) gen_d_form (buf, 37, rt, ra, si)
1166 /* Generate a xfx-form instruction in BUF and return the number of bytes
1170 | OPCD | RST | RI | XO |/| */
1173 gen_xfx_form (uint32_t *buf
, int opcd
, int rst
, int ri
, int xo
)
1176 unsigned int n
= ((ri
& 0x1f) << 5) | ((ri
>> 5) & 0x1f);
1178 gdb_assert ((opcd
& ~0x3f) == 0);
1179 gdb_assert ((rst
& ~0x1f) == 0);
1180 gdb_assert ((xo
& ~0x3ff) == 0);
1182 insn
= (rst
<< 21) | (n
<< 11) | (xo
<< 1);
1183 *buf
= (opcd
<< 26) | insn
;
1187 /* Followings are frequently used xfx-form instructions. */
1189 #define GEN_MFSPR(buf, rt, spr) gen_xfx_form (buf, 31, rt, spr, 339)
1190 #define GEN_MTSPR(buf, rt, spr) gen_xfx_form (buf, 31, rt, spr, 467)
1191 #define GEN_MFCR(buf, rt) gen_xfx_form (buf, 31, rt, 0, 19)
1192 #define GEN_MTCR(buf, rt) gen_xfx_form (buf, 31, rt, 0x3cf, 144)
1193 #define GEN_SYNC(buf, L, E) gen_xfx_form (buf, 31, L & 0x3, \
1195 #define GEN_LWSYNC(buf) GEN_SYNC (buf, 1, 0)
1198 /* Generate a x-form instruction in BUF and return the number of bytes written.
1201 | OPCD | RST | RA | RB | XO |RC| */
1204 gen_x_form (uint32_t *buf
, int opcd
, int rst
, int ra
, int rb
, int xo
, int rc
)
1208 gdb_assert ((opcd
& ~0x3f) == 0);
1209 gdb_assert ((rst
& ~0x1f) == 0);
1210 gdb_assert ((ra
& ~0x1f) == 0);
1211 gdb_assert ((rb
& ~0x1f) == 0);
1212 gdb_assert ((xo
& ~0x3ff) == 0);
1213 gdb_assert ((rc
& ~1) == 0);
1215 insn
= (rst
<< 21) | (ra
<< 16) | (rb
<< 11) | (xo
<< 1) | rc
;
1216 *buf
= (opcd
<< 26) | insn
;
1220 /* Followings are frequently used x-form instructions. */
1222 #define GEN_OR(buf, ra, rs, rb) gen_x_form (buf, 31, rs, ra, rb, 444, 0)
1223 #define GEN_MR(buf, ra, rs) GEN_OR (buf, ra, rs, rs)
1224 #define GEN_LWARX(buf, rt, ra, rb) gen_x_form (buf, 31, rt, ra, rb, 20, 0)
1225 #define GEN_STWCX(buf, rs, ra, rb) gen_x_form (buf, 31, rs, ra, rb, 150, 1)
1226 /* Assume bf = cr7. */
1227 #define GEN_CMPW(buf, ra, rb) gen_x_form (buf, 31, 28, ra, rb, 0, 0)
1230 /* Generate a md-form instruction in BUF and return the number of bytes written.
1232 0 6 11 16 21 27 30 31 32
1233 | OPCD | RS | RA | sh | mb | XO |sh|Rc| */
1236 gen_md_form (uint32_t *buf
, int opcd
, int rs
, int ra
, int sh
, int mb
,
1240 unsigned int n
= ((mb
& 0x1f) << 1) | ((mb
>> 5) & 0x1);
1241 unsigned int sh0_4
= sh
& 0x1f;
1242 unsigned int sh5
= (sh
>> 5) & 1;
1244 gdb_assert ((opcd
& ~0x3f) == 0);
1245 gdb_assert ((rs
& ~0x1f) == 0);
1246 gdb_assert ((ra
& ~0x1f) == 0);
1247 gdb_assert ((sh
& ~0x3f) == 0);
1248 gdb_assert ((mb
& ~0x3f) == 0);
1249 gdb_assert ((xo
& ~0x7) == 0);
1250 gdb_assert ((rc
& ~0x1) == 0);
1252 insn
= (rs
<< 21) | (ra
<< 16) | (sh0_4
<< 11) | (n
<< 5)
1253 | (sh5
<< 1) | (xo
<< 2) | (rc
& 1);
1254 *buf
= (opcd
<< 26) | insn
;
1258 /* The following are frequently used md-form instructions. */
1260 #define GEN_RLDICL(buf, ra, rs ,sh, mb) \
1261 gen_md_form (buf, 30, rs, ra, sh, mb, 0, 0)
1262 #define GEN_RLDICR(buf, ra, rs ,sh, mb) \
1263 gen_md_form (buf, 30, rs, ra, sh, mb, 1, 0)
1265 /* Generate a i-form instruction in BUF and return the number of bytes written.
1268 | OPCD | LI |AA|LK| */
1271 gen_i_form (uint32_t *buf
, int opcd
, int li
, int aa
, int lk
)
1275 gdb_assert ((opcd
& ~0x3f) == 0);
1277 insn
= (li
& 0x3fffffc) | (aa
& 1) | (lk
& 1);
1278 *buf
= (opcd
<< 26) | insn
;
1282 /* The following are frequently used i-form instructions. */
1284 #define GEN_B(buf, li) gen_i_form (buf, 18, li, 0, 0)
1285 #define GEN_BL(buf, li) gen_i_form (buf, 18, li, 0, 1)
1287 /* Generate a b-form instruction in BUF and return the number of bytes written.
1290 | OPCD | BO | BI | BD |AA|LK| */
1293 gen_b_form (uint32_t *buf
, int opcd
, int bo
, int bi
, int bd
,
1298 gdb_assert ((opcd
& ~0x3f) == 0);
1299 gdb_assert ((bo
& ~0x1f) == 0);
1300 gdb_assert ((bi
& ~0x1f) == 0);
1302 insn
= (bo
<< 21) | (bi
<< 16) | (bd
& 0xfffc) | (aa
& 1) | (lk
& 1);
1303 *buf
= (opcd
<< 26) | insn
;
1307 /* The following are frequently used b-form instructions. */
1308 /* Assume bi = cr7. */
1309 #define GEN_BNE(buf, bd) gen_b_form (buf, 16, 0x4, (7 << 2) | 2, bd, 0 ,0)
1311 /* GEN_LOAD and GEN_STORE generate 64- or 32-bit load/store for ppc64 or ppc32
1312 respectively. They are primary used for save/restore GPRs in jump-pad,
1313 not used for bytecode compiling. */
1315 #ifdef __powerpc64__
1316 #define GEN_LOAD(buf, rt, ra, si, is_64) (is_64 ? \
1317 GEN_LD (buf, rt, ra, si) : \
1318 GEN_LWZ (buf, rt, ra, si))
1319 #define GEN_STORE(buf, rt, ra, si, is_64) (is_64 ? \
1320 GEN_STD (buf, rt, ra, si) : \
1321 GEN_STW (buf, rt, ra, si))
1323 #define GEN_LOAD(buf, rt, ra, si, is_64) GEN_LWZ (buf, rt, ra, si)
1324 #define GEN_STORE(buf, rt, ra, si, is_64) GEN_STW (buf, rt, ra, si)
1327 /* Generate a sequence of instructions to load IMM in the register REG.
1328 Write the instructions in BUF and return the number of bytes written. */
1331 gen_limm (uint32_t *buf
, int reg
, uint64_t imm
, int is_64
)
1335 if ((imm
+ 32768) < 65536)
1337 /* li reg, imm[15:0] */
1338 p
+= GEN_LI (p
, reg
, imm
);
1340 else if ((imm
>> 32) == 0)
1342 /* lis reg, imm[31:16]
1343 ori reg, reg, imm[15:0]
1344 rldicl reg, reg, 0, 32 */
1345 p
+= GEN_LIS (p
, reg
, (imm
>> 16) & 0xffff);
1346 if ((imm
& 0xffff) != 0)
1347 p
+= GEN_ORI (p
, reg
, reg
, imm
& 0xffff);
1348 /* Clear upper 32-bit if sign-bit is set. */
1349 if (imm
& (1u << 31) && is_64
)
1350 p
+= GEN_RLDICL (p
, reg
, reg
, 0, 32);
1355 /* lis reg, <imm[63:48]>
1356 ori reg, reg, <imm[48:32]>
1357 rldicr reg, reg, 32, 31
1358 oris reg, reg, <imm[31:16]>
1359 ori reg, reg, <imm[15:0]> */
1360 p
+= GEN_LIS (p
, reg
, ((imm
>> 48) & 0xffff));
1361 if (((imm
>> 32) & 0xffff) != 0)
1362 p
+= GEN_ORI (p
, reg
, reg
, ((imm
>> 32) & 0xffff));
1363 p
+= GEN_RLDICR (p
, reg
, reg
, 32, 31);
1364 if (((imm
>> 16) & 0xffff) != 0)
1365 p
+= GEN_ORIS (p
, reg
, reg
, ((imm
>> 16) & 0xffff));
1366 if ((imm
& 0xffff) != 0)
1367 p
+= GEN_ORI (p
, reg
, reg
, (imm
& 0xffff));
1373 /* Generate a sequence for atomically exchange at location LOCK.
1374 This code sequence clobbers r6, r7, r8. LOCK is the location for
1375 the atomic-xchg, OLD_VALUE is expected old value stored in the
1376 location, and R_NEW is a register for the new value. */
1379 gen_atomic_xchg (uint32_t *buf
, CORE_ADDR lock
, int old_value
, int r_new
,
1382 const int r_lock
= 6;
1383 const int r_old
= 7;
1384 const int r_tmp
= 8;
1388 1: lwarx TMP, 0, LOCK
1394 p
+= gen_limm (p
, r_lock
, lock
, is_64
);
1395 p
+= gen_limm (p
, r_old
, old_value
, is_64
);
1397 p
+= GEN_LWARX (p
, r_tmp
, 0, r_lock
);
1398 p
+= GEN_CMPW (p
, r_tmp
, r_old
);
1399 p
+= GEN_BNE (p
, -8);
1400 p
+= GEN_STWCX (p
, r_new
, 0, r_lock
);
1401 p
+= GEN_BNE (p
, -16);
1406 /* Generate a sequence of instructions for calling a function
1407 at address of FN. Return the number of bytes are written in BUF. */
1410 gen_call (uint32_t *buf
, CORE_ADDR fn
, int is_64
, int is_opd
)
1414 /* Must be called by r12 for caller to calculate TOC address. */
1415 p
+= gen_limm (p
, 12, fn
, is_64
);
1418 p
+= GEN_LOAD (p
, 11, 12, 16, is_64
);
1419 p
+= GEN_LOAD (p
, 2, 12, 8, is_64
);
1420 p
+= GEN_LOAD (p
, 12, 12, 0, is_64
);
1422 p
+= GEN_MTSPR (p
, 12, 9); /* mtctr r12 */
1423 *p
++ = 0x4e800421; /* bctrl */
1428 /* Copy the instruction from OLDLOC to *TO, and update *TO to *TO + size
1429 of instruction. This function is used to adjust pc-relative instructions
1433 ppc_relocate_instruction (CORE_ADDR
*to
, CORE_ADDR oldloc
)
1438 read_inferior_memory (oldloc
, (unsigned char *) &insn
, 4);
1439 op6
= PPC_OP6 (insn
);
1441 if (op6
== 18 && (insn
& 2) == 0)
1443 /* branch && AA = 0 */
1444 rel
= PPC_LI (insn
);
1445 newrel
= (oldloc
- *to
) + rel
;
1447 /* Out of range. Cannot relocate instruction. */
1448 if (newrel
>= (1 << 25) || newrel
< -(1 << 25))
1451 insn
= (insn
& ~0x3fffffc) | (newrel
& 0x3fffffc);
1453 else if (op6
== 16 && (insn
& 2) == 0)
1455 /* conditional branch && AA = 0 */
1457 /* If the new relocation is too big for even a 26-bit unconditional
1458 branch, there is nothing we can do. Just abort.
1460 Otherwise, if it can be fit in 16-bit conditional branch, just
1461 copy the instruction and relocate the address.
1463 If the it's big for conditional-branch (16-bit), try to invert the
1464 condition and jump with 26-bit branch. For example,
1475 After this transform, we are actually jump from *TO+4 instead of *TO,
1476 so check the relocation again because it will be 1-insn farther then
1477 before if *TO is after OLDLOC.
1480 For BDNZT (or so) is transformed from
1492 See also "BO field encodings". */
1494 rel
= PPC_BD (insn
);
1495 newrel
= (oldloc
- *to
) + rel
;
1497 if (newrel
< (1 << 15) && newrel
>= -(1 << 15))
1498 insn
= (insn
& ~0xfffc) | (newrel
& 0xfffc);
1499 else if ((PPC_BO (insn
) & 0x14) == 0x4 || (PPC_BO (insn
) & 0x14) == 0x10)
1503 /* Out of range. Cannot relocate instruction. */
1504 if (newrel
>= (1 << 25) || newrel
< -(1 << 25))
1507 if ((PPC_BO (insn
) & 0x14) == 0x4)
1509 else if ((PPC_BO (insn
) & 0x14) == 0x10)
1512 /* Jump over the unconditional branch. */
1513 insn
= (insn
& ~0xfffc) | 0x8;
1514 target_write_memory (*to
, (unsigned char *) &insn
, 4);
1517 /* Build a unconditional branch and copy LK bit. */
1518 insn
= (18 << 26) | (0x3fffffc & newrel
) | (insn
& 0x3);
1519 target_write_memory (*to
, (unsigned char *) &insn
, 4);
1524 else if ((PPC_BO (insn
) & 0x14) == 0)
1526 uint32_t bdnz_insn
= (16 << 26) | (0x10 << 21) | 12;
1527 uint32_t bf_insn
= (16 << 26) | (0x4 << 21) | 8;
1531 /* Out of range. Cannot relocate instruction. */
1532 if (newrel
>= (1 << 25) || newrel
< -(1 << 25))
1535 /* Copy BI field. */
1536 bf_insn
|= (insn
& 0x1f0000);
1538 /* Invert condition. */
1539 bdnz_insn
|= (insn
^ (1 << 22)) & (1 << 22);
1540 bf_insn
|= (insn
^ (1 << 24)) & (1 << 24);
1542 target_write_memory (*to
, (unsigned char *) &bdnz_insn
, 4);
1544 target_write_memory (*to
, (unsigned char *) &bf_insn
, 4);
1547 /* Build a unconditional branch and copy LK bit. */
1548 insn
= (18 << 26) | (0x3fffffc & newrel
) | (insn
& 0x3);
1549 target_write_memory (*to
, (unsigned char *) &insn
, 4);
1554 else /* (BO & 0x14) == 0x14, branch always. */
1556 /* Out of range. Cannot relocate instruction. */
1557 if (newrel
>= (1 << 25) || newrel
< -(1 << 25))
1560 /* Build a unconditional branch and copy LK bit. */
1561 insn
= (18 << 26) | (0x3fffffc & newrel
) | (insn
& 0x3);
1562 target_write_memory (*to
, (unsigned char *) &insn
, 4);
1569 target_write_memory (*to
, (unsigned char *) &insn
, 4);
1573 /* Implement install_fast_tracepoint_jump_pad of target_ops.
1574 See target.h for details. */
1577 ppc_install_fast_tracepoint_jump_pad (CORE_ADDR tpoint
, CORE_ADDR tpaddr
,
1578 CORE_ADDR collector
,
1581 CORE_ADDR
*jump_entry
,
1582 CORE_ADDR
*trampoline
,
1583 ULONGEST
*trampoline_size
,
1584 unsigned char *jjump_pad_insn
,
1585 ULONGEST
*jjump_pad_insn_size
,
1586 CORE_ADDR
*adjusted_insn_addr
,
1587 CORE_ADDR
*adjusted_insn_addr_end
,
1593 CORE_ADDR buildaddr
= *jump_entry
;
1594 const CORE_ADDR entryaddr
= *jump_entry
;
1595 int rsz
, min_frame
, frame_size
, tp_reg
;
1596 #ifdef __powerpc64__
1597 struct regcache
*regcache
= get_thread_regcache (current_thread
, 0);
1598 int is_64
= register_size (regcache
->tdesc
, 0) == 8;
1599 int is_opd
= is_64
&& !is_elfv2_inferior ();
1601 int is_64
= 0, is_opd
= 0;
1604 #ifdef __powerpc64__
1607 /* Minimum frame size is 32 bytes for ELFv2, and 112 bytes for ELFv1. */
1610 frame_size
= (40 * rsz
) + min_frame
;
1618 frame_size
= (40 * rsz
) + min_frame
;
1620 #ifdef __powerpc64__
1624 /* Stack frame layout for this jump pad,
1626 High thread_area (r13/r2) |
1627 tpoint - collecting_t obj
1637 R0 - collected registers
1643 The code flow of this jump pad,
1648 4. Call gdb_collector
1649 5. Restore GPR and SPR
1651 7. Build a jump for back to the program
1652 8. Copy/relocate original instruction
1653 9. Build a jump for replacing original instruction. */
1655 /* Adjust stack pointer. */
1657 p
+= GEN_STDU (p
, 1, 1, -frame_size
); /* stdu r1,-frame_size(r1) */
1659 p
+= GEN_STWU (p
, 1, 1, -frame_size
); /* stwu r1,-frame_size(r1) */
1661 /* Store GPRs. Save R1 later, because it had just been modified, but
1662 we want the original value. */
1663 for (j
= 2; j
< 32; j
++)
1664 p
+= GEN_STORE (p
, j
, 1, min_frame
+ j
* rsz
, is_64
);
1665 p
+= GEN_STORE (p
, 0, 1, min_frame
+ 0 * rsz
, is_64
);
1666 /* Set r0 to the original value of r1 before adjusting stack frame,
1667 and then save it. */
1668 p
+= GEN_ADDI (p
, 0, 1, frame_size
);
1669 p
+= GEN_STORE (p
, 0, 1, min_frame
+ 1 * rsz
, is_64
);
1671 /* Save CR, XER, LR, and CTR. */
1672 p
+= GEN_MFCR (p
, 3); /* mfcr r3 */
1673 p
+= GEN_MFSPR (p
, 4, 1); /* mfxer r4 */
1674 p
+= GEN_MFSPR (p
, 5, 8); /* mflr r5 */
1675 p
+= GEN_MFSPR (p
, 6, 9); /* mfctr r6 */
1676 p
+= GEN_STORE (p
, 3, 1, min_frame
+ 32 * rsz
, is_64
);/* std r3, 32(r1) */
1677 p
+= GEN_STORE (p
, 4, 1, min_frame
+ 33 * rsz
, is_64
);/* std r4, 33(r1) */
1678 p
+= GEN_STORE (p
, 5, 1, min_frame
+ 34 * rsz
, is_64
);/* std r5, 34(r1) */
1679 p
+= GEN_STORE (p
, 6, 1, min_frame
+ 35 * rsz
, is_64
);/* std r6, 35(r1) */
1681 /* Save PC<tpaddr> */
1682 p
+= gen_limm (p
, 3, tpaddr
, is_64
);
1683 p
+= GEN_STORE (p
, 3, 1, min_frame
+ 36 * rsz
, is_64
);
1686 /* Setup arguments to collector. */
1687 /* Set r4 to collected registers. */
1688 p
+= GEN_ADDI (p
, 4, 1, min_frame
);
1689 /* Set r3 to TPOINT. */
1690 p
+= gen_limm (p
, 3, tpoint
, is_64
);
1692 /* Prepare collecting_t object for lock. */
1693 p
+= GEN_STORE (p
, 3, 1, min_frame
+ 37 * rsz
, is_64
);
1694 p
+= GEN_STORE (p
, tp_reg
, 1, min_frame
+ 38 * rsz
, is_64
);
1695 /* Set R5 to collecting object. */
1696 p
+= GEN_ADDI (p
, 5, 1, 37 * rsz
);
1698 p
+= GEN_LWSYNC (p
);
1699 p
+= gen_atomic_xchg (p
, lockaddr
, 0, 5, is_64
);
1700 p
+= GEN_LWSYNC (p
);
1702 /* Call to collector. */
1703 p
+= gen_call (p
, collector
, is_64
, is_opd
);
1705 /* Simply write 0 to release the lock. */
1706 p
+= gen_limm (p
, 3, lockaddr
, is_64
);
1707 p
+= gen_limm (p
, 4, 0, is_64
);
1708 p
+= GEN_LWSYNC (p
);
1709 p
+= GEN_STORE (p
, 4, 3, 0, is_64
);
1711 /* Restore stack and registers. */
1712 p
+= GEN_LOAD (p
, 3, 1, min_frame
+ 32 * rsz
, is_64
); /* ld r3, 32(r1) */
1713 p
+= GEN_LOAD (p
, 4, 1, min_frame
+ 33 * rsz
, is_64
); /* ld r4, 33(r1) */
1714 p
+= GEN_LOAD (p
, 5, 1, min_frame
+ 34 * rsz
, is_64
); /* ld r5, 34(r1) */
1715 p
+= GEN_LOAD (p
, 6, 1, min_frame
+ 35 * rsz
, is_64
); /* ld r6, 35(r1) */
1716 p
+= GEN_MTCR (p
, 3); /* mtcr r3 */
1717 p
+= GEN_MTSPR (p
, 4, 1); /* mtxer r4 */
1718 p
+= GEN_MTSPR (p
, 5, 8); /* mtlr r5 */
1719 p
+= GEN_MTSPR (p
, 6, 9); /* mtctr r6 */
1722 for (j
= 2; j
< 32; j
++)
1723 p
+= GEN_LOAD (p
, j
, 1, min_frame
+ j
* rsz
, is_64
);
1724 p
+= GEN_LOAD (p
, 0, 1, min_frame
+ 0 * rsz
, is_64
);
1726 p
+= GEN_ADDI (p
, 1, 1, frame_size
);
1728 /* Flush instructions to inferior memory. */
1729 target_write_memory (buildaddr
, (unsigned char *) buf
, (p
- buf
) * 4);
1731 /* Now, insert the original instruction to execute in the jump pad. */
1732 *adjusted_insn_addr
= buildaddr
+ (p
- buf
) * 4;
1733 *adjusted_insn_addr_end
= *adjusted_insn_addr
;
1734 ppc_relocate_instruction (adjusted_insn_addr_end
, tpaddr
);
1736 /* Verify the relocation size. If should be 4 for normal copy,
1737 8 or 12 for some conditional branch. */
1738 if ((*adjusted_insn_addr_end
- *adjusted_insn_addr
== 0)
1739 || (*adjusted_insn_addr_end
- *adjusted_insn_addr
> 12))
1741 sprintf (err
, "E.Unexpected instruction length = %d"
1742 "when relocate instruction.",
1743 (int) (*adjusted_insn_addr_end
- *adjusted_insn_addr
));
1747 buildaddr
= *adjusted_insn_addr_end
;
1749 /* Finally, write a jump back to the program. */
1750 offset
= (tpaddr
+ 4) - buildaddr
;
1751 if (offset
>= (1 << 25) || offset
< -(1 << 25))
1753 sprintf (err
, "E.Jump back from jump pad too far from tracepoint "
1754 "(offset 0x%x > 26-bit).", offset
);
1758 p
+= GEN_B (p
, offset
);
1759 target_write_memory (buildaddr
, (unsigned char *) buf
, (p
- buf
) * 4);
1760 *jump_entry
= buildaddr
+ (p
- buf
) * 4;
1762 /* The jump pad is now built. Wire in a jump to our jump pad. This
1763 is always done last (by our caller actually), so that we can
1764 install fast tracepoints with threads running. This relies on
1765 the agent's atomic write support. */
1766 offset
= entryaddr
- tpaddr
;
1767 if (offset
>= (1 << 25) || offset
< -(1 << 25))
1769 sprintf (err
, "E.Jump back from jump pad too far from tracepoint "
1770 "(offset 0x%x > 26-bit).", offset
);
1774 GEN_B ((uint32_t *) jjump_pad_insn
, offset
);
1775 *jjump_pad_insn_size
= 4;
1780 /* Returns the minimum instruction length for installing a tracepoint. */
1783 ppc_get_min_fast_tracepoint_insn_len (void)
1788 /* Emits a given buffer into the target at current_insn_ptr. Length
1789 is in units of 32-bit words. */
1792 emit_insns (uint32_t *buf
, int n
)
1794 n
= n
* sizeof (uint32_t);
1795 target_write_memory (current_insn_ptr
, (unsigned char *) buf
, n
);
1796 current_insn_ptr
+= n
;
1799 #define __EMIT_ASM(NAME, INSNS) \
1802 extern uint32_t start_bcax_ ## NAME []; \
1803 extern uint32_t end_bcax_ ## NAME []; \
1804 emit_insns (start_bcax_ ## NAME, \
1805 end_bcax_ ## NAME - start_bcax_ ## NAME); \
1806 __asm__ (".section .text.__ppcbcax\n\t" \
1807 "start_bcax_" #NAME ":\n\t" \
1809 "end_bcax_" #NAME ":\n\t" \
1813 #define _EMIT_ASM(NAME, INSNS) __EMIT_ASM (NAME, INSNS)
1814 #define EMIT_ASM(INSNS) _EMIT_ASM (__LINE__, INSNS)
1818 Bytecode execution stack frame - 32-bit
1820 | LR save area (SP + 4)
1821 SP' -> +- Back chain (SP + 0)
1822 | Save r31 for access saved arguments
1823 | Save r30 for bytecode stack pointer
1824 | Save r4 for incoming argument *value
1825 | Save r3 for incoming argument regs
1826 r30 -> +- Bytecode execution stack
1828 | 64-byte (8 doublewords) at initial.
1829 | Expand stack as needed.
1832 | Some padding for minimum stack frame and 16-byte alignment.
1834 SP +- Back-chain (SP')
1840 r30 is the stack-pointer for bytecode machine.
1841 It should point to next-empty, so we can use LDU for pop.
1842 r3 is used for cache of the high part of TOP value.
1843 It was the first argument, pointer to regs.
1844 r4 is used for cache of the low part of TOP value.
1845 It was the second argument, pointer to the result.
1846 We should set *result = TOP after leaving this function.
1849 * To restore stack at epilogue
1851 * To check stack is big enough for bytecode execution.
1853 * To return execution result.
1858 /* Regardless of endian, register 3 is always high part, 4 is low part.
1859 These defines are used when the register pair is stored/loaded.
1860 Likewise, to simplify code, have a similiar define for 5:6. */
1862 #if __BYTE_ORDER == __LITTLE_ENDIAN
1863 #define TOP_FIRST "4"
1864 #define TOP_SECOND "3"
1865 #define TMP_FIRST "6"
1866 #define TMP_SECOND "5"
1868 #define TOP_FIRST "3"
1869 #define TOP_SECOND "4"
1870 #define TMP_FIRST "5"
1871 #define TMP_SECOND "6"
1874 /* Emit prologue in inferior memory. See above comments. */
1877 ppc_emit_prologue (void)
1879 EMIT_ASM (/* Save return address. */
1882 /* Adjust SP. 96 is the initial frame size. */
1884 /* Save r30 and incoming arguments. */
1885 "stw 31, 96-4(1) \n"
1886 "stw 30, 96-8(1) \n"
1887 "stw 4, 96-12(1) \n"
1888 "stw 3, 96-16(1) \n"
1889 /* Point r31 to original r1 for access arguments. */
1891 /* Set r30 to pointing stack-top. */
1893 /* Initial r3/TOP to 0. */
1898 /* Emit epilogue in inferior memory. See above comments. */
1901 ppc_emit_epilogue (void)
1903 EMIT_ASM (/* *result = TOP */
1905 "stw " TOP_FIRST
", 0(5) \n"
1906 "stw " TOP_SECOND
", 4(5) \n"
1907 /* Restore registers. */
1914 /* Return 0 for no-error. */
1920 /* TOP = stack[--sp] + TOP */
1925 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
1926 "lwz " TMP_SECOND
", 4(30)\n"
1931 /* TOP = stack[--sp] - TOP */
1936 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
1937 "lwz " TMP_SECOND
", 4(30) \n"
1939 "subfe 3, 3, 5 \n");
1942 /* TOP = stack[--sp] * TOP */
1947 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
1948 "lwz " TMP_SECOND
", 4(30) \n"
1957 /* TOP = stack[--sp] << TOP */
1962 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
1963 "lwz " TMP_SECOND
", 4(30) \n"
1964 "subfic 3, 4, 32\n" /* r3 = 32 - TOP */
1965 "addi 7, 4, -32\n" /* r7 = TOP - 32 */
1966 "slw 5, 5, 4\n" /* Shift high part left */
1967 "slw 4, 6, 4\n" /* Shift low part left */
1968 "srw 3, 6, 3\n" /* Shift low to high if shift < 32 */
1969 "slw 7, 6, 7\n" /* Shift low to high if shift >= 32 */
1971 "or 3, 7, 3\n"); /* Assemble high part */
1974 /* Top = stack[--sp] >> TOP
1975 (Arithmetic shift right) */
1978 ppc_emit_rsh_signed (void)
1980 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
1981 "lwz " TMP_SECOND
", 4(30) \n"
1982 "addi 7, 4, -32\n" /* r7 = TOP - 32 */
1983 "sraw 3, 5, 4\n" /* Shift high part right */
1985 "blt 0, 1f\n" /* If shift <= 32, goto 1: */
1986 "sraw 4, 5, 7\n" /* Shift high to low */
1989 "subfic 7, 4, 32\n" /* r7 = 32 - TOP */
1990 "srw 4, 6, 4\n" /* Shift low part right */
1991 "slw 5, 5, 7\n" /* Shift high to low */
1992 "or 4, 4, 5\n" /* Assemble low part */
1996 /* Top = stack[--sp] >> TOP
1997 (Logical shift right) */
2000 ppc_emit_rsh_unsigned (void)
2002 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
2003 "lwz " TMP_SECOND
", 4(30) \n"
2004 "subfic 3, 4, 32\n" /* r3 = 32 - TOP */
2005 "addi 7, 4, -32\n" /* r7 = TOP - 32 */
2006 "srw 6, 6, 4\n" /* Shift low part right */
2007 "slw 3, 5, 3\n" /* Shift high to low if shift < 32 */
2008 "srw 7, 5, 7\n" /* Shift high to low if shift >= 32 */
2010 "srw 3, 5, 4\n" /* Shift high part right */
2011 "or 4, 6, 7\n"); /* Assemble low part */
2014 /* Emit code for signed-extension specified by ARG. */
2017 ppc_emit_ext (int arg
)
2022 EMIT_ASM ("extsb 4, 4\n"
2026 EMIT_ASM ("extsh 4, 4\n"
2030 EMIT_ASM ("srawi 3, 4, 31");
2037 /* Emit code for zero-extension specified by ARG. */
2040 ppc_emit_zero_ext (int arg
)
2045 EMIT_ASM ("clrlwi 4,4,24\n"
2049 EMIT_ASM ("clrlwi 4,4,16\n"
2053 EMIT_ASM ("li 3, 0");
2061 i.e., TOP = (TOP == 0) ? 1 : 0; */
2064 ppc_emit_log_not (void)
2066 EMIT_ASM ("or 4, 3, 4 \n"
2072 /* TOP = stack[--sp] & TOP */
2075 ppc_emit_bit_and (void)
2077 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
2078 "lwz " TMP_SECOND
", 4(30) \n"
2083 /* TOP = stack[--sp] | TOP */
2086 ppc_emit_bit_or (void)
2088 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
2089 "lwz " TMP_SECOND
", 4(30) \n"
2094 /* TOP = stack[--sp] ^ TOP */
2097 ppc_emit_bit_xor (void)
2099 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
2100 "lwz " TMP_SECOND
", 4(30) \n"
2106 i.e., TOP = ~(TOP | TOP) */
2109 ppc_emit_bit_not (void)
2111 EMIT_ASM ("nor 3, 3, 3 \n"
2115 /* TOP = stack[--sp] == TOP */
2118 ppc_emit_equal (void)
2120 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
2121 "lwz " TMP_SECOND
", 4(30) \n"
2130 /* TOP = stack[--sp] < TOP
2131 (Signed comparison) */
2134 ppc_emit_less_signed (void)
2136 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
2137 "lwz " TMP_SECOND
", 4(30) \n"
2140 /* CR6 bit 0 = low less and high equal */
2141 "crand 6*4+0, 6*4+0, 7*4+2\n"
2142 /* CR7 bit 0 = (low less and high equal) or high less */
2143 "cror 7*4+0, 7*4+0, 6*4+0\n"
2145 "rlwinm 4, 4, 29, 31, 31 \n"
2149 /* TOP = stack[--sp] < TOP
2150 (Unsigned comparison) */
2153 ppc_emit_less_unsigned (void)
2155 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
2156 "lwz " TMP_SECOND
", 4(30) \n"
2159 /* CR6 bit 0 = low less and high equal */
2160 "crand 6*4+0, 6*4+0, 7*4+2\n"
2161 /* CR7 bit 0 = (low less and high equal) or high less */
2162 "cror 7*4+0, 7*4+0, 6*4+0\n"
2164 "rlwinm 4, 4, 29, 31, 31 \n"
2168 /* Access the memory address in TOP in size of SIZE.
2169 Zero-extend the read value. */
2172 ppc_emit_ref (int size
)
2177 EMIT_ASM ("lbz 4, 0(4)\n"
2181 EMIT_ASM ("lhz 4, 0(4)\n"
2185 EMIT_ASM ("lwz 4, 0(4)\n"
2189 if (__BYTE_ORDER
== __LITTLE_ENDIAN
)
2190 EMIT_ASM ("lwz 3, 4(4)\n"
2193 EMIT_ASM ("lwz 3, 0(4)\n"
2202 ppc_emit_const (LONGEST num
)
2207 p
+= gen_limm (p
, 3, num
>> 32 & 0xffffffff, 0);
2208 p
+= gen_limm (p
, 4, num
& 0xffffffff, 0);
2210 emit_insns (buf
, p
- buf
);
2211 gdb_assert ((p
- buf
) <= (sizeof (buf
) / sizeof (*buf
)));
2214 /* Set TOP to the value of register REG by calling get_raw_reg function
2215 with two argument, collected buffer and register number. */
2218 ppc_emit_reg (int reg
)
2223 /* fctx->regs is passed in r3 and then saved in -16(31). */
2224 p
+= GEN_LWZ (p
, 3, 31, -16);
2225 p
+= GEN_LI (p
, 4, reg
); /* li r4, reg */
2226 p
+= gen_call (p
, get_raw_reg_func_addr (), 0, 0);
2228 emit_insns (buf
, p
- buf
);
2229 gdb_assert ((p
- buf
) <= (sizeof (buf
) / sizeof (*buf
)));
2231 if (__BYTE_ORDER
== __LITTLE_ENDIAN
)
2233 EMIT_ASM ("mr 5, 4\n"
2239 /* TOP = stack[--sp] */
2244 EMIT_ASM ("lwzu " TOP_FIRST
", 8(30) \n"
2245 "lwz " TOP_SECOND
", 4(30) \n");
2248 /* stack[sp++] = TOP
2250 Because we may use up bytecode stack, expand 8 doublewords more
2254 ppc_emit_stack_flush (void)
2256 /* Make sure bytecode stack is big enough before push.
2257 Otherwise, expand 64-byte more. */
2259 EMIT_ASM (" stw " TOP_FIRST
", 0(30) \n"
2260 " stw " TOP_SECOND
", 4(30)\n"
2261 " addi 5, 30, -(8 + 8) \n"
2264 " stwu 31, -64(1) \n"
2265 "1:addi 30, 30, -8 \n");
2268 /* Swap TOP and stack[sp-1] */
2271 ppc_emit_swap (void)
2273 EMIT_ASM ("lwz " TMP_FIRST
", 8(30) \n"
2274 "lwz " TMP_SECOND
", 12(30) \n"
2275 "stw " TOP_FIRST
", 8(30) \n"
2276 "stw " TOP_SECOND
", 12(30) \n"
2281 /* Discard N elements in the stack. Also used for ppc64. */
2284 ppc_emit_stack_adjust (int n
)
2296 p
+= GEN_ADDI (p
, 30, 30, n
);
2298 emit_insns (buf
, p
- buf
);
2299 gdb_assert ((p
- buf
) <= (sizeof (buf
) / sizeof (*buf
)));
2302 /* Call function FN. */
2305 ppc_emit_call (CORE_ADDR fn
)
2310 p
+= gen_call (p
, fn
, 0, 0);
2312 emit_insns (buf
, p
- buf
);
2313 gdb_assert ((p
- buf
) <= (sizeof (buf
) / sizeof (*buf
)));
2316 /* FN's prototype is `LONGEST(*fn)(int)'.
2321 ppc_emit_int_call_1 (CORE_ADDR fn
, int arg1
)
2326 /* Setup argument. arg1 is a 16-bit value. */
2327 p
+= gen_limm (p
, 3, (uint32_t) arg1
, 0);
2328 p
+= gen_call (p
, fn
, 0, 0);
2330 emit_insns (buf
, p
- buf
);
2331 gdb_assert ((p
- buf
) <= (sizeof (buf
) / sizeof (*buf
)));
2333 if (__BYTE_ORDER
== __LITTLE_ENDIAN
)
2335 EMIT_ASM ("mr 5, 4\n"
2341 /* FN's prototype is `void(*fn)(int,LONGEST)'.
2344 TOP should be preserved/restored before/after the call. */
2347 ppc_emit_void_call_2 (CORE_ADDR fn
, int arg1
)
2352 /* Save TOP. 0(30) is next-empty. */
2353 p
+= GEN_STW (p
, 3, 30, 0);
2354 p
+= GEN_STW (p
, 4, 30, 4);
2356 /* Setup argument. arg1 is a 16-bit value. */
2357 if (__BYTE_ORDER
== __LITTLE_ENDIAN
)
2359 p
+= GEN_MR (p
, 5, 4);
2360 p
+= GEN_MR (p
, 6, 3);
2364 p
+= GEN_MR (p
, 5, 3);
2365 p
+= GEN_MR (p
, 6, 4);
2367 p
+= gen_limm (p
, 3, (uint32_t) arg1
, 0);
2368 p
+= gen_call (p
, fn
, 0, 0);
2371 p
+= GEN_LWZ (p
, 3, 30, 0);
2372 p
+= GEN_LWZ (p
, 4, 30, 4);
2374 emit_insns (buf
, p
- buf
);
2375 gdb_assert ((p
- buf
) <= (sizeof (buf
) / sizeof (*buf
)));
2378 /* Note in the following goto ops:
2380 When emitting goto, the target address is later relocated by
2381 write_goto_address. OFFSET_P is the offset of the branch instruction
2382 in the code sequence, and SIZE_P is how to relocate the instruction,
2383 recognized by ppc_write_goto_address. In current implementation,
2384 SIZE can be either 24 or 14 for branch of conditional-branch instruction.
2387 /* If TOP is true, goto somewhere. Otherwise, just fall-through. */
2390 ppc_emit_if_goto (int *offset_p
, int *size_p
)
2392 EMIT_ASM ("or. 3, 3, 4 \n"
2393 "lwzu " TOP_FIRST
", 8(30) \n"
2394 "lwz " TOP_SECOND
", 4(30) \n"
2403 /* Unconditional goto. Also used for ppc64. */
2406 ppc_emit_goto (int *offset_p
, int *size_p
)
2408 EMIT_ASM ("1:b 1b");
2416 /* Goto if stack[--sp] == TOP */
2419 ppc_emit_eq_goto (int *offset_p
, int *size_p
)
2421 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
2422 "lwz " TMP_SECOND
", 4(30) \n"
2426 "lwzu " TOP_FIRST
", 8(30) \n"
2427 "lwz " TOP_SECOND
", 4(30) \n"
2436 /* Goto if stack[--sp] != TOP */
2439 ppc_emit_ne_goto (int *offset_p
, int *size_p
)
2441 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
2442 "lwz " TMP_SECOND
", 4(30) \n"
2446 "lwzu " TOP_FIRST
", 8(30) \n"
2447 "lwz " TOP_SECOND
", 4(30) \n"
2456 /* Goto if stack[--sp] < TOP */
2459 ppc_emit_lt_goto (int *offset_p
, int *size_p
)
2461 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
2462 "lwz " TMP_SECOND
", 4(30) \n"
2465 /* CR6 bit 0 = low less and high equal */
2466 "crand 6*4+0, 6*4+0, 7*4+2\n"
2467 /* CR7 bit 0 = (low less and high equal) or high less */
2468 "cror 7*4+0, 7*4+0, 6*4+0\n"
2469 "lwzu " TOP_FIRST
", 8(30) \n"
2470 "lwz " TOP_SECOND
", 4(30)\n"
2479 /* Goto if stack[--sp] <= TOP */
2482 ppc_emit_le_goto (int *offset_p
, int *size_p
)
2484 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
2485 "lwz " TMP_SECOND
", 4(30) \n"
2488 /* CR6 bit 0 = low less/equal and high equal */
2489 "crandc 6*4+0, 7*4+2, 6*4+1\n"
2490 /* CR7 bit 0 = (low less/eq and high equal) or high less */
2491 "cror 7*4+0, 7*4+0, 6*4+0\n"
2492 "lwzu " TOP_FIRST
", 8(30) \n"
2493 "lwz " TOP_SECOND
", 4(30)\n"
2502 /* Goto if stack[--sp] > TOP */
2505 ppc_emit_gt_goto (int *offset_p
, int *size_p
)
2507 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
2508 "lwz " TMP_SECOND
", 4(30) \n"
2511 /* CR6 bit 0 = low greater and high equal */
2512 "crand 6*4+0, 6*4+1, 7*4+2\n"
2513 /* CR7 bit 0 = (low greater and high equal) or high greater */
2514 "cror 7*4+0, 7*4+1, 6*4+0\n"
2515 "lwzu " TOP_FIRST
", 8(30) \n"
2516 "lwz " TOP_SECOND
", 4(30)\n"
2525 /* Goto if stack[--sp] >= TOP */
2528 ppc_emit_ge_goto (int *offset_p
, int *size_p
)
2530 EMIT_ASM ("lwzu " TMP_FIRST
", 8(30) \n"
2531 "lwz " TMP_SECOND
", 4(30) \n"
2534 /* CR6 bit 0 = low ge and high equal */
2535 "crandc 6*4+0, 7*4+2, 6*4+0\n"
2536 /* CR7 bit 0 = (low ge and high equal) or high greater */
2537 "cror 7*4+0, 7*4+1, 6*4+0\n"
2538 "lwzu " TOP_FIRST
", 8(30)\n"
2539 "lwz " TOP_SECOND
", 4(30)\n"
2548 /* Relocate previous emitted branch instruction. FROM is the address
2549 of the branch instruction, TO is the goto target address, and SIZE
2550 if the value we set by *SIZE_P before. Currently, it is either
2551 24 or 14 of branch and conditional-branch instruction.
2552 Also used for ppc64. */
2555 ppc_write_goto_address (CORE_ADDR from
, CORE_ADDR to
, int size
)
2557 long rel
= to
- from
;
2561 read_inferior_memory (from
, (unsigned char *) &insn
, 4);
2562 opcd
= (insn
>> 26) & 0x3f;
2568 || (rel
>= (1 << 15) || rel
< -(1 << 15)))
2570 insn
= (insn
& ~0xfffc) | (rel
& 0xfffc);
2574 || (rel
>= (1 << 25) || rel
< -(1 << 25)))
2576 insn
= (insn
& ~0x3fffffc) | (rel
& 0x3fffffc);
2583 target_write_memory (from
, (unsigned char *) &insn
, 4);
2586 /* Table of emit ops for 32-bit. */
2588 static struct emit_ops ppc_emit_ops_impl
=
2596 ppc_emit_rsh_signed
,
2597 ppc_emit_rsh_unsigned
,
2605 ppc_emit_less_signed
,
2606 ppc_emit_less_unsigned
,
2610 ppc_write_goto_address
,
2615 ppc_emit_stack_flush
,
2618 ppc_emit_stack_adjust
,
2619 ppc_emit_int_call_1
,
2620 ppc_emit_void_call_2
,
2629 #ifdef __powerpc64__
2633 Bytecode execution stack frame - 64-bit
2635 | LR save area (SP + 16)
2636 | CR save area (SP + 8)
2637 SP' -> +- Back chain (SP + 0)
2638 | Save r31 for access saved arguments
2639 | Save r30 for bytecode stack pointer
2640 | Save r4 for incoming argument *value
2641 | Save r3 for incoming argument regs
2642 r30 -> +- Bytecode execution stack
2644 | 64-byte (8 doublewords) at initial.
2645 | Expand stack as needed.
2648 | Some padding for minimum stack frame.
2650 SP +- Back-chain (SP')
2653 = 112 + (4 * 8) + 64
2656 r30 is the stack-pointer for bytecode machine.
2657 It should point to next-empty, so we can use LDU for pop.
2658 r3 is used for cache of TOP value.
2659 It was the first argument, pointer to regs.
2660 r4 is the second argument, pointer to the result.
2661 We should set *result = TOP after leaving this function.
2664 * To restore stack at epilogue
2666 * To check stack is big enough for bytecode execution.
2667 => r30 - 8 > SP + 112
2668 * To return execution result.
2673 /* Emit prologue in inferior memory. See above comments. */
2676 ppc64v1_emit_prologue (void)
2678 /* On ELFv1, function pointers really point to function descriptor,
2679 so emit one here. We don't care about contents of words 1 and 2,
2680 so let them just overlap out code. */
2681 uint64_t opd
= current_insn_ptr
+ 8;
2684 /* Mind the strict aliasing rules. */
2685 memcpy (buf
, &opd
, sizeof buf
);
2687 EMIT_ASM (/* Save return address. */
2690 /* Save r30 and incoming arguments. */
2695 /* Point r31 to current r1 for access arguments. */
2697 /* Adjust SP. 208 is the initial frame size. */
2698 "stdu 1, -208(1) \n"
2699 /* Set r30 to pointing stack-top. */
2700 "addi 30, 1, 168 \n"
2701 /* Initial r3/TOP to 0. */
2705 /* Emit prologue in inferior memory. See above comments. */
2708 ppc64v2_emit_prologue (void)
2710 EMIT_ASM (/* Save return address. */
2713 /* Save r30 and incoming arguments. */
2718 /* Point r31 to current r1 for access arguments. */
2720 /* Adjust SP. 208 is the initial frame size. */
2721 "stdu 1, -208(1) \n"
2722 /* Set r30 to pointing stack-top. */
2723 "addi 30, 1, 168 \n"
2724 /* Initial r3/TOP to 0. */
2728 /* Emit epilogue in inferior memory. See above comments. */
2731 ppc64_emit_epilogue (void)
2733 EMIT_ASM (/* Restore SP. */
2738 /* Restore registers. */
2743 /* Return 0 for no-error. */
2749 /* TOP = stack[--sp] + TOP */
2752 ppc64_emit_add (void)
2754 EMIT_ASM ("ldu 4, 8(30) \n"
2758 /* TOP = stack[--sp] - TOP */
2761 ppc64_emit_sub (void)
2763 EMIT_ASM ("ldu 4, 8(30) \n"
2767 /* TOP = stack[--sp] * TOP */
2770 ppc64_emit_mul (void)
2772 EMIT_ASM ("ldu 4, 8(30) \n"
2773 "mulld 3, 4, 3 \n");
2776 /* TOP = stack[--sp] << TOP */
2779 ppc64_emit_lsh (void)
2781 EMIT_ASM ("ldu 4, 8(30) \n"
2785 /* Top = stack[--sp] >> TOP
2786 (Arithmetic shift right) */
2789 ppc64_emit_rsh_signed (void)
2791 EMIT_ASM ("ldu 4, 8(30) \n"
2795 /* Top = stack[--sp] >> TOP
2796 (Logical shift right) */
2799 ppc64_emit_rsh_unsigned (void)
2801 EMIT_ASM ("ldu 4, 8(30) \n"
2805 /* Emit code for signed-extension specified by ARG. */
2808 ppc64_emit_ext (int arg
)
2813 EMIT_ASM ("extsb 3, 3");
2816 EMIT_ASM ("extsh 3, 3");
2819 EMIT_ASM ("extsw 3, 3");
2826 /* Emit code for zero-extension specified by ARG. */
2829 ppc64_emit_zero_ext (int arg
)
2834 EMIT_ASM ("rldicl 3,3,0,56");
2837 EMIT_ASM ("rldicl 3,3,0,48");
2840 EMIT_ASM ("rldicl 3,3,0,32");
2848 i.e., TOP = (TOP == 0) ? 1 : 0; */
2851 ppc64_emit_log_not (void)
2853 EMIT_ASM ("cntlzd 3, 3 \n"
2857 /* TOP = stack[--sp] & TOP */
2860 ppc64_emit_bit_and (void)
2862 EMIT_ASM ("ldu 4, 8(30) \n"
2866 /* TOP = stack[--sp] | TOP */
2869 ppc64_emit_bit_or (void)
2871 EMIT_ASM ("ldu 4, 8(30) \n"
2875 /* TOP = stack[--sp] ^ TOP */
2878 ppc64_emit_bit_xor (void)
2880 EMIT_ASM ("ldu 4, 8(30) \n"
2885 i.e., TOP = ~(TOP | TOP) */
2888 ppc64_emit_bit_not (void)
2890 EMIT_ASM ("nor 3, 3, 3 \n");
2893 /* TOP = stack[--sp] == TOP */
2896 ppc64_emit_equal (void)
2898 EMIT_ASM ("ldu 4, 8(30) \n"
2904 /* TOP = stack[--sp] < TOP
2905 (Signed comparison) */
2908 ppc64_emit_less_signed (void)
2910 EMIT_ASM ("ldu 4, 8(30) \n"
2913 "rlwinm 3, 3, 29, 31, 31 \n");
2916 /* TOP = stack[--sp] < TOP
2917 (Unsigned comparison) */
2920 ppc64_emit_less_unsigned (void)
2922 EMIT_ASM ("ldu 4, 8(30) \n"
2925 "rlwinm 3, 3, 29, 31, 31 \n");
2928 /* Access the memory address in TOP in size of SIZE.
2929 Zero-extend the read value. */
2932 ppc64_emit_ref (int size
)
2937 EMIT_ASM ("lbz 3, 0(3)");
2940 EMIT_ASM ("lhz 3, 0(3)");
2943 EMIT_ASM ("lwz 3, 0(3)");
2946 EMIT_ASM ("ld 3, 0(3)");
2954 ppc64_emit_const (LONGEST num
)
2959 p
+= gen_limm (p
, 3, num
, 1);
2961 emit_insns (buf
, p
- buf
);
2962 gdb_assert ((p
- buf
) <= (sizeof (buf
) / sizeof (*buf
)));
2965 /* Set TOP to the value of register REG by calling get_raw_reg function
2966 with two argument, collected buffer and register number. */
2969 ppc64v1_emit_reg (int reg
)
2974 /* fctx->regs is passed in r3 and then saved in 176(1). */
2975 p
+= GEN_LD (p
, 3, 31, -32);
2976 p
+= GEN_LI (p
, 4, reg
);
2977 p
+= GEN_STD (p
, 2, 1, 40); /* Save TOC. */
2978 p
+= gen_call (p
, get_raw_reg_func_addr (), 1, 1);
2979 p
+= GEN_LD (p
, 2, 1, 40); /* Restore TOC. */
2981 emit_insns (buf
, p
- buf
);
2982 gdb_assert ((p
- buf
) <= (sizeof (buf
) / sizeof (*buf
)));
2985 /* Likewise, for ELFv2. */
2988 ppc64v2_emit_reg (int reg
)
2993 /* fctx->regs is passed in r3 and then saved in 176(1). */
2994 p
+= GEN_LD (p
, 3, 31, -32);
2995 p
+= GEN_LI (p
, 4, reg
);
2996 p
+= GEN_STD (p
, 2, 1, 24); /* Save TOC. */
2997 p
+= gen_call (p
, get_raw_reg_func_addr (), 1, 0);
2998 p
+= GEN_LD (p
, 2, 1, 24); /* Restore TOC. */
3000 emit_insns (buf
, p
- buf
);
3001 gdb_assert ((p
- buf
) <= (sizeof (buf
) / sizeof (*buf
)));
3004 /* TOP = stack[--sp] */
3007 ppc64_emit_pop (void)
3009 EMIT_ASM ("ldu 3, 8(30)");
3012 /* stack[sp++] = TOP
3014 Because we may use up bytecode stack, expand 8 doublewords more
3018 ppc64_emit_stack_flush (void)
3020 /* Make sure bytecode stack is big enough before push.
3021 Otherwise, expand 64-byte more. */
3023 EMIT_ASM (" std 3, 0(30) \n"
3024 " addi 4, 30, -(112 + 8) \n"
3027 " stdu 31, -64(1) \n"
3028 "1:addi 30, 30, -8 \n");
3031 /* Swap TOP and stack[sp-1] */
3034 ppc64_emit_swap (void)
3036 EMIT_ASM ("ld 4, 8(30) \n"
3041 /* Call function FN - ELFv1. */
3044 ppc64v1_emit_call (CORE_ADDR fn
)
3049 p
+= GEN_STD (p
, 2, 1, 40); /* Save TOC. */
3050 p
+= gen_call (p
, fn
, 1, 1);
3051 p
+= GEN_LD (p
, 2, 1, 40); /* Restore TOC. */
3053 emit_insns (buf
, p
- buf
);
3054 gdb_assert ((p
- buf
) <= (sizeof (buf
) / sizeof (*buf
)));
3057 /* Call function FN - ELFv2. */
3060 ppc64v2_emit_call (CORE_ADDR fn
)
3065 p
+= GEN_STD (p
, 2, 1, 24); /* Save TOC. */
3066 p
+= gen_call (p
, fn
, 1, 0);
3067 p
+= GEN_LD (p
, 2, 1, 24); /* Restore TOC. */
3069 emit_insns (buf
, p
- buf
);
3070 gdb_assert ((p
- buf
) <= (sizeof (buf
) / sizeof (*buf
)));
3073 /* FN's prototype is `LONGEST(*fn)(int)'.
3078 ppc64v1_emit_int_call_1 (CORE_ADDR fn
, int arg1
)
3083 /* Setup argument. arg1 is a 16-bit value. */
3084 p
+= gen_limm (p
, 3, arg1
, 1);
3085 p
+= GEN_STD (p
, 2, 1, 40); /* Save TOC. */
3086 p
+= gen_call (p
, fn
, 1, 1);
3087 p
+= GEN_LD (p
, 2, 1, 40); /* Restore TOC. */
3089 emit_insns (buf
, p
- buf
);
3090 gdb_assert ((p
- buf
) <= (sizeof (buf
) / sizeof (*buf
)));
3093 /* Likewise for ELFv2. */
3096 ppc64v2_emit_int_call_1 (CORE_ADDR fn
, int arg1
)
3101 /* Setup argument. arg1 is a 16-bit value. */
3102 p
+= gen_limm (p
, 3, arg1
, 1);
3103 p
+= GEN_STD (p
, 2, 1, 24); /* Save TOC. */
3104 p
+= gen_call (p
, fn
, 1, 0);
3105 p
+= GEN_LD (p
, 2, 1, 24); /* Restore TOC. */
3107 emit_insns (buf
, p
- buf
);
3108 gdb_assert ((p
- buf
) <= (sizeof (buf
) / sizeof (*buf
)));
3111 /* FN's prototype is `void(*fn)(int,LONGEST)'.
3114 TOP should be preserved/restored before/after the call. */
3117 ppc64v1_emit_void_call_2 (CORE_ADDR fn
, int arg1
)
3122 /* Save TOP. 0(30) is next-empty. */
3123 p
+= GEN_STD (p
, 3, 30, 0);
3125 /* Setup argument. arg1 is a 16-bit value. */
3126 p
+= GEN_MR (p
, 4, 3); /* mr r4, r3 */
3127 p
+= gen_limm (p
, 3, arg1
, 1);
3128 p
+= GEN_STD (p
, 2, 1, 40); /* Save TOC. */
3129 p
+= gen_call (p
, fn
, 1, 1);
3130 p
+= GEN_LD (p
, 2, 1, 40); /* Restore TOC. */
3133 p
+= GEN_LD (p
, 3, 30, 0);
3135 emit_insns (buf
, p
- buf
);
3136 gdb_assert ((p
- buf
) <= (sizeof (buf
) / sizeof (*buf
)));
3139 /* Likewise for ELFv2. */
3142 ppc64v2_emit_void_call_2 (CORE_ADDR fn
, int arg1
)
3147 /* Save TOP. 0(30) is next-empty. */
3148 p
+= GEN_STD (p
, 3, 30, 0);
3150 /* Setup argument. arg1 is a 16-bit value. */
3151 p
+= GEN_MR (p
, 4, 3); /* mr r4, r3 */
3152 p
+= gen_limm (p
, 3, arg1
, 1);
3153 p
+= GEN_STD (p
, 2, 1, 24); /* Save TOC. */
3154 p
+= gen_call (p
, fn
, 1, 0);
3155 p
+= GEN_LD (p
, 2, 1, 24); /* Restore TOC. */
3158 p
+= GEN_LD (p
, 3, 30, 0);
3160 emit_insns (buf
, p
- buf
);
3161 gdb_assert ((p
- buf
) <= (sizeof (buf
) / sizeof (*buf
)));
3164 /* If TOP is true, goto somewhere. Otherwise, just fall-through. */
3167 ppc64_emit_if_goto (int *offset_p
, int *size_p
)
3169 EMIT_ASM ("cmpdi 7, 3, 0 \n"
3179 /* Goto if stack[--sp] == TOP */
3182 ppc64_emit_eq_goto (int *offset_p
, int *size_p
)
3184 EMIT_ASM ("ldu 4, 8(30) \n"
3195 /* Goto if stack[--sp] != TOP */
3198 ppc64_emit_ne_goto (int *offset_p
, int *size_p
)
3200 EMIT_ASM ("ldu 4, 8(30) \n"
3211 /* Goto if stack[--sp] < TOP */
3214 ppc64_emit_lt_goto (int *offset_p
, int *size_p
)
3216 EMIT_ASM ("ldu 4, 8(30) \n"
3227 /* Goto if stack[--sp] <= TOP */
3230 ppc64_emit_le_goto (int *offset_p
, int *size_p
)
3232 EMIT_ASM ("ldu 4, 8(30) \n"
3243 /* Goto if stack[--sp] > TOP */
3246 ppc64_emit_gt_goto (int *offset_p
, int *size_p
)
3248 EMIT_ASM ("ldu 4, 8(30) \n"
3259 /* Goto if stack[--sp] >= TOP */
3262 ppc64_emit_ge_goto (int *offset_p
, int *size_p
)
3264 EMIT_ASM ("ldu 4, 8(30) \n"
3275 /* Table of emit ops for 64-bit ELFv1. */
3277 static struct emit_ops ppc64v1_emit_ops_impl
=
3279 ppc64v1_emit_prologue
,
3280 ppc64_emit_epilogue
,
3285 ppc64_emit_rsh_signed
,
3286 ppc64_emit_rsh_unsigned
,
3294 ppc64_emit_less_signed
,
3295 ppc64_emit_less_unsigned
,
3299 ppc_write_goto_address
,
3304 ppc64_emit_stack_flush
,
3305 ppc64_emit_zero_ext
,
3307 ppc_emit_stack_adjust
,
3308 ppc64v1_emit_int_call_1
,
3309 ppc64v1_emit_void_call_2
,
3318 /* Table of emit ops for 64-bit ELFv2. */
3320 static struct emit_ops ppc64v2_emit_ops_impl
=
3322 ppc64v2_emit_prologue
,
3323 ppc64_emit_epilogue
,
3328 ppc64_emit_rsh_signed
,
3329 ppc64_emit_rsh_unsigned
,
3337 ppc64_emit_less_signed
,
3338 ppc64_emit_less_unsigned
,
3342 ppc_write_goto_address
,
3347 ppc64_emit_stack_flush
,
3348 ppc64_emit_zero_ext
,
3350 ppc_emit_stack_adjust
,
3351 ppc64v2_emit_int_call_1
,
3352 ppc64v2_emit_void_call_2
,
3363 /* Implementation of linux_target_ops method "emit_ops". */
3365 static struct emit_ops
*
3368 #ifdef __powerpc64__
3369 struct regcache
*regcache
= get_thread_regcache (current_thread
, 0);
3371 if (register_size (regcache
->tdesc
, 0) == 8)
3373 if (is_elfv2_inferior ())
3374 return &ppc64v2_emit_ops_impl
;
3376 return &ppc64v1_emit_ops_impl
;
3379 return &ppc_emit_ops_impl
;
3382 /* Implementation of linux_target_ops method "get_ipa_tdesc_idx". */
3385 ppc_get_ipa_tdesc_idx (void)
3387 struct regcache
*regcache
= get_thread_regcache (current_thread
, 0);
3388 const struct target_desc
*tdesc
= regcache
->tdesc
;
3390 #ifdef __powerpc64__
3391 if (tdesc
== tdesc_powerpc_64l
)
3392 return PPC_TDESC_BASE
;
3393 if (tdesc
== tdesc_powerpc_altivec64l
)
3394 return PPC_TDESC_ALTIVEC
;
3395 if (tdesc
== tdesc_powerpc_vsx64l
)
3396 return PPC_TDESC_VSX
;
3397 if (tdesc
== tdesc_powerpc_isa205_64l
)
3398 return PPC_TDESC_ISA205
;
3399 if (tdesc
== tdesc_powerpc_isa205_altivec64l
)
3400 return PPC_TDESC_ISA205_ALTIVEC
;
3401 if (tdesc
== tdesc_powerpc_isa205_vsx64l
)
3402 return PPC_TDESC_ISA205_VSX
;
3403 if (tdesc
== tdesc_powerpc_isa205_ppr_dscr_vsx64l
)
3404 return PPC_TDESC_ISA205_PPR_DSCR_VSX
;
3405 if (tdesc
== tdesc_powerpc_isa207_vsx64l
)
3406 return PPC_TDESC_ISA207_VSX
;
3407 if (tdesc
== tdesc_powerpc_isa207_htm_vsx64l
)
3408 return PPC_TDESC_ISA207_HTM_VSX
;
3411 if (tdesc
== tdesc_powerpc_32l
)
3412 return PPC_TDESC_BASE
;
3413 if (tdesc
== tdesc_powerpc_altivec32l
)
3414 return PPC_TDESC_ALTIVEC
;
3415 if (tdesc
== tdesc_powerpc_vsx32l
)
3416 return PPC_TDESC_VSX
;
3417 if (tdesc
== tdesc_powerpc_isa205_32l
)
3418 return PPC_TDESC_ISA205
;
3419 if (tdesc
== tdesc_powerpc_isa205_altivec32l
)
3420 return PPC_TDESC_ISA205_ALTIVEC
;
3421 if (tdesc
== tdesc_powerpc_isa205_vsx32l
)
3422 return PPC_TDESC_ISA205_VSX
;
3423 if (tdesc
== tdesc_powerpc_isa205_ppr_dscr_vsx32l
)
3424 return PPC_TDESC_ISA205_PPR_DSCR_VSX
;
3425 if (tdesc
== tdesc_powerpc_isa207_vsx32l
)
3426 return PPC_TDESC_ISA207_VSX
;
3427 if (tdesc
== tdesc_powerpc_isa207_htm_vsx32l
)
3428 return PPC_TDESC_ISA207_HTM_VSX
;
3429 if (tdesc
== tdesc_powerpc_e500l
)
3430 return PPC_TDESC_E500
;
3435 struct linux_target_ops the_low_target
= {
3436 ppc_install_fast_tracepoint_jump_pad
,
3438 ppc_get_min_fast_tracepoint_insn_len
,
3439 NULL
, /* supports_range_stepping */
3440 ppc_supports_hardware_single_step
,
3441 NULL
, /* get_syscall_trapinfo */
3442 ppc_get_ipa_tdesc_idx
,
3445 /* The linux target ops object. */
3447 linux_process_target
*the_linux_target
= &the_ppc_target
;
3450 initialize_low_arch (void)
3452 /* Initialize the Linux target descriptions. */
3454 init_registers_powerpc_32l ();
3455 init_registers_powerpc_altivec32l ();
3456 init_registers_powerpc_vsx32l ();
3457 init_registers_powerpc_isa205_32l ();
3458 init_registers_powerpc_isa205_altivec32l ();
3459 init_registers_powerpc_isa205_vsx32l ();
3460 init_registers_powerpc_isa205_ppr_dscr_vsx32l ();
3461 init_registers_powerpc_isa207_vsx32l ();
3462 init_registers_powerpc_isa207_htm_vsx32l ();
3463 init_registers_powerpc_e500l ();
3465 init_registers_powerpc_64l ();
3466 init_registers_powerpc_altivec64l ();
3467 init_registers_powerpc_vsx64l ();
3468 init_registers_powerpc_isa205_64l ();
3469 init_registers_powerpc_isa205_altivec64l ();
3470 init_registers_powerpc_isa205_vsx64l ();
3471 init_registers_powerpc_isa205_ppr_dscr_vsx64l ();
3472 init_registers_powerpc_isa207_vsx64l ();
3473 init_registers_powerpc_isa207_htm_vsx64l ();
3476 initialize_regsets_info (&ppc_regsets_info
);