Aarch64: Float register detection for return values
[deliverable/binutils-gdb.git] / gdb / aarch64-tdep.c
1 /* Common target dependent code for GDB on AArch64 systems.
2
3 Copyright (C) 2009-2018 Free Software Foundation, Inc.
4 Contributed by ARM Ltd.
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20
21 #include "defs.h"
22
23 #include "frame.h"
24 #include "inferior.h"
25 #include "gdbcmd.h"
26 #include "gdbcore.h"
27 #include "dis-asm.h"
28 #include "regcache.h"
29 #include "reggroups.h"
30 #include "value.h"
31 #include "arch-utils.h"
32 #include "osabi.h"
33 #include "frame-unwind.h"
34 #include "frame-base.h"
35 #include "trad-frame.h"
36 #include "objfiles.h"
37 #include "dwarf2-frame.h"
38 #include "gdbtypes.h"
39 #include "prologue-value.h"
40 #include "target-descriptions.h"
41 #include "user-regs.h"
42 #include "language.h"
43 #include "infcall.h"
44 #include "ax.h"
45 #include "ax-gdb.h"
46 #include "selftest.h"
47
48 #include "aarch64-tdep.h"
49
50 #include "elf-bfd.h"
51 #include "elf/aarch64.h"
52
53 #include "vec.h"
54
55 #include "record.h"
56 #include "record-full.h"
57 #include "arch/aarch64-insn.h"
58
59 #include "opcode/aarch64.h"
60 #include <algorithm>
61
62 #define submask(x) ((1L << ((x) + 1)) - 1)
63 #define bit(obj,st) (((obj) >> (st)) & 1)
64 #define bits(obj,st,fn) (((obj) >> (st)) & submask ((fn) - (st)))
65
66 /* Pseudo register base numbers. */
67 #define AARCH64_Q0_REGNUM 0
68 #define AARCH64_D0_REGNUM (AARCH64_Q0_REGNUM + AARCH64_D_REGISTER_COUNT)
69 #define AARCH64_S0_REGNUM (AARCH64_D0_REGNUM + 32)
70 #define AARCH64_H0_REGNUM (AARCH64_S0_REGNUM + 32)
71 #define AARCH64_B0_REGNUM (AARCH64_H0_REGNUM + 32)
72 #define AARCH64_SVE_V0_REGNUM (AARCH64_B0_REGNUM + 32)
73
74 /* A Homogeneous Floating-Point or Short-Vector Aggregate may have at most
75 four members. */
76 #define HA_MAX_NUM_FLDS 4
77
78 /* All possible aarch64 target descriptors. */
79 struct target_desc *tdesc_aarch64_list[AARCH64_MAX_SVE_VQ + 1];
80
81 /* The standard register names, and all the valid aliases for them. */
82 static const struct
83 {
84 const char *const name;
85 int regnum;
86 } aarch64_register_aliases[] =
87 {
88 /* 64-bit register names. */
89 {"fp", AARCH64_FP_REGNUM},
90 {"lr", AARCH64_LR_REGNUM},
91 {"sp", AARCH64_SP_REGNUM},
92
93 /* 32-bit register names. */
94 {"w0", AARCH64_X0_REGNUM + 0},
95 {"w1", AARCH64_X0_REGNUM + 1},
96 {"w2", AARCH64_X0_REGNUM + 2},
97 {"w3", AARCH64_X0_REGNUM + 3},
98 {"w4", AARCH64_X0_REGNUM + 4},
99 {"w5", AARCH64_X0_REGNUM + 5},
100 {"w6", AARCH64_X0_REGNUM + 6},
101 {"w7", AARCH64_X0_REGNUM + 7},
102 {"w8", AARCH64_X0_REGNUM + 8},
103 {"w9", AARCH64_X0_REGNUM + 9},
104 {"w10", AARCH64_X0_REGNUM + 10},
105 {"w11", AARCH64_X0_REGNUM + 11},
106 {"w12", AARCH64_X0_REGNUM + 12},
107 {"w13", AARCH64_X0_REGNUM + 13},
108 {"w14", AARCH64_X0_REGNUM + 14},
109 {"w15", AARCH64_X0_REGNUM + 15},
110 {"w16", AARCH64_X0_REGNUM + 16},
111 {"w17", AARCH64_X0_REGNUM + 17},
112 {"w18", AARCH64_X0_REGNUM + 18},
113 {"w19", AARCH64_X0_REGNUM + 19},
114 {"w20", AARCH64_X0_REGNUM + 20},
115 {"w21", AARCH64_X0_REGNUM + 21},
116 {"w22", AARCH64_X0_REGNUM + 22},
117 {"w23", AARCH64_X0_REGNUM + 23},
118 {"w24", AARCH64_X0_REGNUM + 24},
119 {"w25", AARCH64_X0_REGNUM + 25},
120 {"w26", AARCH64_X0_REGNUM + 26},
121 {"w27", AARCH64_X0_REGNUM + 27},
122 {"w28", AARCH64_X0_REGNUM + 28},
123 {"w29", AARCH64_X0_REGNUM + 29},
124 {"w30", AARCH64_X0_REGNUM + 30},
125
126 /* specials */
127 {"ip0", AARCH64_X0_REGNUM + 16},
128 {"ip1", AARCH64_X0_REGNUM + 17}
129 };
130
131 /* The required core 'R' registers. */
132 static const char *const aarch64_r_register_names[] =
133 {
134 /* These registers must appear in consecutive RAW register number
135 order and they must begin with AARCH64_X0_REGNUM! */
136 "x0", "x1", "x2", "x3",
137 "x4", "x5", "x6", "x7",
138 "x8", "x9", "x10", "x11",
139 "x12", "x13", "x14", "x15",
140 "x16", "x17", "x18", "x19",
141 "x20", "x21", "x22", "x23",
142 "x24", "x25", "x26", "x27",
143 "x28", "x29", "x30", "sp",
144 "pc", "cpsr"
145 };
146
147 /* The FP/SIMD 'V' registers. */
148 static const char *const aarch64_v_register_names[] =
149 {
150 /* These registers must appear in consecutive RAW register number
151 order and they must begin with AARCH64_V0_REGNUM! */
152 "v0", "v1", "v2", "v3",
153 "v4", "v5", "v6", "v7",
154 "v8", "v9", "v10", "v11",
155 "v12", "v13", "v14", "v15",
156 "v16", "v17", "v18", "v19",
157 "v20", "v21", "v22", "v23",
158 "v24", "v25", "v26", "v27",
159 "v28", "v29", "v30", "v31",
160 "fpsr",
161 "fpcr"
162 };
163
164 /* The SVE 'Z' and 'P' registers. */
165 static const char *const aarch64_sve_register_names[] =
166 {
167 /* These registers must appear in consecutive RAW register number
168 order and they must begin with AARCH64_SVE_Z0_REGNUM! */
169 "z0", "z1", "z2", "z3",
170 "z4", "z5", "z6", "z7",
171 "z8", "z9", "z10", "z11",
172 "z12", "z13", "z14", "z15",
173 "z16", "z17", "z18", "z19",
174 "z20", "z21", "z22", "z23",
175 "z24", "z25", "z26", "z27",
176 "z28", "z29", "z30", "z31",
177 "fpsr", "fpcr",
178 "p0", "p1", "p2", "p3",
179 "p4", "p5", "p6", "p7",
180 "p8", "p9", "p10", "p11",
181 "p12", "p13", "p14", "p15",
182 "ffr", "vg"
183 };
184
185 /* AArch64 prologue cache structure. */
186 struct aarch64_prologue_cache
187 {
188 /* The program counter at the start of the function. It is used to
189 identify this frame as a prologue frame. */
190 CORE_ADDR func;
191
192 /* The program counter at the time this frame was created; i.e. where
193 this function was called from. It is used to identify this frame as a
194 stub frame. */
195 CORE_ADDR prev_pc;
196
197 /* The stack pointer at the time this frame was created; i.e. the
198 caller's stack pointer when this function was called. It is used
199 to identify this frame. */
200 CORE_ADDR prev_sp;
201
202 /* Is the target available to read from? */
203 int available_p;
204
205 /* The frame base for this frame is just prev_sp - frame size.
206 FRAMESIZE is the distance from the frame pointer to the
207 initial stack pointer. */
208 int framesize;
209
210 /* The register used to hold the frame pointer for this frame. */
211 int framereg;
212
213 /* Saved register offsets. */
214 struct trad_frame_saved_reg *saved_regs;
215 };
216
217 static void
218 show_aarch64_debug (struct ui_file *file, int from_tty,
219 struct cmd_list_element *c, const char *value)
220 {
221 fprintf_filtered (file, _("AArch64 debugging is %s.\n"), value);
222 }
223
224 namespace {
225
226 /* Abstract instruction reader. */
227
228 class abstract_instruction_reader
229 {
230 public:
231 /* Read in one instruction. */
232 virtual ULONGEST read (CORE_ADDR memaddr, int len,
233 enum bfd_endian byte_order) = 0;
234 };
235
236 /* Instruction reader from real target. */
237
238 class instruction_reader : public abstract_instruction_reader
239 {
240 public:
241 ULONGEST read (CORE_ADDR memaddr, int len, enum bfd_endian byte_order)
242 override
243 {
244 return read_code_unsigned_integer (memaddr, len, byte_order);
245 }
246 };
247
248 } // namespace
249
250 /* Analyze a prologue, looking for a recognizable stack frame
251 and frame pointer. Scan until we encounter a store that could
252 clobber the stack frame unexpectedly, or an unknown instruction. */
253
254 static CORE_ADDR
255 aarch64_analyze_prologue (struct gdbarch *gdbarch,
256 CORE_ADDR start, CORE_ADDR limit,
257 struct aarch64_prologue_cache *cache,
258 abstract_instruction_reader& reader)
259 {
260 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
261 int i;
262 /* Track X registers and D registers in prologue. */
263 pv_t regs[AARCH64_X_REGISTER_COUNT + AARCH64_D_REGISTER_COUNT];
264
265 for (i = 0; i < AARCH64_X_REGISTER_COUNT + AARCH64_D_REGISTER_COUNT; i++)
266 regs[i] = pv_register (i, 0);
267 pv_area stack (AARCH64_SP_REGNUM, gdbarch_addr_bit (gdbarch));
268
269 for (; start < limit; start += 4)
270 {
271 uint32_t insn;
272 aarch64_inst inst;
273
274 insn = reader.read (start, 4, byte_order_for_code);
275
276 if (aarch64_decode_insn (insn, &inst, 1, NULL) != 0)
277 break;
278
279 if (inst.opcode->iclass == addsub_imm
280 && (inst.opcode->op == OP_ADD
281 || strcmp ("sub", inst.opcode->name) == 0))
282 {
283 unsigned rd = inst.operands[0].reg.regno;
284 unsigned rn = inst.operands[1].reg.regno;
285
286 gdb_assert (aarch64_num_of_operands (inst.opcode) == 3);
287 gdb_assert (inst.operands[0].type == AARCH64_OPND_Rd_SP);
288 gdb_assert (inst.operands[1].type == AARCH64_OPND_Rn_SP);
289 gdb_assert (inst.operands[2].type == AARCH64_OPND_AIMM);
290
291 if (inst.opcode->op == OP_ADD)
292 {
293 regs[rd] = pv_add_constant (regs[rn],
294 inst.operands[2].imm.value);
295 }
296 else
297 {
298 regs[rd] = pv_add_constant (regs[rn],
299 -inst.operands[2].imm.value);
300 }
301 }
302 else if (inst.opcode->iclass == pcreladdr
303 && inst.operands[1].type == AARCH64_OPND_ADDR_ADRP)
304 {
305 gdb_assert (aarch64_num_of_operands (inst.opcode) == 2);
306 gdb_assert (inst.operands[0].type == AARCH64_OPND_Rd);
307
308 regs[inst.operands[0].reg.regno] = pv_unknown ();
309 }
310 else if (inst.opcode->iclass == branch_imm)
311 {
312 /* Stop analysis on branch. */
313 break;
314 }
315 else if (inst.opcode->iclass == condbranch)
316 {
317 /* Stop analysis on branch. */
318 break;
319 }
320 else if (inst.opcode->iclass == branch_reg)
321 {
322 /* Stop analysis on branch. */
323 break;
324 }
325 else if (inst.opcode->iclass == compbranch)
326 {
327 /* Stop analysis on branch. */
328 break;
329 }
330 else if (inst.opcode->op == OP_MOVZ)
331 {
332 gdb_assert (inst.operands[0].type == AARCH64_OPND_Rd);
333 regs[inst.operands[0].reg.regno] = pv_unknown ();
334 }
335 else if (inst.opcode->iclass == log_shift
336 && strcmp (inst.opcode->name, "orr") == 0)
337 {
338 unsigned rd = inst.operands[0].reg.regno;
339 unsigned rn = inst.operands[1].reg.regno;
340 unsigned rm = inst.operands[2].reg.regno;
341
342 gdb_assert (inst.operands[0].type == AARCH64_OPND_Rd);
343 gdb_assert (inst.operands[1].type == AARCH64_OPND_Rn);
344 gdb_assert (inst.operands[2].type == AARCH64_OPND_Rm_SFT);
345
346 if (inst.operands[2].shifter.amount == 0
347 && rn == AARCH64_SP_REGNUM)
348 regs[rd] = regs[rm];
349 else
350 {
351 if (aarch64_debug)
352 {
353 debug_printf ("aarch64: prologue analysis gave up "
354 "addr=%s opcode=0x%x (orr x register)\n",
355 core_addr_to_string_nz (start), insn);
356 }
357 break;
358 }
359 }
360 else if (inst.opcode->op == OP_STUR)
361 {
362 unsigned rt = inst.operands[0].reg.regno;
363 unsigned rn = inst.operands[1].addr.base_regno;
364 int is64
365 = (aarch64_get_qualifier_esize (inst.operands[0].qualifier) == 8);
366
367 gdb_assert (aarch64_num_of_operands (inst.opcode) == 2);
368 gdb_assert (inst.operands[0].type == AARCH64_OPND_Rt);
369 gdb_assert (inst.operands[1].type == AARCH64_OPND_ADDR_SIMM9);
370 gdb_assert (!inst.operands[1].addr.offset.is_reg);
371
372 stack.store (pv_add_constant (regs[rn],
373 inst.operands[1].addr.offset.imm),
374 is64 ? 8 : 4, regs[rt]);
375 }
376 else if ((inst.opcode->iclass == ldstpair_off
377 || (inst.opcode->iclass == ldstpair_indexed
378 && inst.operands[2].addr.preind))
379 && strcmp ("stp", inst.opcode->name) == 0)
380 {
381 /* STP with addressing mode Pre-indexed and Base register. */
382 unsigned rt1;
383 unsigned rt2;
384 unsigned rn = inst.operands[2].addr.base_regno;
385 int32_t imm = inst.operands[2].addr.offset.imm;
386
387 gdb_assert (inst.operands[0].type == AARCH64_OPND_Rt
388 || inst.operands[0].type == AARCH64_OPND_Ft);
389 gdb_assert (inst.operands[1].type == AARCH64_OPND_Rt2
390 || inst.operands[1].type == AARCH64_OPND_Ft2);
391 gdb_assert (inst.operands[2].type == AARCH64_OPND_ADDR_SIMM7);
392 gdb_assert (!inst.operands[2].addr.offset.is_reg);
393
394 /* If recording this store would invalidate the store area
395 (perhaps because rn is not known) then we should abandon
396 further prologue analysis. */
397 if (stack.store_would_trash (pv_add_constant (regs[rn], imm)))
398 break;
399
400 if (stack.store_would_trash (pv_add_constant (regs[rn], imm + 8)))
401 break;
402
403 rt1 = inst.operands[0].reg.regno;
404 rt2 = inst.operands[1].reg.regno;
405 if (inst.operands[0].type == AARCH64_OPND_Ft)
406 {
407 /* Only bottom 64-bit of each V register (D register) need
408 to be preserved. */
409 gdb_assert (inst.operands[0].qualifier == AARCH64_OPND_QLF_S_D);
410 rt1 += AARCH64_X_REGISTER_COUNT;
411 rt2 += AARCH64_X_REGISTER_COUNT;
412 }
413
414 stack.store (pv_add_constant (regs[rn], imm), 8,
415 regs[rt1]);
416 stack.store (pv_add_constant (regs[rn], imm + 8), 8,
417 regs[rt2]);
418
419 if (inst.operands[2].addr.writeback)
420 regs[rn] = pv_add_constant (regs[rn], imm);
421
422 }
423 else if ((inst.opcode->iclass == ldst_imm9 /* Signed immediate. */
424 || (inst.opcode->iclass == ldst_pos /* Unsigned immediate. */
425 && (inst.opcode->op == OP_STR_POS
426 || inst.opcode->op == OP_STRF_POS)))
427 && inst.operands[1].addr.base_regno == AARCH64_SP_REGNUM
428 && strcmp ("str", inst.opcode->name) == 0)
429 {
430 /* STR (immediate) */
431 unsigned int rt = inst.operands[0].reg.regno;
432 int32_t imm = inst.operands[1].addr.offset.imm;
433 unsigned int rn = inst.operands[1].addr.base_regno;
434 bool is64
435 = (aarch64_get_qualifier_esize (inst.operands[0].qualifier) == 8);
436 gdb_assert (inst.operands[0].type == AARCH64_OPND_Rt
437 || inst.operands[0].type == AARCH64_OPND_Ft);
438
439 if (inst.operands[0].type == AARCH64_OPND_Ft)
440 {
441 /* Only bottom 64-bit of each V register (D register) need
442 to be preserved. */
443 gdb_assert (inst.operands[0].qualifier == AARCH64_OPND_QLF_S_D);
444 rt += AARCH64_X_REGISTER_COUNT;
445 }
446
447 stack.store (pv_add_constant (regs[rn], imm),
448 is64 ? 8 : 4, regs[rt]);
449 if (inst.operands[1].addr.writeback)
450 regs[rn] = pv_add_constant (regs[rn], imm);
451 }
452 else if (inst.opcode->iclass == testbranch)
453 {
454 /* Stop analysis on branch. */
455 break;
456 }
457 else
458 {
459 if (aarch64_debug)
460 {
461 debug_printf ("aarch64: prologue analysis gave up addr=%s"
462 " opcode=0x%x\n",
463 core_addr_to_string_nz (start), insn);
464 }
465 break;
466 }
467 }
468
469 if (cache == NULL)
470 return start;
471
472 if (pv_is_register (regs[AARCH64_FP_REGNUM], AARCH64_SP_REGNUM))
473 {
474 /* Frame pointer is fp. Frame size is constant. */
475 cache->framereg = AARCH64_FP_REGNUM;
476 cache->framesize = -regs[AARCH64_FP_REGNUM].k;
477 }
478 else if (pv_is_register (regs[AARCH64_SP_REGNUM], AARCH64_SP_REGNUM))
479 {
480 /* Try the stack pointer. */
481 cache->framesize = -regs[AARCH64_SP_REGNUM].k;
482 cache->framereg = AARCH64_SP_REGNUM;
483 }
484 else
485 {
486 /* We're just out of luck. We don't know where the frame is. */
487 cache->framereg = -1;
488 cache->framesize = 0;
489 }
490
491 for (i = 0; i < AARCH64_X_REGISTER_COUNT; i++)
492 {
493 CORE_ADDR offset;
494
495 if (stack.find_reg (gdbarch, i, &offset))
496 cache->saved_regs[i].addr = offset;
497 }
498
499 for (i = 0; i < AARCH64_D_REGISTER_COUNT; i++)
500 {
501 int regnum = gdbarch_num_regs (gdbarch);
502 CORE_ADDR offset;
503
504 if (stack.find_reg (gdbarch, i + AARCH64_X_REGISTER_COUNT,
505 &offset))
506 cache->saved_regs[i + regnum + AARCH64_D0_REGNUM].addr = offset;
507 }
508
509 return start;
510 }
511
512 static CORE_ADDR
513 aarch64_analyze_prologue (struct gdbarch *gdbarch,
514 CORE_ADDR start, CORE_ADDR limit,
515 struct aarch64_prologue_cache *cache)
516 {
517 instruction_reader reader;
518
519 return aarch64_analyze_prologue (gdbarch, start, limit, cache,
520 reader);
521 }
522
523 #if GDB_SELF_TEST
524
525 namespace selftests {
526
527 /* Instruction reader from manually cooked instruction sequences. */
528
529 class instruction_reader_test : public abstract_instruction_reader
530 {
531 public:
532 template<size_t SIZE>
533 explicit instruction_reader_test (const uint32_t (&insns)[SIZE])
534 : m_insns (insns), m_insns_size (SIZE)
535 {}
536
537 ULONGEST read (CORE_ADDR memaddr, int len, enum bfd_endian byte_order)
538 override
539 {
540 SELF_CHECK (len == 4);
541 SELF_CHECK (memaddr % 4 == 0);
542 SELF_CHECK (memaddr / 4 < m_insns_size);
543
544 return m_insns[memaddr / 4];
545 }
546
547 private:
548 const uint32_t *m_insns;
549 size_t m_insns_size;
550 };
551
552 static void
553 aarch64_analyze_prologue_test (void)
554 {
555 struct gdbarch_info info;
556
557 gdbarch_info_init (&info);
558 info.bfd_arch_info = bfd_scan_arch ("aarch64");
559
560 struct gdbarch *gdbarch = gdbarch_find_by_info (info);
561 SELF_CHECK (gdbarch != NULL);
562
563 /* Test the simple prologue in which frame pointer is used. */
564 {
565 struct aarch64_prologue_cache cache;
566 cache.saved_regs = trad_frame_alloc_saved_regs (gdbarch);
567
568 static const uint32_t insns[] = {
569 0xa9af7bfd, /* stp x29, x30, [sp,#-272]! */
570 0x910003fd, /* mov x29, sp */
571 0x97ffffe6, /* bl 0x400580 */
572 };
573 instruction_reader_test reader (insns);
574
575 CORE_ADDR end = aarch64_analyze_prologue (gdbarch, 0, 128, &cache, reader);
576 SELF_CHECK (end == 4 * 2);
577
578 SELF_CHECK (cache.framereg == AARCH64_FP_REGNUM);
579 SELF_CHECK (cache.framesize == 272);
580
581 for (int i = 0; i < AARCH64_X_REGISTER_COUNT; i++)
582 {
583 if (i == AARCH64_FP_REGNUM)
584 SELF_CHECK (cache.saved_regs[i].addr == -272);
585 else if (i == AARCH64_LR_REGNUM)
586 SELF_CHECK (cache.saved_regs[i].addr == -264);
587 else
588 SELF_CHECK (cache.saved_regs[i].addr == -1);
589 }
590
591 for (int i = 0; i < AARCH64_D_REGISTER_COUNT; i++)
592 {
593 int regnum = gdbarch_num_regs (gdbarch);
594
595 SELF_CHECK (cache.saved_regs[i + regnum + AARCH64_D0_REGNUM].addr
596 == -1);
597 }
598 }
599
600 /* Test a prologue in which STR is used and frame pointer is not
601 used. */
602 {
603 struct aarch64_prologue_cache cache;
604 cache.saved_regs = trad_frame_alloc_saved_regs (gdbarch);
605
606 static const uint32_t insns[] = {
607 0xf81d0ff3, /* str x19, [sp, #-48]! */
608 0xb9002fe0, /* str w0, [sp, #44] */
609 0xf90013e1, /* str x1, [sp, #32]*/
610 0xfd000fe0, /* str d0, [sp, #24] */
611 0xaa0203f3, /* mov x19, x2 */
612 0xf94013e0, /* ldr x0, [sp, #32] */
613 };
614 instruction_reader_test reader (insns);
615
616 CORE_ADDR end = aarch64_analyze_prologue (gdbarch, 0, 128, &cache, reader);
617
618 SELF_CHECK (end == 4 * 5);
619
620 SELF_CHECK (cache.framereg == AARCH64_SP_REGNUM);
621 SELF_CHECK (cache.framesize == 48);
622
623 for (int i = 0; i < AARCH64_X_REGISTER_COUNT; i++)
624 {
625 if (i == 1)
626 SELF_CHECK (cache.saved_regs[i].addr == -16);
627 else if (i == 19)
628 SELF_CHECK (cache.saved_regs[i].addr == -48);
629 else
630 SELF_CHECK (cache.saved_regs[i].addr == -1);
631 }
632
633 for (int i = 0; i < AARCH64_D_REGISTER_COUNT; i++)
634 {
635 int regnum = gdbarch_num_regs (gdbarch);
636
637 if (i == 0)
638 SELF_CHECK (cache.saved_regs[i + regnum + AARCH64_D0_REGNUM].addr
639 == -24);
640 else
641 SELF_CHECK (cache.saved_regs[i + regnum + AARCH64_D0_REGNUM].addr
642 == -1);
643 }
644 }
645 }
646 } // namespace selftests
647 #endif /* GDB_SELF_TEST */
648
649 /* Implement the "skip_prologue" gdbarch method. */
650
651 static CORE_ADDR
652 aarch64_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
653 {
654 CORE_ADDR func_addr, limit_pc;
655
656 /* See if we can determine the end of the prologue via the symbol
657 table. If so, then return either PC, or the PC after the
658 prologue, whichever is greater. */
659 if (find_pc_partial_function (pc, NULL, &func_addr, NULL))
660 {
661 CORE_ADDR post_prologue_pc
662 = skip_prologue_using_sal (gdbarch, func_addr);
663
664 if (post_prologue_pc != 0)
665 return std::max (pc, post_prologue_pc);
666 }
667
668 /* Can't determine prologue from the symbol table, need to examine
669 instructions. */
670
671 /* Find an upper limit on the function prologue using the debug
672 information. If the debug information could not be used to
673 provide that bound, then use an arbitrary large number as the
674 upper bound. */
675 limit_pc = skip_prologue_using_sal (gdbarch, pc);
676 if (limit_pc == 0)
677 limit_pc = pc + 128; /* Magic. */
678
679 /* Try disassembling prologue. */
680 return aarch64_analyze_prologue (gdbarch, pc, limit_pc, NULL);
681 }
682
683 /* Scan the function prologue for THIS_FRAME and populate the prologue
684 cache CACHE. */
685
686 static void
687 aarch64_scan_prologue (struct frame_info *this_frame,
688 struct aarch64_prologue_cache *cache)
689 {
690 CORE_ADDR block_addr = get_frame_address_in_block (this_frame);
691 CORE_ADDR prologue_start;
692 CORE_ADDR prologue_end;
693 CORE_ADDR prev_pc = get_frame_pc (this_frame);
694 struct gdbarch *gdbarch = get_frame_arch (this_frame);
695
696 cache->prev_pc = prev_pc;
697
698 /* Assume we do not find a frame. */
699 cache->framereg = -1;
700 cache->framesize = 0;
701
702 if (find_pc_partial_function (block_addr, NULL, &prologue_start,
703 &prologue_end))
704 {
705 struct symtab_and_line sal = find_pc_line (prologue_start, 0);
706
707 if (sal.line == 0)
708 {
709 /* No line info so use the current PC. */
710 prologue_end = prev_pc;
711 }
712 else if (sal.end < prologue_end)
713 {
714 /* The next line begins after the function end. */
715 prologue_end = sal.end;
716 }
717
718 prologue_end = std::min (prologue_end, prev_pc);
719 aarch64_analyze_prologue (gdbarch, prologue_start, prologue_end, cache);
720 }
721 else
722 {
723 CORE_ADDR frame_loc;
724
725 frame_loc = get_frame_register_unsigned (this_frame, AARCH64_FP_REGNUM);
726 if (frame_loc == 0)
727 return;
728
729 cache->framereg = AARCH64_FP_REGNUM;
730 cache->framesize = 16;
731 cache->saved_regs[29].addr = 0;
732 cache->saved_regs[30].addr = 8;
733 }
734 }
735
736 /* Fill in *CACHE with information about the prologue of *THIS_FRAME. This
737 function may throw an exception if the inferior's registers or memory is
738 not available. */
739
740 static void
741 aarch64_make_prologue_cache_1 (struct frame_info *this_frame,
742 struct aarch64_prologue_cache *cache)
743 {
744 CORE_ADDR unwound_fp;
745 int reg;
746
747 aarch64_scan_prologue (this_frame, cache);
748
749 if (cache->framereg == -1)
750 return;
751
752 unwound_fp = get_frame_register_unsigned (this_frame, cache->framereg);
753 if (unwound_fp == 0)
754 return;
755
756 cache->prev_sp = unwound_fp + cache->framesize;
757
758 /* Calculate actual addresses of saved registers using offsets
759 determined by aarch64_analyze_prologue. */
760 for (reg = 0; reg < gdbarch_num_regs (get_frame_arch (this_frame)); reg++)
761 if (trad_frame_addr_p (cache->saved_regs, reg))
762 cache->saved_regs[reg].addr += cache->prev_sp;
763
764 cache->func = get_frame_func (this_frame);
765
766 cache->available_p = 1;
767 }
768
769 /* Allocate and fill in *THIS_CACHE with information about the prologue of
770 *THIS_FRAME. Do not do this is if *THIS_CACHE was already allocated.
771 Return a pointer to the current aarch64_prologue_cache in
772 *THIS_CACHE. */
773
774 static struct aarch64_prologue_cache *
775 aarch64_make_prologue_cache (struct frame_info *this_frame, void **this_cache)
776 {
777 struct aarch64_prologue_cache *cache;
778
779 if (*this_cache != NULL)
780 return (struct aarch64_prologue_cache *) *this_cache;
781
782 cache = FRAME_OBSTACK_ZALLOC (struct aarch64_prologue_cache);
783 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
784 *this_cache = cache;
785
786 TRY
787 {
788 aarch64_make_prologue_cache_1 (this_frame, cache);
789 }
790 CATCH (ex, RETURN_MASK_ERROR)
791 {
792 if (ex.error != NOT_AVAILABLE_ERROR)
793 throw_exception (ex);
794 }
795 END_CATCH
796
797 return cache;
798 }
799
800 /* Implement the "stop_reason" frame_unwind method. */
801
802 static enum unwind_stop_reason
803 aarch64_prologue_frame_unwind_stop_reason (struct frame_info *this_frame,
804 void **this_cache)
805 {
806 struct aarch64_prologue_cache *cache
807 = aarch64_make_prologue_cache (this_frame, this_cache);
808
809 if (!cache->available_p)
810 return UNWIND_UNAVAILABLE;
811
812 /* Halt the backtrace at "_start". */
813 if (cache->prev_pc <= gdbarch_tdep (get_frame_arch (this_frame))->lowest_pc)
814 return UNWIND_OUTERMOST;
815
816 /* We've hit a wall, stop. */
817 if (cache->prev_sp == 0)
818 return UNWIND_OUTERMOST;
819
820 return UNWIND_NO_REASON;
821 }
822
823 /* Our frame ID for a normal frame is the current function's starting
824 PC and the caller's SP when we were called. */
825
826 static void
827 aarch64_prologue_this_id (struct frame_info *this_frame,
828 void **this_cache, struct frame_id *this_id)
829 {
830 struct aarch64_prologue_cache *cache
831 = aarch64_make_prologue_cache (this_frame, this_cache);
832
833 if (!cache->available_p)
834 *this_id = frame_id_build_unavailable_stack (cache->func);
835 else
836 *this_id = frame_id_build (cache->prev_sp, cache->func);
837 }
838
839 /* Implement the "prev_register" frame_unwind method. */
840
841 static struct value *
842 aarch64_prologue_prev_register (struct frame_info *this_frame,
843 void **this_cache, int prev_regnum)
844 {
845 struct aarch64_prologue_cache *cache
846 = aarch64_make_prologue_cache (this_frame, this_cache);
847
848 /* If we are asked to unwind the PC, then we need to return the LR
849 instead. The prologue may save PC, but it will point into this
850 frame's prologue, not the next frame's resume location. */
851 if (prev_regnum == AARCH64_PC_REGNUM)
852 {
853 CORE_ADDR lr;
854
855 lr = frame_unwind_register_unsigned (this_frame, AARCH64_LR_REGNUM);
856 return frame_unwind_got_constant (this_frame, prev_regnum, lr);
857 }
858
859 /* SP is generally not saved to the stack, but this frame is
860 identified by the next frame's stack pointer at the time of the
861 call. The value was already reconstructed into PREV_SP. */
862 /*
863 +----------+ ^
864 | saved lr | |
865 +->| saved fp |--+
866 | | |
867 | | | <- Previous SP
868 | +----------+
869 | | saved lr |
870 +--| saved fp |<- FP
871 | |
872 | |<- SP
873 +----------+ */
874 if (prev_regnum == AARCH64_SP_REGNUM)
875 return frame_unwind_got_constant (this_frame, prev_regnum,
876 cache->prev_sp);
877
878 return trad_frame_get_prev_register (this_frame, cache->saved_regs,
879 prev_regnum);
880 }
881
882 /* AArch64 prologue unwinder. */
883 struct frame_unwind aarch64_prologue_unwind =
884 {
885 NORMAL_FRAME,
886 aarch64_prologue_frame_unwind_stop_reason,
887 aarch64_prologue_this_id,
888 aarch64_prologue_prev_register,
889 NULL,
890 default_frame_sniffer
891 };
892
893 /* Allocate and fill in *THIS_CACHE with information about the prologue of
894 *THIS_FRAME. Do not do this is if *THIS_CACHE was already allocated.
895 Return a pointer to the current aarch64_prologue_cache in
896 *THIS_CACHE. */
897
898 static struct aarch64_prologue_cache *
899 aarch64_make_stub_cache (struct frame_info *this_frame, void **this_cache)
900 {
901 struct aarch64_prologue_cache *cache;
902
903 if (*this_cache != NULL)
904 return (struct aarch64_prologue_cache *) *this_cache;
905
906 cache = FRAME_OBSTACK_ZALLOC (struct aarch64_prologue_cache);
907 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
908 *this_cache = cache;
909
910 TRY
911 {
912 cache->prev_sp = get_frame_register_unsigned (this_frame,
913 AARCH64_SP_REGNUM);
914 cache->prev_pc = get_frame_pc (this_frame);
915 cache->available_p = 1;
916 }
917 CATCH (ex, RETURN_MASK_ERROR)
918 {
919 if (ex.error != NOT_AVAILABLE_ERROR)
920 throw_exception (ex);
921 }
922 END_CATCH
923
924 return cache;
925 }
926
927 /* Implement the "stop_reason" frame_unwind method. */
928
929 static enum unwind_stop_reason
930 aarch64_stub_frame_unwind_stop_reason (struct frame_info *this_frame,
931 void **this_cache)
932 {
933 struct aarch64_prologue_cache *cache
934 = aarch64_make_stub_cache (this_frame, this_cache);
935
936 if (!cache->available_p)
937 return UNWIND_UNAVAILABLE;
938
939 return UNWIND_NO_REASON;
940 }
941
942 /* Our frame ID for a stub frame is the current SP and LR. */
943
944 static void
945 aarch64_stub_this_id (struct frame_info *this_frame,
946 void **this_cache, struct frame_id *this_id)
947 {
948 struct aarch64_prologue_cache *cache
949 = aarch64_make_stub_cache (this_frame, this_cache);
950
951 if (cache->available_p)
952 *this_id = frame_id_build (cache->prev_sp, cache->prev_pc);
953 else
954 *this_id = frame_id_build_unavailable_stack (cache->prev_pc);
955 }
956
957 /* Implement the "sniffer" frame_unwind method. */
958
959 static int
960 aarch64_stub_unwind_sniffer (const struct frame_unwind *self,
961 struct frame_info *this_frame,
962 void **this_prologue_cache)
963 {
964 CORE_ADDR addr_in_block;
965 gdb_byte dummy[4];
966
967 addr_in_block = get_frame_address_in_block (this_frame);
968 if (in_plt_section (addr_in_block)
969 /* We also use the stub winder if the target memory is unreadable
970 to avoid having the prologue unwinder trying to read it. */
971 || target_read_memory (get_frame_pc (this_frame), dummy, 4) != 0)
972 return 1;
973
974 return 0;
975 }
976
977 /* AArch64 stub unwinder. */
978 struct frame_unwind aarch64_stub_unwind =
979 {
980 NORMAL_FRAME,
981 aarch64_stub_frame_unwind_stop_reason,
982 aarch64_stub_this_id,
983 aarch64_prologue_prev_register,
984 NULL,
985 aarch64_stub_unwind_sniffer
986 };
987
988 /* Return the frame base address of *THIS_FRAME. */
989
990 static CORE_ADDR
991 aarch64_normal_frame_base (struct frame_info *this_frame, void **this_cache)
992 {
993 struct aarch64_prologue_cache *cache
994 = aarch64_make_prologue_cache (this_frame, this_cache);
995
996 return cache->prev_sp - cache->framesize;
997 }
998
999 /* AArch64 default frame base information. */
1000 struct frame_base aarch64_normal_base =
1001 {
1002 &aarch64_prologue_unwind,
1003 aarch64_normal_frame_base,
1004 aarch64_normal_frame_base,
1005 aarch64_normal_frame_base
1006 };
1007
1008 /* Assuming THIS_FRAME is a dummy, return the frame ID of that
1009 dummy frame. The frame ID's base needs to match the TOS value
1010 saved by save_dummy_frame_tos () and returned from
1011 aarch64_push_dummy_call, and the PC needs to match the dummy
1012 frame's breakpoint. */
1013
1014 static struct frame_id
1015 aarch64_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
1016 {
1017 return frame_id_build (get_frame_register_unsigned (this_frame,
1018 AARCH64_SP_REGNUM),
1019 get_frame_pc (this_frame));
1020 }
1021
1022 /* Implement the "unwind_pc" gdbarch method. */
1023
1024 static CORE_ADDR
1025 aarch64_unwind_pc (struct gdbarch *gdbarch, struct frame_info *this_frame)
1026 {
1027 CORE_ADDR pc
1028 = frame_unwind_register_unsigned (this_frame, AARCH64_PC_REGNUM);
1029
1030 return pc;
1031 }
1032
1033 /* Implement the "unwind_sp" gdbarch method. */
1034
1035 static CORE_ADDR
1036 aarch64_unwind_sp (struct gdbarch *gdbarch, struct frame_info *this_frame)
1037 {
1038 return frame_unwind_register_unsigned (this_frame, AARCH64_SP_REGNUM);
1039 }
1040
1041 /* Return the value of the REGNUM register in the previous frame of
1042 *THIS_FRAME. */
1043
1044 static struct value *
1045 aarch64_dwarf2_prev_register (struct frame_info *this_frame,
1046 void **this_cache, int regnum)
1047 {
1048 CORE_ADDR lr;
1049
1050 switch (regnum)
1051 {
1052 case AARCH64_PC_REGNUM:
1053 lr = frame_unwind_register_unsigned (this_frame, AARCH64_LR_REGNUM);
1054 return frame_unwind_got_constant (this_frame, regnum, lr);
1055
1056 default:
1057 internal_error (__FILE__, __LINE__,
1058 _("Unexpected register %d"), regnum);
1059 }
1060 }
1061
1062 /* Implement the "init_reg" dwarf2_frame_ops method. */
1063
1064 static void
1065 aarch64_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
1066 struct dwarf2_frame_state_reg *reg,
1067 struct frame_info *this_frame)
1068 {
1069 switch (regnum)
1070 {
1071 case AARCH64_PC_REGNUM:
1072 reg->how = DWARF2_FRAME_REG_FN;
1073 reg->loc.fn = aarch64_dwarf2_prev_register;
1074 break;
1075 case AARCH64_SP_REGNUM:
1076 reg->how = DWARF2_FRAME_REG_CFA;
1077 break;
1078 }
1079 }
1080
1081 /* When arguments must be pushed onto the stack, they go on in reverse
1082 order. The code below implements a FILO (stack) to do this. */
1083
1084 typedef struct
1085 {
1086 /* Value to pass on stack. It can be NULL if this item is for stack
1087 padding. */
1088 const gdb_byte *data;
1089
1090 /* Size in bytes of value to pass on stack. */
1091 int len;
1092 } stack_item_t;
1093
1094 DEF_VEC_O (stack_item_t);
1095
1096 /* Return the alignment (in bytes) of the given type. */
1097
1098 static int
1099 aarch64_type_align (struct type *t)
1100 {
1101 int n;
1102 int align;
1103 int falign;
1104
1105 t = check_typedef (t);
1106 switch (TYPE_CODE (t))
1107 {
1108 default:
1109 /* Should never happen. */
1110 internal_error (__FILE__, __LINE__, _("unknown type alignment"));
1111 return 4;
1112
1113 case TYPE_CODE_PTR:
1114 case TYPE_CODE_ENUM:
1115 case TYPE_CODE_INT:
1116 case TYPE_CODE_FLT:
1117 case TYPE_CODE_SET:
1118 case TYPE_CODE_RANGE:
1119 case TYPE_CODE_BITSTRING:
1120 case TYPE_CODE_REF:
1121 case TYPE_CODE_RVALUE_REF:
1122 case TYPE_CODE_CHAR:
1123 case TYPE_CODE_BOOL:
1124 return TYPE_LENGTH (t);
1125
1126 case TYPE_CODE_ARRAY:
1127 if (TYPE_VECTOR (t))
1128 {
1129 /* Use the natural alignment for vector types (the same for
1130 scalar type), but the maximum alignment is 128-bit. */
1131 if (TYPE_LENGTH (t) > 16)
1132 return 16;
1133 else
1134 return TYPE_LENGTH (t);
1135 }
1136 else
1137 return aarch64_type_align (TYPE_TARGET_TYPE (t));
1138 case TYPE_CODE_COMPLEX:
1139 return aarch64_type_align (TYPE_TARGET_TYPE (t));
1140
1141 case TYPE_CODE_STRUCT:
1142 case TYPE_CODE_UNION:
1143 align = 1;
1144 for (n = 0; n < TYPE_NFIELDS (t); n++)
1145 {
1146 falign = aarch64_type_align (TYPE_FIELD_TYPE (t, n));
1147 if (falign > align)
1148 align = falign;
1149 }
1150 return align;
1151 }
1152 }
1153
1154 /* Worker function for aapcs_is_vfp_call_or_return_candidate.
1155
1156 Return the number of register required, or -1 on failure.
1157
1158 When encountering a base element, if FUNDAMENTAL_TYPE is not set then set it
1159 to the element, else fail if the type of this element does not match the
1160 existing value. */
1161
1162 static int
1163 aapcs_is_vfp_call_or_return_candidate_1 (struct type *type,
1164 struct type **fundamental_type)
1165 {
1166 if (type == nullptr)
1167 return -1;
1168
1169 switch (TYPE_CODE (type))
1170 {
1171 case TYPE_CODE_FLT:
1172 if (TYPE_LENGTH (type) > 16)
1173 return -1;
1174
1175 if (*fundamental_type == nullptr)
1176 *fundamental_type = type;
1177 else if (TYPE_LENGTH (type) != TYPE_LENGTH (*fundamental_type)
1178 || TYPE_CODE (type) != TYPE_CODE (*fundamental_type))
1179 return -1;
1180
1181 return 1;
1182
1183 case TYPE_CODE_COMPLEX:
1184 {
1185 struct type *target_type = check_typedef (TYPE_TARGET_TYPE (type));
1186 if (TYPE_LENGTH (target_type) > 16)
1187 return -1;
1188
1189 if (*fundamental_type == nullptr)
1190 *fundamental_type = target_type;
1191 else if (TYPE_LENGTH (target_type) != TYPE_LENGTH (*fundamental_type)
1192 || TYPE_CODE (target_type) != TYPE_CODE (*fundamental_type))
1193 return -1;
1194
1195 return 2;
1196 }
1197
1198 case TYPE_CODE_ARRAY:
1199 {
1200 if (TYPE_VECTOR (type))
1201 {
1202 if (TYPE_LENGTH (type) != 8 && TYPE_LENGTH (type) != 16)
1203 return -1;
1204
1205 if (*fundamental_type == nullptr)
1206 *fundamental_type = type;
1207 else if (TYPE_LENGTH (type) != TYPE_LENGTH (*fundamental_type)
1208 || TYPE_CODE (type) != TYPE_CODE (*fundamental_type))
1209 return -1;
1210
1211 return 1;
1212 }
1213 else
1214 {
1215 struct type *target_type = TYPE_TARGET_TYPE (type);
1216 int count = aapcs_is_vfp_call_or_return_candidate_1
1217 (target_type, fundamental_type);
1218
1219 if (count == -1)
1220 return count;
1221
1222 count *= TYPE_LENGTH (type);
1223 return count;
1224 }
1225 }
1226
1227 case TYPE_CODE_STRUCT:
1228 case TYPE_CODE_UNION:
1229 {
1230 int count = 0;
1231
1232 for (int i = 0; i < TYPE_NFIELDS (type); i++)
1233 {
1234 struct type *member = check_typedef (TYPE_FIELD_TYPE (type, i));
1235
1236 int sub_count = aapcs_is_vfp_call_or_return_candidate_1
1237 (member, fundamental_type);
1238 if (sub_count == -1)
1239 return -1;
1240 count += sub_count;
1241 }
1242 return count;
1243 }
1244
1245 default:
1246 break;
1247 }
1248
1249 return -1;
1250 }
1251
1252 /* Return true if an argument, whose type is described by TYPE, can be passed or
1253 returned in simd/fp registers, providing enough parameter passing registers
1254 are available. This is as described in the AAPCS64.
1255
1256 Upon successful return, *COUNT returns the number of needed registers,
1257 *FUNDAMENTAL_TYPE contains the type of those registers.
1258
1259 Candidate as per the AAPCS64 5.4.2.C is either a:
1260 - float.
1261 - short-vector.
1262 - HFA (Homogeneous Floating-point Aggregate, 4.3.5.1). A Composite type where
1263 all the members are floats and has at most 4 members.
1264 - HVA (Homogeneous Short-vector Aggregate, 4.3.5.2). A Composite type where
1265 all the members are short vectors and has at most 4 members.
1266 - Complex (7.1.1)
1267
1268 Note that HFAs and HVAs can include nested structures and arrays. */
1269
1270 static bool
1271 aapcs_is_vfp_call_or_return_candidate (struct type *type, int *count,
1272 struct type **fundamental_type)
1273 {
1274 if (type == nullptr)
1275 return false;
1276
1277 *fundamental_type = nullptr;
1278
1279 int ag_count = aapcs_is_vfp_call_or_return_candidate_1 (type,
1280 fundamental_type);
1281
1282 if (ag_count > 0 && ag_count <= HA_MAX_NUM_FLDS)
1283 {
1284 *count = ag_count;
1285 return true;
1286 }
1287 else
1288 return false;
1289 }
1290
1291 /* AArch64 function call information structure. */
1292 struct aarch64_call_info
1293 {
1294 /* the current argument number. */
1295 unsigned argnum;
1296
1297 /* The next general purpose register number, equivalent to NGRN as
1298 described in the AArch64 Procedure Call Standard. */
1299 unsigned ngrn;
1300
1301 /* The next SIMD and floating point register number, equivalent to
1302 NSRN as described in the AArch64 Procedure Call Standard. */
1303 unsigned nsrn;
1304
1305 /* The next stacked argument address, equivalent to NSAA as
1306 described in the AArch64 Procedure Call Standard. */
1307 unsigned nsaa;
1308
1309 /* Stack item vector. */
1310 VEC(stack_item_t) *si;
1311 };
1312
1313 /* Pass a value in a sequence of consecutive X registers. The caller
1314 is responsbile for ensuring sufficient registers are available. */
1315
1316 static void
1317 pass_in_x (struct gdbarch *gdbarch, struct regcache *regcache,
1318 struct aarch64_call_info *info, struct type *type,
1319 struct value *arg)
1320 {
1321 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1322 int len = TYPE_LENGTH (type);
1323 enum type_code typecode = TYPE_CODE (type);
1324 int regnum = AARCH64_X0_REGNUM + info->ngrn;
1325 const bfd_byte *buf = value_contents (arg);
1326
1327 info->argnum++;
1328
1329 while (len > 0)
1330 {
1331 int partial_len = len < X_REGISTER_SIZE ? len : X_REGISTER_SIZE;
1332 CORE_ADDR regval = extract_unsigned_integer (buf, partial_len,
1333 byte_order);
1334
1335
1336 /* Adjust sub-word struct/union args when big-endian. */
1337 if (byte_order == BFD_ENDIAN_BIG
1338 && partial_len < X_REGISTER_SIZE
1339 && (typecode == TYPE_CODE_STRUCT || typecode == TYPE_CODE_UNION))
1340 regval <<= ((X_REGISTER_SIZE - partial_len) * TARGET_CHAR_BIT);
1341
1342 if (aarch64_debug)
1343 {
1344 debug_printf ("arg %d in %s = 0x%s\n", info->argnum,
1345 gdbarch_register_name (gdbarch, regnum),
1346 phex (regval, X_REGISTER_SIZE));
1347 }
1348 regcache_cooked_write_unsigned (regcache, regnum, regval);
1349 len -= partial_len;
1350 buf += partial_len;
1351 regnum++;
1352 }
1353 }
1354
1355 /* Attempt to marshall a value in a V register. Return 1 if
1356 successful, or 0 if insufficient registers are available. This
1357 function, unlike the equivalent pass_in_x() function does not
1358 handle arguments spread across multiple registers. */
1359
1360 static int
1361 pass_in_v (struct gdbarch *gdbarch,
1362 struct regcache *regcache,
1363 struct aarch64_call_info *info,
1364 int len, const bfd_byte *buf)
1365 {
1366 if (info->nsrn < 8)
1367 {
1368 int regnum = AARCH64_V0_REGNUM + info->nsrn;
1369 gdb_byte reg[V_REGISTER_SIZE];
1370
1371 info->argnum++;
1372 info->nsrn++;
1373
1374 memset (reg, 0, sizeof (reg));
1375 /* PCS C.1, the argument is allocated to the least significant
1376 bits of V register. */
1377 memcpy (reg, buf, len);
1378 regcache->cooked_write (regnum, reg);
1379
1380 if (aarch64_debug)
1381 {
1382 debug_printf ("arg %d in %s\n", info->argnum,
1383 gdbarch_register_name (gdbarch, regnum));
1384 }
1385 return 1;
1386 }
1387 info->nsrn = 8;
1388 return 0;
1389 }
1390
1391 /* Marshall an argument onto the stack. */
1392
1393 static void
1394 pass_on_stack (struct aarch64_call_info *info, struct type *type,
1395 struct value *arg)
1396 {
1397 const bfd_byte *buf = value_contents (arg);
1398 int len = TYPE_LENGTH (type);
1399 int align;
1400 stack_item_t item;
1401
1402 info->argnum++;
1403
1404 align = aarch64_type_align (type);
1405
1406 /* PCS C.17 Stack should be aligned to the larger of 8 bytes or the
1407 Natural alignment of the argument's type. */
1408 align = align_up (align, 8);
1409
1410 /* The AArch64 PCS requires at most doubleword alignment. */
1411 if (align > 16)
1412 align = 16;
1413
1414 if (aarch64_debug)
1415 {
1416 debug_printf ("arg %d len=%d @ sp + %d\n", info->argnum, len,
1417 info->nsaa);
1418 }
1419
1420 item.len = len;
1421 item.data = buf;
1422 VEC_safe_push (stack_item_t, info->si, &item);
1423
1424 info->nsaa += len;
1425 if (info->nsaa & (align - 1))
1426 {
1427 /* Push stack alignment padding. */
1428 int pad = align - (info->nsaa & (align - 1));
1429
1430 item.len = pad;
1431 item.data = NULL;
1432
1433 VEC_safe_push (stack_item_t, info->si, &item);
1434 info->nsaa += pad;
1435 }
1436 }
1437
1438 /* Marshall an argument into a sequence of one or more consecutive X
1439 registers or, if insufficient X registers are available then onto
1440 the stack. */
1441
1442 static void
1443 pass_in_x_or_stack (struct gdbarch *gdbarch, struct regcache *regcache,
1444 struct aarch64_call_info *info, struct type *type,
1445 struct value *arg)
1446 {
1447 int len = TYPE_LENGTH (type);
1448 int nregs = (len + X_REGISTER_SIZE - 1) / X_REGISTER_SIZE;
1449
1450 /* PCS C.13 - Pass in registers if we have enough spare */
1451 if (info->ngrn + nregs <= 8)
1452 {
1453 pass_in_x (gdbarch, regcache, info, type, arg);
1454 info->ngrn += nregs;
1455 }
1456 else
1457 {
1458 info->ngrn = 8;
1459 pass_on_stack (info, type, arg);
1460 }
1461 }
1462
1463 /* Pass a value, which is of type arg_type, in a V register. Assumes value is a
1464 aapcs_is_vfp_call_or_return_candidate and there are enough spare V
1465 registers. A return value of false is an error state as the value will have
1466 been partially passed to the stack. */
1467 static bool
1468 pass_in_v_vfp_candidate (struct gdbarch *gdbarch, struct regcache *regcache,
1469 struct aarch64_call_info *info, struct type *arg_type,
1470 struct value *arg)
1471 {
1472 switch (TYPE_CODE (arg_type))
1473 {
1474 case TYPE_CODE_FLT:
1475 return pass_in_v (gdbarch, regcache, info, TYPE_LENGTH (arg_type),
1476 value_contents (arg));
1477 break;
1478
1479 case TYPE_CODE_COMPLEX:
1480 {
1481 const bfd_byte *buf = value_contents (arg);
1482 struct type *target_type = check_typedef (TYPE_TARGET_TYPE (arg_type));
1483
1484 if (!pass_in_v (gdbarch, regcache, info, TYPE_LENGTH (target_type),
1485 buf))
1486 return false;
1487
1488 return pass_in_v (gdbarch, regcache, info, TYPE_LENGTH (target_type),
1489 buf + TYPE_LENGTH (target_type));
1490 }
1491
1492 case TYPE_CODE_ARRAY:
1493 if (TYPE_VECTOR (arg_type))
1494 return pass_in_v (gdbarch, regcache, info, TYPE_LENGTH (arg_type),
1495 value_contents (arg));
1496 /* fall through. */
1497
1498 case TYPE_CODE_STRUCT:
1499 case TYPE_CODE_UNION:
1500 for (int i = 0; i < TYPE_NFIELDS (arg_type); i++)
1501 {
1502 struct value *field = value_primitive_field (arg, 0, i, arg_type);
1503 struct type *field_type = check_typedef (value_type (field));
1504
1505 if (!pass_in_v_vfp_candidate (gdbarch, regcache, info, field_type,
1506 field))
1507 return false;
1508 }
1509 return true;
1510
1511 default:
1512 return false;
1513 }
1514 }
1515
1516 /* Implement the "push_dummy_call" gdbarch method. */
1517
1518 static CORE_ADDR
1519 aarch64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
1520 struct regcache *regcache, CORE_ADDR bp_addr,
1521 int nargs,
1522 struct value **args, CORE_ADDR sp, int struct_return,
1523 CORE_ADDR struct_addr)
1524 {
1525 int argnum;
1526 struct aarch64_call_info info;
1527 struct type *func_type;
1528 struct type *return_type;
1529 int lang_struct_return;
1530
1531 memset (&info, 0, sizeof (info));
1532
1533 /* We need to know what the type of the called function is in order
1534 to determine the number of named/anonymous arguments for the
1535 actual argument placement, and the return type in order to handle
1536 return value correctly.
1537
1538 The generic code above us views the decision of return in memory
1539 or return in registers as a two stage processes. The language
1540 handler is consulted first and may decide to return in memory (eg
1541 class with copy constructor returned by value), this will cause
1542 the generic code to allocate space AND insert an initial leading
1543 argument.
1544
1545 If the language code does not decide to pass in memory then the
1546 target code is consulted.
1547
1548 If the language code decides to pass in memory we want to move
1549 the pointer inserted as the initial argument from the argument
1550 list and into X8, the conventional AArch64 struct return pointer
1551 register.
1552
1553 This is slightly awkward, ideally the flag "lang_struct_return"
1554 would be passed to the targets implementation of push_dummy_call.
1555 Rather that change the target interface we call the language code
1556 directly ourselves. */
1557
1558 func_type = check_typedef (value_type (function));
1559
1560 /* Dereference function pointer types. */
1561 if (TYPE_CODE (func_type) == TYPE_CODE_PTR)
1562 func_type = TYPE_TARGET_TYPE (func_type);
1563
1564 gdb_assert (TYPE_CODE (func_type) == TYPE_CODE_FUNC
1565 || TYPE_CODE (func_type) == TYPE_CODE_METHOD);
1566
1567 /* If language_pass_by_reference () returned true we will have been
1568 given an additional initial argument, a hidden pointer to the
1569 return slot in memory. */
1570 return_type = TYPE_TARGET_TYPE (func_type);
1571 lang_struct_return = language_pass_by_reference (return_type);
1572
1573 /* Set the return address. For the AArch64, the return breakpoint
1574 is always at BP_ADDR. */
1575 regcache_cooked_write_unsigned (regcache, AARCH64_LR_REGNUM, bp_addr);
1576
1577 /* If we were given an initial argument for the return slot because
1578 lang_struct_return was true, lose it. */
1579 if (lang_struct_return)
1580 {
1581 args++;
1582 nargs--;
1583 }
1584
1585 /* The struct_return pointer occupies X8. */
1586 if (struct_return || lang_struct_return)
1587 {
1588 if (aarch64_debug)
1589 {
1590 debug_printf ("struct return in %s = 0x%s\n",
1591 gdbarch_register_name (gdbarch,
1592 AARCH64_STRUCT_RETURN_REGNUM),
1593 paddress (gdbarch, struct_addr));
1594 }
1595 regcache_cooked_write_unsigned (regcache, AARCH64_STRUCT_RETURN_REGNUM,
1596 struct_addr);
1597 }
1598
1599 for (argnum = 0; argnum < nargs; argnum++)
1600 {
1601 struct value *arg = args[argnum];
1602 struct type *arg_type, *fundamental_type;
1603 int len, elements;
1604
1605 arg_type = check_typedef (value_type (arg));
1606 len = TYPE_LENGTH (arg_type);
1607
1608 /* If arg can be passed in v registers as per the AAPCS64, then do so if
1609 if there are enough spare registers. */
1610 if (aapcs_is_vfp_call_or_return_candidate (arg_type, &elements,
1611 &fundamental_type))
1612 {
1613 if (info.nsrn + elements <= 8)
1614 {
1615 /* We know that we have sufficient registers available therefore
1616 this will never need to fallback to the stack. */
1617 if (!pass_in_v_vfp_candidate (gdbarch, regcache, &info, arg_type,
1618 arg))
1619 gdb_assert_not_reached ("Failed to push args");
1620 }
1621 else
1622 {
1623 info.nsrn = 8;
1624 pass_on_stack (&info, arg_type, arg);
1625 }
1626 continue;
1627 }
1628
1629 switch (TYPE_CODE (arg_type))
1630 {
1631 case TYPE_CODE_INT:
1632 case TYPE_CODE_BOOL:
1633 case TYPE_CODE_CHAR:
1634 case TYPE_CODE_RANGE:
1635 case TYPE_CODE_ENUM:
1636 if (len < 4)
1637 {
1638 /* Promote to 32 bit integer. */
1639 if (TYPE_UNSIGNED (arg_type))
1640 arg_type = builtin_type (gdbarch)->builtin_uint32;
1641 else
1642 arg_type = builtin_type (gdbarch)->builtin_int32;
1643 arg = value_cast (arg_type, arg);
1644 }
1645 pass_in_x_or_stack (gdbarch, regcache, &info, arg_type, arg);
1646 break;
1647
1648 case TYPE_CODE_STRUCT:
1649 case TYPE_CODE_ARRAY:
1650 case TYPE_CODE_UNION:
1651 if (len > 16)
1652 {
1653 /* PCS B.7 Aggregates larger than 16 bytes are passed by
1654 invisible reference. */
1655
1656 /* Allocate aligned storage. */
1657 sp = align_down (sp - len, 16);
1658
1659 /* Write the real data into the stack. */
1660 write_memory (sp, value_contents (arg), len);
1661
1662 /* Construct the indirection. */
1663 arg_type = lookup_pointer_type (arg_type);
1664 arg = value_from_pointer (arg_type, sp);
1665 pass_in_x_or_stack (gdbarch, regcache, &info, arg_type, arg);
1666 }
1667 else
1668 /* PCS C.15 / C.18 multiple values pass. */
1669 pass_in_x_or_stack (gdbarch, regcache, &info, arg_type, arg);
1670 break;
1671
1672 default:
1673 pass_in_x_or_stack (gdbarch, regcache, &info, arg_type, arg);
1674 break;
1675 }
1676 }
1677
1678 /* Make sure stack retains 16 byte alignment. */
1679 if (info.nsaa & 15)
1680 sp -= 16 - (info.nsaa & 15);
1681
1682 while (!VEC_empty (stack_item_t, info.si))
1683 {
1684 stack_item_t *si = VEC_last (stack_item_t, info.si);
1685
1686 sp -= si->len;
1687 if (si->data != NULL)
1688 write_memory (sp, si->data, si->len);
1689 VEC_pop (stack_item_t, info.si);
1690 }
1691
1692 VEC_free (stack_item_t, info.si);
1693
1694 /* Finally, update the SP register. */
1695 regcache_cooked_write_unsigned (regcache, AARCH64_SP_REGNUM, sp);
1696
1697 return sp;
1698 }
1699
1700 /* Implement the "frame_align" gdbarch method. */
1701
1702 static CORE_ADDR
1703 aarch64_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp)
1704 {
1705 /* Align the stack to sixteen bytes. */
1706 return sp & ~(CORE_ADDR) 15;
1707 }
1708
1709 /* Return the type for an AdvSISD Q register. */
1710
1711 static struct type *
1712 aarch64_vnq_type (struct gdbarch *gdbarch)
1713 {
1714 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1715
1716 if (tdep->vnq_type == NULL)
1717 {
1718 struct type *t;
1719 struct type *elem;
1720
1721 t = arch_composite_type (gdbarch, "__gdb_builtin_type_vnq",
1722 TYPE_CODE_UNION);
1723
1724 elem = builtin_type (gdbarch)->builtin_uint128;
1725 append_composite_type_field (t, "u", elem);
1726
1727 elem = builtin_type (gdbarch)->builtin_int128;
1728 append_composite_type_field (t, "s", elem);
1729
1730 tdep->vnq_type = t;
1731 }
1732
1733 return tdep->vnq_type;
1734 }
1735
1736 /* Return the type for an AdvSISD D register. */
1737
1738 static struct type *
1739 aarch64_vnd_type (struct gdbarch *gdbarch)
1740 {
1741 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1742
1743 if (tdep->vnd_type == NULL)
1744 {
1745 struct type *t;
1746 struct type *elem;
1747
1748 t = arch_composite_type (gdbarch, "__gdb_builtin_type_vnd",
1749 TYPE_CODE_UNION);
1750
1751 elem = builtin_type (gdbarch)->builtin_double;
1752 append_composite_type_field (t, "f", elem);
1753
1754 elem = builtin_type (gdbarch)->builtin_uint64;
1755 append_composite_type_field (t, "u", elem);
1756
1757 elem = builtin_type (gdbarch)->builtin_int64;
1758 append_composite_type_field (t, "s", elem);
1759
1760 tdep->vnd_type = t;
1761 }
1762
1763 return tdep->vnd_type;
1764 }
1765
1766 /* Return the type for an AdvSISD S register. */
1767
1768 static struct type *
1769 aarch64_vns_type (struct gdbarch *gdbarch)
1770 {
1771 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1772
1773 if (tdep->vns_type == NULL)
1774 {
1775 struct type *t;
1776 struct type *elem;
1777
1778 t = arch_composite_type (gdbarch, "__gdb_builtin_type_vns",
1779 TYPE_CODE_UNION);
1780
1781 elem = builtin_type (gdbarch)->builtin_float;
1782 append_composite_type_field (t, "f", elem);
1783
1784 elem = builtin_type (gdbarch)->builtin_uint32;
1785 append_composite_type_field (t, "u", elem);
1786
1787 elem = builtin_type (gdbarch)->builtin_int32;
1788 append_composite_type_field (t, "s", elem);
1789
1790 tdep->vns_type = t;
1791 }
1792
1793 return tdep->vns_type;
1794 }
1795
1796 /* Return the type for an AdvSISD H register. */
1797
1798 static struct type *
1799 aarch64_vnh_type (struct gdbarch *gdbarch)
1800 {
1801 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1802
1803 if (tdep->vnh_type == NULL)
1804 {
1805 struct type *t;
1806 struct type *elem;
1807
1808 t = arch_composite_type (gdbarch, "__gdb_builtin_type_vnh",
1809 TYPE_CODE_UNION);
1810
1811 elem = builtin_type (gdbarch)->builtin_uint16;
1812 append_composite_type_field (t, "u", elem);
1813
1814 elem = builtin_type (gdbarch)->builtin_int16;
1815 append_composite_type_field (t, "s", elem);
1816
1817 tdep->vnh_type = t;
1818 }
1819
1820 return tdep->vnh_type;
1821 }
1822
1823 /* Return the type for an AdvSISD B register. */
1824
1825 static struct type *
1826 aarch64_vnb_type (struct gdbarch *gdbarch)
1827 {
1828 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1829
1830 if (tdep->vnb_type == NULL)
1831 {
1832 struct type *t;
1833 struct type *elem;
1834
1835 t = arch_composite_type (gdbarch, "__gdb_builtin_type_vnb",
1836 TYPE_CODE_UNION);
1837
1838 elem = builtin_type (gdbarch)->builtin_uint8;
1839 append_composite_type_field (t, "u", elem);
1840
1841 elem = builtin_type (gdbarch)->builtin_int8;
1842 append_composite_type_field (t, "s", elem);
1843
1844 tdep->vnb_type = t;
1845 }
1846
1847 return tdep->vnb_type;
1848 }
1849
1850 /* Return the type for an AdvSISD V register. */
1851
1852 static struct type *
1853 aarch64_vnv_type (struct gdbarch *gdbarch)
1854 {
1855 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1856
1857 if (tdep->vnv_type == NULL)
1858 {
1859 struct type *t = arch_composite_type (gdbarch, "__gdb_builtin_type_vnv",
1860 TYPE_CODE_UNION);
1861
1862 append_composite_type_field (t, "d", aarch64_vnd_type (gdbarch));
1863 append_composite_type_field (t, "s", aarch64_vns_type (gdbarch));
1864 append_composite_type_field (t, "h", aarch64_vnh_type (gdbarch));
1865 append_composite_type_field (t, "b", aarch64_vnb_type (gdbarch));
1866 append_composite_type_field (t, "q", aarch64_vnq_type (gdbarch));
1867
1868 tdep->vnv_type = t;
1869 }
1870
1871 return tdep->vnv_type;
1872 }
1873
1874 /* Implement the "dwarf2_reg_to_regnum" gdbarch method. */
1875
1876 static int
1877 aarch64_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
1878 {
1879 if (reg >= AARCH64_DWARF_X0 && reg <= AARCH64_DWARF_X0 + 30)
1880 return AARCH64_X0_REGNUM + reg - AARCH64_DWARF_X0;
1881
1882 if (reg == AARCH64_DWARF_SP)
1883 return AARCH64_SP_REGNUM;
1884
1885 if (reg >= AARCH64_DWARF_V0 && reg <= AARCH64_DWARF_V0 + 31)
1886 return AARCH64_V0_REGNUM + reg - AARCH64_DWARF_V0;
1887
1888 if (reg == AARCH64_DWARF_SVE_VG)
1889 return AARCH64_SVE_VG_REGNUM;
1890
1891 if (reg == AARCH64_DWARF_SVE_FFR)
1892 return AARCH64_SVE_FFR_REGNUM;
1893
1894 if (reg >= AARCH64_DWARF_SVE_P0 && reg <= AARCH64_DWARF_SVE_P0 + 15)
1895 return AARCH64_SVE_P0_REGNUM + reg - AARCH64_DWARF_SVE_P0;
1896
1897 if (reg >= AARCH64_DWARF_SVE_Z0 && reg <= AARCH64_DWARF_SVE_Z0 + 15)
1898 return AARCH64_SVE_Z0_REGNUM + reg - AARCH64_DWARF_SVE_Z0;
1899
1900 return -1;
1901 }
1902
1903 /* Implement the "print_insn" gdbarch method. */
1904
1905 static int
1906 aarch64_gdb_print_insn (bfd_vma memaddr, disassemble_info *info)
1907 {
1908 info->symbols = NULL;
1909 return default_print_insn (memaddr, info);
1910 }
1911
1912 /* AArch64 BRK software debug mode instruction.
1913 Note that AArch64 code is always little-endian.
1914 1101.0100.0010.0000.0000.0000.0000.0000 = 0xd4200000. */
1915 constexpr gdb_byte aarch64_default_breakpoint[] = {0x00, 0x00, 0x20, 0xd4};
1916
1917 typedef BP_MANIPULATION (aarch64_default_breakpoint) aarch64_breakpoint;
1918
1919 /* Extract from an array REGS containing the (raw) register state a
1920 function return value of type TYPE, and copy that, in virtual
1921 format, into VALBUF. */
1922
1923 static void
1924 aarch64_extract_return_value (struct type *type, struct regcache *regs,
1925 gdb_byte *valbuf)
1926 {
1927 struct gdbarch *gdbarch = regs->arch ();
1928 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1929 int elements;
1930 struct type *fundamental_type;
1931
1932 if (aapcs_is_vfp_call_or_return_candidate (type, &elements,
1933 &fundamental_type))
1934 {
1935 int len = TYPE_LENGTH (fundamental_type);
1936
1937 for (int i = 0; i < elements; i++)
1938 {
1939 int regno = AARCH64_V0_REGNUM + i;
1940 bfd_byte buf[V_REGISTER_SIZE];
1941
1942 if (aarch64_debug)
1943 {
1944 debug_printf ("read HFA or HVA return value element %d from %s\n",
1945 i + 1,
1946 gdbarch_register_name (gdbarch, regno));
1947 }
1948 regs->cooked_read (regno, buf);
1949
1950 memcpy (valbuf, buf, len);
1951 valbuf += len;
1952 }
1953 }
1954 else if (TYPE_CODE (type) == TYPE_CODE_INT
1955 || TYPE_CODE (type) == TYPE_CODE_CHAR
1956 || TYPE_CODE (type) == TYPE_CODE_BOOL
1957 || TYPE_CODE (type) == TYPE_CODE_PTR
1958 || TYPE_IS_REFERENCE (type)
1959 || TYPE_CODE (type) == TYPE_CODE_ENUM)
1960 {
1961 /* If the the type is a plain integer, then the access is
1962 straight-forward. Otherwise we have to play around a bit
1963 more. */
1964 int len = TYPE_LENGTH (type);
1965 int regno = AARCH64_X0_REGNUM;
1966 ULONGEST tmp;
1967
1968 while (len > 0)
1969 {
1970 /* By using store_unsigned_integer we avoid having to do
1971 anything special for small big-endian values. */
1972 regcache_cooked_read_unsigned (regs, regno++, &tmp);
1973 store_unsigned_integer (valbuf,
1974 (len > X_REGISTER_SIZE
1975 ? X_REGISTER_SIZE : len), byte_order, tmp);
1976 len -= X_REGISTER_SIZE;
1977 valbuf += X_REGISTER_SIZE;
1978 }
1979 }
1980 else
1981 {
1982 /* For a structure or union the behaviour is as if the value had
1983 been stored to word-aligned memory and then loaded into
1984 registers with 64-bit load instruction(s). */
1985 int len = TYPE_LENGTH (type);
1986 int regno = AARCH64_X0_REGNUM;
1987 bfd_byte buf[X_REGISTER_SIZE];
1988
1989 while (len > 0)
1990 {
1991 regs->cooked_read (regno++, buf);
1992 memcpy (valbuf, buf, len > X_REGISTER_SIZE ? X_REGISTER_SIZE : len);
1993 len -= X_REGISTER_SIZE;
1994 valbuf += X_REGISTER_SIZE;
1995 }
1996 }
1997 }
1998
1999
2000 /* Will a function return an aggregate type in memory or in a
2001 register? Return 0 if an aggregate type can be returned in a
2002 register, 1 if it must be returned in memory. */
2003
2004 static int
2005 aarch64_return_in_memory (struct gdbarch *gdbarch, struct type *type)
2006 {
2007 type = check_typedef (type);
2008 int elements;
2009 struct type *fundamental_type;
2010
2011 if (aapcs_is_vfp_call_or_return_candidate (type, &elements,
2012 &fundamental_type))
2013 {
2014 /* v0-v7 are used to return values and one register is allocated
2015 for one member. However, HFA or HVA has at most four members. */
2016 return 0;
2017 }
2018
2019 if (TYPE_LENGTH (type) > 16)
2020 {
2021 /* PCS B.6 Aggregates larger than 16 bytes are passed by
2022 invisible reference. */
2023
2024 return 1;
2025 }
2026
2027 return 0;
2028 }
2029
2030 /* Write into appropriate registers a function return value of type
2031 TYPE, given in virtual format. */
2032
2033 static void
2034 aarch64_store_return_value (struct type *type, struct regcache *regs,
2035 const gdb_byte *valbuf)
2036 {
2037 struct gdbarch *gdbarch = regs->arch ();
2038 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
2039 int elements;
2040 struct type *fundamental_type;
2041
2042 if (aapcs_is_vfp_call_or_return_candidate (type, &elements,
2043 &fundamental_type))
2044 {
2045 int len = TYPE_LENGTH (fundamental_type);
2046
2047 for (int i = 0; i < elements; i++)
2048 {
2049 int regno = AARCH64_V0_REGNUM + i;
2050 bfd_byte tmpbuf[V_REGISTER_SIZE];
2051
2052 if (aarch64_debug)
2053 {
2054 debug_printf ("write HFA or HVA return value element %d to %s\n",
2055 i + 1,
2056 gdbarch_register_name (gdbarch, regno));
2057 }
2058
2059 memcpy (tmpbuf, valbuf,
2060 len > V_REGISTER_SIZE ? V_REGISTER_SIZE : len);
2061 regs->cooked_write (regno, tmpbuf);
2062 valbuf += len;
2063 }
2064 }
2065 else if (TYPE_CODE (type) == TYPE_CODE_INT
2066 || TYPE_CODE (type) == TYPE_CODE_CHAR
2067 || TYPE_CODE (type) == TYPE_CODE_BOOL
2068 || TYPE_CODE (type) == TYPE_CODE_PTR
2069 || TYPE_IS_REFERENCE (type)
2070 || TYPE_CODE (type) == TYPE_CODE_ENUM)
2071 {
2072 if (TYPE_LENGTH (type) <= X_REGISTER_SIZE)
2073 {
2074 /* Values of one word or less are zero/sign-extended and
2075 returned in r0. */
2076 bfd_byte tmpbuf[X_REGISTER_SIZE];
2077 LONGEST val = unpack_long (type, valbuf);
2078
2079 store_signed_integer (tmpbuf, X_REGISTER_SIZE, byte_order, val);
2080 regs->cooked_write (AARCH64_X0_REGNUM, tmpbuf);
2081 }
2082 else
2083 {
2084 /* Integral values greater than one word are stored in
2085 consecutive registers starting with r0. This will always
2086 be a multiple of the regiser size. */
2087 int len = TYPE_LENGTH (type);
2088 int regno = AARCH64_X0_REGNUM;
2089
2090 while (len > 0)
2091 {
2092 regs->cooked_write (regno++, valbuf);
2093 len -= X_REGISTER_SIZE;
2094 valbuf += X_REGISTER_SIZE;
2095 }
2096 }
2097 }
2098 else
2099 {
2100 /* For a structure or union the behaviour is as if the value had
2101 been stored to word-aligned memory and then loaded into
2102 registers with 64-bit load instruction(s). */
2103 int len = TYPE_LENGTH (type);
2104 int regno = AARCH64_X0_REGNUM;
2105 bfd_byte tmpbuf[X_REGISTER_SIZE];
2106
2107 while (len > 0)
2108 {
2109 memcpy (tmpbuf, valbuf,
2110 len > X_REGISTER_SIZE ? X_REGISTER_SIZE : len);
2111 regs->cooked_write (regno++, tmpbuf);
2112 len -= X_REGISTER_SIZE;
2113 valbuf += X_REGISTER_SIZE;
2114 }
2115 }
2116 }
2117
2118 /* Implement the "return_value" gdbarch method. */
2119
2120 static enum return_value_convention
2121 aarch64_return_value (struct gdbarch *gdbarch, struct value *func_value,
2122 struct type *valtype, struct regcache *regcache,
2123 gdb_byte *readbuf, const gdb_byte *writebuf)
2124 {
2125
2126 if (TYPE_CODE (valtype) == TYPE_CODE_STRUCT
2127 || TYPE_CODE (valtype) == TYPE_CODE_UNION
2128 || TYPE_CODE (valtype) == TYPE_CODE_ARRAY)
2129 {
2130 if (aarch64_return_in_memory (gdbarch, valtype))
2131 {
2132 if (aarch64_debug)
2133 debug_printf ("return value in memory\n");
2134 return RETURN_VALUE_STRUCT_CONVENTION;
2135 }
2136 }
2137
2138 if (writebuf)
2139 aarch64_store_return_value (valtype, regcache, writebuf);
2140
2141 if (readbuf)
2142 aarch64_extract_return_value (valtype, regcache, readbuf);
2143
2144 if (aarch64_debug)
2145 debug_printf ("return value in registers\n");
2146
2147 return RETURN_VALUE_REGISTER_CONVENTION;
2148 }
2149
2150 /* Implement the "get_longjmp_target" gdbarch method. */
2151
2152 static int
2153 aarch64_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
2154 {
2155 CORE_ADDR jb_addr;
2156 gdb_byte buf[X_REGISTER_SIZE];
2157 struct gdbarch *gdbarch = get_frame_arch (frame);
2158 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2159 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
2160
2161 jb_addr = get_frame_register_unsigned (frame, AARCH64_X0_REGNUM);
2162
2163 if (target_read_memory (jb_addr + tdep->jb_pc * tdep->jb_elt_size, buf,
2164 X_REGISTER_SIZE))
2165 return 0;
2166
2167 *pc = extract_unsigned_integer (buf, X_REGISTER_SIZE, byte_order);
2168 return 1;
2169 }
2170
2171 /* Implement the "gen_return_address" gdbarch method. */
2172
2173 static void
2174 aarch64_gen_return_address (struct gdbarch *gdbarch,
2175 struct agent_expr *ax, struct axs_value *value,
2176 CORE_ADDR scope)
2177 {
2178 value->type = register_type (gdbarch, AARCH64_LR_REGNUM);
2179 value->kind = axs_lvalue_register;
2180 value->u.reg = AARCH64_LR_REGNUM;
2181 }
2182 \f
2183
2184 /* Return the pseudo register name corresponding to register regnum. */
2185
2186 static const char *
2187 aarch64_pseudo_register_name (struct gdbarch *gdbarch, int regnum)
2188 {
2189 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2190
2191 static const char *const q_name[] =
2192 {
2193 "q0", "q1", "q2", "q3",
2194 "q4", "q5", "q6", "q7",
2195 "q8", "q9", "q10", "q11",
2196 "q12", "q13", "q14", "q15",
2197 "q16", "q17", "q18", "q19",
2198 "q20", "q21", "q22", "q23",
2199 "q24", "q25", "q26", "q27",
2200 "q28", "q29", "q30", "q31",
2201 };
2202
2203 static const char *const d_name[] =
2204 {
2205 "d0", "d1", "d2", "d3",
2206 "d4", "d5", "d6", "d7",
2207 "d8", "d9", "d10", "d11",
2208 "d12", "d13", "d14", "d15",
2209 "d16", "d17", "d18", "d19",
2210 "d20", "d21", "d22", "d23",
2211 "d24", "d25", "d26", "d27",
2212 "d28", "d29", "d30", "d31",
2213 };
2214
2215 static const char *const s_name[] =
2216 {
2217 "s0", "s1", "s2", "s3",
2218 "s4", "s5", "s6", "s7",
2219 "s8", "s9", "s10", "s11",
2220 "s12", "s13", "s14", "s15",
2221 "s16", "s17", "s18", "s19",
2222 "s20", "s21", "s22", "s23",
2223 "s24", "s25", "s26", "s27",
2224 "s28", "s29", "s30", "s31",
2225 };
2226
2227 static const char *const h_name[] =
2228 {
2229 "h0", "h1", "h2", "h3",
2230 "h4", "h5", "h6", "h7",
2231 "h8", "h9", "h10", "h11",
2232 "h12", "h13", "h14", "h15",
2233 "h16", "h17", "h18", "h19",
2234 "h20", "h21", "h22", "h23",
2235 "h24", "h25", "h26", "h27",
2236 "h28", "h29", "h30", "h31",
2237 };
2238
2239 static const char *const b_name[] =
2240 {
2241 "b0", "b1", "b2", "b3",
2242 "b4", "b5", "b6", "b7",
2243 "b8", "b9", "b10", "b11",
2244 "b12", "b13", "b14", "b15",
2245 "b16", "b17", "b18", "b19",
2246 "b20", "b21", "b22", "b23",
2247 "b24", "b25", "b26", "b27",
2248 "b28", "b29", "b30", "b31",
2249 };
2250
2251 regnum -= gdbarch_num_regs (gdbarch);
2252
2253 if (regnum >= AARCH64_Q0_REGNUM && regnum < AARCH64_Q0_REGNUM + 32)
2254 return q_name[regnum - AARCH64_Q0_REGNUM];
2255
2256 if (regnum >= AARCH64_D0_REGNUM && regnum < AARCH64_D0_REGNUM + 32)
2257 return d_name[regnum - AARCH64_D0_REGNUM];
2258
2259 if (regnum >= AARCH64_S0_REGNUM && regnum < AARCH64_S0_REGNUM + 32)
2260 return s_name[regnum - AARCH64_S0_REGNUM];
2261
2262 if (regnum >= AARCH64_H0_REGNUM && regnum < AARCH64_H0_REGNUM + 32)
2263 return h_name[regnum - AARCH64_H0_REGNUM];
2264
2265 if (regnum >= AARCH64_B0_REGNUM && regnum < AARCH64_B0_REGNUM + 32)
2266 return b_name[regnum - AARCH64_B0_REGNUM];
2267
2268 if (tdep->has_sve ())
2269 {
2270 static const char *const sve_v_name[] =
2271 {
2272 "v0", "v1", "v2", "v3",
2273 "v4", "v5", "v6", "v7",
2274 "v8", "v9", "v10", "v11",
2275 "v12", "v13", "v14", "v15",
2276 "v16", "v17", "v18", "v19",
2277 "v20", "v21", "v22", "v23",
2278 "v24", "v25", "v26", "v27",
2279 "v28", "v29", "v30", "v31",
2280 };
2281
2282 if (regnum >= AARCH64_SVE_V0_REGNUM
2283 && regnum < AARCH64_SVE_V0_REGNUM + AARCH64_V_REGS_NUM)
2284 return sve_v_name[regnum - AARCH64_SVE_V0_REGNUM];
2285 }
2286
2287 internal_error (__FILE__, __LINE__,
2288 _("aarch64_pseudo_register_name: bad register number %d"),
2289 regnum);
2290 }
2291
2292 /* Implement the "pseudo_register_type" tdesc_arch_data method. */
2293
2294 static struct type *
2295 aarch64_pseudo_register_type (struct gdbarch *gdbarch, int regnum)
2296 {
2297 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2298
2299 regnum -= gdbarch_num_regs (gdbarch);
2300
2301 if (regnum >= AARCH64_Q0_REGNUM && regnum < AARCH64_Q0_REGNUM + 32)
2302 return aarch64_vnq_type (gdbarch);
2303
2304 if (regnum >= AARCH64_D0_REGNUM && regnum < AARCH64_D0_REGNUM + 32)
2305 return aarch64_vnd_type (gdbarch);
2306
2307 if (regnum >= AARCH64_S0_REGNUM && regnum < AARCH64_S0_REGNUM + 32)
2308 return aarch64_vns_type (gdbarch);
2309
2310 if (regnum >= AARCH64_H0_REGNUM && regnum < AARCH64_H0_REGNUM + 32)
2311 return aarch64_vnh_type (gdbarch);
2312
2313 if (regnum >= AARCH64_B0_REGNUM && regnum < AARCH64_B0_REGNUM + 32)
2314 return aarch64_vnb_type (gdbarch);
2315
2316 if (tdep->has_sve () && regnum >= AARCH64_SVE_V0_REGNUM
2317 && regnum < AARCH64_SVE_V0_REGNUM + AARCH64_V_REGS_NUM)
2318 return aarch64_vnv_type (gdbarch);
2319
2320 internal_error (__FILE__, __LINE__,
2321 _("aarch64_pseudo_register_type: bad register number %d"),
2322 regnum);
2323 }
2324
2325 /* Implement the "pseudo_register_reggroup_p" tdesc_arch_data method. */
2326
2327 static int
2328 aarch64_pseudo_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
2329 struct reggroup *group)
2330 {
2331 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2332
2333 regnum -= gdbarch_num_regs (gdbarch);
2334
2335 if (regnum >= AARCH64_Q0_REGNUM && regnum < AARCH64_Q0_REGNUM + 32)
2336 return group == all_reggroup || group == vector_reggroup;
2337 else if (regnum >= AARCH64_D0_REGNUM && regnum < AARCH64_D0_REGNUM + 32)
2338 return (group == all_reggroup || group == vector_reggroup
2339 || group == float_reggroup);
2340 else if (regnum >= AARCH64_S0_REGNUM && regnum < AARCH64_S0_REGNUM + 32)
2341 return (group == all_reggroup || group == vector_reggroup
2342 || group == float_reggroup);
2343 else if (regnum >= AARCH64_H0_REGNUM && regnum < AARCH64_H0_REGNUM + 32)
2344 return group == all_reggroup || group == vector_reggroup;
2345 else if (regnum >= AARCH64_B0_REGNUM && regnum < AARCH64_B0_REGNUM + 32)
2346 return group == all_reggroup || group == vector_reggroup;
2347 else if (tdep->has_sve () && regnum >= AARCH64_SVE_V0_REGNUM
2348 && regnum < AARCH64_SVE_V0_REGNUM + AARCH64_V_REGS_NUM)
2349 return group == all_reggroup || group == vector_reggroup;
2350
2351 return group == all_reggroup;
2352 }
2353
2354 /* Helper for aarch64_pseudo_read_value. */
2355
2356 static struct value *
2357 aarch64_pseudo_read_value_1 (struct gdbarch *gdbarch,
2358 readable_regcache *regcache, int regnum_offset,
2359 int regsize, struct value *result_value)
2360 {
2361 unsigned v_regnum = AARCH64_V0_REGNUM + regnum_offset;
2362
2363 /* Enough space for a full vector register. */
2364 gdb_byte reg_buf[register_size (gdbarch, AARCH64_V0_REGNUM)];
2365 gdb_static_assert (AARCH64_V0_REGNUM == AARCH64_SVE_Z0_REGNUM);
2366
2367 if (regcache->raw_read (v_regnum, reg_buf) != REG_VALID)
2368 mark_value_bytes_unavailable (result_value, 0,
2369 TYPE_LENGTH (value_type (result_value)));
2370 else
2371 memcpy (value_contents_raw (result_value), reg_buf, regsize);
2372
2373 return result_value;
2374 }
2375
2376 /* Implement the "pseudo_register_read_value" gdbarch method. */
2377
2378 static struct value *
2379 aarch64_pseudo_read_value (struct gdbarch *gdbarch, readable_regcache *regcache,
2380 int regnum)
2381 {
2382 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2383 struct value *result_value = allocate_value (register_type (gdbarch, regnum));
2384
2385 VALUE_LVAL (result_value) = lval_register;
2386 VALUE_REGNUM (result_value) = regnum;
2387
2388 regnum -= gdbarch_num_regs (gdbarch);
2389
2390 if (regnum >= AARCH64_Q0_REGNUM && regnum < AARCH64_Q0_REGNUM + 32)
2391 return aarch64_pseudo_read_value_1 (gdbarch, regcache,
2392 regnum - AARCH64_Q0_REGNUM,
2393 Q_REGISTER_SIZE, result_value);
2394
2395 if (regnum >= AARCH64_D0_REGNUM && regnum < AARCH64_D0_REGNUM + 32)
2396 return aarch64_pseudo_read_value_1 (gdbarch, regcache,
2397 regnum - AARCH64_D0_REGNUM,
2398 D_REGISTER_SIZE, result_value);
2399
2400 if (regnum >= AARCH64_S0_REGNUM && regnum < AARCH64_S0_REGNUM + 32)
2401 return aarch64_pseudo_read_value_1 (gdbarch, regcache,
2402 regnum - AARCH64_S0_REGNUM,
2403 S_REGISTER_SIZE, result_value);
2404
2405 if (regnum >= AARCH64_H0_REGNUM && regnum < AARCH64_H0_REGNUM + 32)
2406 return aarch64_pseudo_read_value_1 (gdbarch, regcache,
2407 regnum - AARCH64_H0_REGNUM,
2408 H_REGISTER_SIZE, result_value);
2409
2410 if (regnum >= AARCH64_B0_REGNUM && regnum < AARCH64_B0_REGNUM + 32)
2411 return aarch64_pseudo_read_value_1 (gdbarch, regcache,
2412 regnum - AARCH64_B0_REGNUM,
2413 B_REGISTER_SIZE, result_value);
2414
2415 if (tdep->has_sve () && regnum >= AARCH64_SVE_V0_REGNUM
2416 && regnum < AARCH64_SVE_V0_REGNUM + 32)
2417 return aarch64_pseudo_read_value_1 (gdbarch, regcache,
2418 regnum - AARCH64_SVE_V0_REGNUM,
2419 V_REGISTER_SIZE, result_value);
2420
2421 gdb_assert_not_reached ("regnum out of bound");
2422 }
2423
2424 /* Helper for aarch64_pseudo_write. */
2425
2426 static void
2427 aarch64_pseudo_write_1 (struct gdbarch *gdbarch, struct regcache *regcache,
2428 int regnum_offset, int regsize, const gdb_byte *buf)
2429 {
2430 unsigned v_regnum = AARCH64_V0_REGNUM + regnum_offset;
2431
2432 /* Enough space for a full vector register. */
2433 gdb_byte reg_buf[register_size (gdbarch, AARCH64_V0_REGNUM)];
2434 gdb_static_assert (AARCH64_V0_REGNUM == AARCH64_SVE_Z0_REGNUM);
2435
2436 /* Ensure the register buffer is zero, we want gdb writes of the
2437 various 'scalar' pseudo registers to behavior like architectural
2438 writes, register width bytes are written the remainder are set to
2439 zero. */
2440 memset (reg_buf, 0, register_size (gdbarch, AARCH64_V0_REGNUM));
2441
2442 memcpy (reg_buf, buf, regsize);
2443 regcache->raw_write (v_regnum, reg_buf);
2444 }
2445
2446 /* Implement the "pseudo_register_write" gdbarch method. */
2447
2448 static void
2449 aarch64_pseudo_write (struct gdbarch *gdbarch, struct regcache *regcache,
2450 int regnum, const gdb_byte *buf)
2451 {
2452 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
2453 regnum -= gdbarch_num_regs (gdbarch);
2454
2455 if (regnum >= AARCH64_Q0_REGNUM && regnum < AARCH64_Q0_REGNUM + 32)
2456 return aarch64_pseudo_write_1 (gdbarch, regcache,
2457 regnum - AARCH64_Q0_REGNUM, Q_REGISTER_SIZE,
2458 buf);
2459
2460 if (regnum >= AARCH64_D0_REGNUM && regnum < AARCH64_D0_REGNUM + 32)
2461 return aarch64_pseudo_write_1 (gdbarch, regcache,
2462 regnum - AARCH64_D0_REGNUM, D_REGISTER_SIZE,
2463 buf);
2464
2465 if (regnum >= AARCH64_S0_REGNUM && regnum < AARCH64_S0_REGNUM + 32)
2466 return aarch64_pseudo_write_1 (gdbarch, regcache,
2467 regnum - AARCH64_S0_REGNUM, S_REGISTER_SIZE,
2468 buf);
2469
2470 if (regnum >= AARCH64_H0_REGNUM && regnum < AARCH64_H0_REGNUM + 32)
2471 return aarch64_pseudo_write_1 (gdbarch, regcache,
2472 regnum - AARCH64_H0_REGNUM, H_REGISTER_SIZE,
2473 buf);
2474
2475 if (regnum >= AARCH64_B0_REGNUM && regnum < AARCH64_B0_REGNUM + 32)
2476 return aarch64_pseudo_write_1 (gdbarch, regcache,
2477 regnum - AARCH64_B0_REGNUM, B_REGISTER_SIZE,
2478 buf);
2479
2480 if (tdep->has_sve () && regnum >= AARCH64_SVE_V0_REGNUM
2481 && regnum < AARCH64_SVE_V0_REGNUM + 32)
2482 return aarch64_pseudo_write_1 (gdbarch, regcache,
2483 regnum - AARCH64_SVE_V0_REGNUM,
2484 V_REGISTER_SIZE, buf);
2485
2486 gdb_assert_not_reached ("regnum out of bound");
2487 }
2488
2489 /* Callback function for user_reg_add. */
2490
2491 static struct value *
2492 value_of_aarch64_user_reg (struct frame_info *frame, const void *baton)
2493 {
2494 const int *reg_p = (const int *) baton;
2495
2496 return value_of_register (*reg_p, frame);
2497 }
2498 \f
2499
2500 /* Implement the "software_single_step" gdbarch method, needed to
2501 single step through atomic sequences on AArch64. */
2502
2503 static std::vector<CORE_ADDR>
2504 aarch64_software_single_step (struct regcache *regcache)
2505 {
2506 struct gdbarch *gdbarch = regcache->arch ();
2507 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
2508 const int insn_size = 4;
2509 const int atomic_sequence_length = 16; /* Instruction sequence length. */
2510 CORE_ADDR pc = regcache_read_pc (regcache);
2511 CORE_ADDR breaks[2] = { CORE_ADDR_MAX, CORE_ADDR_MAX };
2512 CORE_ADDR loc = pc;
2513 CORE_ADDR closing_insn = 0;
2514 uint32_t insn = read_memory_unsigned_integer (loc, insn_size,
2515 byte_order_for_code);
2516 int index;
2517 int insn_count;
2518 int bc_insn_count = 0; /* Conditional branch instruction count. */
2519 int last_breakpoint = 0; /* Defaults to 0 (no breakpoints placed). */
2520 aarch64_inst inst;
2521
2522 if (aarch64_decode_insn (insn, &inst, 1, NULL) != 0)
2523 return {};
2524
2525 /* Look for a Load Exclusive instruction which begins the sequence. */
2526 if (inst.opcode->iclass != ldstexcl || bit (insn, 22) == 0)
2527 return {};
2528
2529 for (insn_count = 0; insn_count < atomic_sequence_length; ++insn_count)
2530 {
2531 loc += insn_size;
2532 insn = read_memory_unsigned_integer (loc, insn_size,
2533 byte_order_for_code);
2534
2535 if (aarch64_decode_insn (insn, &inst, 1, NULL) != 0)
2536 return {};
2537 /* Check if the instruction is a conditional branch. */
2538 if (inst.opcode->iclass == condbranch)
2539 {
2540 gdb_assert (inst.operands[0].type == AARCH64_OPND_ADDR_PCREL19);
2541
2542 if (bc_insn_count >= 1)
2543 return {};
2544
2545 /* It is, so we'll try to set a breakpoint at the destination. */
2546 breaks[1] = loc + inst.operands[0].imm.value;
2547
2548 bc_insn_count++;
2549 last_breakpoint++;
2550 }
2551
2552 /* Look for the Store Exclusive which closes the atomic sequence. */
2553 if (inst.opcode->iclass == ldstexcl && bit (insn, 22) == 0)
2554 {
2555 closing_insn = loc;
2556 break;
2557 }
2558 }
2559
2560 /* We didn't find a closing Store Exclusive instruction, fall back. */
2561 if (!closing_insn)
2562 return {};
2563
2564 /* Insert breakpoint after the end of the atomic sequence. */
2565 breaks[0] = loc + insn_size;
2566
2567 /* Check for duplicated breakpoints, and also check that the second
2568 breakpoint is not within the atomic sequence. */
2569 if (last_breakpoint
2570 && (breaks[1] == breaks[0]
2571 || (breaks[1] >= pc && breaks[1] <= closing_insn)))
2572 last_breakpoint = 0;
2573
2574 std::vector<CORE_ADDR> next_pcs;
2575
2576 /* Insert the breakpoint at the end of the sequence, and one at the
2577 destination of the conditional branch, if it exists. */
2578 for (index = 0; index <= last_breakpoint; index++)
2579 next_pcs.push_back (breaks[index]);
2580
2581 return next_pcs;
2582 }
2583
2584 struct aarch64_displaced_step_closure : public displaced_step_closure
2585 {
2586 /* It is true when condition instruction, such as B.CON, TBZ, etc,
2587 is being displaced stepping. */
2588 int cond = 0;
2589
2590 /* PC adjustment offset after displaced stepping. */
2591 int32_t pc_adjust = 0;
2592 };
2593
2594 /* Data when visiting instructions for displaced stepping. */
2595
2596 struct aarch64_displaced_step_data
2597 {
2598 struct aarch64_insn_data base;
2599
2600 /* The address where the instruction will be executed at. */
2601 CORE_ADDR new_addr;
2602 /* Buffer of instructions to be copied to NEW_ADDR to execute. */
2603 uint32_t insn_buf[DISPLACED_MODIFIED_INSNS];
2604 /* Number of instructions in INSN_BUF. */
2605 unsigned insn_count;
2606 /* Registers when doing displaced stepping. */
2607 struct regcache *regs;
2608
2609 aarch64_displaced_step_closure *dsc;
2610 };
2611
2612 /* Implementation of aarch64_insn_visitor method "b". */
2613
2614 static void
2615 aarch64_displaced_step_b (const int is_bl, const int32_t offset,
2616 struct aarch64_insn_data *data)
2617 {
2618 struct aarch64_displaced_step_data *dsd
2619 = (struct aarch64_displaced_step_data *) data;
2620 int64_t new_offset = data->insn_addr - dsd->new_addr + offset;
2621
2622 if (can_encode_int32 (new_offset, 28))
2623 {
2624 /* Emit B rather than BL, because executing BL on a new address
2625 will get the wrong address into LR. In order to avoid this,
2626 we emit B, and update LR if the instruction is BL. */
2627 emit_b (dsd->insn_buf, 0, new_offset);
2628 dsd->insn_count++;
2629 }
2630 else
2631 {
2632 /* Write NOP. */
2633 emit_nop (dsd->insn_buf);
2634 dsd->insn_count++;
2635 dsd->dsc->pc_adjust = offset;
2636 }
2637
2638 if (is_bl)
2639 {
2640 /* Update LR. */
2641 regcache_cooked_write_unsigned (dsd->regs, AARCH64_LR_REGNUM,
2642 data->insn_addr + 4);
2643 }
2644 }
2645
2646 /* Implementation of aarch64_insn_visitor method "b_cond". */
2647
2648 static void
2649 aarch64_displaced_step_b_cond (const unsigned cond, const int32_t offset,
2650 struct aarch64_insn_data *data)
2651 {
2652 struct aarch64_displaced_step_data *dsd
2653 = (struct aarch64_displaced_step_data *) data;
2654
2655 /* GDB has to fix up PC after displaced step this instruction
2656 differently according to the condition is true or false. Instead
2657 of checking COND against conditional flags, we can use
2658 the following instructions, and GDB can tell how to fix up PC
2659 according to the PC value.
2660
2661 B.COND TAKEN ; If cond is true, then jump to TAKEN.
2662 INSN1 ;
2663 TAKEN:
2664 INSN2
2665 */
2666
2667 emit_bcond (dsd->insn_buf, cond, 8);
2668 dsd->dsc->cond = 1;
2669 dsd->dsc->pc_adjust = offset;
2670 dsd->insn_count = 1;
2671 }
2672
2673 /* Dynamically allocate a new register. If we know the register
2674 statically, we should make it a global as above instead of using this
2675 helper function. */
2676
2677 static struct aarch64_register
2678 aarch64_register (unsigned num, int is64)
2679 {
2680 return (struct aarch64_register) { num, is64 };
2681 }
2682
2683 /* Implementation of aarch64_insn_visitor method "cb". */
2684
2685 static void
2686 aarch64_displaced_step_cb (const int32_t offset, const int is_cbnz,
2687 const unsigned rn, int is64,
2688 struct aarch64_insn_data *data)
2689 {
2690 struct aarch64_displaced_step_data *dsd
2691 = (struct aarch64_displaced_step_data *) data;
2692
2693 /* The offset is out of range for a compare and branch
2694 instruction. We can use the following instructions instead:
2695
2696 CBZ xn, TAKEN ; xn == 0, then jump to TAKEN.
2697 INSN1 ;
2698 TAKEN:
2699 INSN2
2700 */
2701 emit_cb (dsd->insn_buf, is_cbnz, aarch64_register (rn, is64), 8);
2702 dsd->insn_count = 1;
2703 dsd->dsc->cond = 1;
2704 dsd->dsc->pc_adjust = offset;
2705 }
2706
2707 /* Implementation of aarch64_insn_visitor method "tb". */
2708
2709 static void
2710 aarch64_displaced_step_tb (const int32_t offset, int is_tbnz,
2711 const unsigned rt, unsigned bit,
2712 struct aarch64_insn_data *data)
2713 {
2714 struct aarch64_displaced_step_data *dsd
2715 = (struct aarch64_displaced_step_data *) data;
2716
2717 /* The offset is out of range for a test bit and branch
2718 instruction We can use the following instructions instead:
2719
2720 TBZ xn, #bit, TAKEN ; xn[bit] == 0, then jump to TAKEN.
2721 INSN1 ;
2722 TAKEN:
2723 INSN2
2724
2725 */
2726 emit_tb (dsd->insn_buf, is_tbnz, bit, aarch64_register (rt, 1), 8);
2727 dsd->insn_count = 1;
2728 dsd->dsc->cond = 1;
2729 dsd->dsc->pc_adjust = offset;
2730 }
2731
2732 /* Implementation of aarch64_insn_visitor method "adr". */
2733
2734 static void
2735 aarch64_displaced_step_adr (const int32_t offset, const unsigned rd,
2736 const int is_adrp, struct aarch64_insn_data *data)
2737 {
2738 struct aarch64_displaced_step_data *dsd
2739 = (struct aarch64_displaced_step_data *) data;
2740 /* We know exactly the address the ADR{P,} instruction will compute.
2741 We can just write it to the destination register. */
2742 CORE_ADDR address = data->insn_addr + offset;
2743
2744 if (is_adrp)
2745 {
2746 /* Clear the lower 12 bits of the offset to get the 4K page. */
2747 regcache_cooked_write_unsigned (dsd->regs, AARCH64_X0_REGNUM + rd,
2748 address & ~0xfff);
2749 }
2750 else
2751 regcache_cooked_write_unsigned (dsd->regs, AARCH64_X0_REGNUM + rd,
2752 address);
2753
2754 dsd->dsc->pc_adjust = 4;
2755 emit_nop (dsd->insn_buf);
2756 dsd->insn_count = 1;
2757 }
2758
2759 /* Implementation of aarch64_insn_visitor method "ldr_literal". */
2760
2761 static void
2762 aarch64_displaced_step_ldr_literal (const int32_t offset, const int is_sw,
2763 const unsigned rt, const int is64,
2764 struct aarch64_insn_data *data)
2765 {
2766 struct aarch64_displaced_step_data *dsd
2767 = (struct aarch64_displaced_step_data *) data;
2768 CORE_ADDR address = data->insn_addr + offset;
2769 struct aarch64_memory_operand zero = { MEMORY_OPERAND_OFFSET, 0 };
2770
2771 regcache_cooked_write_unsigned (dsd->regs, AARCH64_X0_REGNUM + rt,
2772 address);
2773
2774 if (is_sw)
2775 dsd->insn_count = emit_ldrsw (dsd->insn_buf, aarch64_register (rt, 1),
2776 aarch64_register (rt, 1), zero);
2777 else
2778 dsd->insn_count = emit_ldr (dsd->insn_buf, aarch64_register (rt, is64),
2779 aarch64_register (rt, 1), zero);
2780
2781 dsd->dsc->pc_adjust = 4;
2782 }
2783
2784 /* Implementation of aarch64_insn_visitor method "others". */
2785
2786 static void
2787 aarch64_displaced_step_others (const uint32_t insn,
2788 struct aarch64_insn_data *data)
2789 {
2790 struct aarch64_displaced_step_data *dsd
2791 = (struct aarch64_displaced_step_data *) data;
2792
2793 aarch64_emit_insn (dsd->insn_buf, insn);
2794 dsd->insn_count = 1;
2795
2796 if ((insn & 0xfffffc1f) == 0xd65f0000)
2797 {
2798 /* RET */
2799 dsd->dsc->pc_adjust = 0;
2800 }
2801 else
2802 dsd->dsc->pc_adjust = 4;
2803 }
2804
2805 static const struct aarch64_insn_visitor visitor =
2806 {
2807 aarch64_displaced_step_b,
2808 aarch64_displaced_step_b_cond,
2809 aarch64_displaced_step_cb,
2810 aarch64_displaced_step_tb,
2811 aarch64_displaced_step_adr,
2812 aarch64_displaced_step_ldr_literal,
2813 aarch64_displaced_step_others,
2814 };
2815
2816 /* Implement the "displaced_step_copy_insn" gdbarch method. */
2817
2818 struct displaced_step_closure *
2819 aarch64_displaced_step_copy_insn (struct gdbarch *gdbarch,
2820 CORE_ADDR from, CORE_ADDR to,
2821 struct regcache *regs)
2822 {
2823 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
2824 uint32_t insn = read_memory_unsigned_integer (from, 4, byte_order_for_code);
2825 struct aarch64_displaced_step_data dsd;
2826 aarch64_inst inst;
2827
2828 if (aarch64_decode_insn (insn, &inst, 1, NULL) != 0)
2829 return NULL;
2830
2831 /* Look for a Load Exclusive instruction which begins the sequence. */
2832 if (inst.opcode->iclass == ldstexcl && bit (insn, 22))
2833 {
2834 /* We can't displaced step atomic sequences. */
2835 return NULL;
2836 }
2837
2838 std::unique_ptr<aarch64_displaced_step_closure> dsc
2839 (new aarch64_displaced_step_closure);
2840 dsd.base.insn_addr = from;
2841 dsd.new_addr = to;
2842 dsd.regs = regs;
2843 dsd.dsc = dsc.get ();
2844 dsd.insn_count = 0;
2845 aarch64_relocate_instruction (insn, &visitor,
2846 (struct aarch64_insn_data *) &dsd);
2847 gdb_assert (dsd.insn_count <= DISPLACED_MODIFIED_INSNS);
2848
2849 if (dsd.insn_count != 0)
2850 {
2851 int i;
2852
2853 /* Instruction can be relocated to scratch pad. Copy
2854 relocated instruction(s) there. */
2855 for (i = 0; i < dsd.insn_count; i++)
2856 {
2857 if (debug_displaced)
2858 {
2859 debug_printf ("displaced: writing insn ");
2860 debug_printf ("%.8x", dsd.insn_buf[i]);
2861 debug_printf (" at %s\n", paddress (gdbarch, to + i * 4));
2862 }
2863 write_memory_unsigned_integer (to + i * 4, 4, byte_order_for_code,
2864 (ULONGEST) dsd.insn_buf[i]);
2865 }
2866 }
2867 else
2868 {
2869 dsc = NULL;
2870 }
2871
2872 return dsc.release ();
2873 }
2874
2875 /* Implement the "displaced_step_fixup" gdbarch method. */
2876
2877 void
2878 aarch64_displaced_step_fixup (struct gdbarch *gdbarch,
2879 struct displaced_step_closure *dsc_,
2880 CORE_ADDR from, CORE_ADDR to,
2881 struct regcache *regs)
2882 {
2883 aarch64_displaced_step_closure *dsc = (aarch64_displaced_step_closure *) dsc_;
2884
2885 if (dsc->cond)
2886 {
2887 ULONGEST pc;
2888
2889 regcache_cooked_read_unsigned (regs, AARCH64_PC_REGNUM, &pc);
2890 if (pc - to == 8)
2891 {
2892 /* Condition is true. */
2893 }
2894 else if (pc - to == 4)
2895 {
2896 /* Condition is false. */
2897 dsc->pc_adjust = 4;
2898 }
2899 else
2900 gdb_assert_not_reached ("Unexpected PC value after displaced stepping");
2901 }
2902
2903 if (dsc->pc_adjust != 0)
2904 {
2905 if (debug_displaced)
2906 {
2907 debug_printf ("displaced: fixup: set PC to %s:%d\n",
2908 paddress (gdbarch, from), dsc->pc_adjust);
2909 }
2910 regcache_cooked_write_unsigned (regs, AARCH64_PC_REGNUM,
2911 from + dsc->pc_adjust);
2912 }
2913 }
2914
2915 /* Implement the "displaced_step_hw_singlestep" gdbarch method. */
2916
2917 int
2918 aarch64_displaced_step_hw_singlestep (struct gdbarch *gdbarch,
2919 struct displaced_step_closure *closure)
2920 {
2921 return 1;
2922 }
2923
2924 /* Get the correct target description for the given VQ value.
2925 If VQ is zero then it is assumed SVE is not supported.
2926 (It is not possible to set VQ to zero on an SVE system). */
2927
2928 const target_desc *
2929 aarch64_read_description (uint64_t vq)
2930 {
2931 if (vq > AARCH64_MAX_SVE_VQ)
2932 error (_("VQ is %" PRIu64 ", maximum supported value is %d"), vq,
2933 AARCH64_MAX_SVE_VQ);
2934
2935 struct target_desc *tdesc = tdesc_aarch64_list[vq];
2936
2937 if (tdesc == NULL)
2938 {
2939 tdesc = aarch64_create_target_description (vq);
2940 tdesc_aarch64_list[vq] = tdesc;
2941 }
2942
2943 return tdesc;
2944 }
2945
2946 /* Return the VQ used when creating the target description TDESC. */
2947
2948 static uint64_t
2949 aarch64_get_tdesc_vq (const struct target_desc *tdesc)
2950 {
2951 const struct tdesc_feature *feature_sve;
2952
2953 if (!tdesc_has_registers (tdesc))
2954 return 0;
2955
2956 feature_sve = tdesc_find_feature (tdesc, "org.gnu.gdb.aarch64.sve");
2957
2958 if (feature_sve == nullptr)
2959 return 0;
2960
2961 uint64_t vl = tdesc_register_bitsize (feature_sve,
2962 aarch64_sve_register_names[0]) / 8;
2963 return sve_vq_from_vl (vl);
2964 }
2965
2966
2967 /* Initialize the current architecture based on INFO. If possible,
2968 re-use an architecture from ARCHES, which is a list of
2969 architectures already created during this debugging session.
2970
2971 Called e.g. at program startup, when reading a core file, and when
2972 reading a binary file. */
2973
2974 static struct gdbarch *
2975 aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
2976 {
2977 struct gdbarch_tdep *tdep;
2978 struct gdbarch *gdbarch;
2979 struct gdbarch_list *best_arch;
2980 struct tdesc_arch_data *tdesc_data = NULL;
2981 const struct target_desc *tdesc = info.target_desc;
2982 int i;
2983 int valid_p = 1;
2984 const struct tdesc_feature *feature_core;
2985 const struct tdesc_feature *feature_fpu;
2986 const struct tdesc_feature *feature_sve;
2987 int num_regs = 0;
2988 int num_pseudo_regs = 0;
2989
2990 /* Ensure we always have a target description. */
2991 if (!tdesc_has_registers (tdesc))
2992 tdesc = aarch64_read_description (0);
2993 gdb_assert (tdesc);
2994
2995 feature_core = tdesc_find_feature (tdesc, "org.gnu.gdb.aarch64.core");
2996 feature_fpu = tdesc_find_feature (tdesc, "org.gnu.gdb.aarch64.fpu");
2997 feature_sve = tdesc_find_feature (tdesc, "org.gnu.gdb.aarch64.sve");
2998
2999 if (feature_core == NULL)
3000 return NULL;
3001
3002 tdesc_data = tdesc_data_alloc ();
3003
3004 /* Validate the description provides the mandatory core R registers
3005 and allocate their numbers. */
3006 for (i = 0; i < ARRAY_SIZE (aarch64_r_register_names); i++)
3007 valid_p &= tdesc_numbered_register (feature_core, tdesc_data,
3008 AARCH64_X0_REGNUM + i,
3009 aarch64_r_register_names[i]);
3010
3011 num_regs = AARCH64_X0_REGNUM + i;
3012
3013 /* Add the V registers. */
3014 if (feature_fpu != NULL)
3015 {
3016 if (feature_sve != NULL)
3017 error (_("Program contains both fpu and SVE features."));
3018
3019 /* Validate the description provides the mandatory V registers
3020 and allocate their numbers. */
3021 for (i = 0; i < ARRAY_SIZE (aarch64_v_register_names); i++)
3022 valid_p &= tdesc_numbered_register (feature_fpu, tdesc_data,
3023 AARCH64_V0_REGNUM + i,
3024 aarch64_v_register_names[i]);
3025
3026 num_regs = AARCH64_V0_REGNUM + i;
3027 }
3028
3029 /* Add the SVE registers. */
3030 if (feature_sve != NULL)
3031 {
3032 /* Validate the description provides the mandatory SVE registers
3033 and allocate their numbers. */
3034 for (i = 0; i < ARRAY_SIZE (aarch64_sve_register_names); i++)
3035 valid_p &= tdesc_numbered_register (feature_sve, tdesc_data,
3036 AARCH64_SVE_Z0_REGNUM + i,
3037 aarch64_sve_register_names[i]);
3038
3039 num_regs = AARCH64_SVE_Z0_REGNUM + i;
3040 num_pseudo_regs += 32; /* add the Vn register pseudos. */
3041 }
3042
3043 if (feature_fpu != NULL || feature_sve != NULL)
3044 {
3045 num_pseudo_regs += 32; /* add the Qn scalar register pseudos */
3046 num_pseudo_regs += 32; /* add the Dn scalar register pseudos */
3047 num_pseudo_regs += 32; /* add the Sn scalar register pseudos */
3048 num_pseudo_regs += 32; /* add the Hn scalar register pseudos */
3049 num_pseudo_regs += 32; /* add the Bn scalar register pseudos */
3050 }
3051
3052 if (!valid_p)
3053 {
3054 tdesc_data_cleanup (tdesc_data);
3055 return NULL;
3056 }
3057
3058 /* AArch64 code is always little-endian. */
3059 info.byte_order_for_code = BFD_ENDIAN_LITTLE;
3060
3061 /* If there is already a candidate, use it. */
3062 for (best_arch = gdbarch_list_lookup_by_info (arches, &info);
3063 best_arch != NULL;
3064 best_arch = gdbarch_list_lookup_by_info (best_arch->next, &info))
3065 {
3066 /* Found a match. */
3067 break;
3068 }
3069
3070 if (best_arch != NULL)
3071 {
3072 if (tdesc_data != NULL)
3073 tdesc_data_cleanup (tdesc_data);
3074 return best_arch->gdbarch;
3075 }
3076
3077 tdep = XCNEW (struct gdbarch_tdep);
3078 gdbarch = gdbarch_alloc (&info, tdep);
3079
3080 /* This should be low enough for everything. */
3081 tdep->lowest_pc = 0x20;
3082 tdep->jb_pc = -1; /* Longjump support not enabled by default. */
3083 tdep->jb_elt_size = 8;
3084 tdep->vq = aarch64_get_tdesc_vq (tdesc);
3085
3086 set_gdbarch_push_dummy_call (gdbarch, aarch64_push_dummy_call);
3087 set_gdbarch_frame_align (gdbarch, aarch64_frame_align);
3088
3089 /* Frame handling. */
3090 set_gdbarch_dummy_id (gdbarch, aarch64_dummy_id);
3091 set_gdbarch_unwind_pc (gdbarch, aarch64_unwind_pc);
3092 set_gdbarch_unwind_sp (gdbarch, aarch64_unwind_sp);
3093
3094 /* Advance PC across function entry code. */
3095 set_gdbarch_skip_prologue (gdbarch, aarch64_skip_prologue);
3096
3097 /* The stack grows downward. */
3098 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
3099
3100 /* Breakpoint manipulation. */
3101 set_gdbarch_breakpoint_kind_from_pc (gdbarch,
3102 aarch64_breakpoint::kind_from_pc);
3103 set_gdbarch_sw_breakpoint_from_kind (gdbarch,
3104 aarch64_breakpoint::bp_from_kind);
3105 set_gdbarch_have_nonsteppable_watchpoint (gdbarch, 1);
3106 set_gdbarch_software_single_step (gdbarch, aarch64_software_single_step);
3107
3108 /* Information about registers, etc. */
3109 set_gdbarch_sp_regnum (gdbarch, AARCH64_SP_REGNUM);
3110 set_gdbarch_pc_regnum (gdbarch, AARCH64_PC_REGNUM);
3111 set_gdbarch_num_regs (gdbarch, num_regs);
3112
3113 set_gdbarch_num_pseudo_regs (gdbarch, num_pseudo_regs);
3114 set_gdbarch_pseudo_register_read_value (gdbarch, aarch64_pseudo_read_value);
3115 set_gdbarch_pseudo_register_write (gdbarch, aarch64_pseudo_write);
3116 set_tdesc_pseudo_register_name (gdbarch, aarch64_pseudo_register_name);
3117 set_tdesc_pseudo_register_type (gdbarch, aarch64_pseudo_register_type);
3118 set_tdesc_pseudo_register_reggroup_p (gdbarch,
3119 aarch64_pseudo_register_reggroup_p);
3120
3121 /* ABI */
3122 set_gdbarch_short_bit (gdbarch, 16);
3123 set_gdbarch_int_bit (gdbarch, 32);
3124 set_gdbarch_float_bit (gdbarch, 32);
3125 set_gdbarch_double_bit (gdbarch, 64);
3126 set_gdbarch_long_double_bit (gdbarch, 128);
3127 set_gdbarch_long_bit (gdbarch, 64);
3128 set_gdbarch_long_long_bit (gdbarch, 64);
3129 set_gdbarch_ptr_bit (gdbarch, 64);
3130 set_gdbarch_char_signed (gdbarch, 0);
3131 set_gdbarch_wchar_signed (gdbarch, 0);
3132 set_gdbarch_float_format (gdbarch, floatformats_ieee_single);
3133 set_gdbarch_double_format (gdbarch, floatformats_ieee_double);
3134 set_gdbarch_long_double_format (gdbarch, floatformats_ia64_quad);
3135
3136 /* Internal <-> external register number maps. */
3137 set_gdbarch_dwarf2_reg_to_regnum (gdbarch, aarch64_dwarf_reg_to_regnum);
3138
3139 /* Returning results. */
3140 set_gdbarch_return_value (gdbarch, aarch64_return_value);
3141
3142 /* Disassembly. */
3143 set_gdbarch_print_insn (gdbarch, aarch64_gdb_print_insn);
3144
3145 /* Virtual tables. */
3146 set_gdbarch_vbit_in_delta (gdbarch, 1);
3147
3148 /* Hook in the ABI-specific overrides, if they have been registered. */
3149 info.target_desc = tdesc;
3150 info.tdesc_data = tdesc_data;
3151 gdbarch_init_osabi (info, gdbarch);
3152
3153 dwarf2_frame_set_init_reg (gdbarch, aarch64_dwarf2_frame_init_reg);
3154
3155 /* Add some default predicates. */
3156 frame_unwind_append_unwinder (gdbarch, &aarch64_stub_unwind);
3157 dwarf2_append_unwinders (gdbarch);
3158 frame_unwind_append_unwinder (gdbarch, &aarch64_prologue_unwind);
3159
3160 frame_base_set_default (gdbarch, &aarch64_normal_base);
3161
3162 /* Now we have tuned the configuration, set a few final things,
3163 based on what the OS ABI has told us. */
3164
3165 if (tdep->jb_pc >= 0)
3166 set_gdbarch_get_longjmp_target (gdbarch, aarch64_get_longjmp_target);
3167
3168 set_gdbarch_gen_return_address (gdbarch, aarch64_gen_return_address);
3169
3170 tdesc_use_registers (gdbarch, tdesc, tdesc_data);
3171
3172 /* Add standard register aliases. */
3173 for (i = 0; i < ARRAY_SIZE (aarch64_register_aliases); i++)
3174 user_reg_add (gdbarch, aarch64_register_aliases[i].name,
3175 value_of_aarch64_user_reg,
3176 &aarch64_register_aliases[i].regnum);
3177
3178 return gdbarch;
3179 }
3180
3181 static void
3182 aarch64_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
3183 {
3184 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3185
3186 if (tdep == NULL)
3187 return;
3188
3189 fprintf_unfiltered (file, _("aarch64_dump_tdep: Lowest pc = 0x%s"),
3190 paddress (gdbarch, tdep->lowest_pc));
3191 }
3192
3193 #if GDB_SELF_TEST
3194 namespace selftests
3195 {
3196 static void aarch64_process_record_test (void);
3197 }
3198 #endif
3199
3200 void
3201 _initialize_aarch64_tdep (void)
3202 {
3203 gdbarch_register (bfd_arch_aarch64, aarch64_gdbarch_init,
3204 aarch64_dump_tdep);
3205
3206 /* Debug this file's internals. */
3207 add_setshow_boolean_cmd ("aarch64", class_maintenance, &aarch64_debug, _("\
3208 Set AArch64 debugging."), _("\
3209 Show AArch64 debugging."), _("\
3210 When on, AArch64 specific debugging is enabled."),
3211 NULL,
3212 show_aarch64_debug,
3213 &setdebuglist, &showdebuglist);
3214
3215 #if GDB_SELF_TEST
3216 selftests::register_test ("aarch64-analyze-prologue",
3217 selftests::aarch64_analyze_prologue_test);
3218 selftests::register_test ("aarch64-process-record",
3219 selftests::aarch64_process_record_test);
3220 selftests::record_xml_tdesc ("aarch64.xml",
3221 aarch64_create_target_description (0));
3222 #endif
3223 }
3224
3225 /* AArch64 process record-replay related structures, defines etc. */
3226
3227 #define REG_ALLOC(REGS, LENGTH, RECORD_BUF) \
3228 do \
3229 { \
3230 unsigned int reg_len = LENGTH; \
3231 if (reg_len) \
3232 { \
3233 REGS = XNEWVEC (uint32_t, reg_len); \
3234 memcpy(&REGS[0], &RECORD_BUF[0], sizeof(uint32_t)*LENGTH); \
3235 } \
3236 } \
3237 while (0)
3238
3239 #define MEM_ALLOC(MEMS, LENGTH, RECORD_BUF) \
3240 do \
3241 { \
3242 unsigned int mem_len = LENGTH; \
3243 if (mem_len) \
3244 { \
3245 MEMS = XNEWVEC (struct aarch64_mem_r, mem_len); \
3246 memcpy(&MEMS->len, &RECORD_BUF[0], \
3247 sizeof(struct aarch64_mem_r) * LENGTH); \
3248 } \
3249 } \
3250 while (0)
3251
3252 /* AArch64 record/replay structures and enumerations. */
3253
3254 struct aarch64_mem_r
3255 {
3256 uint64_t len; /* Record length. */
3257 uint64_t addr; /* Memory address. */
3258 };
3259
3260 enum aarch64_record_result
3261 {
3262 AARCH64_RECORD_SUCCESS,
3263 AARCH64_RECORD_UNSUPPORTED,
3264 AARCH64_RECORD_UNKNOWN
3265 };
3266
3267 typedef struct insn_decode_record_t
3268 {
3269 struct gdbarch *gdbarch;
3270 struct regcache *regcache;
3271 CORE_ADDR this_addr; /* Address of insn to be recorded. */
3272 uint32_t aarch64_insn; /* Insn to be recorded. */
3273 uint32_t mem_rec_count; /* Count of memory records. */
3274 uint32_t reg_rec_count; /* Count of register records. */
3275 uint32_t *aarch64_regs; /* Registers to be recorded. */
3276 struct aarch64_mem_r *aarch64_mems; /* Memory locations to be recorded. */
3277 } insn_decode_record;
3278
3279 /* Record handler for data processing - register instructions. */
3280
3281 static unsigned int
3282 aarch64_record_data_proc_reg (insn_decode_record *aarch64_insn_r)
3283 {
3284 uint8_t reg_rd, insn_bits24_27, insn_bits21_23;
3285 uint32_t record_buf[4];
3286
3287 reg_rd = bits (aarch64_insn_r->aarch64_insn, 0, 4);
3288 insn_bits24_27 = bits (aarch64_insn_r->aarch64_insn, 24, 27);
3289 insn_bits21_23 = bits (aarch64_insn_r->aarch64_insn, 21, 23);
3290
3291 if (!bit (aarch64_insn_r->aarch64_insn, 28))
3292 {
3293 uint8_t setflags;
3294
3295 /* Logical (shifted register). */
3296 if (insn_bits24_27 == 0x0a)
3297 setflags = (bits (aarch64_insn_r->aarch64_insn, 29, 30) == 0x03);
3298 /* Add/subtract. */
3299 else if (insn_bits24_27 == 0x0b)
3300 setflags = bit (aarch64_insn_r->aarch64_insn, 29);
3301 else
3302 return AARCH64_RECORD_UNKNOWN;
3303
3304 record_buf[0] = reg_rd;
3305 aarch64_insn_r->reg_rec_count = 1;
3306 if (setflags)
3307 record_buf[aarch64_insn_r->reg_rec_count++] = AARCH64_CPSR_REGNUM;
3308 }
3309 else
3310 {
3311 if (insn_bits24_27 == 0x0b)
3312 {
3313 /* Data-processing (3 source). */
3314 record_buf[0] = reg_rd;
3315 aarch64_insn_r->reg_rec_count = 1;
3316 }
3317 else if (insn_bits24_27 == 0x0a)
3318 {
3319 if (insn_bits21_23 == 0x00)
3320 {
3321 /* Add/subtract (with carry). */
3322 record_buf[0] = reg_rd;
3323 aarch64_insn_r->reg_rec_count = 1;
3324 if (bit (aarch64_insn_r->aarch64_insn, 29))
3325 {
3326 record_buf[1] = AARCH64_CPSR_REGNUM;
3327 aarch64_insn_r->reg_rec_count = 2;
3328 }
3329 }
3330 else if (insn_bits21_23 == 0x02)
3331 {
3332 /* Conditional compare (register) and conditional compare
3333 (immediate) instructions. */
3334 record_buf[0] = AARCH64_CPSR_REGNUM;
3335 aarch64_insn_r->reg_rec_count = 1;
3336 }
3337 else if (insn_bits21_23 == 0x04 || insn_bits21_23 == 0x06)
3338 {
3339 /* CConditional select. */
3340 /* Data-processing (2 source). */
3341 /* Data-processing (1 source). */
3342 record_buf[0] = reg_rd;
3343 aarch64_insn_r->reg_rec_count = 1;
3344 }
3345 else
3346 return AARCH64_RECORD_UNKNOWN;
3347 }
3348 }
3349
3350 REG_ALLOC (aarch64_insn_r->aarch64_regs, aarch64_insn_r->reg_rec_count,
3351 record_buf);
3352 return AARCH64_RECORD_SUCCESS;
3353 }
3354
3355 /* Record handler for data processing - immediate instructions. */
3356
3357 static unsigned int
3358 aarch64_record_data_proc_imm (insn_decode_record *aarch64_insn_r)
3359 {
3360 uint8_t reg_rd, insn_bit23, insn_bits24_27, setflags;
3361 uint32_t record_buf[4];
3362
3363 reg_rd = bits (aarch64_insn_r->aarch64_insn, 0, 4);
3364 insn_bit23 = bit (aarch64_insn_r->aarch64_insn, 23);
3365 insn_bits24_27 = bits (aarch64_insn_r->aarch64_insn, 24, 27);
3366
3367 if (insn_bits24_27 == 0x00 /* PC rel addressing. */
3368 || insn_bits24_27 == 0x03 /* Bitfield and Extract. */
3369 || (insn_bits24_27 == 0x02 && insn_bit23)) /* Move wide (immediate). */
3370 {
3371 record_buf[0] = reg_rd;
3372 aarch64_insn_r->reg_rec_count = 1;
3373 }
3374 else if (insn_bits24_27 == 0x01)
3375 {
3376 /* Add/Subtract (immediate). */
3377 setflags = bit (aarch64_insn_r->aarch64_insn, 29);
3378 record_buf[0] = reg_rd;
3379 aarch64_insn_r->reg_rec_count = 1;
3380 if (setflags)
3381 record_buf[aarch64_insn_r->reg_rec_count++] = AARCH64_CPSR_REGNUM;
3382 }
3383 else if (insn_bits24_27 == 0x02 && !insn_bit23)
3384 {
3385 /* Logical (immediate). */
3386 setflags = bits (aarch64_insn_r->aarch64_insn, 29, 30) == 0x03;
3387 record_buf[0] = reg_rd;
3388 aarch64_insn_r->reg_rec_count = 1;
3389 if (setflags)
3390 record_buf[aarch64_insn_r->reg_rec_count++] = AARCH64_CPSR_REGNUM;
3391 }
3392 else
3393 return AARCH64_RECORD_UNKNOWN;
3394
3395 REG_ALLOC (aarch64_insn_r->aarch64_regs, aarch64_insn_r->reg_rec_count,
3396 record_buf);
3397 return AARCH64_RECORD_SUCCESS;
3398 }
3399
3400 /* Record handler for branch, exception generation and system instructions. */
3401
3402 static unsigned int
3403 aarch64_record_branch_except_sys (insn_decode_record *aarch64_insn_r)
3404 {
3405 struct gdbarch_tdep *tdep = gdbarch_tdep (aarch64_insn_r->gdbarch);
3406 uint8_t insn_bits24_27, insn_bits28_31, insn_bits22_23;
3407 uint32_t record_buf[4];
3408
3409 insn_bits24_27 = bits (aarch64_insn_r->aarch64_insn, 24, 27);
3410 insn_bits28_31 = bits (aarch64_insn_r->aarch64_insn, 28, 31);
3411 insn_bits22_23 = bits (aarch64_insn_r->aarch64_insn, 22, 23);
3412
3413 if (insn_bits28_31 == 0x0d)
3414 {
3415 /* Exception generation instructions. */
3416 if (insn_bits24_27 == 0x04)
3417 {
3418 if (!bits (aarch64_insn_r->aarch64_insn, 2, 4)
3419 && !bits (aarch64_insn_r->aarch64_insn, 21, 23)
3420 && bits (aarch64_insn_r->aarch64_insn, 0, 1) == 0x01)
3421 {
3422 ULONGEST svc_number;
3423
3424 regcache_raw_read_unsigned (aarch64_insn_r->regcache, 8,
3425 &svc_number);
3426 return tdep->aarch64_syscall_record (aarch64_insn_r->regcache,
3427 svc_number);
3428 }
3429 else
3430 return AARCH64_RECORD_UNSUPPORTED;
3431 }
3432 /* System instructions. */
3433 else if (insn_bits24_27 == 0x05 && insn_bits22_23 == 0x00)
3434 {
3435 uint32_t reg_rt, reg_crn;
3436
3437 reg_rt = bits (aarch64_insn_r->aarch64_insn, 0, 4);
3438 reg_crn = bits (aarch64_insn_r->aarch64_insn, 12, 15);
3439
3440 /* Record rt in case of sysl and mrs instructions. */
3441 if (bit (aarch64_insn_r->aarch64_insn, 21))
3442 {
3443 record_buf[0] = reg_rt;
3444 aarch64_insn_r->reg_rec_count = 1;
3445 }
3446 /* Record cpsr for hint and msr(immediate) instructions. */
3447 else if (reg_crn == 0x02 || reg_crn == 0x04)
3448 {
3449 record_buf[0] = AARCH64_CPSR_REGNUM;
3450 aarch64_insn_r->reg_rec_count = 1;
3451 }
3452 }
3453 /* Unconditional branch (register). */
3454 else if((insn_bits24_27 & 0x0e) == 0x06)
3455 {
3456 record_buf[aarch64_insn_r->reg_rec_count++] = AARCH64_PC_REGNUM;
3457 if (bits (aarch64_insn_r->aarch64_insn, 21, 22) == 0x01)
3458 record_buf[aarch64_insn_r->reg_rec_count++] = AARCH64_LR_REGNUM;
3459 }
3460 else
3461 return AARCH64_RECORD_UNKNOWN;
3462 }
3463 /* Unconditional branch (immediate). */
3464 else if ((insn_bits28_31 & 0x07) == 0x01 && (insn_bits24_27 & 0x0c) == 0x04)
3465 {
3466 record_buf[aarch64_insn_r->reg_rec_count++] = AARCH64_PC_REGNUM;
3467 if (bit (aarch64_insn_r->aarch64_insn, 31))
3468 record_buf[aarch64_insn_r->reg_rec_count++] = AARCH64_LR_REGNUM;
3469 }
3470 else
3471 /* Compare & branch (immediate), Test & branch (immediate) and
3472 Conditional branch (immediate). */
3473 record_buf[aarch64_insn_r->reg_rec_count++] = AARCH64_PC_REGNUM;
3474
3475 REG_ALLOC (aarch64_insn_r->aarch64_regs, aarch64_insn_r->reg_rec_count,
3476 record_buf);
3477 return AARCH64_RECORD_SUCCESS;
3478 }
3479
3480 /* Record handler for advanced SIMD load and store instructions. */
3481
3482 static unsigned int
3483 aarch64_record_asimd_load_store (insn_decode_record *aarch64_insn_r)
3484 {
3485 CORE_ADDR address;
3486 uint64_t addr_offset = 0;
3487 uint32_t record_buf[24];
3488 uint64_t record_buf_mem[24];
3489 uint32_t reg_rn, reg_rt;
3490 uint32_t reg_index = 0, mem_index = 0;
3491 uint8_t opcode_bits, size_bits;
3492
3493 reg_rt = bits (aarch64_insn_r->aarch64_insn, 0, 4);
3494 reg_rn = bits (aarch64_insn_r->aarch64_insn, 5, 9);
3495 size_bits = bits (aarch64_insn_r->aarch64_insn, 10, 11);
3496 opcode_bits = bits (aarch64_insn_r->aarch64_insn, 12, 15);
3497 regcache_raw_read_unsigned (aarch64_insn_r->regcache, reg_rn, &address);
3498
3499 if (record_debug)
3500 debug_printf ("Process record: Advanced SIMD load/store\n");
3501
3502 /* Load/store single structure. */
3503 if (bit (aarch64_insn_r->aarch64_insn, 24))
3504 {
3505 uint8_t sindex, scale, selem, esize, replicate = 0;
3506 scale = opcode_bits >> 2;
3507 selem = ((opcode_bits & 0x02) |
3508 bit (aarch64_insn_r->aarch64_insn, 21)) + 1;
3509 switch (scale)
3510 {
3511 case 1:
3512 if (size_bits & 0x01)
3513 return AARCH64_RECORD_UNKNOWN;
3514 break;
3515 case 2:
3516 if ((size_bits >> 1) & 0x01)
3517 return AARCH64_RECORD_UNKNOWN;
3518 if (size_bits & 0x01)
3519 {
3520 if (!((opcode_bits >> 1) & 0x01))
3521 scale = 3;
3522 else
3523 return AARCH64_RECORD_UNKNOWN;
3524 }
3525 break;
3526 case 3:
3527 if (bit (aarch64_insn_r->aarch64_insn, 22) && !(opcode_bits & 0x01))
3528 {
3529 scale = size_bits;
3530 replicate = 1;
3531 break;
3532 }
3533 else
3534 return AARCH64_RECORD_UNKNOWN;
3535 default:
3536 break;
3537 }
3538 esize = 8 << scale;
3539 if (replicate)
3540 for (sindex = 0; sindex < selem; sindex++)
3541 {
3542 record_buf[reg_index++] = reg_rt + AARCH64_V0_REGNUM;
3543 reg_rt = (reg_rt + 1) % 32;
3544 }
3545 else
3546 {
3547 for (sindex = 0; sindex < selem; sindex++)
3548 {
3549 if (bit (aarch64_insn_r->aarch64_insn, 22))
3550 record_buf[reg_index++] = reg_rt + AARCH64_V0_REGNUM;
3551 else
3552 {
3553 record_buf_mem[mem_index++] = esize / 8;
3554 record_buf_mem[mem_index++] = address + addr_offset;
3555 }
3556 addr_offset = addr_offset + (esize / 8);
3557 reg_rt = (reg_rt + 1) % 32;
3558 }
3559 }
3560 }
3561 /* Load/store multiple structure. */
3562 else
3563 {
3564 uint8_t selem, esize, rpt, elements;
3565 uint8_t eindex, rindex;
3566
3567 esize = 8 << size_bits;
3568 if (bit (aarch64_insn_r->aarch64_insn, 30))
3569 elements = 128 / esize;
3570 else
3571 elements = 64 / esize;
3572
3573 switch (opcode_bits)
3574 {
3575 /*LD/ST4 (4 Registers). */
3576 case 0:
3577 rpt = 1;
3578 selem = 4;
3579 break;
3580 /*LD/ST1 (4 Registers). */
3581 case 2:
3582 rpt = 4;
3583 selem = 1;
3584 break;
3585 /*LD/ST3 (3 Registers). */
3586 case 4:
3587 rpt = 1;
3588 selem = 3;
3589 break;
3590 /*LD/ST1 (3 Registers). */
3591 case 6:
3592 rpt = 3;
3593 selem = 1;
3594 break;
3595 /*LD/ST1 (1 Register). */
3596 case 7:
3597 rpt = 1;
3598 selem = 1;
3599 break;
3600 /*LD/ST2 (2 Registers). */
3601 case 8:
3602 rpt = 1;
3603 selem = 2;
3604 break;
3605 /*LD/ST1 (2 Registers). */
3606 case 10:
3607 rpt = 2;
3608 selem = 1;
3609 break;
3610 default:
3611 return AARCH64_RECORD_UNSUPPORTED;
3612 break;
3613 }
3614 for (rindex = 0; rindex < rpt; rindex++)
3615 for (eindex = 0; eindex < elements; eindex++)
3616 {
3617 uint8_t reg_tt, sindex;
3618 reg_tt = (reg_rt + rindex) % 32;
3619 for (sindex = 0; sindex < selem; sindex++)
3620 {
3621 if (bit (aarch64_insn_r->aarch64_insn, 22))
3622 record_buf[reg_index++] = reg_tt + AARCH64_V0_REGNUM;
3623 else
3624 {
3625 record_buf_mem[mem_index++] = esize / 8;
3626 record_buf_mem[mem_index++] = address + addr_offset;
3627 }
3628 addr_offset = addr_offset + (esize / 8);
3629 reg_tt = (reg_tt + 1) % 32;
3630 }
3631 }
3632 }
3633
3634 if (bit (aarch64_insn_r->aarch64_insn, 23))
3635 record_buf[reg_index++] = reg_rn;
3636
3637 aarch64_insn_r->reg_rec_count = reg_index;
3638 aarch64_insn_r->mem_rec_count = mem_index / 2;
3639 MEM_ALLOC (aarch64_insn_r->aarch64_mems, aarch64_insn_r->mem_rec_count,
3640 record_buf_mem);
3641 REG_ALLOC (aarch64_insn_r->aarch64_regs, aarch64_insn_r->reg_rec_count,
3642 record_buf);
3643 return AARCH64_RECORD_SUCCESS;
3644 }
3645
3646 /* Record handler for load and store instructions. */
3647
3648 static unsigned int
3649 aarch64_record_load_store (insn_decode_record *aarch64_insn_r)
3650 {
3651 uint8_t insn_bits24_27, insn_bits28_29, insn_bits10_11;
3652 uint8_t insn_bit23, insn_bit21;
3653 uint8_t opc, size_bits, ld_flag, vector_flag;
3654 uint32_t reg_rn, reg_rt, reg_rt2;
3655 uint64_t datasize, offset;
3656 uint32_t record_buf[8];
3657 uint64_t record_buf_mem[8];
3658 CORE_ADDR address;
3659
3660 insn_bits10_11 = bits (aarch64_insn_r->aarch64_insn, 10, 11);
3661 insn_bits24_27 = bits (aarch64_insn_r->aarch64_insn, 24, 27);
3662 insn_bits28_29 = bits (aarch64_insn_r->aarch64_insn, 28, 29);
3663 insn_bit21 = bit (aarch64_insn_r->aarch64_insn, 21);
3664 insn_bit23 = bit (aarch64_insn_r->aarch64_insn, 23);
3665 ld_flag = bit (aarch64_insn_r->aarch64_insn, 22);
3666 vector_flag = bit (aarch64_insn_r->aarch64_insn, 26);
3667 reg_rt = bits (aarch64_insn_r->aarch64_insn, 0, 4);
3668 reg_rn = bits (aarch64_insn_r->aarch64_insn, 5, 9);
3669 reg_rt2 = bits (aarch64_insn_r->aarch64_insn, 10, 14);
3670 size_bits = bits (aarch64_insn_r->aarch64_insn, 30, 31);
3671
3672 /* Load/store exclusive. */
3673 if (insn_bits24_27 == 0x08 && insn_bits28_29 == 0x00)
3674 {
3675 if (record_debug)
3676 debug_printf ("Process record: load/store exclusive\n");
3677
3678 if (ld_flag)
3679 {
3680 record_buf[0] = reg_rt;
3681 aarch64_insn_r->reg_rec_count = 1;
3682 if (insn_bit21)
3683 {
3684 record_buf[1] = reg_rt2;
3685 aarch64_insn_r->reg_rec_count = 2;
3686 }
3687 }
3688 else
3689 {
3690 if (insn_bit21)
3691 datasize = (8 << size_bits) * 2;
3692 else
3693 datasize = (8 << size_bits);
3694 regcache_raw_read_unsigned (aarch64_insn_r->regcache, reg_rn,
3695 &address);
3696 record_buf_mem[0] = datasize / 8;
3697 record_buf_mem[1] = address;
3698 aarch64_insn_r->mem_rec_count = 1;
3699 if (!insn_bit23)
3700 {
3701 /* Save register rs. */
3702 record_buf[0] = bits (aarch64_insn_r->aarch64_insn, 16, 20);
3703 aarch64_insn_r->reg_rec_count = 1;
3704 }
3705 }
3706 }
3707 /* Load register (literal) instructions decoding. */
3708 else if ((insn_bits24_27 & 0x0b) == 0x08 && insn_bits28_29 == 0x01)
3709 {
3710 if (record_debug)
3711 debug_printf ("Process record: load register (literal)\n");
3712 if (vector_flag)
3713 record_buf[0] = reg_rt + AARCH64_V0_REGNUM;
3714 else
3715 record_buf[0] = reg_rt;
3716 aarch64_insn_r->reg_rec_count = 1;
3717 }
3718 /* All types of load/store pair instructions decoding. */
3719 else if ((insn_bits24_27 & 0x0a) == 0x08 && insn_bits28_29 == 0x02)
3720 {
3721 if (record_debug)
3722 debug_printf ("Process record: load/store pair\n");
3723
3724 if (ld_flag)
3725 {
3726 if (vector_flag)
3727 {
3728 record_buf[0] = reg_rt + AARCH64_V0_REGNUM;
3729 record_buf[1] = reg_rt2 + AARCH64_V0_REGNUM;
3730 }
3731 else
3732 {
3733 record_buf[0] = reg_rt;
3734 record_buf[1] = reg_rt2;
3735 }
3736 aarch64_insn_r->reg_rec_count = 2;
3737 }
3738 else
3739 {
3740 uint16_t imm7_off;
3741 imm7_off = bits (aarch64_insn_r->aarch64_insn, 15, 21);
3742 if (!vector_flag)
3743 size_bits = size_bits >> 1;
3744 datasize = 8 << (2 + size_bits);
3745 offset = (imm7_off & 0x40) ? (~imm7_off & 0x007f) + 1 : imm7_off;
3746 offset = offset << (2 + size_bits);
3747 regcache_raw_read_unsigned (aarch64_insn_r->regcache, reg_rn,
3748 &address);
3749 if (!((insn_bits24_27 & 0x0b) == 0x08 && insn_bit23))
3750 {
3751 if (imm7_off & 0x40)
3752 address = address - offset;
3753 else
3754 address = address + offset;
3755 }
3756
3757 record_buf_mem[0] = datasize / 8;
3758 record_buf_mem[1] = address;
3759 record_buf_mem[2] = datasize / 8;
3760 record_buf_mem[3] = address + (datasize / 8);
3761 aarch64_insn_r->mem_rec_count = 2;
3762 }
3763 if (bit (aarch64_insn_r->aarch64_insn, 23))
3764 record_buf[aarch64_insn_r->reg_rec_count++] = reg_rn;
3765 }
3766 /* Load/store register (unsigned immediate) instructions. */
3767 else if ((insn_bits24_27 & 0x0b) == 0x09 && insn_bits28_29 == 0x03)
3768 {
3769 opc = bits (aarch64_insn_r->aarch64_insn, 22, 23);
3770 if (!(opc >> 1))
3771 {
3772 if (opc & 0x01)
3773 ld_flag = 0x01;
3774 else
3775 ld_flag = 0x0;
3776 }
3777 else
3778 {
3779 if (size_bits == 0x3 && vector_flag == 0x0 && opc == 0x2)
3780 {
3781 /* PRFM (immediate) */
3782 return AARCH64_RECORD_SUCCESS;
3783 }
3784 else if (size_bits == 0x2 && vector_flag == 0x0 && opc == 0x2)
3785 {
3786 /* LDRSW (immediate) */
3787 ld_flag = 0x1;
3788 }
3789 else
3790 {
3791 if (opc & 0x01)
3792 ld_flag = 0x01;
3793 else
3794 ld_flag = 0x0;
3795 }
3796 }
3797
3798 if (record_debug)
3799 {
3800 debug_printf ("Process record: load/store (unsigned immediate):"
3801 " size %x V %d opc %x\n", size_bits, vector_flag,
3802 opc);
3803 }
3804
3805 if (!ld_flag)
3806 {
3807 offset = bits (aarch64_insn_r->aarch64_insn, 10, 21);
3808 datasize = 8 << size_bits;
3809 regcache_raw_read_unsigned (aarch64_insn_r->regcache, reg_rn,
3810 &address);
3811 offset = offset << size_bits;
3812 address = address + offset;
3813
3814 record_buf_mem[0] = datasize >> 3;
3815 record_buf_mem[1] = address;
3816 aarch64_insn_r->mem_rec_count = 1;
3817 }
3818 else
3819 {
3820 if (vector_flag)
3821 record_buf[0] = reg_rt + AARCH64_V0_REGNUM;
3822 else
3823 record_buf[0] = reg_rt;
3824 aarch64_insn_r->reg_rec_count = 1;
3825 }
3826 }
3827 /* Load/store register (register offset) instructions. */
3828 else if ((insn_bits24_27 & 0x0b) == 0x08 && insn_bits28_29 == 0x03
3829 && insn_bits10_11 == 0x02 && insn_bit21)
3830 {
3831 if (record_debug)
3832 debug_printf ("Process record: load/store (register offset)\n");
3833 opc = bits (aarch64_insn_r->aarch64_insn, 22, 23);
3834 if (!(opc >> 1))
3835 if (opc & 0x01)
3836 ld_flag = 0x01;
3837 else
3838 ld_flag = 0x0;
3839 else
3840 if (size_bits != 0x03)
3841 ld_flag = 0x01;
3842 else
3843 return AARCH64_RECORD_UNKNOWN;
3844
3845 if (!ld_flag)
3846 {
3847 ULONGEST reg_rm_val;
3848
3849 regcache_raw_read_unsigned (aarch64_insn_r->regcache,
3850 bits (aarch64_insn_r->aarch64_insn, 16, 20), &reg_rm_val);
3851 if (bit (aarch64_insn_r->aarch64_insn, 12))
3852 offset = reg_rm_val << size_bits;
3853 else
3854 offset = reg_rm_val;
3855 datasize = 8 << size_bits;
3856 regcache_raw_read_unsigned (aarch64_insn_r->regcache, reg_rn,
3857 &address);
3858 address = address + offset;
3859 record_buf_mem[0] = datasize >> 3;
3860 record_buf_mem[1] = address;
3861 aarch64_insn_r->mem_rec_count = 1;
3862 }
3863 else
3864 {
3865 if (vector_flag)
3866 record_buf[0] = reg_rt + AARCH64_V0_REGNUM;
3867 else
3868 record_buf[0] = reg_rt;
3869 aarch64_insn_r->reg_rec_count = 1;
3870 }
3871 }
3872 /* Load/store register (immediate and unprivileged) instructions. */
3873 else if ((insn_bits24_27 & 0x0b) == 0x08 && insn_bits28_29 == 0x03
3874 && !insn_bit21)
3875 {
3876 if (record_debug)
3877 {
3878 debug_printf ("Process record: load/store "
3879 "(immediate and unprivileged)\n");
3880 }
3881 opc = bits (aarch64_insn_r->aarch64_insn, 22, 23);
3882 if (!(opc >> 1))
3883 if (opc & 0x01)
3884 ld_flag = 0x01;
3885 else
3886 ld_flag = 0x0;
3887 else
3888 if (size_bits != 0x03)
3889 ld_flag = 0x01;
3890 else
3891 return AARCH64_RECORD_UNKNOWN;
3892
3893 if (!ld_flag)
3894 {
3895 uint16_t imm9_off;
3896 imm9_off = bits (aarch64_insn_r->aarch64_insn, 12, 20);
3897 offset = (imm9_off & 0x0100) ? (((~imm9_off) & 0x01ff) + 1) : imm9_off;
3898 datasize = 8 << size_bits;
3899 regcache_raw_read_unsigned (aarch64_insn_r->regcache, reg_rn,
3900 &address);
3901 if (insn_bits10_11 != 0x01)
3902 {
3903 if (imm9_off & 0x0100)
3904 address = address - offset;
3905 else
3906 address = address + offset;
3907 }
3908 record_buf_mem[0] = datasize >> 3;
3909 record_buf_mem[1] = address;
3910 aarch64_insn_r->mem_rec_count = 1;
3911 }
3912 else
3913 {
3914 if (vector_flag)
3915 record_buf[0] = reg_rt + AARCH64_V0_REGNUM;
3916 else
3917 record_buf[0] = reg_rt;
3918 aarch64_insn_r->reg_rec_count = 1;
3919 }
3920 if (insn_bits10_11 == 0x01 || insn_bits10_11 == 0x03)
3921 record_buf[aarch64_insn_r->reg_rec_count++] = reg_rn;
3922 }
3923 /* Advanced SIMD load/store instructions. */
3924 else
3925 return aarch64_record_asimd_load_store (aarch64_insn_r);
3926
3927 MEM_ALLOC (aarch64_insn_r->aarch64_mems, aarch64_insn_r->mem_rec_count,
3928 record_buf_mem);
3929 REG_ALLOC (aarch64_insn_r->aarch64_regs, aarch64_insn_r->reg_rec_count,
3930 record_buf);
3931 return AARCH64_RECORD_SUCCESS;
3932 }
3933
3934 /* Record handler for data processing SIMD and floating point instructions. */
3935
3936 static unsigned int
3937 aarch64_record_data_proc_simd_fp (insn_decode_record *aarch64_insn_r)
3938 {
3939 uint8_t insn_bit21, opcode, rmode, reg_rd;
3940 uint8_t insn_bits24_27, insn_bits28_31, insn_bits10_11, insn_bits12_15;
3941 uint8_t insn_bits11_14;
3942 uint32_t record_buf[2];
3943
3944 insn_bits24_27 = bits (aarch64_insn_r->aarch64_insn, 24, 27);
3945 insn_bits28_31 = bits (aarch64_insn_r->aarch64_insn, 28, 31);
3946 insn_bits10_11 = bits (aarch64_insn_r->aarch64_insn, 10, 11);
3947 insn_bits12_15 = bits (aarch64_insn_r->aarch64_insn, 12, 15);
3948 insn_bits11_14 = bits (aarch64_insn_r->aarch64_insn, 11, 14);
3949 opcode = bits (aarch64_insn_r->aarch64_insn, 16, 18);
3950 rmode = bits (aarch64_insn_r->aarch64_insn, 19, 20);
3951 reg_rd = bits (aarch64_insn_r->aarch64_insn, 0, 4);
3952 insn_bit21 = bit (aarch64_insn_r->aarch64_insn, 21);
3953
3954 if (record_debug)
3955 debug_printf ("Process record: data processing SIMD/FP: ");
3956
3957 if ((insn_bits28_31 & 0x05) == 0x01 && insn_bits24_27 == 0x0e)
3958 {
3959 /* Floating point - fixed point conversion instructions. */
3960 if (!insn_bit21)
3961 {
3962 if (record_debug)
3963 debug_printf ("FP - fixed point conversion");
3964
3965 if ((opcode >> 1) == 0x0 && rmode == 0x03)
3966 record_buf[0] = reg_rd;
3967 else
3968 record_buf[0] = reg_rd + AARCH64_V0_REGNUM;
3969 }
3970 /* Floating point - conditional compare instructions. */
3971 else if (insn_bits10_11 == 0x01)
3972 {
3973 if (record_debug)
3974 debug_printf ("FP - conditional compare");
3975
3976 record_buf[0] = AARCH64_CPSR_REGNUM;
3977 }
3978 /* Floating point - data processing (2-source) and
3979 conditional select instructions. */
3980 else if (insn_bits10_11 == 0x02 || insn_bits10_11 == 0x03)
3981 {
3982 if (record_debug)
3983 debug_printf ("FP - DP (2-source)");
3984
3985 record_buf[0] = reg_rd + AARCH64_V0_REGNUM;
3986 }
3987 else if (insn_bits10_11 == 0x00)
3988 {
3989 /* Floating point - immediate instructions. */
3990 if ((insn_bits12_15 & 0x01) == 0x01
3991 || (insn_bits12_15 & 0x07) == 0x04)
3992 {
3993 if (record_debug)
3994 debug_printf ("FP - immediate");
3995 record_buf[0] = reg_rd + AARCH64_V0_REGNUM;
3996 }
3997 /* Floating point - compare instructions. */
3998 else if ((insn_bits12_15 & 0x03) == 0x02)
3999 {
4000 if (record_debug)
4001 debug_printf ("FP - immediate");
4002 record_buf[0] = AARCH64_CPSR_REGNUM;
4003 }
4004 /* Floating point - integer conversions instructions. */
4005 else if (insn_bits12_15 == 0x00)
4006 {
4007 /* Convert float to integer instruction. */
4008 if (!(opcode >> 1) || ((opcode >> 1) == 0x02 && !rmode))
4009 {
4010 if (record_debug)
4011 debug_printf ("float to int conversion");
4012
4013 record_buf[0] = reg_rd + AARCH64_X0_REGNUM;
4014 }
4015 /* Convert integer to float instruction. */
4016 else if ((opcode >> 1) == 0x01 && !rmode)
4017 {
4018 if (record_debug)
4019 debug_printf ("int to float conversion");
4020
4021 record_buf[0] = reg_rd + AARCH64_V0_REGNUM;
4022 }
4023 /* Move float to integer instruction. */
4024 else if ((opcode >> 1) == 0x03)
4025 {
4026 if (record_debug)
4027 debug_printf ("move float to int");
4028
4029 if (!(opcode & 0x01))
4030 record_buf[0] = reg_rd + AARCH64_X0_REGNUM;
4031 else
4032 record_buf[0] = reg_rd + AARCH64_V0_REGNUM;
4033 }
4034 else
4035 return AARCH64_RECORD_UNKNOWN;
4036 }
4037 else
4038 return AARCH64_RECORD_UNKNOWN;
4039 }
4040 else
4041 return AARCH64_RECORD_UNKNOWN;
4042 }
4043 else if ((insn_bits28_31 & 0x09) == 0x00 && insn_bits24_27 == 0x0e)
4044 {
4045 if (record_debug)
4046 debug_printf ("SIMD copy");
4047
4048 /* Advanced SIMD copy instructions. */
4049 if (!bits (aarch64_insn_r->aarch64_insn, 21, 23)
4050 && !bit (aarch64_insn_r->aarch64_insn, 15)
4051 && bit (aarch64_insn_r->aarch64_insn, 10))
4052 {
4053 if (insn_bits11_14 == 0x05 || insn_bits11_14 == 0x07)
4054 record_buf[0] = reg_rd + AARCH64_X0_REGNUM;
4055 else
4056 record_buf[0] = reg_rd + AARCH64_V0_REGNUM;
4057 }
4058 else
4059 record_buf[0] = reg_rd + AARCH64_V0_REGNUM;
4060 }
4061 /* All remaining floating point or advanced SIMD instructions. */
4062 else
4063 {
4064 if (record_debug)
4065 debug_printf ("all remain");
4066
4067 record_buf[0] = reg_rd + AARCH64_V0_REGNUM;
4068 }
4069
4070 if (record_debug)
4071 debug_printf ("\n");
4072
4073 aarch64_insn_r->reg_rec_count++;
4074 gdb_assert (aarch64_insn_r->reg_rec_count == 1);
4075 REG_ALLOC (aarch64_insn_r->aarch64_regs, aarch64_insn_r->reg_rec_count,
4076 record_buf);
4077 return AARCH64_RECORD_SUCCESS;
4078 }
4079
4080 /* Decodes insns type and invokes its record handler. */
4081
4082 static unsigned int
4083 aarch64_record_decode_insn_handler (insn_decode_record *aarch64_insn_r)
4084 {
4085 uint32_t ins_bit25, ins_bit26, ins_bit27, ins_bit28;
4086
4087 ins_bit25 = bit (aarch64_insn_r->aarch64_insn, 25);
4088 ins_bit26 = bit (aarch64_insn_r->aarch64_insn, 26);
4089 ins_bit27 = bit (aarch64_insn_r->aarch64_insn, 27);
4090 ins_bit28 = bit (aarch64_insn_r->aarch64_insn, 28);
4091
4092 /* Data processing - immediate instructions. */
4093 if (!ins_bit26 && !ins_bit27 && ins_bit28)
4094 return aarch64_record_data_proc_imm (aarch64_insn_r);
4095
4096 /* Branch, exception generation and system instructions. */
4097 if (ins_bit26 && !ins_bit27 && ins_bit28)
4098 return aarch64_record_branch_except_sys (aarch64_insn_r);
4099
4100 /* Load and store instructions. */
4101 if (!ins_bit25 && ins_bit27)
4102 return aarch64_record_load_store (aarch64_insn_r);
4103
4104 /* Data processing - register instructions. */
4105 if (ins_bit25 && !ins_bit26 && ins_bit27)
4106 return aarch64_record_data_proc_reg (aarch64_insn_r);
4107
4108 /* Data processing - SIMD and floating point instructions. */
4109 if (ins_bit25 && ins_bit26 && ins_bit27)
4110 return aarch64_record_data_proc_simd_fp (aarch64_insn_r);
4111
4112 return AARCH64_RECORD_UNSUPPORTED;
4113 }
4114
4115 /* Cleans up local record registers and memory allocations. */
4116
4117 static void
4118 deallocate_reg_mem (insn_decode_record *record)
4119 {
4120 xfree (record->aarch64_regs);
4121 xfree (record->aarch64_mems);
4122 }
4123
4124 #if GDB_SELF_TEST
4125 namespace selftests {
4126
4127 static void
4128 aarch64_process_record_test (void)
4129 {
4130 struct gdbarch_info info;
4131 uint32_t ret;
4132
4133 gdbarch_info_init (&info);
4134 info.bfd_arch_info = bfd_scan_arch ("aarch64");
4135
4136 struct gdbarch *gdbarch = gdbarch_find_by_info (info);
4137 SELF_CHECK (gdbarch != NULL);
4138
4139 insn_decode_record aarch64_record;
4140
4141 memset (&aarch64_record, 0, sizeof (insn_decode_record));
4142 aarch64_record.regcache = NULL;
4143 aarch64_record.this_addr = 0;
4144 aarch64_record.gdbarch = gdbarch;
4145
4146 /* 20 00 80 f9 prfm pldl1keep, [x1] */
4147 aarch64_record.aarch64_insn = 0xf9800020;
4148 ret = aarch64_record_decode_insn_handler (&aarch64_record);
4149 SELF_CHECK (ret == AARCH64_RECORD_SUCCESS);
4150 SELF_CHECK (aarch64_record.reg_rec_count == 0);
4151 SELF_CHECK (aarch64_record.mem_rec_count == 0);
4152
4153 deallocate_reg_mem (&aarch64_record);
4154 }
4155
4156 } // namespace selftests
4157 #endif /* GDB_SELF_TEST */
4158
4159 /* Parse the current instruction and record the values of the registers and
4160 memory that will be changed in current instruction to record_arch_list
4161 return -1 if something is wrong. */
4162
4163 int
4164 aarch64_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
4165 CORE_ADDR insn_addr)
4166 {
4167 uint32_t rec_no = 0;
4168 uint8_t insn_size = 4;
4169 uint32_t ret = 0;
4170 gdb_byte buf[insn_size];
4171 insn_decode_record aarch64_record;
4172
4173 memset (&buf[0], 0, insn_size);
4174 memset (&aarch64_record, 0, sizeof (insn_decode_record));
4175 target_read_memory (insn_addr, &buf[0], insn_size);
4176 aarch64_record.aarch64_insn
4177 = (uint32_t) extract_unsigned_integer (&buf[0],
4178 insn_size,
4179 gdbarch_byte_order (gdbarch));
4180 aarch64_record.regcache = regcache;
4181 aarch64_record.this_addr = insn_addr;
4182 aarch64_record.gdbarch = gdbarch;
4183
4184 ret = aarch64_record_decode_insn_handler (&aarch64_record);
4185 if (ret == AARCH64_RECORD_UNSUPPORTED)
4186 {
4187 printf_unfiltered (_("Process record does not support instruction "
4188 "0x%0x at address %s.\n"),
4189 aarch64_record.aarch64_insn,
4190 paddress (gdbarch, insn_addr));
4191 ret = -1;
4192 }
4193
4194 if (0 == ret)
4195 {
4196 /* Record registers. */
4197 record_full_arch_list_add_reg (aarch64_record.regcache,
4198 AARCH64_PC_REGNUM);
4199 /* Always record register CPSR. */
4200 record_full_arch_list_add_reg (aarch64_record.regcache,
4201 AARCH64_CPSR_REGNUM);
4202 if (aarch64_record.aarch64_regs)
4203 for (rec_no = 0; rec_no < aarch64_record.reg_rec_count; rec_no++)
4204 if (record_full_arch_list_add_reg (aarch64_record.regcache,
4205 aarch64_record.aarch64_regs[rec_no]))
4206 ret = -1;
4207
4208 /* Record memories. */
4209 if (aarch64_record.aarch64_mems)
4210 for (rec_no = 0; rec_no < aarch64_record.mem_rec_count; rec_no++)
4211 if (record_full_arch_list_add_mem
4212 ((CORE_ADDR)aarch64_record.aarch64_mems[rec_no].addr,
4213 aarch64_record.aarch64_mems[rec_no].len))
4214 ret = -1;
4215
4216 if (record_full_arch_list_add_end ())
4217 ret = -1;
4218 }
4219
4220 deallocate_reg_mem (&aarch64_record);
4221 return ret;
4222 }
This page took 0.117059 seconds and 5 git commands to generate.