1 /* Target-dependent code for GNU/Linux AArch64.
3 Copyright (C) 2009-2023 Free Software Foundation, Inc.
4 Contributed by ARM Ltd.
6 This file is part of GDB.
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.
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.
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/>. */
24 #include "glibc-tdep.h"
25 #include "linux-tdep.h"
26 #include "aarch64-tdep.h"
27 #include "aarch64-linux-tdep.h"
29 #include "solib-svr4.h"
31 #include "tramp-frame.h"
32 #include "trad-frame.h"
34 #include "target/target.h"
41 #include "stap-probe.h"
42 #include "parser-defs.h"
43 #include "user-regs.h"
44 #include "xml-syscall.h"
47 #include "record-full.h"
48 #include "linux-record.h"
50 #include "arch/aarch64-mte-linux.h"
52 #include "arch-utils.h"
55 #include "gdbsupport/selftest.h"
57 #include "elf/common.h"
58 #include "elf/aarch64.h"
60 /* For inferior_ptid and current_inferior (). */
63 /* Signal frame handling.
78 | | | SIGTRAMP_FRAME (struct rt_sigframe)
80 +--| saved sp |--> interrupted_sp
81 | | saved pc |--> interrupted_pc
84 | | saved lr |--> default_restorer (movz x8, NR_sys_rt_sigreturn; svc 0)
90 On signal delivery, the kernel will create a signal handler stack
91 frame and setup the return address in LR to point at restorer stub.
92 The signal stack frame is defined by:
100 The ucontext has the following form:
103 unsigned long uc_flags;
104 struct ucontext *uc_link;
107 struct sigcontext uc_mcontext;
112 unsigned long fault_address;
113 unsigned long regs[31];
114 unsigned long sp; / * 31 * /
115 unsigned long pc; / * 32 * /
116 unsigned long pstate; / * 33 * /
117 __u8 __reserved[4096]
120 The reserved space in sigcontext contains additional structures, each starting
121 with a aarch64_ctx, which specifies a unique identifier and the total size of
122 the structure. The final structure in reserved will start will a null
123 aarch64_ctx. The penultimate entry in reserved may be a extra_context which
124 then points to a further block of reserved space.
131 The restorer stub will always have the form:
133 d28015a8 movz x8, #0xad
136 This is a system call sys_rt_sigreturn.
138 We detect signal frames by snooping the return code for the restorer
139 instruction sequence.
141 The handler then needs to recover the saved register set from
142 ucontext.uc_mcontext. */
144 /* These magic numbers need to reflect the layout of the kernel
145 defined struct rt_sigframe and ucontext. */
146 #define AARCH64_SIGCONTEXT_REG_SIZE 8
147 #define AARCH64_RT_SIGFRAME_UCONTEXT_OFFSET 128
148 #define AARCH64_UCONTEXT_SIGCONTEXT_OFFSET 176
149 #define AARCH64_SIGCONTEXT_XO_OFFSET 8
150 #define AARCH64_SIGCONTEXT_RESERVED_OFFSET 288
152 #define AARCH64_SIGCONTEXT_RESERVED_SIZE 4096
154 /* Unique identifiers that may be used for aarch64_ctx.magic. */
155 #define AARCH64_EXTRA_MAGIC 0x45585401
156 #define AARCH64_FPSIMD_MAGIC 0x46508001
157 #define AARCH64_SVE_MAGIC 0x53564501
159 /* Defines for the extra_context that follows an AARCH64_EXTRA_MAGIC. */
160 #define AARCH64_EXTRA_DATAP_OFFSET 8
162 /* Defines for the fpsimd that follows an AARCH64_FPSIMD_MAGIC. */
163 #define AARCH64_FPSIMD_FPSR_OFFSET 8
164 #define AARCH64_FPSIMD_FPCR_OFFSET 12
165 #define AARCH64_FPSIMD_V0_OFFSET 16
166 #define AARCH64_FPSIMD_VREG_SIZE 16
168 /* Defines for the sve structure that follows an AARCH64_SVE_MAGIC. */
169 #define AARCH64_SVE_CONTEXT_VL_OFFSET 8
170 #define AARCH64_SVE_CONTEXT_REGS_OFFSET 16
171 #define AARCH64_SVE_CONTEXT_P_REGS_OFFSET(vq) (32 * vq * 16)
172 #define AARCH64_SVE_CONTEXT_FFR_OFFSET(vq) \
173 (AARCH64_SVE_CONTEXT_P_REGS_OFFSET (vq) + (16 * vq * 2))
174 #define AARCH64_SVE_CONTEXT_SIZE(vq) \
175 (AARCH64_SVE_CONTEXT_FFR_OFFSET (vq) + (vq * 2))
178 /* Read an aarch64_ctx, returning the magic value, and setting *SIZE to the
179 size, or return 0 on error. */
182 read_aarch64_ctx (CORE_ADDR ctx_addr, enum bfd_endian byte_order,
188 if (target_read_memory (ctx_addr, buf, 4) != 0)
190 magic = extract_unsigned_integer (buf, 4, byte_order);
192 if (target_read_memory (ctx_addr + 4, buf, 4) != 0)
194 *size = extract_unsigned_integer (buf, 4, byte_order);
199 /* Given CACHE, use the trad_frame* functions to restore the FPSIMD
200 registers from a signal frame.
202 VREG_NUM is the number of the V register being restored, OFFSET is the
203 address containing the register value, BYTE_ORDER is the endianness and
204 HAS_SVE tells us if we have a valid SVE context or not. */
207 aarch64_linux_restore_vreg (struct trad_frame_cache *cache, int num_regs,
208 int vreg_num, CORE_ADDR offset,
209 enum bfd_endian byte_order, bool has_sve)
211 /* WARNING: SIMD state is laid out in memory in target-endian format.
213 So we have a couple cases to consider:
215 1 - If the target is big endian, then SIMD state is big endian,
216 requiring a byteswap.
218 2 - If the target is little endian, then SIMD state is little endian, so
219 no byteswap is needed. */
221 if (byte_order == BFD_ENDIAN_BIG)
223 gdb_byte buf[V_REGISTER_SIZE];
225 if (target_read_memory (offset, buf, V_REGISTER_SIZE) != 0)
227 size_t size = V_REGISTER_SIZE/2;
229 /* Read the two halves of the V register in reverse byte order. */
230 CORE_ADDR u64 = extract_unsigned_integer (buf, size,
232 CORE_ADDR l64 = extract_unsigned_integer (buf + size, size,
235 /* Copy the reversed bytes to the buffer. */
236 store_unsigned_integer (buf, size, BFD_ENDIAN_LITTLE, l64);
237 store_unsigned_integer (buf + size , size, BFD_ENDIAN_LITTLE, u64);
239 /* Now we can store the correct bytes for the V register. */
240 trad_frame_set_reg_value_bytes (cache, AARCH64_V0_REGNUM + vreg_num,
241 {buf, V_REGISTER_SIZE});
242 trad_frame_set_reg_value_bytes (cache,
243 num_regs + AARCH64_Q0_REGNUM
244 + vreg_num, {buf, Q_REGISTER_SIZE});
245 trad_frame_set_reg_value_bytes (cache,
246 num_regs + AARCH64_D0_REGNUM
247 + vreg_num, {buf, D_REGISTER_SIZE});
248 trad_frame_set_reg_value_bytes (cache,
249 num_regs + AARCH64_S0_REGNUM
250 + vreg_num, {buf, S_REGISTER_SIZE});
251 trad_frame_set_reg_value_bytes (cache,
252 num_regs + AARCH64_H0_REGNUM
253 + vreg_num, {buf, H_REGISTER_SIZE});
254 trad_frame_set_reg_value_bytes (cache,
255 num_regs + AARCH64_B0_REGNUM
256 + vreg_num, {buf, B_REGISTER_SIZE});
259 trad_frame_set_reg_value_bytes (cache,
260 num_regs + AARCH64_SVE_V0_REGNUM
261 + vreg_num, {buf, V_REGISTER_SIZE});
266 /* Little endian, just point at the address containing the register
268 trad_frame_set_reg_addr (cache, AARCH64_V0_REGNUM + vreg_num, offset);
269 trad_frame_set_reg_addr (cache, num_regs + AARCH64_Q0_REGNUM + vreg_num,
271 trad_frame_set_reg_addr (cache, num_regs + AARCH64_D0_REGNUM + vreg_num,
273 trad_frame_set_reg_addr (cache, num_regs + AARCH64_S0_REGNUM + vreg_num,
275 trad_frame_set_reg_addr (cache, num_regs + AARCH64_H0_REGNUM + vreg_num,
277 trad_frame_set_reg_addr (cache, num_regs + AARCH64_B0_REGNUM + vreg_num,
281 trad_frame_set_reg_addr (cache, num_regs + AARCH64_SVE_V0_REGNUM
286 /* Implement the "init" method of struct tramp_frame. */
289 aarch64_linux_sigframe_init (const struct tramp_frame *self,
290 frame_info_ptr this_frame,
291 struct trad_frame_cache *this_cache,
294 struct gdbarch *gdbarch = get_frame_arch (this_frame);
295 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
296 aarch64_gdbarch_tdep *tdep = gdbarch_tdep<aarch64_gdbarch_tdep> (gdbarch);
297 CORE_ADDR sp = get_frame_register_unsigned (this_frame, AARCH64_SP_REGNUM);
298 CORE_ADDR sigcontext_addr = (sp + AARCH64_RT_SIGFRAME_UCONTEXT_OFFSET
299 + AARCH64_UCONTEXT_SIGCONTEXT_OFFSET );
300 CORE_ADDR section = sigcontext_addr + AARCH64_SIGCONTEXT_RESERVED_OFFSET;
301 CORE_ADDR section_end = section + AARCH64_SIGCONTEXT_RESERVED_SIZE;
302 CORE_ADDR fpsimd = 0;
303 CORE_ADDR sve_regs = 0;
304 uint32_t size, magic;
305 bool extra_found = false;
306 int num_regs = gdbarch_num_regs (gdbarch);
308 /* Read in the integer registers. */
310 for (int i = 0; i < 31; i++)
312 trad_frame_set_reg_addr (this_cache,
313 AARCH64_X0_REGNUM + i,
314 sigcontext_addr + AARCH64_SIGCONTEXT_XO_OFFSET
315 + i * AARCH64_SIGCONTEXT_REG_SIZE);
317 trad_frame_set_reg_addr (this_cache, AARCH64_SP_REGNUM,
318 sigcontext_addr + AARCH64_SIGCONTEXT_XO_OFFSET
319 + 31 * AARCH64_SIGCONTEXT_REG_SIZE);
320 trad_frame_set_reg_addr (this_cache, AARCH64_PC_REGNUM,
321 sigcontext_addr + AARCH64_SIGCONTEXT_XO_OFFSET
322 + 32 * AARCH64_SIGCONTEXT_REG_SIZE);
324 /* Search for the FP and SVE sections, stopping at null. */
325 while ((magic = read_aarch64_ctx (section, byte_order, &size)) != 0
330 case AARCH64_FPSIMD_MAGIC:
335 case AARCH64_SVE_MAGIC:
337 /* Check if the section is followed by a full SVE dump, and set
338 sve_regs if it is. */
342 if (!tdep->has_sve ())
345 if (target_read_memory (section + AARCH64_SVE_CONTEXT_VL_OFFSET,
351 vq = sve_vq_from_vl (extract_unsigned_integer (buf, 2, byte_order));
354 error (_("Invalid vector length in signal frame %d vs %s."), vq,
355 pulongest (tdep->vq));
357 if (size >= AARCH64_SVE_CONTEXT_SIZE (vq))
358 sve_regs = section + AARCH64_SVE_CONTEXT_REGS_OFFSET;
364 case AARCH64_EXTRA_MAGIC:
366 /* Extra is always the last valid section in reserved and points to
367 an additional block of memory filled with more sections. Reset
368 the address to the extra section and continue looking for more
372 if (target_read_memory (section + AARCH64_EXTRA_DATAP_OFFSET,
379 section = extract_unsigned_integer (buf, 8, byte_order);
389 /* Prevent searching past the end of the reserved section. The extra
390 section does not have a hard coded limit - we have to rely on it ending
392 if (!extra_found && section > section_end)
400 for (int i = 0; i < 32; i++)
402 offset = sve_regs + (i * tdep->vq * 16);
403 trad_frame_set_reg_addr (this_cache, AARCH64_SVE_Z0_REGNUM + i,
405 trad_frame_set_reg_addr (this_cache,
406 num_regs + AARCH64_SVE_V0_REGNUM + i,
408 trad_frame_set_reg_addr (this_cache, num_regs + AARCH64_Q0_REGNUM + i,
410 trad_frame_set_reg_addr (this_cache, num_regs + AARCH64_D0_REGNUM + i,
412 trad_frame_set_reg_addr (this_cache, num_regs + AARCH64_S0_REGNUM + i,
414 trad_frame_set_reg_addr (this_cache, num_regs + AARCH64_H0_REGNUM + i,
416 trad_frame_set_reg_addr (this_cache, num_regs + AARCH64_B0_REGNUM + i,
420 offset = sve_regs + AARCH64_SVE_CONTEXT_P_REGS_OFFSET (tdep->vq);
421 for (int i = 0; i < 16; i++)
422 trad_frame_set_reg_addr (this_cache, AARCH64_SVE_P0_REGNUM + i,
423 offset + (i * tdep->vq * 2));
425 offset = sve_regs + AARCH64_SVE_CONTEXT_FFR_OFFSET (tdep->vq);
426 trad_frame_set_reg_addr (this_cache, AARCH64_SVE_FFR_REGNUM, offset);
431 trad_frame_set_reg_addr (this_cache, AARCH64_FPSR_REGNUM,
432 fpsimd + AARCH64_FPSIMD_FPSR_OFFSET);
433 trad_frame_set_reg_addr (this_cache, AARCH64_FPCR_REGNUM,
434 fpsimd + AARCH64_FPSIMD_FPCR_OFFSET);
436 /* If there was no SVE section then set up the V registers. */
439 for (int i = 0; i < 32; i++)
441 CORE_ADDR offset = (fpsimd + AARCH64_FPSIMD_V0_OFFSET
442 + (i * AARCH64_FPSIMD_VREG_SIZE));
444 aarch64_linux_restore_vreg (this_cache, num_regs, i, offset,
445 byte_order, tdep->has_sve ());
450 trad_frame_set_id (this_cache, frame_id_build (sp, func));
453 static const struct tramp_frame aarch64_linux_rt_sigframe =
458 /* movz x8, 0x8b (S=1,o=10,h=0,i=0x8b,r=8)
459 Soo1 0010 1hhi iiii iiii iiii iiir rrrr */
460 {0xd2801168, ULONGEST_MAX},
462 /* svc 0x0 (o=0, l=1)
463 1101 0100 oooi iiii iiii iiii iii0 00ll */
464 {0xd4000001, ULONGEST_MAX},
465 {TRAMP_SENTINEL_INSN, ULONGEST_MAX}
467 aarch64_linux_sigframe_init
472 static const struct regcache_map_entry aarch64_linux_gregmap[] =
474 { 31, AARCH64_X0_REGNUM, 8 }, /* x0 ... x30 */
475 { 1, AARCH64_SP_REGNUM, 8 },
476 { 1, AARCH64_PC_REGNUM, 8 },
477 { 1, AARCH64_CPSR_REGNUM, 8 },
481 static const struct regcache_map_entry aarch64_linux_fpregmap[] =
483 { 32, AARCH64_V0_REGNUM, 16 }, /* v0 ... v31 */
484 { 1, AARCH64_FPSR_REGNUM, 4 },
485 { 1, AARCH64_FPCR_REGNUM, 4 },
489 /* Register set definitions. */
491 const struct regset aarch64_linux_gregset =
493 aarch64_linux_gregmap,
494 regcache_supply_regset, regcache_collect_regset
497 const struct regset aarch64_linux_fpregset =
499 aarch64_linux_fpregmap,
500 regcache_supply_regset, regcache_collect_regset
503 /* The fields in an SVE header at the start of a SVE regset. */
505 #define SVE_HEADER_SIZE_LENGTH 4
506 #define SVE_HEADER_MAX_SIZE_LENGTH 4
507 #define SVE_HEADER_VL_LENGTH 2
508 #define SVE_HEADER_MAX_VL_LENGTH 2
509 #define SVE_HEADER_FLAGS_LENGTH 2
510 #define SVE_HEADER_RESERVED_LENGTH 2
512 #define SVE_HEADER_SIZE_OFFSET 0
513 #define SVE_HEADER_MAX_SIZE_OFFSET \
514 (SVE_HEADER_SIZE_OFFSET + SVE_HEADER_SIZE_LENGTH)
515 #define SVE_HEADER_VL_OFFSET \
516 (SVE_HEADER_MAX_SIZE_OFFSET + SVE_HEADER_MAX_SIZE_LENGTH)
517 #define SVE_HEADER_MAX_VL_OFFSET \
518 (SVE_HEADER_VL_OFFSET + SVE_HEADER_VL_LENGTH)
519 #define SVE_HEADER_FLAGS_OFFSET \
520 (SVE_HEADER_MAX_VL_OFFSET + SVE_HEADER_MAX_VL_LENGTH)
521 #define SVE_HEADER_RESERVED_OFFSET \
522 (SVE_HEADER_FLAGS_OFFSET + SVE_HEADER_FLAGS_LENGTH)
523 #define SVE_HEADER_SIZE \
524 (SVE_HEADER_RESERVED_OFFSET + SVE_HEADER_RESERVED_LENGTH)
526 #define SVE_HEADER_FLAG_SVE 1
528 /* Get VQ value from SVE section in the core dump. */
531 aarch64_linux_core_read_vq (struct gdbarch *gdbarch, bfd *abfd)
533 gdb_byte header[SVE_HEADER_SIZE];
534 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
535 asection *sve_section = bfd_get_section_by_name (abfd, ".reg-aarch-sve");
537 if (sve_section == nullptr)
543 size_t size = bfd_section_size (sve_section);
545 /* Check extended state size. */
546 if (size < SVE_HEADER_SIZE)
548 warning (_("'.reg-aarch-sve' section in core file too small."));
552 if (!bfd_get_section_contents (abfd, sve_section, header, 0, SVE_HEADER_SIZE))
554 warning (_("Couldn't read sve header from "
555 "'.reg-aarch-sve' section in core file."));
559 uint64_t vl = extract_unsigned_integer (header + SVE_HEADER_VL_OFFSET,
560 SVE_HEADER_VL_LENGTH, byte_order);
561 uint64_t vq = sve_vq_from_vl (vl);
563 if (vq > AARCH64_MAX_SVE_VQ)
565 warning (_("SVE Vector length in core file not supported by this version"
566 " of GDB. (VQ=%s)"), pulongest (vq));
571 warning (_("SVE Vector length in core file is invalid. (VQ=%s"),
579 /* Supply register REGNUM from BUF to REGCACHE, using the register map
580 in REGSET. If REGNUM is -1, do this for all registers in REGSET.
581 If BUF is NULL, set the registers to "unavailable" status. */
584 aarch64_linux_supply_sve_regset (const struct regset *regset,
585 struct regcache *regcache,
586 int regnum, const void *buf, size_t size)
588 gdb_byte *header = (gdb_byte *) buf;
589 struct gdbarch *gdbarch = regcache->arch ();
590 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
593 return regcache->supply_regset (regset, regnum, nullptr, size);
594 gdb_assert (size > SVE_HEADER_SIZE);
596 /* BUF contains an SVE header followed by a register dump of either the
597 passed in SVE regset or a NEON fpregset. */
599 /* Extract required fields from the header. */
600 ULONGEST vl = extract_unsigned_integer (header + SVE_HEADER_VL_OFFSET,
601 SVE_HEADER_VL_LENGTH, byte_order);
602 uint16_t flags = extract_unsigned_integer (header + SVE_HEADER_FLAGS_OFFSET,
603 SVE_HEADER_FLAGS_LENGTH,
606 if (regnum == -1 || regnum == AARCH64_SVE_VG_REGNUM)
608 gdb_byte vg_target[8];
609 store_integer ((gdb_byte *)&vg_target, sizeof (uint64_t), byte_order,
610 sve_vg_from_vl (vl));
611 regcache->raw_supply (AARCH64_SVE_VG_REGNUM, &vg_target);
614 if (flags & SVE_HEADER_FLAG_SVE)
616 /* Register dump is a SVE structure. */
617 regcache->supply_regset (regset, regnum,
618 (gdb_byte *) buf + SVE_HEADER_SIZE,
619 size - SVE_HEADER_SIZE);
623 /* Register dump is a fpsimd structure. First clear the SVE
625 for (int i = 0; i < AARCH64_SVE_Z_REGS_NUM; i++)
626 regcache->raw_supply_zeroed (AARCH64_SVE_Z0_REGNUM + i);
627 for (int i = 0; i < AARCH64_SVE_P_REGS_NUM; i++)
628 regcache->raw_supply_zeroed (AARCH64_SVE_P0_REGNUM + i);
629 regcache->raw_supply_zeroed (AARCH64_SVE_FFR_REGNUM);
631 /* Then supply the fpsimd registers. */
632 regcache->supply_regset (&aarch64_linux_fpregset, regnum,
633 (gdb_byte *) buf + SVE_HEADER_SIZE,
634 size - SVE_HEADER_SIZE);
638 /* Collect register REGNUM from REGCACHE to BUF, using the register
639 map in REGSET. If REGNUM is -1, do this for all registers in
643 aarch64_linux_collect_sve_regset (const struct regset *regset,
644 const struct regcache *regcache,
645 int regnum, void *buf, size_t size)
647 gdb_byte *header = (gdb_byte *) buf;
648 struct gdbarch *gdbarch = regcache->arch ();
649 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
650 aarch64_gdbarch_tdep *tdep = gdbarch_tdep<aarch64_gdbarch_tdep> (gdbarch);
651 uint64_t vq = tdep->vq;
653 gdb_assert (buf != NULL);
654 gdb_assert (size > SVE_HEADER_SIZE);
656 /* BUF starts with a SVE header prior to the register dump. */
658 store_unsigned_integer (header + SVE_HEADER_SIZE_OFFSET,
659 SVE_HEADER_SIZE_LENGTH, byte_order, size);
660 store_unsigned_integer (header + SVE_HEADER_MAX_SIZE_OFFSET,
661 SVE_HEADER_MAX_SIZE_LENGTH, byte_order, size);
662 store_unsigned_integer (header + SVE_HEADER_VL_OFFSET, SVE_HEADER_VL_LENGTH,
663 byte_order, sve_vl_from_vq (vq));
664 store_unsigned_integer (header + SVE_HEADER_MAX_VL_OFFSET,
665 SVE_HEADER_MAX_VL_LENGTH, byte_order,
666 sve_vl_from_vq (vq));
667 store_unsigned_integer (header + SVE_HEADER_FLAGS_OFFSET,
668 SVE_HEADER_FLAGS_LENGTH, byte_order,
669 SVE_HEADER_FLAG_SVE);
670 store_unsigned_integer (header + SVE_HEADER_RESERVED_OFFSET,
671 SVE_HEADER_RESERVED_LENGTH, byte_order, 0);
673 /* The SVE register dump follows. */
674 regcache->collect_regset (regset, regnum, (gdb_byte *) buf + SVE_HEADER_SIZE,
675 size - SVE_HEADER_SIZE);
678 /* Implement the "iterate_over_regset_sections" gdbarch method. */
681 aarch64_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
682 iterate_over_regset_sections_cb *cb,
684 const struct regcache *regcache)
686 aarch64_gdbarch_tdep *tdep = gdbarch_tdep<aarch64_gdbarch_tdep> (gdbarch);
688 cb (".reg", AARCH64_LINUX_SIZEOF_GREGSET, AARCH64_LINUX_SIZEOF_GREGSET,
689 &aarch64_linux_gregset, NULL, cb_data);
691 if (tdep->has_sve ())
693 /* Create this on the fly in order to handle vector register sizes. */
694 const struct regcache_map_entry sve_regmap[] =
696 { 32, AARCH64_SVE_Z0_REGNUM, (int) (tdep->vq * 16) },
697 { 16, AARCH64_SVE_P0_REGNUM, (int) (tdep->vq * 16 / 8) },
698 { 1, AARCH64_SVE_FFR_REGNUM, (int) (tdep->vq * 16 / 8) },
699 { 1, AARCH64_FPSR_REGNUM, 4 },
700 { 1, AARCH64_FPCR_REGNUM, 4 },
704 const struct regset aarch64_linux_sve_regset =
707 aarch64_linux_supply_sve_regset, aarch64_linux_collect_sve_regset,
711 cb (".reg-aarch-sve",
712 SVE_HEADER_SIZE + regcache_map_entry_size (aarch64_linux_fpregmap),
713 SVE_HEADER_SIZE + regcache_map_entry_size (sve_regmap),
714 &aarch64_linux_sve_regset, "SVE registers", cb_data);
717 cb (".reg2", AARCH64_LINUX_SIZEOF_FPREGSET, AARCH64_LINUX_SIZEOF_FPREGSET,
718 &aarch64_linux_fpregset, NULL, cb_data);
721 if (tdep->has_pauth ())
723 /* Create this on the fly in order to handle the variable location. */
724 const struct regcache_map_entry pauth_regmap[] =
726 { 2, AARCH64_PAUTH_DMASK_REGNUM (tdep->pauth_reg_base), 8},
730 const struct regset aarch64_linux_pauth_regset =
732 pauth_regmap, regcache_supply_regset, regcache_collect_regset
735 cb (".reg-aarch-pauth", AARCH64_LINUX_SIZEOF_PAUTH,
736 AARCH64_LINUX_SIZEOF_PAUTH, &aarch64_linux_pauth_regset,
737 "pauth registers", cb_data);
740 /* Handle MTE registers. */
741 if (tdep->has_mte ())
743 /* Create this on the fly in order to handle the variable location. */
744 const struct regcache_map_entry mte_regmap[] =
746 { 1, tdep->mte_reg_base, 8},
750 const struct regset aarch64_linux_mte_regset =
752 mte_regmap, regcache_supply_regset, regcache_collect_regset
755 cb (".reg-aarch-mte", AARCH64_LINUX_SIZEOF_MTE_REGSET,
756 AARCH64_LINUX_SIZEOF_MTE_REGSET, &aarch64_linux_mte_regset,
757 "MTE registers", cb_data);
760 /* Handle the TLS registers. */
761 if (tdep->has_tls ())
763 gdb_assert (tdep->tls_regnum_base != -1);
764 gdb_assert (tdep->tls_register_count > 0);
766 int sizeof_tls_regset
767 = AARCH64_TLS_REGISTER_SIZE * tdep->tls_register_count;
769 const struct regcache_map_entry tls_regmap[] =
771 { tdep->tls_register_count, tdep->tls_regnum_base,
772 AARCH64_TLS_REGISTER_SIZE },
776 const struct regset aarch64_linux_tls_regset =
778 tls_regmap, regcache_supply_regset, regcache_collect_regset,
782 cb (".reg-aarch-tls", sizeof_tls_regset, sizeof_tls_regset,
783 &aarch64_linux_tls_regset, "TLS register", cb_data);
787 /* Implement the "core_read_description" gdbarch method. */
789 static const struct target_desc *
790 aarch64_linux_core_read_description (struct gdbarch *gdbarch,
791 struct target_ops *target, bfd *abfd)
793 gdb::optional<gdb::byte_vector> auxv = target_read_auxv_raw (target);
794 CORE_ADDR hwcap = linux_get_hwcap (auxv, target, gdbarch);
795 CORE_ADDR hwcap2 = linux_get_hwcap2 (auxv, target, gdbarch);
797 aarch64_features features;
798 features.vq = aarch64_linux_core_read_vq (gdbarch, abfd);
799 features.pauth = hwcap & AARCH64_HWCAP_PACA;
800 features.mte = hwcap2 & HWCAP2_MTE;
802 /* Handle the TLS section. */
803 asection *tls = bfd_get_section_by_name (abfd, ".reg-aarch-tls");
806 size_t size = bfd_section_size (tls);
807 /* Convert the size to the number of actual registers, by
809 features.tls = size / AARCH64_TLS_REGISTER_SIZE;
812 return aarch64_read_description (features);
815 /* Implementation of `gdbarch_stap_is_single_operand', as defined in
819 aarch64_stap_is_single_operand (struct gdbarch *gdbarch, const char *s)
821 return (*s == '#' || isdigit (*s) /* Literal number. */
822 || *s == '[' /* Register indirection. */
823 || isalpha (*s)); /* Register value. */
826 /* This routine is used to parse a special token in AArch64's assembly.
828 The special tokens parsed by it are:
830 - Register displacement (e.g, [fp, #-8])
832 It returns one if the special token has been parsed successfully,
833 or zero if the current token is not considered special. */
835 static expr::operation_up
836 aarch64_stap_parse_special_token (struct gdbarch *gdbarch,
837 struct stap_parse_info *p)
841 /* Temporary holder for lookahead. */
842 const char *tmp = p->arg;
844 /* Used to save the register name. */
854 while (isalnum (*tmp))
861 std::string regname (start, len);
863 if (user_reg_map_name_to_regnum (gdbarch, regname.c_str (), len) == -1)
864 error (_("Invalid register name `%s' on expression `%s'."),
865 regname.c_str (), p->saved_arg);
868 tmp = skip_spaces (tmp);
869 /* Now we expect a number. It can begin with '#' or simply
879 else if (*tmp == '+')
885 displacement = strtol (tmp, &endp, 10);
888 /* Skipping last `]'. */
893 using namespace expr;
895 /* The displacement. */
896 struct type *long_type = builtin_type (gdbarch)->builtin_long;
898 displacement = -displacement;
899 operation_up disp = make_operation<long_const_operation> (long_type,
902 /* The register name. */
904 = make_operation<register_operation> (std::move (regname));
907 = make_operation<add_operation> (std::move (reg), std::move (disp));
909 /* Casting to the expected type. */
910 struct type *arg_ptr_type = lookup_pointer_type (p->arg_type);
911 sum = make_operation<unop_cast_operation> (std::move (sum),
913 return make_operation<unop_ind_operation> (std::move (sum));
918 /* AArch64 process record-replay constructs: syscall, signal etc. */
920 static linux_record_tdep aarch64_linux_record_tdep;
922 /* Enum that defines the AArch64 linux specific syscall identifiers used for
923 process record/replay. */
925 enum aarch64_syscall {
926 aarch64_sys_io_setup = 0,
927 aarch64_sys_io_destroy = 1,
928 aarch64_sys_io_submit = 2,
929 aarch64_sys_io_cancel = 3,
930 aarch64_sys_io_getevents = 4,
931 aarch64_sys_setxattr = 5,
932 aarch64_sys_lsetxattr = 6,
933 aarch64_sys_fsetxattr = 7,
934 aarch64_sys_getxattr = 8,
935 aarch64_sys_lgetxattr = 9,
936 aarch64_sys_fgetxattr = 10,
937 aarch64_sys_listxattr = 11,
938 aarch64_sys_llistxattr = 12,
939 aarch64_sys_flistxattr = 13,
940 aarch64_sys_removexattr = 14,
941 aarch64_sys_lremovexattr = 15,
942 aarch64_sys_fremovexattr = 16,
943 aarch64_sys_getcwd = 17,
944 aarch64_sys_lookup_dcookie = 18,
945 aarch64_sys_eventfd2 = 19,
946 aarch64_sys_epoll_create1 = 20,
947 aarch64_sys_epoll_ctl = 21,
948 aarch64_sys_epoll_pwait = 22,
949 aarch64_sys_dup = 23,
950 aarch64_sys_dup3 = 24,
951 aarch64_sys_fcntl = 25,
952 aarch64_sys_inotify_init1 = 26,
953 aarch64_sys_inotify_add_watch = 27,
954 aarch64_sys_inotify_rm_watch = 28,
955 aarch64_sys_ioctl = 29,
956 aarch64_sys_ioprio_set = 30,
957 aarch64_sys_ioprio_get = 31,
958 aarch64_sys_flock = 32,
959 aarch64_sys_mknodat = 33,
960 aarch64_sys_mkdirat = 34,
961 aarch64_sys_unlinkat = 35,
962 aarch64_sys_symlinkat = 36,
963 aarch64_sys_linkat = 37,
964 aarch64_sys_renameat = 38,
965 aarch64_sys_umount2 = 39,
966 aarch64_sys_mount = 40,
967 aarch64_sys_pivot_root = 41,
968 aarch64_sys_nfsservctl = 42,
969 aarch64_sys_statfs = 43,
970 aarch64_sys_fstatfs = 44,
971 aarch64_sys_truncate = 45,
972 aarch64_sys_ftruncate = 46,
973 aarch64_sys_fallocate = 47,
974 aarch64_sys_faccessat = 48,
975 aarch64_sys_chdir = 49,
976 aarch64_sys_fchdir = 50,
977 aarch64_sys_chroot = 51,
978 aarch64_sys_fchmod = 52,
979 aarch64_sys_fchmodat = 53,
980 aarch64_sys_fchownat = 54,
981 aarch64_sys_fchown = 55,
982 aarch64_sys_openat = 56,
983 aarch64_sys_close = 57,
984 aarch64_sys_vhangup = 58,
985 aarch64_sys_pipe2 = 59,
986 aarch64_sys_quotactl = 60,
987 aarch64_sys_getdents64 = 61,
988 aarch64_sys_lseek = 62,
989 aarch64_sys_read = 63,
990 aarch64_sys_write = 64,
991 aarch64_sys_readv = 65,
992 aarch64_sys_writev = 66,
993 aarch64_sys_pread64 = 67,
994 aarch64_sys_pwrite64 = 68,
995 aarch64_sys_preadv = 69,
996 aarch64_sys_pwritev = 70,
997 aarch64_sys_sendfile = 71,
998 aarch64_sys_pselect6 = 72,
999 aarch64_sys_ppoll = 73,
1000 aarch64_sys_signalfd4 = 74,
1001 aarch64_sys_vmsplice = 75,
1002 aarch64_sys_splice = 76,
1003 aarch64_sys_tee = 77,
1004 aarch64_sys_readlinkat = 78,
1005 aarch64_sys_newfstatat = 79,
1006 aarch64_sys_fstat = 80,
1007 aarch64_sys_sync = 81,
1008 aarch64_sys_fsync = 82,
1009 aarch64_sys_fdatasync = 83,
1010 aarch64_sys_sync_file_range2 = 84,
1011 aarch64_sys_sync_file_range = 84,
1012 aarch64_sys_timerfd_create = 85,
1013 aarch64_sys_timerfd_settime = 86,
1014 aarch64_sys_timerfd_gettime = 87,
1015 aarch64_sys_utimensat = 88,
1016 aarch64_sys_acct = 89,
1017 aarch64_sys_capget = 90,
1018 aarch64_sys_capset = 91,
1019 aarch64_sys_personality = 92,
1020 aarch64_sys_exit = 93,
1021 aarch64_sys_exit_group = 94,
1022 aarch64_sys_waitid = 95,
1023 aarch64_sys_set_tid_address = 96,
1024 aarch64_sys_unshare = 97,
1025 aarch64_sys_futex = 98,
1026 aarch64_sys_set_robust_list = 99,
1027 aarch64_sys_get_robust_list = 100,
1028 aarch64_sys_nanosleep = 101,
1029 aarch64_sys_getitimer = 102,
1030 aarch64_sys_setitimer = 103,
1031 aarch64_sys_kexec_load = 104,
1032 aarch64_sys_init_module = 105,
1033 aarch64_sys_delete_module = 106,
1034 aarch64_sys_timer_create = 107,
1035 aarch64_sys_timer_gettime = 108,
1036 aarch64_sys_timer_getoverrun = 109,
1037 aarch64_sys_timer_settime = 110,
1038 aarch64_sys_timer_delete = 111,
1039 aarch64_sys_clock_settime = 112,
1040 aarch64_sys_clock_gettime = 113,
1041 aarch64_sys_clock_getres = 114,
1042 aarch64_sys_clock_nanosleep = 115,
1043 aarch64_sys_syslog = 116,
1044 aarch64_sys_ptrace = 117,
1045 aarch64_sys_sched_setparam = 118,
1046 aarch64_sys_sched_setscheduler = 119,
1047 aarch64_sys_sched_getscheduler = 120,
1048 aarch64_sys_sched_getparam = 121,
1049 aarch64_sys_sched_setaffinity = 122,
1050 aarch64_sys_sched_getaffinity = 123,
1051 aarch64_sys_sched_yield = 124,
1052 aarch64_sys_sched_get_priority_max = 125,
1053 aarch64_sys_sched_get_priority_min = 126,
1054 aarch64_sys_sched_rr_get_interval = 127,
1055 aarch64_sys_kill = 129,
1056 aarch64_sys_tkill = 130,
1057 aarch64_sys_tgkill = 131,
1058 aarch64_sys_sigaltstack = 132,
1059 aarch64_sys_rt_sigsuspend = 133,
1060 aarch64_sys_rt_sigaction = 134,
1061 aarch64_sys_rt_sigprocmask = 135,
1062 aarch64_sys_rt_sigpending = 136,
1063 aarch64_sys_rt_sigtimedwait = 137,
1064 aarch64_sys_rt_sigqueueinfo = 138,
1065 aarch64_sys_rt_sigreturn = 139,
1066 aarch64_sys_setpriority = 140,
1067 aarch64_sys_getpriority = 141,
1068 aarch64_sys_reboot = 142,
1069 aarch64_sys_setregid = 143,
1070 aarch64_sys_setgid = 144,
1071 aarch64_sys_setreuid = 145,
1072 aarch64_sys_setuid = 146,
1073 aarch64_sys_setresuid = 147,
1074 aarch64_sys_getresuid = 148,
1075 aarch64_sys_setresgid = 149,
1076 aarch64_sys_getresgid = 150,
1077 aarch64_sys_setfsuid = 151,
1078 aarch64_sys_setfsgid = 152,
1079 aarch64_sys_times = 153,
1080 aarch64_sys_setpgid = 154,
1081 aarch64_sys_getpgid = 155,
1082 aarch64_sys_getsid = 156,
1083 aarch64_sys_setsid = 157,
1084 aarch64_sys_getgroups = 158,
1085 aarch64_sys_setgroups = 159,
1086 aarch64_sys_uname = 160,
1087 aarch64_sys_sethostname = 161,
1088 aarch64_sys_setdomainname = 162,
1089 aarch64_sys_getrlimit = 163,
1090 aarch64_sys_setrlimit = 164,
1091 aarch64_sys_getrusage = 165,
1092 aarch64_sys_umask = 166,
1093 aarch64_sys_prctl = 167,
1094 aarch64_sys_getcpu = 168,
1095 aarch64_sys_gettimeofday = 169,
1096 aarch64_sys_settimeofday = 170,
1097 aarch64_sys_adjtimex = 171,
1098 aarch64_sys_getpid = 172,
1099 aarch64_sys_getppid = 173,
1100 aarch64_sys_getuid = 174,
1101 aarch64_sys_geteuid = 175,
1102 aarch64_sys_getgid = 176,
1103 aarch64_sys_getegid = 177,
1104 aarch64_sys_gettid = 178,
1105 aarch64_sys_sysinfo = 179,
1106 aarch64_sys_mq_open = 180,
1107 aarch64_sys_mq_unlink = 181,
1108 aarch64_sys_mq_timedsend = 182,
1109 aarch64_sys_mq_timedreceive = 183,
1110 aarch64_sys_mq_notify = 184,
1111 aarch64_sys_mq_getsetattr = 185,
1112 aarch64_sys_msgget = 186,
1113 aarch64_sys_msgctl = 187,
1114 aarch64_sys_msgrcv = 188,
1115 aarch64_sys_msgsnd = 189,
1116 aarch64_sys_semget = 190,
1117 aarch64_sys_semctl = 191,
1118 aarch64_sys_semtimedop = 192,
1119 aarch64_sys_semop = 193,
1120 aarch64_sys_shmget = 194,
1121 aarch64_sys_shmctl = 195,
1122 aarch64_sys_shmat = 196,
1123 aarch64_sys_shmdt = 197,
1124 aarch64_sys_socket = 198,
1125 aarch64_sys_socketpair = 199,
1126 aarch64_sys_bind = 200,
1127 aarch64_sys_listen = 201,
1128 aarch64_sys_accept = 202,
1129 aarch64_sys_connect = 203,
1130 aarch64_sys_getsockname = 204,
1131 aarch64_sys_getpeername = 205,
1132 aarch64_sys_sendto = 206,
1133 aarch64_sys_recvfrom = 207,
1134 aarch64_sys_setsockopt = 208,
1135 aarch64_sys_getsockopt = 209,
1136 aarch64_sys_shutdown = 210,
1137 aarch64_sys_sendmsg = 211,
1138 aarch64_sys_recvmsg = 212,
1139 aarch64_sys_readahead = 213,
1140 aarch64_sys_brk = 214,
1141 aarch64_sys_munmap = 215,
1142 aarch64_sys_mremap = 216,
1143 aarch64_sys_add_key = 217,
1144 aarch64_sys_request_key = 218,
1145 aarch64_sys_keyctl = 219,
1146 aarch64_sys_clone = 220,
1147 aarch64_sys_execve = 221,
1148 aarch64_sys_mmap = 222,
1149 aarch64_sys_fadvise64 = 223,
1150 aarch64_sys_swapon = 224,
1151 aarch64_sys_swapoff = 225,
1152 aarch64_sys_mprotect = 226,
1153 aarch64_sys_msync = 227,
1154 aarch64_sys_mlock = 228,
1155 aarch64_sys_munlock = 229,
1156 aarch64_sys_mlockall = 230,
1157 aarch64_sys_munlockall = 231,
1158 aarch64_sys_mincore = 232,
1159 aarch64_sys_madvise = 233,
1160 aarch64_sys_remap_file_pages = 234,
1161 aarch64_sys_mbind = 235,
1162 aarch64_sys_get_mempolicy = 236,
1163 aarch64_sys_set_mempolicy = 237,
1164 aarch64_sys_migrate_pages = 238,
1165 aarch64_sys_move_pages = 239,
1166 aarch64_sys_rt_tgsigqueueinfo = 240,
1167 aarch64_sys_perf_event_open = 241,
1168 aarch64_sys_accept4 = 242,
1169 aarch64_sys_recvmmsg = 243,
1170 aarch64_sys_wait4 = 260,
1171 aarch64_sys_prlimit64 = 261,
1172 aarch64_sys_fanotify_init = 262,
1173 aarch64_sys_fanotify_mark = 263,
1174 aarch64_sys_name_to_handle_at = 264,
1175 aarch64_sys_open_by_handle_at = 265,
1176 aarch64_sys_clock_adjtime = 266,
1177 aarch64_sys_syncfs = 267,
1178 aarch64_sys_setns = 268,
1179 aarch64_sys_sendmmsg = 269,
1180 aarch64_sys_process_vm_readv = 270,
1181 aarch64_sys_process_vm_writev = 271,
1182 aarch64_sys_kcmp = 272,
1183 aarch64_sys_finit_module = 273,
1184 aarch64_sys_sched_setattr = 274,
1185 aarch64_sys_sched_getattr = 275,
1186 aarch64_sys_getrandom = 278
1189 /* aarch64_canonicalize_syscall maps syscall ids from the native AArch64
1190 linux set of syscall ids into a canonical set of syscall ids used by
1193 static enum gdb_syscall
1194 aarch64_canonicalize_syscall (enum aarch64_syscall syscall_number)
1196 #define SYSCALL_MAP(SYSCALL) case aarch64_sys_##SYSCALL: \
1197 return gdb_sys_##SYSCALL
1199 #define UNSUPPORTED_SYSCALL_MAP(SYSCALL) case aarch64_sys_##SYSCALL: \
1200 return gdb_sys_no_syscall
1202 switch (syscall_number)
1204 SYSCALL_MAP (io_setup);
1205 SYSCALL_MAP (io_destroy);
1206 SYSCALL_MAP (io_submit);
1207 SYSCALL_MAP (io_cancel);
1208 SYSCALL_MAP (io_getevents);
1210 SYSCALL_MAP (setxattr);
1211 SYSCALL_MAP (lsetxattr);
1212 SYSCALL_MAP (fsetxattr);
1213 SYSCALL_MAP (getxattr);
1214 SYSCALL_MAP (lgetxattr);
1215 SYSCALL_MAP (fgetxattr);
1216 SYSCALL_MAP (listxattr);
1217 SYSCALL_MAP (llistxattr);
1218 SYSCALL_MAP (flistxattr);
1219 SYSCALL_MAP (removexattr);
1220 SYSCALL_MAP (lremovexattr);
1221 SYSCALL_MAP (fremovexattr);
1222 SYSCALL_MAP (getcwd);
1223 SYSCALL_MAP (lookup_dcookie);
1224 SYSCALL_MAP (eventfd2);
1225 SYSCALL_MAP (epoll_create1);
1226 SYSCALL_MAP (epoll_ctl);
1227 SYSCALL_MAP (epoll_pwait);
1230 SYSCALL_MAP (fcntl);
1231 SYSCALL_MAP (inotify_init1);
1232 SYSCALL_MAP (inotify_add_watch);
1233 SYSCALL_MAP (inotify_rm_watch);
1234 SYSCALL_MAP (ioctl);
1235 SYSCALL_MAP (ioprio_set);
1236 SYSCALL_MAP (ioprio_get);
1237 SYSCALL_MAP (flock);
1238 SYSCALL_MAP (mknodat);
1239 SYSCALL_MAP (mkdirat);
1240 SYSCALL_MAP (unlinkat);
1241 SYSCALL_MAP (symlinkat);
1242 SYSCALL_MAP (linkat);
1243 SYSCALL_MAP (renameat);
1244 UNSUPPORTED_SYSCALL_MAP (umount2);
1245 SYSCALL_MAP (mount);
1246 SYSCALL_MAP (pivot_root);
1247 SYSCALL_MAP (nfsservctl);
1248 SYSCALL_MAP (statfs);
1249 SYSCALL_MAP (truncate);
1250 SYSCALL_MAP (ftruncate);
1251 SYSCALL_MAP (fallocate);
1252 SYSCALL_MAP (faccessat);
1253 SYSCALL_MAP (fchdir);
1254 SYSCALL_MAP (chroot);
1255 SYSCALL_MAP (fchmod);
1256 SYSCALL_MAP (fchmodat);
1257 SYSCALL_MAP (fchownat);
1258 SYSCALL_MAP (fchown);
1259 SYSCALL_MAP (openat);
1260 SYSCALL_MAP (close);
1261 SYSCALL_MAP (vhangup);
1262 SYSCALL_MAP (pipe2);
1263 SYSCALL_MAP (quotactl);
1264 SYSCALL_MAP (getdents64);
1265 SYSCALL_MAP (lseek);
1267 SYSCALL_MAP (write);
1268 SYSCALL_MAP (readv);
1269 SYSCALL_MAP (writev);
1270 SYSCALL_MAP (pread64);
1271 SYSCALL_MAP (pwrite64);
1272 UNSUPPORTED_SYSCALL_MAP (preadv);
1273 UNSUPPORTED_SYSCALL_MAP (pwritev);
1274 SYSCALL_MAP (sendfile);
1275 SYSCALL_MAP (pselect6);
1276 SYSCALL_MAP (ppoll);
1277 UNSUPPORTED_SYSCALL_MAP (signalfd4);
1278 SYSCALL_MAP (vmsplice);
1279 SYSCALL_MAP (splice);
1281 SYSCALL_MAP (readlinkat);
1282 SYSCALL_MAP (newfstatat);
1284 SYSCALL_MAP (fstat);
1286 SYSCALL_MAP (fsync);
1287 SYSCALL_MAP (fdatasync);
1288 SYSCALL_MAP (sync_file_range);
1289 UNSUPPORTED_SYSCALL_MAP (timerfd_create);
1290 UNSUPPORTED_SYSCALL_MAP (timerfd_settime);
1291 UNSUPPORTED_SYSCALL_MAP (timerfd_gettime);
1292 UNSUPPORTED_SYSCALL_MAP (utimensat);
1294 SYSCALL_MAP (capget);
1295 SYSCALL_MAP (capset);
1296 SYSCALL_MAP (personality);
1298 SYSCALL_MAP (exit_group);
1299 SYSCALL_MAP (waitid);
1300 SYSCALL_MAP (set_tid_address);
1301 SYSCALL_MAP (unshare);
1302 SYSCALL_MAP (futex);
1303 SYSCALL_MAP (set_robust_list);
1304 SYSCALL_MAP (get_robust_list);
1305 SYSCALL_MAP (nanosleep);
1307 SYSCALL_MAP (getitimer);
1308 SYSCALL_MAP (setitimer);
1309 SYSCALL_MAP (kexec_load);
1310 SYSCALL_MAP (init_module);
1311 SYSCALL_MAP (delete_module);
1312 SYSCALL_MAP (timer_create);
1313 SYSCALL_MAP (timer_settime);
1314 SYSCALL_MAP (timer_gettime);
1315 SYSCALL_MAP (timer_getoverrun);
1316 SYSCALL_MAP (timer_delete);
1317 SYSCALL_MAP (clock_settime);
1318 SYSCALL_MAP (clock_gettime);
1319 SYSCALL_MAP (clock_getres);
1320 SYSCALL_MAP (clock_nanosleep);
1321 SYSCALL_MAP (syslog);
1322 SYSCALL_MAP (ptrace);
1323 SYSCALL_MAP (sched_setparam);
1324 SYSCALL_MAP (sched_setscheduler);
1325 SYSCALL_MAP (sched_getscheduler);
1326 SYSCALL_MAP (sched_getparam);
1327 SYSCALL_MAP (sched_setaffinity);
1328 SYSCALL_MAP (sched_getaffinity);
1329 SYSCALL_MAP (sched_yield);
1330 SYSCALL_MAP (sched_get_priority_max);
1331 SYSCALL_MAP (sched_get_priority_min);
1332 SYSCALL_MAP (sched_rr_get_interval);
1334 SYSCALL_MAP (tkill);
1335 SYSCALL_MAP (tgkill);
1336 SYSCALL_MAP (sigaltstack);
1337 SYSCALL_MAP (rt_sigsuspend);
1338 SYSCALL_MAP (rt_sigaction);
1339 SYSCALL_MAP (rt_sigprocmask);
1340 SYSCALL_MAP (rt_sigpending);
1341 SYSCALL_MAP (rt_sigtimedwait);
1342 SYSCALL_MAP (rt_sigqueueinfo);
1343 SYSCALL_MAP (rt_sigreturn);
1344 SYSCALL_MAP (setpriority);
1345 SYSCALL_MAP (getpriority);
1346 SYSCALL_MAP (reboot);
1347 SYSCALL_MAP (setregid);
1348 SYSCALL_MAP (setgid);
1349 SYSCALL_MAP (setreuid);
1350 SYSCALL_MAP (setuid);
1351 SYSCALL_MAP (setresuid);
1352 SYSCALL_MAP (getresuid);
1353 SYSCALL_MAP (setresgid);
1354 SYSCALL_MAP (getresgid);
1355 SYSCALL_MAP (setfsuid);
1356 SYSCALL_MAP (setfsgid);
1357 SYSCALL_MAP (times);
1358 SYSCALL_MAP (setpgid);
1359 SYSCALL_MAP (getpgid);
1360 SYSCALL_MAP (getsid);
1361 SYSCALL_MAP (setsid);
1362 SYSCALL_MAP (getgroups);
1363 SYSCALL_MAP (setgroups);
1364 SYSCALL_MAP (uname);
1365 SYSCALL_MAP (sethostname);
1366 SYSCALL_MAP (setdomainname);
1367 SYSCALL_MAP (getrlimit);
1368 SYSCALL_MAP (setrlimit);
1369 SYSCALL_MAP (getrusage);
1370 SYSCALL_MAP (umask);
1371 SYSCALL_MAP (prctl);
1372 SYSCALL_MAP (getcpu);
1373 SYSCALL_MAP (gettimeofday);
1374 SYSCALL_MAP (settimeofday);
1375 SYSCALL_MAP (adjtimex);
1376 SYSCALL_MAP (getpid);
1377 SYSCALL_MAP (getppid);
1378 SYSCALL_MAP (getuid);
1379 SYSCALL_MAP (geteuid);
1380 SYSCALL_MAP (getgid);
1381 SYSCALL_MAP (getegid);
1382 SYSCALL_MAP (gettid);
1383 SYSCALL_MAP (sysinfo);
1384 SYSCALL_MAP (mq_open);
1385 SYSCALL_MAP (mq_unlink);
1386 SYSCALL_MAP (mq_timedsend);
1387 SYSCALL_MAP (mq_timedreceive);
1388 SYSCALL_MAP (mq_notify);
1389 SYSCALL_MAP (mq_getsetattr);
1390 SYSCALL_MAP (msgget);
1391 SYSCALL_MAP (msgctl);
1392 SYSCALL_MAP (msgrcv);
1393 SYSCALL_MAP (msgsnd);
1394 SYSCALL_MAP (semget);
1395 SYSCALL_MAP (semctl);
1396 SYSCALL_MAP (semtimedop);
1397 SYSCALL_MAP (semop);
1398 SYSCALL_MAP (shmget);
1399 SYSCALL_MAP (shmctl);
1400 SYSCALL_MAP (shmat);
1401 SYSCALL_MAP (shmdt);
1402 SYSCALL_MAP (socket);
1403 SYSCALL_MAP (socketpair);
1405 SYSCALL_MAP (listen);
1406 SYSCALL_MAP (accept);
1407 SYSCALL_MAP (connect);
1408 SYSCALL_MAP (getsockname);
1409 SYSCALL_MAP (getpeername);
1410 SYSCALL_MAP (sendto);
1411 SYSCALL_MAP (recvfrom);
1412 SYSCALL_MAP (setsockopt);
1413 SYSCALL_MAP (getsockopt);
1414 SYSCALL_MAP (shutdown);
1415 SYSCALL_MAP (sendmsg);
1416 SYSCALL_MAP (recvmsg);
1417 SYSCALL_MAP (readahead);
1419 SYSCALL_MAP (munmap);
1420 SYSCALL_MAP (mremap);
1421 SYSCALL_MAP (add_key);
1422 SYSCALL_MAP (request_key);
1423 SYSCALL_MAP (keyctl);
1424 SYSCALL_MAP (clone);
1425 SYSCALL_MAP (execve);
1427 case aarch64_sys_mmap:
1428 return gdb_sys_mmap2;
1430 SYSCALL_MAP (fadvise64);
1431 SYSCALL_MAP (swapon);
1432 SYSCALL_MAP (swapoff);
1433 SYSCALL_MAP (mprotect);
1434 SYSCALL_MAP (msync);
1435 SYSCALL_MAP (mlock);
1436 SYSCALL_MAP (munlock);
1437 SYSCALL_MAP (mlockall);
1438 SYSCALL_MAP (munlockall);
1439 SYSCALL_MAP (mincore);
1440 SYSCALL_MAP (madvise);
1441 SYSCALL_MAP (remap_file_pages);
1442 SYSCALL_MAP (mbind);
1443 SYSCALL_MAP (get_mempolicy);
1444 SYSCALL_MAP (set_mempolicy);
1445 SYSCALL_MAP (migrate_pages);
1446 SYSCALL_MAP (move_pages);
1447 UNSUPPORTED_SYSCALL_MAP (rt_tgsigqueueinfo);
1448 UNSUPPORTED_SYSCALL_MAP (perf_event_open);
1449 UNSUPPORTED_SYSCALL_MAP (accept4);
1450 UNSUPPORTED_SYSCALL_MAP (recvmmsg);
1452 SYSCALL_MAP (wait4);
1454 UNSUPPORTED_SYSCALL_MAP (prlimit64);
1455 UNSUPPORTED_SYSCALL_MAP (fanotify_init);
1456 UNSUPPORTED_SYSCALL_MAP (fanotify_mark);
1457 UNSUPPORTED_SYSCALL_MAP (name_to_handle_at);
1458 UNSUPPORTED_SYSCALL_MAP (open_by_handle_at);
1459 UNSUPPORTED_SYSCALL_MAP (clock_adjtime);
1460 UNSUPPORTED_SYSCALL_MAP (syncfs);
1461 UNSUPPORTED_SYSCALL_MAP (setns);
1462 UNSUPPORTED_SYSCALL_MAP (sendmmsg);
1463 UNSUPPORTED_SYSCALL_MAP (process_vm_readv);
1464 UNSUPPORTED_SYSCALL_MAP (process_vm_writev);
1465 UNSUPPORTED_SYSCALL_MAP (kcmp);
1466 UNSUPPORTED_SYSCALL_MAP (finit_module);
1467 UNSUPPORTED_SYSCALL_MAP (sched_setattr);
1468 UNSUPPORTED_SYSCALL_MAP (sched_getattr);
1469 SYSCALL_MAP (getrandom);
1471 return gdb_sys_no_syscall;
1475 /* Retrieve the syscall number at a ptrace syscall-stop, either on syscall entry
1476 or exit. Return -1 upon error. */
1479 aarch64_linux_get_syscall_number (struct gdbarch *gdbarch, thread_info *thread)
1481 struct regcache *regs = get_thread_regcache (thread);
1484 /* Get the system call number from register x8. */
1485 regs->cooked_read (AARCH64_X0_REGNUM + 8, &ret);
1487 /* On exit from a successful execve, we will be in a new process and all the
1488 registers will be cleared - x0 to x30 will be 0, except for a 1 in x7.
1489 This function will only ever get called when stopped at the entry or exit
1490 of a syscall, so by checking for 0 in x0 (arg0/retval), x1 (arg1), x8
1491 (syscall), x29 (FP) and x30 (LR) we can infer:
1492 1) Either inferior is at exit from successful execve.
1493 2) Or inferior is at entry to a call to io_setup with invalid arguments and
1494 a corrupted FP and LR.
1495 It should be safe enough to assume case 1. */
1498 LONGEST x1 = -1, fp = -1, lr = -1;
1499 regs->cooked_read (AARCH64_X0_REGNUM + 1, &x1);
1500 regs->cooked_read (AARCH64_FP_REGNUM, &fp);
1501 regs->cooked_read (AARCH64_LR_REGNUM, &lr);
1502 if (x1 == 0 && fp ==0 && lr == 0)
1503 return aarch64_sys_execve;
1509 /* Record all registers but PC register for process-record. */
1512 aarch64_all_but_pc_registers_record (struct regcache *regcache)
1516 for (i = AARCH64_X0_REGNUM; i < AARCH64_PC_REGNUM; i++)
1517 if (record_full_arch_list_add_reg (regcache, i))
1520 if (record_full_arch_list_add_reg (regcache, AARCH64_CPSR_REGNUM))
1526 /* Handler for aarch64 system call instruction recording. */
1529 aarch64_linux_syscall_record (struct regcache *regcache,
1530 unsigned long svc_number)
1533 enum gdb_syscall syscall_gdb;
1536 aarch64_canonicalize_syscall ((enum aarch64_syscall) svc_number);
1538 if (syscall_gdb < 0)
1540 gdb_printf (gdb_stderr,
1541 _("Process record and replay target doesn't "
1542 "support syscall number %s\n"),
1543 plongest (svc_number));
1547 if (syscall_gdb == gdb_sys_sigreturn
1548 || syscall_gdb == gdb_sys_rt_sigreturn)
1550 if (aarch64_all_but_pc_registers_record (regcache))
1555 ret = record_linux_system_call (syscall_gdb, regcache,
1556 &aarch64_linux_record_tdep);
1560 /* Record the return value of the system call. */
1561 if (record_full_arch_list_add_reg (regcache, AARCH64_X0_REGNUM))
1564 if (record_full_arch_list_add_reg (regcache, AARCH64_LR_REGNUM))
1567 if (record_full_arch_list_add_reg (regcache, AARCH64_CPSR_REGNUM))
1573 /* Implement the "gcc_target_options" gdbarch method. */
1576 aarch64_linux_gcc_target_options (struct gdbarch *gdbarch)
1578 /* GCC doesn't know "-m64". */
1582 /* Helper to get the allocation tag from a 64-bit ADDRESS.
1584 Return the allocation tag if successful and nullopt otherwise. */
1586 static gdb::optional<CORE_ADDR>
1587 aarch64_mte_get_atag (CORE_ADDR address)
1589 gdb::byte_vector tags;
1591 /* Attempt to fetch the allocation tag. */
1592 if (!target_fetch_memtags (address, 1, tags,
1593 static_cast<int> (memtag_type::allocation)))
1596 /* Only one tag should've been returned. Make sure we got exactly that. */
1597 if (tags.size () != 1)
1598 error (_("Target returned an unexpected number of tags."));
1600 /* Although our tags are 4 bits in size, they are stored in a
1605 /* Implement the tagged_address_p gdbarch method. */
1608 aarch64_linux_tagged_address_p (struct gdbarch *gdbarch, struct value *address)
1610 gdb_assert (address != nullptr);
1612 CORE_ADDR addr = value_as_address (address);
1614 /* Remove the top byte for the memory range check. */
1615 addr = gdbarch_remove_non_address_bits (gdbarch, addr);
1617 /* Check if the page that contains ADDRESS is mapped with PROT_MTE. */
1618 if (!linux_address_in_memtag_page (addr))
1621 /* We have a valid tag in the top byte of the 64-bit address. */
1625 /* Implement the memtag_matches_p gdbarch method. */
1628 aarch64_linux_memtag_matches_p (struct gdbarch *gdbarch,
1629 struct value *address)
1631 gdb_assert (address != nullptr);
1633 /* Make sure we are dealing with a tagged address to begin with. */
1634 if (!aarch64_linux_tagged_address_p (gdbarch, address))
1637 CORE_ADDR addr = value_as_address (address);
1639 /* Fetch the allocation tag for ADDRESS. */
1640 gdb::optional<CORE_ADDR> atag
1641 = aarch64_mte_get_atag (gdbarch_remove_non_address_bits (gdbarch, addr));
1643 if (!atag.has_value ())
1646 /* Fetch the logical tag for ADDRESS. */
1647 gdb_byte ltag = aarch64_mte_get_ltag (addr);
1649 /* Are the tags the same? */
1650 return ltag == *atag;
1653 /* Implement the set_memtags gdbarch method. */
1656 aarch64_linux_set_memtags (struct gdbarch *gdbarch, struct value *address,
1657 size_t length, const gdb::byte_vector &tags,
1658 memtag_type tag_type)
1660 gdb_assert (!tags.empty ());
1661 gdb_assert (address != nullptr);
1663 CORE_ADDR addr = value_as_address (address);
1665 /* Set the logical tag or the allocation tag. */
1666 if (tag_type == memtag_type::logical)
1668 /* When setting logical tags, we don't care about the length, since
1669 we are only setting a single logical tag. */
1670 addr = aarch64_mte_set_ltag (addr, tags[0]);
1672 /* Update the value's content with the tag. */
1673 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1674 gdb_byte *srcbuf = value_contents_raw (address).data ();
1675 store_unsigned_integer (srcbuf, sizeof (addr), byte_order, addr);
1679 /* Remove the top byte. */
1680 addr = gdbarch_remove_non_address_bits (gdbarch, addr);
1682 /* Make sure we are dealing with a tagged address to begin with. */
1683 if (!aarch64_linux_tagged_address_p (gdbarch, address))
1686 /* With G being the number of tag granules and N the number of tags
1687 passed in, we can have the following cases:
1689 1 - G == N: Store all the N tags to memory.
1691 2 - G < N : Warn about having more tags than granules, but write G
1694 3 - G > N : This is a "fill tags" operation. We should use the tags
1695 as a pattern to fill the granules repeatedly until we have
1696 written G tags to memory.
1699 size_t g = aarch64_mte_get_tag_granules (addr, length,
1700 AARCH64_MTE_GRANULE_SIZE);
1701 size_t n = tags.size ();
1704 warning (_("Got more tags than memory granules. Tags will be "
1707 warning (_("Using tag pattern to fill memory range."));
1709 if (!target_store_memtags (addr, length, tags,
1710 static_cast<int> (memtag_type::allocation)))
1716 /* Implement the get_memtag gdbarch method. */
1718 static struct value *
1719 aarch64_linux_get_memtag (struct gdbarch *gdbarch, struct value *address,
1720 memtag_type tag_type)
1722 gdb_assert (address != nullptr);
1724 CORE_ADDR addr = value_as_address (address);
1727 /* Get the logical tag or the allocation tag. */
1728 if (tag_type == memtag_type::logical)
1729 tag = aarch64_mte_get_ltag (addr);
1732 /* Make sure we are dealing with a tagged address to begin with. */
1733 if (!aarch64_linux_tagged_address_p (gdbarch, address))
1736 /* Remove the top byte. */
1737 addr = gdbarch_remove_non_address_bits (gdbarch, addr);
1738 gdb::optional<CORE_ADDR> atag = aarch64_mte_get_atag (addr);
1740 if (!atag.has_value ())
1746 /* Convert the tag to a value. */
1747 return value_from_ulongest (builtin_type (gdbarch)->builtin_unsigned_int,
1751 /* Implement the memtag_to_string gdbarch method. */
1754 aarch64_linux_memtag_to_string (struct gdbarch *gdbarch, struct value *tag_value)
1756 if (tag_value == nullptr)
1759 CORE_ADDR tag = value_as_address (tag_value);
1761 return string_printf ("0x%s", phex_nz (tag, sizeof (tag)));
1764 /* AArch64 Linux implementation of the report_signal_info gdbarch
1765 hook. Displays information about possible memory tag violations. */
1768 aarch64_linux_report_signal_info (struct gdbarch *gdbarch,
1769 struct ui_out *uiout,
1770 enum gdb_signal siggnal)
1772 aarch64_gdbarch_tdep *tdep = gdbarch_tdep<aarch64_gdbarch_tdep> (gdbarch);
1774 if (!tdep->has_mte () || siggnal != GDB_SIGNAL_SEGV)
1777 CORE_ADDR fault_addr = 0;
1782 /* Sigcode tells us if the segfault is actually a memory tag
1784 si_code = parse_and_eval_long ("$_siginfo.si_code");
1787 = parse_and_eval_long ("$_siginfo._sifields._sigfault.si_addr");
1789 catch (const gdb_exception_error &exception)
1791 exception_print (gdb_stderr, exception);
1795 /* If this is not a memory tag violation, just return. */
1796 if (si_code != SEGV_MTEAERR && si_code != SEGV_MTESERR)
1801 uiout->field_string ("sigcode-meaning", _("Memory tag violation"));
1803 /* For synchronous faults, show additional information. */
1804 if (si_code == SEGV_MTESERR)
1806 uiout->text (_(" while accessing address "));
1807 uiout->field_core_addr ("fault-addr", gdbarch, fault_addr);
1810 gdb::optional<CORE_ADDR> atag
1811 = aarch64_mte_get_atag (gdbarch_remove_non_address_bits (gdbarch,
1813 gdb_byte ltag = aarch64_mte_get_ltag (fault_addr);
1815 if (!atag.has_value ())
1816 uiout->text (_("Allocation tag unavailable"));
1819 uiout->text (_("Allocation tag "));
1820 uiout->field_string ("allocation-tag", hex_string (*atag));
1822 uiout->text (_("Logical tag "));
1823 uiout->field_string ("logical-tag", hex_string (ltag));
1829 uiout->text (_("Fault address unavailable"));
1833 /* AArch64 Linux implementation of the gdbarch_create_memtag_section hook. */
1836 aarch64_linux_create_memtag_section (struct gdbarch *gdbarch, bfd *obfd,
1837 CORE_ADDR address, size_t size)
1839 gdb_assert (obfd != nullptr);
1840 gdb_assert (size > 0);
1842 /* Create the section and associated program header.
1844 Make sure the section's flags has SEC_HAS_CONTENTS, otherwise BFD will
1845 refuse to write data to this section. */
1846 asection *mte_section
1847 = bfd_make_section_anyway_with_flags (obfd, "memtag", SEC_HAS_CONTENTS);
1849 if (mte_section == nullptr)
1852 bfd_set_section_vma (mte_section, address);
1853 /* The size of the memory range covered by the memory tags. We reuse the
1854 section's rawsize field for this purpose. */
1855 mte_section->rawsize = size;
1857 /* Fetch the number of tags we need to save. */
1859 = aarch64_mte_get_tag_granules (address, size, AARCH64_MTE_GRANULE_SIZE);
1860 /* Tags are stored packed as 2 tags per byte. */
1861 bfd_set_section_size (mte_section, (tags_count + 1) >> 1);
1862 /* Store program header information. */
1863 bfd_record_phdr (obfd, PT_AARCH64_MEMTAG_MTE, 1, 0, 0, 0, 0, 0, 1,
1869 /* Maximum number of tags to request. */
1870 #define MAX_TAGS_TO_TRANSFER 1024
1872 /* AArch64 Linux implementation of the gdbarch_fill_memtag_section hook. */
1875 aarch64_linux_fill_memtag_section (struct gdbarch *gdbarch, asection *osec)
1877 /* We only handle MTE tags for now. */
1879 size_t segment_size = osec->rawsize;
1880 CORE_ADDR start_address = bfd_section_vma (osec);
1881 CORE_ADDR end_address = start_address + segment_size;
1883 /* Figure out how many tags we need to store in this memory range. */
1884 size_t granules = aarch64_mte_get_tag_granules (start_address, segment_size,
1885 AARCH64_MTE_GRANULE_SIZE);
1887 /* If there are no tag granules to fetch, just return. */
1891 CORE_ADDR address = start_address;
1893 /* Vector of tags. */
1894 gdb::byte_vector tags;
1896 while (granules > 0)
1898 /* Transfer tags in chunks. */
1899 gdb::byte_vector tags_read;
1901 = ((granules >= MAX_TAGS_TO_TRANSFER)
1902 ? MAX_TAGS_TO_TRANSFER * AARCH64_MTE_GRANULE_SIZE
1903 : granules * AARCH64_MTE_GRANULE_SIZE);
1905 if (!target_fetch_memtags (address, xfer_len, tags_read,
1906 static_cast<int> (memtag_type::allocation)))
1908 warning (_("Failed to read MTE tags from memory range [%s,%s)."),
1909 phex_nz (start_address, sizeof (start_address)),
1910 phex_nz (end_address, sizeof (end_address)));
1914 /* Transfer over the tags that have been read. */
1915 tags.insert (tags.end (), tags_read.begin (), tags_read.end ());
1917 /* Adjust the remaining granules and starting address. */
1918 granules -= tags_read.size ();
1919 address += tags_read.size () * AARCH64_MTE_GRANULE_SIZE;
1922 /* Pack the MTE tag bits. */
1923 aarch64_mte_pack_tags (tags);
1925 if (!bfd_set_section_contents (osec->owner, osec, tags.data (),
1928 warning (_("Failed to write %s bytes of corefile memory "
1929 "tag content (%s)."),
1930 pulongest (tags.size ()),
1931 bfd_errmsg (bfd_get_error ()));
1936 /* AArch64 Linux implementation of the gdbarch_decode_memtag_section
1937 hook. Decode a memory tag section and return the requested tags.
1939 The section is guaranteed to cover the [ADDRESS, ADDRESS + length)
1942 static gdb::byte_vector
1943 aarch64_linux_decode_memtag_section (struct gdbarch *gdbarch,
1944 bfd_section *section,
1946 CORE_ADDR address, size_t length)
1948 gdb_assert (section != nullptr);
1950 /* The requested address must not be less than section->vma. */
1951 gdb_assert (section->vma <= address);
1953 /* Figure out how many tags we need to fetch in this memory range. */
1954 size_t granules = aarch64_mte_get_tag_granules (address, length,
1955 AARCH64_MTE_GRANULE_SIZE);
1957 gdb_assert (granules > 0);
1959 /* Fetch the total number of tags in the range [VMA, address + length). */
1960 size_t granules_from_vma
1961 = aarch64_mte_get_tag_granules (section->vma,
1962 address - section->vma + length,
1963 AARCH64_MTE_GRANULE_SIZE);
1965 /* Adjust the tags vector to contain the exact number of packed bytes. */
1966 gdb::byte_vector tags (((granules - 1) >> 1) + 1);
1968 /* Figure out the starting offset into the packed tags data. */
1969 file_ptr offset = ((granules_from_vma - granules) >> 1);
1971 if (!bfd_get_section_contents (section->owner, section, tags.data (),
1972 offset, tags.size ()))
1973 error (_("Couldn't read contents from memtag section."));
1975 /* At this point, the tags are packed 2 per byte. Unpack them before
1977 bool skip_first = ((granules_from_vma - granules) % 2) != 0;
1978 aarch64_mte_unpack_tags (tags, skip_first);
1980 /* Resize to the exact number of tags that was requested. */
1981 tags.resize (granules);
1986 /* AArch64 implementation of the remove_non_address_bits gdbarch hook. Remove
1987 non address bits from a pointer value. */
1990 aarch64_remove_non_address_bits (struct gdbarch *gdbarch, CORE_ADDR pointer)
1992 /* By default, we assume TBI and discard the top 8 bits plus the VA range
1993 select bit (55). Below we try to fetch information about pointer
1994 authentication masks in order to make non-address removal more
1996 CORE_ADDR mask = AARCH64_TOP_BITS_MASK;
1998 /* Check if we have an inferior first. If not, just use the default
2001 We use the inferior_ptid here because the pointer authentication masks
2002 should be the same across threads of a process. Since we may not have
2003 access to the current thread (gdb may have switched to no inferiors
2004 momentarily), we use the inferior ptid. */
2005 if (inferior_ptid != null_ptid)
2007 /* If we do have an inferior, attempt to fetch its thread's thread_info
2010 = find_thread_ptid (current_inferior ()->process_target (),
2013 /* If the thread is running, we will not be able to fetch the mask
2015 if (thread != nullptr && thread->state != THREAD_RUNNING)
2017 /* Otherwise, fetch the register cache and the masks. */
2018 struct regcache *regs
2019 = get_thread_regcache (current_inferior ()->process_target (),
2022 /* Use the gdbarch from the register cache to check for pointer
2023 authentication support, as it matches the features found in
2024 that particular thread. */
2025 aarch64_gdbarch_tdep *tdep
2026 = gdbarch_tdep<aarch64_gdbarch_tdep> (regs->arch ());
2028 /* Is there pointer authentication support? */
2029 if (tdep->has_pauth ())
2031 /* We have both a code mask and a data mask. For now they are
2032 the same, but this may change in the future. */
2033 CORE_ADDR cmask, dmask;
2035 if (regs->cooked_read (tdep->pauth_reg_base, &dmask)
2039 if (regs->cooked_read (tdep->pauth_reg_base + 1, &cmask)
2043 mask |= aarch64_mask_from_pac_registers (cmask, dmask);
2048 return aarch64_remove_top_bits (pointer, mask);
2052 aarch64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
2054 static const char *const stap_integer_prefixes[] = { "#", "", NULL };
2055 static const char *const stap_register_prefixes[] = { "", NULL };
2056 static const char *const stap_register_indirection_prefixes[] = { "[",
2058 static const char *const stap_register_indirection_suffixes[] = { "]",
2060 aarch64_gdbarch_tdep *tdep = gdbarch_tdep<aarch64_gdbarch_tdep> (gdbarch);
2062 tdep->lowest_pc = 0x8000;
2064 linux_init_abi (info, gdbarch, 1);
2066 set_solib_svr4_fetch_link_map_offsets (gdbarch,
2067 linux_lp64_fetch_link_map_offsets);
2069 /* Enable TLS support. */
2070 set_gdbarch_fetch_tls_load_module_address (gdbarch,
2071 svr4_fetch_objfile_link_map);
2073 /* Shared library handling. */
2074 set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
2075 set_gdbarch_skip_solib_resolver (gdbarch, glibc_skip_solib_resolver);
2077 tramp_frame_prepend_unwinder (gdbarch, &aarch64_linux_rt_sigframe);
2079 /* Enable longjmp. */
2082 set_gdbarch_iterate_over_regset_sections
2083 (gdbarch, aarch64_linux_iterate_over_regset_sections);
2084 set_gdbarch_core_read_description
2085 (gdbarch, aarch64_linux_core_read_description);
2087 /* SystemTap related. */
2088 set_gdbarch_stap_integer_prefixes (gdbarch, stap_integer_prefixes);
2089 set_gdbarch_stap_register_prefixes (gdbarch, stap_register_prefixes);
2090 set_gdbarch_stap_register_indirection_prefixes (gdbarch,
2091 stap_register_indirection_prefixes);
2092 set_gdbarch_stap_register_indirection_suffixes (gdbarch,
2093 stap_register_indirection_suffixes);
2094 set_gdbarch_stap_is_single_operand (gdbarch, aarch64_stap_is_single_operand);
2095 set_gdbarch_stap_parse_special_token (gdbarch,
2096 aarch64_stap_parse_special_token);
2098 /* Reversible debugging, process record. */
2099 set_gdbarch_process_record (gdbarch, aarch64_process_record);
2100 /* Syscall record. */
2101 tdep->aarch64_syscall_record = aarch64_linux_syscall_record;
2103 /* The top byte of a user space address known as the "tag",
2104 is ignored by the kernel and can be regarded as additional
2105 data associated with the address. */
2106 set_gdbarch_remove_non_address_bits (gdbarch,
2107 aarch64_remove_non_address_bits);
2109 /* MTE-specific settings and hooks. */
2110 if (tdep->has_mte ())
2112 /* Register a hook for checking if an address is tagged or not. */
2113 set_gdbarch_tagged_address_p (gdbarch, aarch64_linux_tagged_address_p);
2115 /* Register a hook for checking if there is a memory tag match. */
2116 set_gdbarch_memtag_matches_p (gdbarch,
2117 aarch64_linux_memtag_matches_p);
2119 /* Register a hook for setting the logical/allocation tags for
2120 a range of addresses. */
2121 set_gdbarch_set_memtags (gdbarch, aarch64_linux_set_memtags);
2123 /* Register a hook for extracting the logical/allocation tag from an
2125 set_gdbarch_get_memtag (gdbarch, aarch64_linux_get_memtag);
2127 /* Set the allocation tag granule size to 16 bytes. */
2128 set_gdbarch_memtag_granule_size (gdbarch, AARCH64_MTE_GRANULE_SIZE);
2130 /* Register a hook for converting a memory tag to a string. */
2131 set_gdbarch_memtag_to_string (gdbarch, aarch64_linux_memtag_to_string);
2133 set_gdbarch_report_signal_info (gdbarch,
2134 aarch64_linux_report_signal_info);
2136 /* Core file helpers. */
2138 /* Core file helper to create a memory tag section for a particular
2140 set_gdbarch_create_memtag_section
2141 (gdbarch, aarch64_linux_create_memtag_section);
2143 /* Core file helper to fill a memory tag section with tag data. */
2144 set_gdbarch_fill_memtag_section
2145 (gdbarch, aarch64_linux_fill_memtag_section);
2147 /* Core file helper to decode a memory tag section. */
2148 set_gdbarch_decode_memtag_section (gdbarch,
2149 aarch64_linux_decode_memtag_section);
2152 /* Initialize the aarch64_linux_record_tdep. */
2153 /* These values are the size of the type that will be used in a system
2154 call. They are obtained from Linux Kernel source. */
2155 aarch64_linux_record_tdep.size_pointer
2156 = gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT;
2157 aarch64_linux_record_tdep.size__old_kernel_stat = 32;
2158 aarch64_linux_record_tdep.size_tms = 32;
2159 aarch64_linux_record_tdep.size_loff_t = 8;
2160 aarch64_linux_record_tdep.size_flock = 32;
2161 aarch64_linux_record_tdep.size_oldold_utsname = 45;
2162 aarch64_linux_record_tdep.size_ustat = 32;
2163 aarch64_linux_record_tdep.size_old_sigaction = 32;
2164 aarch64_linux_record_tdep.size_old_sigset_t = 8;
2165 aarch64_linux_record_tdep.size_rlimit = 16;
2166 aarch64_linux_record_tdep.size_rusage = 144;
2167 aarch64_linux_record_tdep.size_timeval = 16;
2168 aarch64_linux_record_tdep.size_timezone = 8;
2169 aarch64_linux_record_tdep.size_old_gid_t = 2;
2170 aarch64_linux_record_tdep.size_old_uid_t = 2;
2171 aarch64_linux_record_tdep.size_fd_set = 128;
2172 aarch64_linux_record_tdep.size_old_dirent = 280;
2173 aarch64_linux_record_tdep.size_statfs = 120;
2174 aarch64_linux_record_tdep.size_statfs64 = 120;
2175 aarch64_linux_record_tdep.size_sockaddr = 16;
2176 aarch64_linux_record_tdep.size_int
2177 = gdbarch_int_bit (gdbarch) / TARGET_CHAR_BIT;
2178 aarch64_linux_record_tdep.size_long
2179 = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT;
2180 aarch64_linux_record_tdep.size_ulong
2181 = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT;
2182 aarch64_linux_record_tdep.size_msghdr = 56;
2183 aarch64_linux_record_tdep.size_itimerval = 32;
2184 aarch64_linux_record_tdep.size_stat = 144;
2185 aarch64_linux_record_tdep.size_old_utsname = 325;
2186 aarch64_linux_record_tdep.size_sysinfo = 112;
2187 aarch64_linux_record_tdep.size_msqid_ds = 120;
2188 aarch64_linux_record_tdep.size_shmid_ds = 112;
2189 aarch64_linux_record_tdep.size_new_utsname = 390;
2190 aarch64_linux_record_tdep.size_timex = 208;
2191 aarch64_linux_record_tdep.size_mem_dqinfo = 24;
2192 aarch64_linux_record_tdep.size_if_dqblk = 72;
2193 aarch64_linux_record_tdep.size_fs_quota_stat = 80;
2194 aarch64_linux_record_tdep.size_timespec = 16;
2195 aarch64_linux_record_tdep.size_pollfd = 8;
2196 aarch64_linux_record_tdep.size_NFS_FHSIZE = 32;
2197 aarch64_linux_record_tdep.size_knfsd_fh = 132;
2198 aarch64_linux_record_tdep.size_TASK_COMM_LEN = 16;
2199 aarch64_linux_record_tdep.size_sigaction = 32;
2200 aarch64_linux_record_tdep.size_sigset_t = 8;
2201 aarch64_linux_record_tdep.size_siginfo_t = 128;
2202 aarch64_linux_record_tdep.size_cap_user_data_t = 8;
2203 aarch64_linux_record_tdep.size_stack_t = 24;
2204 aarch64_linux_record_tdep.size_off_t = 8;
2205 aarch64_linux_record_tdep.size_stat64 = 144;
2206 aarch64_linux_record_tdep.size_gid_t = 4;
2207 aarch64_linux_record_tdep.size_uid_t = 4;
2208 aarch64_linux_record_tdep.size_PAGE_SIZE = 4096;
2209 aarch64_linux_record_tdep.size_flock64 = 32;
2210 aarch64_linux_record_tdep.size_user_desc = 16;
2211 aarch64_linux_record_tdep.size_io_event = 32;
2212 aarch64_linux_record_tdep.size_iocb = 64;
2213 aarch64_linux_record_tdep.size_epoll_event = 12;
2214 aarch64_linux_record_tdep.size_itimerspec = 32;
2215 aarch64_linux_record_tdep.size_mq_attr = 64;
2216 aarch64_linux_record_tdep.size_termios = 36;
2217 aarch64_linux_record_tdep.size_termios2 = 44;
2218 aarch64_linux_record_tdep.size_pid_t = 4;
2219 aarch64_linux_record_tdep.size_winsize = 8;
2220 aarch64_linux_record_tdep.size_serial_struct = 72;
2221 aarch64_linux_record_tdep.size_serial_icounter_struct = 80;
2222 aarch64_linux_record_tdep.size_hayes_esp_config = 12;
2223 aarch64_linux_record_tdep.size_size_t = 8;
2224 aarch64_linux_record_tdep.size_iovec = 16;
2225 aarch64_linux_record_tdep.size_time_t = 8;
2227 /* These values are the second argument of system call "sys_ioctl".
2228 They are obtained from Linux Kernel source. */
2229 aarch64_linux_record_tdep.ioctl_TCGETS = 0x5401;
2230 aarch64_linux_record_tdep.ioctl_TCSETS = 0x5402;
2231 aarch64_linux_record_tdep.ioctl_TCSETSW = 0x5403;
2232 aarch64_linux_record_tdep.ioctl_TCSETSF = 0x5404;
2233 aarch64_linux_record_tdep.ioctl_TCGETA = 0x5405;
2234 aarch64_linux_record_tdep.ioctl_TCSETA = 0x5406;
2235 aarch64_linux_record_tdep.ioctl_TCSETAW = 0x5407;
2236 aarch64_linux_record_tdep.ioctl_TCSETAF = 0x5408;
2237 aarch64_linux_record_tdep.ioctl_TCSBRK = 0x5409;
2238 aarch64_linux_record_tdep.ioctl_TCXONC = 0x540a;
2239 aarch64_linux_record_tdep.ioctl_TCFLSH = 0x540b;
2240 aarch64_linux_record_tdep.ioctl_TIOCEXCL = 0x540c;
2241 aarch64_linux_record_tdep.ioctl_TIOCNXCL = 0x540d;
2242 aarch64_linux_record_tdep.ioctl_TIOCSCTTY = 0x540e;
2243 aarch64_linux_record_tdep.ioctl_TIOCGPGRP = 0x540f;
2244 aarch64_linux_record_tdep.ioctl_TIOCSPGRP = 0x5410;
2245 aarch64_linux_record_tdep.ioctl_TIOCOUTQ = 0x5411;
2246 aarch64_linux_record_tdep.ioctl_TIOCSTI = 0x5412;
2247 aarch64_linux_record_tdep.ioctl_TIOCGWINSZ = 0x5413;
2248 aarch64_linux_record_tdep.ioctl_TIOCSWINSZ = 0x5414;
2249 aarch64_linux_record_tdep.ioctl_TIOCMGET = 0x5415;
2250 aarch64_linux_record_tdep.ioctl_TIOCMBIS = 0x5416;
2251 aarch64_linux_record_tdep.ioctl_TIOCMBIC = 0x5417;
2252 aarch64_linux_record_tdep.ioctl_TIOCMSET = 0x5418;
2253 aarch64_linux_record_tdep.ioctl_TIOCGSOFTCAR = 0x5419;
2254 aarch64_linux_record_tdep.ioctl_TIOCSSOFTCAR = 0x541a;
2255 aarch64_linux_record_tdep.ioctl_FIONREAD = 0x541b;
2256 aarch64_linux_record_tdep.ioctl_TIOCINQ = 0x541b;
2257 aarch64_linux_record_tdep.ioctl_TIOCLINUX = 0x541c;
2258 aarch64_linux_record_tdep.ioctl_TIOCCONS = 0x541d;
2259 aarch64_linux_record_tdep.ioctl_TIOCGSERIAL = 0x541e;
2260 aarch64_linux_record_tdep.ioctl_TIOCSSERIAL = 0x541f;
2261 aarch64_linux_record_tdep.ioctl_TIOCPKT = 0x5420;
2262 aarch64_linux_record_tdep.ioctl_FIONBIO = 0x5421;
2263 aarch64_linux_record_tdep.ioctl_TIOCNOTTY = 0x5422;
2264 aarch64_linux_record_tdep.ioctl_TIOCSETD = 0x5423;
2265 aarch64_linux_record_tdep.ioctl_TIOCGETD = 0x5424;
2266 aarch64_linux_record_tdep.ioctl_TCSBRKP = 0x5425;
2267 aarch64_linux_record_tdep.ioctl_TIOCTTYGSTRUCT = 0x5426;
2268 aarch64_linux_record_tdep.ioctl_TIOCSBRK = 0x5427;
2269 aarch64_linux_record_tdep.ioctl_TIOCCBRK = 0x5428;
2270 aarch64_linux_record_tdep.ioctl_TIOCGSID = 0x5429;
2271 aarch64_linux_record_tdep.ioctl_TCGETS2 = 0x802c542a;
2272 aarch64_linux_record_tdep.ioctl_TCSETS2 = 0x402c542b;
2273 aarch64_linux_record_tdep.ioctl_TCSETSW2 = 0x402c542c;
2274 aarch64_linux_record_tdep.ioctl_TCSETSF2 = 0x402c542d;
2275 aarch64_linux_record_tdep.ioctl_TIOCGPTN = 0x80045430;
2276 aarch64_linux_record_tdep.ioctl_TIOCSPTLCK = 0x40045431;
2277 aarch64_linux_record_tdep.ioctl_FIONCLEX = 0x5450;
2278 aarch64_linux_record_tdep.ioctl_FIOCLEX = 0x5451;
2279 aarch64_linux_record_tdep.ioctl_FIOASYNC = 0x5452;
2280 aarch64_linux_record_tdep.ioctl_TIOCSERCONFIG = 0x5453;
2281 aarch64_linux_record_tdep.ioctl_TIOCSERGWILD = 0x5454;
2282 aarch64_linux_record_tdep.ioctl_TIOCSERSWILD = 0x5455;
2283 aarch64_linux_record_tdep.ioctl_TIOCGLCKTRMIOS = 0x5456;
2284 aarch64_linux_record_tdep.ioctl_TIOCSLCKTRMIOS = 0x5457;
2285 aarch64_linux_record_tdep.ioctl_TIOCSERGSTRUCT = 0x5458;
2286 aarch64_linux_record_tdep.ioctl_TIOCSERGETLSR = 0x5459;
2287 aarch64_linux_record_tdep.ioctl_TIOCSERGETMULTI = 0x545a;
2288 aarch64_linux_record_tdep.ioctl_TIOCSERSETMULTI = 0x545b;
2289 aarch64_linux_record_tdep.ioctl_TIOCMIWAIT = 0x545c;
2290 aarch64_linux_record_tdep.ioctl_TIOCGICOUNT = 0x545d;
2291 aarch64_linux_record_tdep.ioctl_TIOCGHAYESESP = 0x545e;
2292 aarch64_linux_record_tdep.ioctl_TIOCSHAYESESP = 0x545f;
2293 aarch64_linux_record_tdep.ioctl_FIOQSIZE = 0x5460;
2295 /* These values are the second argument of system call "sys_fcntl"
2296 and "sys_fcntl64". They are obtained from Linux Kernel source. */
2297 aarch64_linux_record_tdep.fcntl_F_GETLK = 5;
2298 aarch64_linux_record_tdep.fcntl_F_GETLK64 = 12;
2299 aarch64_linux_record_tdep.fcntl_F_SETLK64 = 13;
2300 aarch64_linux_record_tdep.fcntl_F_SETLKW64 = 14;
2302 /* The AArch64 syscall calling convention: reg x0-x6 for arguments,
2303 reg x8 for syscall number and return value in reg x0. */
2304 aarch64_linux_record_tdep.arg1 = AARCH64_X0_REGNUM + 0;
2305 aarch64_linux_record_tdep.arg2 = AARCH64_X0_REGNUM + 1;
2306 aarch64_linux_record_tdep.arg3 = AARCH64_X0_REGNUM + 2;
2307 aarch64_linux_record_tdep.arg4 = AARCH64_X0_REGNUM + 3;
2308 aarch64_linux_record_tdep.arg5 = AARCH64_X0_REGNUM + 4;
2309 aarch64_linux_record_tdep.arg6 = AARCH64_X0_REGNUM + 5;
2310 aarch64_linux_record_tdep.arg7 = AARCH64_X0_REGNUM + 6;
2312 /* `catch syscall' */
2313 set_xml_syscall_file_name (gdbarch, "syscalls/aarch64-linux.xml");
2314 set_gdbarch_get_syscall_number (gdbarch, aarch64_linux_get_syscall_number);
2316 /* Displaced stepping. */
2317 set_gdbarch_max_insn_length (gdbarch, 4 * AARCH64_DISPLACED_MODIFIED_INSNS);
2318 set_gdbarch_displaced_step_copy_insn (gdbarch,
2319 aarch64_displaced_step_copy_insn);
2320 set_gdbarch_displaced_step_fixup (gdbarch, aarch64_displaced_step_fixup);
2321 set_gdbarch_displaced_step_hw_singlestep (gdbarch,
2322 aarch64_displaced_step_hw_singlestep);
2324 set_gdbarch_gcc_target_options (gdbarch, aarch64_linux_gcc_target_options);
2329 namespace selftests {
2331 /* Verify functions to read and write logical tags. */
2334 aarch64_linux_ltag_tests (void)
2336 /* We have 4 bits of tags, but we test writing all the bits of the top
2338 for (int i = 0; i < 1 << 8; i++)
2340 CORE_ADDR addr = ((CORE_ADDR) i << 56) | 0xdeadbeef;
2341 SELF_CHECK (aarch64_mte_get_ltag (addr) == (i & 0xf));
2343 addr = aarch64_mte_set_ltag (0xdeadbeef, i);
2344 SELF_CHECK (addr = ((CORE_ADDR) (i & 0xf) << 56) | 0xdeadbeef);
2348 } // namespace selftests
2349 #endif /* GDB_SELF_TEST */
2351 void _initialize_aarch64_linux_tdep ();
2353 _initialize_aarch64_linux_tdep ()
2355 gdbarch_register_osabi (bfd_arch_aarch64, 0, GDB_OSABI_LINUX,
2356 aarch64_linux_init_abi);
2359 selftests::register_test ("aarch64-linux-tagged-address",
2360 selftests::aarch64_linux_ltag_tests);