xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/aarch64-linux-tdep.c (revision 8b657b0747480f8989760d71343d6dd33f8d4cf9)
1 /* Target-dependent code for GNU/Linux AArch64.
2 
3    Copyright (C) 2009-2023 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 "gdbarch.h"
24 #include "glibc-tdep.h"
25 #include "linux-tdep.h"
26 #include "aarch64-tdep.h"
27 #include "aarch64-linux-tdep.h"
28 #include "osabi.h"
29 #include "solib-svr4.h"
30 #include "symtab.h"
31 #include "tramp-frame.h"
32 #include "trad-frame.h"
33 #include "target.h"
34 #include "target/target.h"
35 #include "expop.h"
36 #include "auxv.h"
37 
38 #include "regcache.h"
39 #include "regset.h"
40 
41 #include "stap-probe.h"
42 #include "parser-defs.h"
43 #include "user-regs.h"
44 #include "xml-syscall.h"
45 #include <ctype.h>
46 
47 #include "record-full.h"
48 #include "linux-record.h"
49 
50 #include "arch/aarch64-mte-linux.h"
51 
52 #include "arch-utils.h"
53 #include "value.h"
54 
55 #include "gdbsupport/selftest.h"
56 
57 #include "elf/common.h"
58 #include "elf/aarch64.h"
59 
60 /* For inferior_ptid and current_inferior ().  */
61 #include "inferior.h"
62 
63 /* Signal frame handling.
64 
65       +------------+  ^
66       | saved lr   |  |
67    +->| saved fp   |--+
68    |  |            |
69    |  |            |
70    |  +------------+
71    |  | saved lr   |
72    +--| saved fp   |
73    ^  |            |
74    |  |            |
75    |  +------------+
76    ^  |            |
77    |  | signal     |
78    |  |            |        SIGTRAMP_FRAME (struct rt_sigframe)
79    |  | saved regs |
80    +--| saved sp   |--> interrupted_sp
81    |  | saved pc   |--> interrupted_pc
82    |  |            |
83    |  +------------+
84    |  | saved lr   |--> default_restorer (movz x8, NR_sys_rt_sigreturn; svc 0)
85    +--| saved fp   |<- FP
86       |            |         NORMAL_FRAME
87       |            |<- SP
88       +------------+
89 
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:
93 
94   struct rt_sigframe
95   {
96     siginfo_t info;
97     struct ucontext uc;
98   };
99 
100   The ucontext has the following form:
101   struct ucontext
102   {
103     unsigned long uc_flags;
104     struct ucontext *uc_link;
105     stack_t uc_stack;
106     sigset_t uc_sigmask;
107     struct sigcontext uc_mcontext;
108   };
109 
110   struct sigcontext
111   {
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]
118   };
119 
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.
125 
126   struct aarch64_ctx {
127 	u32 magic;
128 	u32 size;
129   };
130 
131   The restorer stub will always have the form:
132 
133   d28015a8        movz    x8, #0xad
134   d4000001        svc     #0x0
135 
136   This is a system call sys_rt_sigreturn.
137 
138   We detect signal frames by snooping the return code for the restorer
139   instruction sequence.
140 
141   The handler then needs to recover the saved register set from
142   ucontext.uc_mcontext.  */
143 
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
151 
152 #define AARCH64_SIGCONTEXT_RESERVED_SIZE	4096
153 
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
158 
159 /* Defines for the extra_context that follows an AARCH64_EXTRA_MAGIC.  */
160 #define AARCH64_EXTRA_DATAP_OFFSET		8
161 
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
167 
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))
176 
177 
178 /* Read an aarch64_ctx, returning the magic value, and setting *SIZE to the
179    size, or return 0 on error.  */
180 
181 static uint32_t
182 read_aarch64_ctx (CORE_ADDR ctx_addr, enum bfd_endian byte_order,
183 		  uint32_t *size)
184 {
185   uint32_t magic = 0;
186   gdb_byte buf[4];
187 
188   if (target_read_memory (ctx_addr, buf, 4) != 0)
189     return 0;
190   magic = extract_unsigned_integer (buf, 4, byte_order);
191 
192   if (target_read_memory (ctx_addr + 4, buf, 4) != 0)
193     return 0;
194   *size = extract_unsigned_integer (buf, 4, byte_order);
195 
196   return magic;
197 }
198 
199 /* Given CACHE, use the trad_frame* functions to restore the FPSIMD
200    registers from a signal frame.
201 
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.  */
205 
206 static void
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)
210 {
211   /* WARNING: SIMD state is laid out in memory in target-endian format.
212 
213      So we have a couple cases to consider:
214 
215      1 - If the target is big endian, then SIMD state is big endian,
216      requiring a byteswap.
217 
218      2 - If the target is little endian, then SIMD state is little endian, so
219      no byteswap is needed. */
220 
221   if (byte_order == BFD_ENDIAN_BIG)
222     {
223       gdb_byte buf[V_REGISTER_SIZE];
224 
225       if (target_read_memory (offset, buf, V_REGISTER_SIZE) != 0)
226 	{
227 	  size_t size = V_REGISTER_SIZE/2;
228 
229 	  /* Read the two halves of the V register in reverse byte order.  */
230 	  CORE_ADDR u64 = extract_unsigned_integer (buf, size,
231 						    byte_order);
232 	  CORE_ADDR l64 = extract_unsigned_integer (buf + size, size,
233 						    byte_order);
234 
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);
238 
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});
257 
258 	  if (has_sve)
259 	    trad_frame_set_reg_value_bytes (cache,
260 					    num_regs + AARCH64_SVE_V0_REGNUM
261 					    + vreg_num, {buf, V_REGISTER_SIZE});
262 	}
263       return;
264     }
265 
266   /* Little endian, just point at the address containing the register
267      value.  */
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,
270 			   offset);
271   trad_frame_set_reg_addr (cache, num_regs + AARCH64_D0_REGNUM + vreg_num,
272 			   offset);
273   trad_frame_set_reg_addr (cache, num_regs + AARCH64_S0_REGNUM + vreg_num,
274 			   offset);
275   trad_frame_set_reg_addr (cache, num_regs + AARCH64_H0_REGNUM + vreg_num,
276 			   offset);
277   trad_frame_set_reg_addr (cache, num_regs + AARCH64_B0_REGNUM + vreg_num,
278 			   offset);
279 
280   if (has_sve)
281     trad_frame_set_reg_addr (cache, num_regs + AARCH64_SVE_V0_REGNUM
282 			     + vreg_num, offset);
283 
284 }
285 
286 /* Implement the "init" method of struct tramp_frame.  */
287 
288 static void
289 aarch64_linux_sigframe_init (const struct tramp_frame *self,
290 			     frame_info_ptr this_frame,
291 			     struct trad_frame_cache *this_cache,
292 			     CORE_ADDR func)
293 {
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);
307 
308   /* Read in the integer registers.  */
309 
310   for (int i = 0; i < 31; i++)
311     {
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);
316     }
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);
323 
324   /* Search for the FP and SVE sections, stopping at null.  */
325   while ((magic = read_aarch64_ctx (section, byte_order, &size)) != 0
326 	 && size != 0)
327     {
328       switch (magic)
329 	{
330 	case AARCH64_FPSIMD_MAGIC:
331 	  fpsimd = section;
332 	  section += size;
333 	  break;
334 
335 	case AARCH64_SVE_MAGIC:
336 	  {
337 	    /* Check if the section is followed by a full SVE dump, and set
338 	       sve_regs if it is.  */
339 	    gdb_byte buf[4];
340 	    uint16_t vq;
341 
342 	    if (!tdep->has_sve ())
343 	      break;
344 
345 	    if (target_read_memory (section + AARCH64_SVE_CONTEXT_VL_OFFSET,
346 				    buf, 2) != 0)
347 	      {
348 		section += size;
349 		break;
350 	      }
351 	    vq = sve_vq_from_vl (extract_unsigned_integer (buf, 2, byte_order));
352 
353 	    if (vq != tdep->vq)
354 	      error (_("Invalid vector length in signal frame %d vs %s."), vq,
355 		     pulongest (tdep->vq));
356 
357 	    if (size >= AARCH64_SVE_CONTEXT_SIZE (vq))
358 	      sve_regs = section + AARCH64_SVE_CONTEXT_REGS_OFFSET;
359 
360 	    section += size;
361 	    break;
362 	  }
363 
364 	case AARCH64_EXTRA_MAGIC:
365 	  {
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
369 	       structures.  */
370 	    gdb_byte buf[8];
371 
372 	    if (target_read_memory (section + AARCH64_EXTRA_DATAP_OFFSET,
373 				    buf, 8) != 0)
374 	      {
375 		section += size;
376 		break;
377 	      }
378 
379 	    section = extract_unsigned_integer (buf, 8, byte_order);
380 	    extra_found = true;
381 	    break;
382 	  }
383 
384 	default:
385 	  section += size;
386 	  break;
387 	}
388 
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
391 	 with nulls.  */
392       if (!extra_found && section > section_end)
393 	break;
394     }
395 
396   if (sve_regs != 0)
397     {
398       CORE_ADDR offset;
399 
400       for (int i = 0; i < 32; i++)
401 	{
402 	  offset = sve_regs + (i * tdep->vq * 16);
403 	  trad_frame_set_reg_addr (this_cache, AARCH64_SVE_Z0_REGNUM + i,
404 				   offset);
405 	  trad_frame_set_reg_addr (this_cache,
406 				   num_regs + AARCH64_SVE_V0_REGNUM + i,
407 				   offset);
408 	  trad_frame_set_reg_addr (this_cache, num_regs + AARCH64_Q0_REGNUM + i,
409 				   offset);
410 	  trad_frame_set_reg_addr (this_cache, num_regs + AARCH64_D0_REGNUM + i,
411 				   offset);
412 	  trad_frame_set_reg_addr (this_cache, num_regs + AARCH64_S0_REGNUM + i,
413 				   offset);
414 	  trad_frame_set_reg_addr (this_cache, num_regs + AARCH64_H0_REGNUM + i,
415 				   offset);
416 	  trad_frame_set_reg_addr (this_cache, num_regs + AARCH64_B0_REGNUM + i,
417 				   offset);
418 	}
419 
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));
424 
425       offset = sve_regs + AARCH64_SVE_CONTEXT_FFR_OFFSET (tdep->vq);
426       trad_frame_set_reg_addr (this_cache, AARCH64_SVE_FFR_REGNUM, offset);
427     }
428 
429   if (fpsimd != 0)
430     {
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);
435 
436       /* If there was no SVE section then set up the V registers.  */
437       if (sve_regs == 0)
438 	{
439 	  for (int i = 0; i < 32; i++)
440 	    {
441 	      CORE_ADDR offset = (fpsimd + AARCH64_FPSIMD_V0_OFFSET
442 				  + (i * AARCH64_FPSIMD_VREG_SIZE));
443 
444 	      aarch64_linux_restore_vreg (this_cache, num_regs, i, offset,
445 					  byte_order, tdep->has_sve ());
446 	    }
447 	}
448     }
449 
450   trad_frame_set_id (this_cache, frame_id_build (sp, func));
451 }
452 
453 static const struct tramp_frame aarch64_linux_rt_sigframe =
454 {
455   SIGTRAMP_FRAME,
456   4,
457   {
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},
461 
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}
466   },
467   aarch64_linux_sigframe_init
468 };
469 
470 /* Register maps.  */
471 
472 static const struct regcache_map_entry aarch64_linux_gregmap[] =
473   {
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 },
478     { 0 }
479   };
480 
481 static const struct regcache_map_entry aarch64_linux_fpregmap[] =
482   {
483     { 32, AARCH64_V0_REGNUM, 16 }, /* v0 ... v31 */
484     { 1, AARCH64_FPSR_REGNUM, 4 },
485     { 1, AARCH64_FPCR_REGNUM, 4 },
486     { 0 }
487   };
488 
489 /* Register set definitions.  */
490 
491 const struct regset aarch64_linux_gregset =
492   {
493     aarch64_linux_gregmap,
494     regcache_supply_regset, regcache_collect_regset
495   };
496 
497 const struct regset aarch64_linux_fpregset =
498   {
499     aarch64_linux_fpregmap,
500     regcache_supply_regset, regcache_collect_regset
501   };
502 
503 /* The fields in an SVE header at the start of a SVE regset.  */
504 
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
511 
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)
525 
526 #define SVE_HEADER_FLAG_SVE		1
527 
528 /* Get VQ value from SVE section in the core dump.  */
529 
530 static uint64_t
531 aarch64_linux_core_read_vq (struct gdbarch *gdbarch, bfd *abfd)
532 {
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");
536 
537   if (sve_section == nullptr)
538     {
539       /* No SVE state.  */
540       return 0;
541     }
542 
543   size_t size = bfd_section_size (sve_section);
544 
545   /* Check extended state size.  */
546   if (size < SVE_HEADER_SIZE)
547     {
548       warning (_("'.reg-aarch-sve' section in core file too small."));
549       return 0;
550     }
551 
552   if (!bfd_get_section_contents (abfd, sve_section, header, 0, SVE_HEADER_SIZE))
553     {
554       warning (_("Couldn't read sve header from "
555 		 "'.reg-aarch-sve' section in core file."));
556       return 0;
557     }
558 
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);
562 
563   if (vq > AARCH64_MAX_SVE_VQ)
564     {
565       warning (_("SVE Vector length in core file not supported by this version"
566 		 " of GDB.  (VQ=%s)"), pulongest (vq));
567       return 0;
568     }
569   else if (vq == 0)
570     {
571       warning (_("SVE Vector length in core file is invalid. (VQ=%s"),
572 	       pulongest (vq));
573       return 0;
574     }
575 
576   return vq;
577 }
578 
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.  */
582 
583 static void
584 aarch64_linux_supply_sve_regset (const struct regset *regset,
585 				 struct regcache *regcache,
586 				 int regnum, const void *buf, size_t size)
587 {
588   gdb_byte *header = (gdb_byte *) buf;
589   struct gdbarch *gdbarch = regcache->arch ();
590   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
591 
592   if (buf == nullptr)
593     return regcache->supply_regset (regset, regnum, nullptr, size);
594   gdb_assert (size > SVE_HEADER_SIZE);
595 
596   /* BUF contains an SVE header followed by a register dump of either the
597      passed in SVE regset or a NEON fpregset.  */
598 
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,
604 					     byte_order);
605 
606   if (regnum == -1 || regnum == AARCH64_SVE_VG_REGNUM)
607     {
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);
612     }
613 
614   if (flags & SVE_HEADER_FLAG_SVE)
615     {
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);
620     }
621   else
622     {
623       /* Register dump is a fpsimd structure.  First clear the SVE
624 	 registers.  */
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);
630 
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);
635     }
636 }
637 
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
640    REGSET.  */
641 
642 static void
643 aarch64_linux_collect_sve_regset (const struct regset *regset,
644 				  const struct regcache *regcache,
645 				  int regnum, void *buf, size_t size)
646 {
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;
652 
653   gdb_assert (buf != NULL);
654   gdb_assert (size > SVE_HEADER_SIZE);
655 
656   /* BUF starts with a SVE header prior to the register dump.  */
657 
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);
672 
673   /* The SVE register dump follows.  */
674   regcache->collect_regset (regset, regnum, (gdb_byte *) buf + SVE_HEADER_SIZE,
675 			    size - SVE_HEADER_SIZE);
676 }
677 
678 /* Implement the "iterate_over_regset_sections" gdbarch method.  */
679 
680 static void
681 aarch64_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
682 					    iterate_over_regset_sections_cb *cb,
683 					    void *cb_data,
684 					    const struct regcache *regcache)
685 {
686   aarch64_gdbarch_tdep *tdep = gdbarch_tdep<aarch64_gdbarch_tdep> (gdbarch);
687 
688   cb (".reg", AARCH64_LINUX_SIZEOF_GREGSET, AARCH64_LINUX_SIZEOF_GREGSET,
689       &aarch64_linux_gregset, NULL, cb_data);
690 
691   if (tdep->has_sve ())
692     {
693       /* Create this on the fly in order to handle vector register sizes.  */
694       const struct regcache_map_entry sve_regmap[] =
695 	{
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 },
701 	  { 0 }
702 	};
703 
704       const struct regset aarch64_linux_sve_regset =
705 	{
706 	  sve_regmap,
707 	  aarch64_linux_supply_sve_regset, aarch64_linux_collect_sve_regset,
708 	  REGSET_VARIABLE_SIZE
709 	};
710 
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);
715     }
716   else
717     cb (".reg2", AARCH64_LINUX_SIZEOF_FPREGSET, AARCH64_LINUX_SIZEOF_FPREGSET,
718 	&aarch64_linux_fpregset, NULL, cb_data);
719 
720 
721   if (tdep->has_pauth ())
722     {
723       /* Create this on the fly in order to handle the variable location.  */
724       const struct regcache_map_entry pauth_regmap[] =
725 	{
726 	  { 2, AARCH64_PAUTH_DMASK_REGNUM (tdep->pauth_reg_base), 8},
727 	  { 0 }
728 	};
729 
730       const struct regset aarch64_linux_pauth_regset =
731 	{
732 	  pauth_regmap, regcache_supply_regset, regcache_collect_regset
733 	};
734 
735       cb (".reg-aarch-pauth", AARCH64_LINUX_SIZEOF_PAUTH,
736 	  AARCH64_LINUX_SIZEOF_PAUTH, &aarch64_linux_pauth_regset,
737 	  "pauth registers", cb_data);
738     }
739 
740   /* Handle MTE registers.  */
741   if (tdep->has_mte ())
742     {
743       /* Create this on the fly in order to handle the variable location.  */
744       const struct regcache_map_entry mte_regmap[] =
745 	{
746 	  { 1, tdep->mte_reg_base, 8},
747 	  { 0 }
748 	};
749 
750       const struct regset aarch64_linux_mte_regset =
751 	{
752 	  mte_regmap, regcache_supply_regset, regcache_collect_regset
753 	};
754 
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);
758     }
759 
760   /* Handle the TLS registers.  */
761   if (tdep->has_tls ())
762     {
763       gdb_assert (tdep->tls_regnum_base != -1);
764       gdb_assert (tdep->tls_register_count > 0);
765 
766       int sizeof_tls_regset
767 	= AARCH64_TLS_REGISTER_SIZE * tdep->tls_register_count;
768 
769       const struct regcache_map_entry tls_regmap[] =
770 	{
771 	  { tdep->tls_register_count, tdep->tls_regnum_base,
772 	    AARCH64_TLS_REGISTER_SIZE },
773 	  { 0 }
774 	};
775 
776       const struct regset aarch64_linux_tls_regset =
777 	{
778 	  tls_regmap, regcache_supply_regset, regcache_collect_regset,
779 	  REGSET_VARIABLE_SIZE
780 	};
781 
782       cb (".reg-aarch-tls", sizeof_tls_regset, sizeof_tls_regset,
783 	  &aarch64_linux_tls_regset, "TLS register", cb_data);
784     }
785 }
786 
787 /* Implement the "core_read_description" gdbarch method.  */
788 
789 static const struct target_desc *
790 aarch64_linux_core_read_description (struct gdbarch *gdbarch,
791 				     struct target_ops *target, bfd *abfd)
792 {
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);
796 
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;
801 
802   /* Handle the TLS section.  */
803   asection *tls = bfd_get_section_by_name (abfd, ".reg-aarch-tls");
804   if (tls != nullptr)
805     {
806       size_t size = bfd_section_size (tls);
807       /* Convert the size to the number of actual registers, by
808 	 dividing by 8.  */
809       features.tls = size / AARCH64_TLS_REGISTER_SIZE;
810     }
811 
812   return aarch64_read_description (features);
813 }
814 
815 /* Implementation of `gdbarch_stap_is_single_operand', as defined in
816    gdbarch.h.  */
817 
818 static int
819 aarch64_stap_is_single_operand (struct gdbarch *gdbarch, const char *s)
820 {
821   return (*s == '#' || isdigit (*s) /* Literal number.  */
822 	  || *s == '[' /* Register indirection.  */
823 	  || isalpha (*s)); /* Register value.  */
824 }
825 
826 /* This routine is used to parse a special token in AArch64's assembly.
827 
828    The special tokens parsed by it are:
829 
830       - Register displacement (e.g, [fp, #-8])
831 
832    It returns one if the special token has been parsed successfully,
833    or zero if the current token is not considered special.  */
834 
835 static expr::operation_up
836 aarch64_stap_parse_special_token (struct gdbarch *gdbarch,
837 				  struct stap_parse_info *p)
838 {
839   if (*p->arg == '[')
840     {
841       /* Temporary holder for lookahead.  */
842       const char *tmp = p->arg;
843       char *endp;
844       /* Used to save the register name.  */
845       const char *start;
846       int len;
847       int got_minus = 0;
848       long displacement;
849 
850       ++tmp;
851       start = tmp;
852 
853       /* Register name.  */
854       while (isalnum (*tmp))
855 	++tmp;
856 
857       if (*tmp != ',')
858 	return {};
859 
860       len = tmp - start;
861       std::string regname (start, len);
862 
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);
866 
867       ++tmp;
868       tmp = skip_spaces (tmp);
869       /* Now we expect a number.  It can begin with '#' or simply
870 	 a digit.  */
871       if (*tmp == '#')
872 	++tmp;
873 
874       if (*tmp == '-')
875 	{
876 	  ++tmp;
877 	  got_minus = 1;
878 	}
879       else if (*tmp == '+')
880 	++tmp;
881 
882       if (!isdigit (*tmp))
883 	return {};
884 
885       displacement = strtol (tmp, &endp, 10);
886       tmp = endp;
887 
888       /* Skipping last `]'.  */
889       if (*tmp++ != ']')
890 	return {};
891       p->arg = tmp;
892 
893       using namespace expr;
894 
895       /* The displacement.  */
896       struct type *long_type = builtin_type (gdbarch)->builtin_long;
897       if (got_minus)
898 	displacement = -displacement;
899       operation_up disp = make_operation<long_const_operation> (long_type,
900 								displacement);
901 
902       /* The register name.  */
903       operation_up reg
904 	= make_operation<register_operation> (std::move (regname));
905 
906       operation_up sum
907 	= make_operation<add_operation> (std::move (reg), std::move (disp));
908 
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),
912 						 arg_ptr_type);
913       return make_operation<unop_ind_operation> (std::move (sum));
914     }
915   return {};
916 }
917 
918 /* AArch64 process record-replay constructs: syscall, signal etc.  */
919 
920 static linux_record_tdep aarch64_linux_record_tdep;
921 
922 /* Enum that defines the AArch64 linux specific syscall identifiers used for
923    process record/replay.  */
924 
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
1187 };
1188 
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
1191    process record.  */
1192 
1193 static enum gdb_syscall
1194 aarch64_canonicalize_syscall (enum aarch64_syscall syscall_number)
1195 {
1196 #define SYSCALL_MAP(SYSCALL) case aarch64_sys_##SYSCALL: \
1197   return gdb_sys_##SYSCALL
1198 
1199 #define UNSUPPORTED_SYSCALL_MAP(SYSCALL) case aarch64_sys_##SYSCALL: \
1200   return gdb_sys_no_syscall
1201 
1202   switch (syscall_number)
1203     {
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);
1209 
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);
1228       SYSCALL_MAP (dup);
1229       SYSCALL_MAP (dup3);
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);
1266       SYSCALL_MAP (read);
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);
1280       SYSCALL_MAP (tee);
1281       SYSCALL_MAP (readlinkat);
1282       SYSCALL_MAP (newfstatat);
1283 
1284       SYSCALL_MAP (fstat);
1285       SYSCALL_MAP (sync);
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);
1293       SYSCALL_MAP (acct);
1294       SYSCALL_MAP (capget);
1295       SYSCALL_MAP (capset);
1296       SYSCALL_MAP (personality);
1297       SYSCALL_MAP (exit);
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);
1306 
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);
1333       SYSCALL_MAP (kill);
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);
1404       SYSCALL_MAP (bind);
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);
1418       SYSCALL_MAP (brk);
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);
1426 
1427     case aarch64_sys_mmap:
1428       return gdb_sys_mmap2;
1429 
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);
1451 
1452       SYSCALL_MAP (wait4);
1453 
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);
1470   default:
1471     return gdb_sys_no_syscall;
1472   }
1473 }
1474 
1475 /* Retrieve the syscall number at a ptrace syscall-stop, either on syscall entry
1476    or exit.  Return -1 upon error.  */
1477 
1478 static LONGEST
1479 aarch64_linux_get_syscall_number (struct gdbarch *gdbarch, thread_info *thread)
1480 {
1481   struct regcache *regs = get_thread_regcache (thread);
1482   LONGEST ret;
1483 
1484   /* Get the system call number from register x8.  */
1485   regs->cooked_read (AARCH64_X0_REGNUM + 8, &ret);
1486 
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.  */
1496   if (ret == 0)
1497     {
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;
1504     }
1505 
1506   return ret;
1507 }
1508 
1509 /* Record all registers but PC register for process-record.  */
1510 
1511 static int
1512 aarch64_all_but_pc_registers_record (struct regcache *regcache)
1513 {
1514   int i;
1515 
1516   for (i = AARCH64_X0_REGNUM; i < AARCH64_PC_REGNUM; i++)
1517     if (record_full_arch_list_add_reg (regcache, i))
1518       return -1;
1519 
1520   if (record_full_arch_list_add_reg (regcache, AARCH64_CPSR_REGNUM))
1521     return -1;
1522 
1523   return 0;
1524 }
1525 
1526 /* Handler for aarch64 system call instruction recording.  */
1527 
1528 static int
1529 aarch64_linux_syscall_record (struct regcache *regcache,
1530 			      unsigned long svc_number)
1531 {
1532   int ret = 0;
1533   enum gdb_syscall syscall_gdb;
1534 
1535   syscall_gdb =
1536     aarch64_canonicalize_syscall ((enum aarch64_syscall) svc_number);
1537 
1538   if (syscall_gdb < 0)
1539     {
1540       gdb_printf (gdb_stderr,
1541 		  _("Process record and replay target doesn't "
1542 		    "support syscall number %s\n"),
1543 		  plongest (svc_number));
1544       return -1;
1545     }
1546 
1547   if (syscall_gdb == gdb_sys_sigreturn
1548       || syscall_gdb == gdb_sys_rt_sigreturn)
1549    {
1550      if (aarch64_all_but_pc_registers_record (regcache))
1551        return -1;
1552      return 0;
1553    }
1554 
1555   ret = record_linux_system_call (syscall_gdb, regcache,
1556 				  &aarch64_linux_record_tdep);
1557   if (ret != 0)
1558     return ret;
1559 
1560   /* Record the return value of the system call.  */
1561   if (record_full_arch_list_add_reg (regcache, AARCH64_X0_REGNUM))
1562     return -1;
1563   /* Record LR.  */
1564   if (record_full_arch_list_add_reg (regcache, AARCH64_LR_REGNUM))
1565     return -1;
1566   /* Record CPSR.  */
1567   if (record_full_arch_list_add_reg (regcache, AARCH64_CPSR_REGNUM))
1568     return -1;
1569 
1570   return 0;
1571 }
1572 
1573 /* Implement the "gcc_target_options" gdbarch method.  */
1574 
1575 static std::string
1576 aarch64_linux_gcc_target_options (struct gdbarch *gdbarch)
1577 {
1578   /* GCC doesn't know "-m64".  */
1579   return {};
1580 }
1581 
1582 /* Helper to get the allocation tag from a 64-bit ADDRESS.
1583 
1584    Return the allocation tag if successful and nullopt otherwise.  */
1585 
1586 static gdb::optional<CORE_ADDR>
1587 aarch64_mte_get_atag (CORE_ADDR address)
1588 {
1589   gdb::byte_vector tags;
1590 
1591   /* Attempt to fetch the allocation tag.  */
1592   if (!target_fetch_memtags (address, 1, tags,
1593 			     static_cast<int> (memtag_type::allocation)))
1594     return {};
1595 
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."));
1599 
1600   /* Although our tags are 4 bits in size, they are stored in a
1601      byte.  */
1602   return tags[0];
1603 }
1604 
1605 /* Implement the tagged_address_p gdbarch method.  */
1606 
1607 static bool
1608 aarch64_linux_tagged_address_p (struct gdbarch *gdbarch, struct value *address)
1609 {
1610   gdb_assert (address != nullptr);
1611 
1612   CORE_ADDR addr = value_as_address (address);
1613 
1614   /* Remove the top byte for the memory range check.  */
1615   addr = gdbarch_remove_non_address_bits (gdbarch, addr);
1616 
1617   /* Check if the page that contains ADDRESS is mapped with PROT_MTE.  */
1618   if (!linux_address_in_memtag_page (addr))
1619     return false;
1620 
1621   /* We have a valid tag in the top byte of the 64-bit address.  */
1622   return true;
1623 }
1624 
1625 /* Implement the memtag_matches_p gdbarch method.  */
1626 
1627 static bool
1628 aarch64_linux_memtag_matches_p (struct gdbarch *gdbarch,
1629 				struct value *address)
1630 {
1631   gdb_assert (address != nullptr);
1632 
1633   /* Make sure we are dealing with a tagged address to begin with.  */
1634   if (!aarch64_linux_tagged_address_p (gdbarch, address))
1635     return true;
1636 
1637   CORE_ADDR addr = value_as_address (address);
1638 
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));
1642 
1643   if (!atag.has_value ())
1644     return true;
1645 
1646   /* Fetch the logical tag for ADDRESS.  */
1647   gdb_byte ltag = aarch64_mte_get_ltag (addr);
1648 
1649   /* Are the tags the same?  */
1650   return ltag == *atag;
1651 }
1652 
1653 /* Implement the set_memtags gdbarch method.  */
1654 
1655 static bool
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)
1659 {
1660   gdb_assert (!tags.empty ());
1661   gdb_assert (address != nullptr);
1662 
1663   CORE_ADDR addr = value_as_address (address);
1664 
1665   /* Set the logical tag or the allocation tag.  */
1666   if (tag_type == memtag_type::logical)
1667     {
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]);
1671 
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);
1676     }
1677   else
1678     {
1679       /* Remove the top byte.  */
1680       addr = gdbarch_remove_non_address_bits (gdbarch, addr);
1681 
1682       /* Make sure we are dealing with a tagged address to begin with.  */
1683       if (!aarch64_linux_tagged_address_p (gdbarch, address))
1684 	return false;
1685 
1686       /* With G being the number of tag granules and N the number of tags
1687 	 passed in, we can have the following cases:
1688 
1689 	 1 - G == N: Store all the N tags to memory.
1690 
1691 	 2 - G < N : Warn about having more tags than granules, but write G
1692 		     tags.
1693 
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.
1697       */
1698 
1699       size_t g = aarch64_mte_get_tag_granules (addr, length,
1700 					       AARCH64_MTE_GRANULE_SIZE);
1701       size_t n = tags.size ();
1702 
1703       if (g < n)
1704 	warning (_("Got more tags than memory granules.  Tags will be "
1705 		   "truncated."));
1706       else if (g > n)
1707 	warning (_("Using tag pattern to fill memory range."));
1708 
1709       if (!target_store_memtags (addr, length, tags,
1710 				 static_cast<int> (memtag_type::allocation)))
1711 	return false;
1712     }
1713   return true;
1714 }
1715 
1716 /* Implement the get_memtag gdbarch method.  */
1717 
1718 static struct value *
1719 aarch64_linux_get_memtag (struct gdbarch *gdbarch, struct value *address,
1720 			  memtag_type tag_type)
1721 {
1722   gdb_assert (address != nullptr);
1723 
1724   CORE_ADDR addr = value_as_address (address);
1725   CORE_ADDR tag = 0;
1726 
1727   /* Get the logical tag or the allocation tag.  */
1728   if (tag_type == memtag_type::logical)
1729     tag = aarch64_mte_get_ltag (addr);
1730   else
1731     {
1732       /* Make sure we are dealing with a tagged address to begin with.  */
1733       if (!aarch64_linux_tagged_address_p (gdbarch, address))
1734 	return nullptr;
1735 
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);
1739 
1740       if (!atag.has_value ())
1741 	return nullptr;
1742 
1743       tag = *atag;
1744     }
1745 
1746   /* Convert the tag to a value.  */
1747   return value_from_ulongest (builtin_type (gdbarch)->builtin_unsigned_int,
1748 			      tag);
1749 }
1750 
1751 /* Implement the memtag_to_string gdbarch method.  */
1752 
1753 static std::string
1754 aarch64_linux_memtag_to_string (struct gdbarch *gdbarch, struct value *tag_value)
1755 {
1756   if (tag_value == nullptr)
1757     return "";
1758 
1759   CORE_ADDR tag = value_as_address (tag_value);
1760 
1761   return string_printf ("0x%s", phex_nz (tag, sizeof (tag)));
1762 }
1763 
1764 /* AArch64 Linux implementation of the report_signal_info gdbarch
1765    hook.  Displays information about possible memory tag violations.  */
1766 
1767 static void
1768 aarch64_linux_report_signal_info (struct gdbarch *gdbarch,
1769 				  struct ui_out *uiout,
1770 				  enum gdb_signal siggnal)
1771 {
1772   aarch64_gdbarch_tdep *tdep = gdbarch_tdep<aarch64_gdbarch_tdep> (gdbarch);
1773 
1774   if (!tdep->has_mte () || siggnal != GDB_SIGNAL_SEGV)
1775     return;
1776 
1777   CORE_ADDR fault_addr = 0;
1778   long si_code = 0;
1779 
1780   try
1781     {
1782       /* Sigcode tells us if the segfault is actually a memory tag
1783 	 violation.  */
1784       si_code = parse_and_eval_long ("$_siginfo.si_code");
1785 
1786       fault_addr
1787 	= parse_and_eval_long ("$_siginfo._sifields._sigfault.si_addr");
1788     }
1789   catch (const gdb_exception_error &exception)
1790     {
1791       exception_print (gdb_stderr, exception);
1792       return;
1793     }
1794 
1795   /* If this is not a memory tag violation, just return.  */
1796   if (si_code != SEGV_MTEAERR && si_code != SEGV_MTESERR)
1797     return;
1798 
1799   uiout->text ("\n");
1800 
1801   uiout->field_string ("sigcode-meaning", _("Memory tag violation"));
1802 
1803   /* For synchronous faults, show additional information.  */
1804   if (si_code == SEGV_MTESERR)
1805     {
1806       uiout->text (_(" while accessing address "));
1807       uiout->field_core_addr ("fault-addr", gdbarch, fault_addr);
1808       uiout->text ("\n");
1809 
1810       gdb::optional<CORE_ADDR> atag
1811 	= aarch64_mte_get_atag (gdbarch_remove_non_address_bits (gdbarch,
1812 								 fault_addr));
1813       gdb_byte ltag = aarch64_mte_get_ltag (fault_addr);
1814 
1815       if (!atag.has_value ())
1816 	uiout->text (_("Allocation tag unavailable"));
1817       else
1818 	{
1819 	  uiout->text (_("Allocation tag "));
1820 	  uiout->field_string ("allocation-tag", hex_string (*atag));
1821 	  uiout->text ("\n");
1822 	  uiout->text (_("Logical tag "));
1823 	  uiout->field_string ("logical-tag", hex_string (ltag));
1824 	}
1825     }
1826   else
1827     {
1828       uiout->text ("\n");
1829       uiout->text (_("Fault address unavailable"));
1830     }
1831 }
1832 
1833 /* AArch64 Linux implementation of the gdbarch_create_memtag_section hook.  */
1834 
1835 static asection *
1836 aarch64_linux_create_memtag_section (struct gdbarch *gdbarch, bfd *obfd,
1837 				     CORE_ADDR address, size_t size)
1838 {
1839   gdb_assert (obfd != nullptr);
1840   gdb_assert (size > 0);
1841 
1842   /* Create the section and associated program header.
1843 
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);
1848 
1849   if (mte_section == nullptr)
1850     return nullptr;
1851 
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;
1856 
1857   /* Fetch the number of tags we need to save.  */
1858   size_t tags_count
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,
1864 		   &mte_section);
1865 
1866   return mte_section;
1867 }
1868 
1869 /* Maximum number of tags to request.  */
1870 #define MAX_TAGS_TO_TRANSFER 1024
1871 
1872 /* AArch64 Linux implementation of the gdbarch_fill_memtag_section hook.  */
1873 
1874 static bool
1875 aarch64_linux_fill_memtag_section (struct gdbarch *gdbarch, asection *osec)
1876 {
1877   /* We only handle MTE tags for now.  */
1878 
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;
1882 
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);
1886 
1887   /* If there are no tag granules to fetch, just return.  */
1888   if (granules == 0)
1889     return true;
1890 
1891   CORE_ADDR address = start_address;
1892 
1893   /* Vector of tags.  */
1894   gdb::byte_vector tags;
1895 
1896   while (granules > 0)
1897     {
1898       /* Transfer tags in chunks.  */
1899       gdb::byte_vector tags_read;
1900       size_t xfer_len
1901 	= ((granules >= MAX_TAGS_TO_TRANSFER)
1902 	  ? MAX_TAGS_TO_TRANSFER * AARCH64_MTE_GRANULE_SIZE
1903 	  : granules * AARCH64_MTE_GRANULE_SIZE);
1904 
1905       if (!target_fetch_memtags (address, xfer_len, tags_read,
1906 				 static_cast<int> (memtag_type::allocation)))
1907 	{
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)));
1911 	  return false;
1912 	}
1913 
1914       /* Transfer over the tags that have been read.  */
1915       tags.insert (tags.end (), tags_read.begin (), tags_read.end ());
1916 
1917       /* Adjust the remaining granules and starting address.  */
1918       granules -= tags_read.size ();
1919       address += tags_read.size () * AARCH64_MTE_GRANULE_SIZE;
1920     }
1921 
1922   /* Pack the MTE tag bits.  */
1923   aarch64_mte_pack_tags (tags);
1924 
1925   if (!bfd_set_section_contents (osec->owner, osec, tags.data (),
1926 				 0, tags.size ()))
1927     {
1928       warning (_("Failed to write %s bytes of corefile memory "
1929 		 "tag content (%s)."),
1930 	       pulongest (tags.size ()),
1931 	       bfd_errmsg (bfd_get_error ()));
1932     }
1933   return true;
1934 }
1935 
1936 /* AArch64 Linux implementation of the gdbarch_decode_memtag_section
1937    hook.  Decode a memory tag section and return the requested tags.
1938 
1939    The section is guaranteed to cover the [ADDRESS, ADDRESS + length)
1940    range.  */
1941 
1942 static gdb::byte_vector
1943 aarch64_linux_decode_memtag_section (struct gdbarch *gdbarch,
1944 				     bfd_section *section,
1945 				     int type,
1946 				     CORE_ADDR address, size_t length)
1947 {
1948   gdb_assert (section != nullptr);
1949 
1950   /* The requested address must not be less than section->vma.  */
1951   gdb_assert (section->vma <= address);
1952 
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);
1956   /* Sanity check.  */
1957   gdb_assert (granules > 0);
1958 
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);
1964 
1965   /* Adjust the tags vector to contain the exact number of packed bytes.  */
1966   gdb::byte_vector tags (((granules - 1) >> 1) + 1);
1967 
1968   /* Figure out the starting offset into the packed tags data.  */
1969   file_ptr offset = ((granules_from_vma - granules) >> 1);
1970 
1971   if (!bfd_get_section_contents (section->owner, section, tags.data (),
1972 				 offset, tags.size ()))
1973     error (_("Couldn't read contents from memtag section."));
1974 
1975   /* At this point, the tags are packed 2 per byte.  Unpack them before
1976      returning.  */
1977   bool skip_first = ((granules_from_vma - granules) % 2) != 0;
1978   aarch64_mte_unpack_tags (tags, skip_first);
1979 
1980   /* Resize to the exact number of tags that was requested.  */
1981   tags.resize (granules);
1982 
1983   return tags;
1984 }
1985 
1986 /* AArch64 implementation of the remove_non_address_bits gdbarch hook.  Remove
1987    non address bits from a pointer value.  */
1988 
1989 static CORE_ADDR
1990 aarch64_remove_non_address_bits (struct gdbarch *gdbarch, CORE_ADDR pointer)
1991 {
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
1995      precise.  */
1996   CORE_ADDR mask = AARCH64_TOP_BITS_MASK;
1997 
1998   /* Check if we have an inferior first.  If not, just use the default
1999      mask.
2000 
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)
2006     {
2007       /* If we do have an inferior, attempt to fetch its thread's thread_info
2008 	 struct.  */
2009       thread_info *thread
2010 	= find_thread_ptid (current_inferior ()->process_target (),
2011 			    inferior_ptid);
2012 
2013       /* If the thread is running, we will not be able to fetch the mask
2014 	 registers.  */
2015       if (thread != nullptr && thread->state != THREAD_RUNNING)
2016 	{
2017 	  /* Otherwise, fetch the register cache and the masks.  */
2018 	  struct regcache *regs
2019 	    = get_thread_regcache (current_inferior ()->process_target (),
2020 				   inferior_ptid);
2021 
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 ());
2027 
2028 	  /* Is there pointer authentication support?  */
2029 	  if (tdep->has_pauth ())
2030 	    {
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;
2034 
2035 	      if (regs->cooked_read (tdep->pauth_reg_base, &dmask)
2036 		  != REG_VALID)
2037 		dmask = mask;
2038 
2039 	      if (regs->cooked_read (tdep->pauth_reg_base + 1, &cmask)
2040 		  != REG_VALID)
2041 		cmask = mask;
2042 
2043 	      mask |= aarch64_mask_from_pac_registers (cmask, dmask);
2044 	    }
2045 	}
2046     }
2047 
2048   return aarch64_remove_top_bits (pointer, mask);
2049 }
2050 
2051 static void
2052 aarch64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
2053 {
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[] = { "[",
2057 								    NULL };
2058   static const char *const stap_register_indirection_suffixes[] = { "]",
2059 								    NULL };
2060   aarch64_gdbarch_tdep *tdep = gdbarch_tdep<aarch64_gdbarch_tdep> (gdbarch);
2061 
2062   tdep->lowest_pc = 0x8000;
2063 
2064   linux_init_abi (info, gdbarch, 1);
2065 
2066   set_solib_svr4_fetch_link_map_offsets (gdbarch,
2067 					 linux_lp64_fetch_link_map_offsets);
2068 
2069   /* Enable TLS support.  */
2070   set_gdbarch_fetch_tls_load_module_address (gdbarch,
2071 					     svr4_fetch_objfile_link_map);
2072 
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);
2076 
2077   tramp_frame_prepend_unwinder (gdbarch, &aarch64_linux_rt_sigframe);
2078 
2079   /* Enable longjmp.  */
2080   tdep->jb_pc = 11;
2081 
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);
2086 
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);
2097 
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;
2102 
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);
2108 
2109   /* MTE-specific settings and hooks.  */
2110   if (tdep->has_mte ())
2111     {
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);
2114 
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);
2118 
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);
2122 
2123       /* Register a hook for extracting the logical/allocation tag from an
2124 	 address.  */
2125       set_gdbarch_get_memtag (gdbarch, aarch64_linux_get_memtag);
2126 
2127       /* Set the allocation tag granule size to 16 bytes.  */
2128       set_gdbarch_memtag_granule_size (gdbarch, AARCH64_MTE_GRANULE_SIZE);
2129 
2130       /* Register a hook for converting a memory tag to a string.  */
2131       set_gdbarch_memtag_to_string (gdbarch, aarch64_linux_memtag_to_string);
2132 
2133       set_gdbarch_report_signal_info (gdbarch,
2134 				      aarch64_linux_report_signal_info);
2135 
2136       /* Core file helpers.  */
2137 
2138       /* Core file helper to create a memory tag section for a particular
2139 	 PT_LOAD segment.  */
2140       set_gdbarch_create_memtag_section
2141 	(gdbarch, aarch64_linux_create_memtag_section);
2142 
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);
2146 
2147       /* Core file helper to decode a memory tag section.  */
2148       set_gdbarch_decode_memtag_section (gdbarch,
2149 					 aarch64_linux_decode_memtag_section);
2150     }
2151 
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;
2226 
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;
2294 
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;
2301 
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;
2311 
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);
2315 
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);
2323 
2324   set_gdbarch_gcc_target_options (gdbarch, aarch64_linux_gcc_target_options);
2325 }
2326 
2327 #if GDB_SELF_TEST
2328 
2329 namespace selftests {
2330 
2331 /* Verify functions to read and write logical tags.  */
2332 
2333 static void
2334 aarch64_linux_ltag_tests (void)
2335 {
2336   /* We have 4 bits of tags, but we test writing all the bits of the top
2337      byte of address.  */
2338   for (int i = 0; i < 1 << 8; i++)
2339     {
2340       CORE_ADDR addr = ((CORE_ADDR) i << 56) | 0xdeadbeef;
2341       SELF_CHECK (aarch64_mte_get_ltag (addr) == (i & 0xf));
2342 
2343       addr = aarch64_mte_set_ltag (0xdeadbeef, i);
2344       SELF_CHECK (addr = ((CORE_ADDR) (i & 0xf) << 56) | 0xdeadbeef);
2345     }
2346 }
2347 
2348 } // namespace selftests
2349 #endif /* GDB_SELF_TEST */
2350 
2351 void _initialize_aarch64_linux_tdep ();
2352 void
2353 _initialize_aarch64_linux_tdep ()
2354 {
2355   gdbarch_register_osabi (bfd_arch_aarch64, 0, GDB_OSABI_LINUX,
2356 			  aarch64_linux_init_abi);
2357 
2358 #if GDB_SELF_TEST
2359   selftests::register_test ("aarch64-linux-tagged-address",
2360 			    selftests::aarch64_linux_ltag_tests);
2361 #endif
2362 }
2363