]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/aarch64-linux-tdep.c
Fix signed/unsigned address extraction in capability maintenance commands
[thirdparty/binutils-gdb.git] / gdb / aarch64-linux-tdep.c
CommitLineData
1ae3db19
MS
1/* Target-dependent code for GNU/Linux AArch64.
2
b811d2c2 3 Copyright (C) 2009-2020 Free Software Foundation, Inc.
1ae3db19
MS
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
4a3d7ef8 23#include "gdbcmd.h"
d55e5aa6 24#include "gdbarch.h"
1ae3db19
MS
25#include "glibc-tdep.h"
26#include "linux-tdep.h"
4de283e4
TT
27#include "aarch64-tdep.h"
28#include "aarch64-linux-tdep.h"
698c8983 29#include "arch/aarch64-cap-linux.h"
1ae3db19 30#include "osabi.h"
d55e5aa6 31#include "solib-svr4.h"
d55e5aa6 32#include "symtab.h"
d55e5aa6 33#include "tramp-frame.h"
4de283e4 34#include "trad-frame.h"
be155ebb 35#include "target/target.h"
c7c3ac5d 36#include "target.h"
4de283e4 37
4de283e4
TT
38#include "regcache.h"
39#include "regset.h"
40
4de283e4
TT
41#include "stap-probe.h"
42#include "parser-defs.h"
08248ca9 43#include "user-regs.h"
f68f11b7 44#include "xml-syscall.h"
4de283e4
TT
45#include <ctype.h>
46
47#include "record-full.h"
48#include "linux-record.h"
99afc88b 49
c8c305cd
LM
50#include "value.h"
51
33f0202d
LM
52/* For aarch64_debug. */
53#include "arch/aarch64-insn.h"
54
ffbda24e
LM
55#include "elf/common.h"
56
4f7528c7
LM
57#include "gdbsupport/capability.h"
58
1ae3db19
MS
59/* Signal frame handling.
60
f2205de0
HZ
61 +------------+ ^
62 | saved lr | |
63 +->| saved fp |--+
64 | | |
65 | | |
66 | +------------+
67 | | saved lr |
68 +--| saved fp |
69 ^ | |
70 | | |
71 | +------------+
72 ^ | |
73 | | signal |
74 | | | SIGTRAMP_FRAME (struct rt_sigframe)
75 | | saved regs |
76 +--| saved sp |--> interrupted_sp
77 | | saved pc |--> interrupted_pc
78 | | |
79 | +------------+
80 | | saved lr |--> default_restorer (movz x8, NR_sys_rt_sigreturn; svc 0)
81 +--| saved fp |<- FP
82 | | NORMAL_FRAME
83 | |<- SP
84 +------------+
1ae3db19
MS
85
86 On signal delivery, the kernel will create a signal handler stack
87 frame and setup the return address in LR to point at restorer stub.
88 The signal stack frame is defined by:
89
90 struct rt_sigframe
91 {
92 siginfo_t info;
93 struct ucontext uc;
94 };
95
1ae3db19
MS
96 The ucontext has the following form:
97 struct ucontext
98 {
99 unsigned long uc_flags;
100 struct ucontext *uc_link;
101 stack_t uc_stack;
102 sigset_t uc_sigmask;
103 struct sigcontext uc_mcontext;
104 };
105
1ae3db19
MS
106 struct sigcontext
107 {
108 unsigned long fault_address;
109 unsigned long regs[31];
110 unsigned long sp; / * 31 * /
111 unsigned long pc; / * 32 * /
112 unsigned long pstate; / * 33 * /
113 __u8 __reserved[4096]
114 };
115
05c71722
AH
116 The reserved space in sigcontext contains additional structures, each starting
117 with a aarch64_ctx, which specifies a unique identifier and the total size of
118 the structure. The final structure in reserved will start will a null
119 aarch64_ctx. The penultimate entry in reserved may be a extra_context which
120 then points to a further block of reserved space.
121
122 struct aarch64_ctx {
123 u32 magic;
124 u32 size;
125 };
126
1ae3db19
MS
127 The restorer stub will always have the form:
128
129 d28015a8 movz x8, #0xad
130 d4000001 svc #0x0
131
f2205de0
HZ
132 This is a system call sys_rt_sigreturn.
133
1ae3db19
MS
134 We detect signal frames by snooping the return code for the restorer
135 instruction sequence.
136
137 The handler then needs to recover the saved register set from
138 ucontext.uc_mcontext. */
139
140/* These magic numbers need to reflect the layout of the kernel
141 defined struct rt_sigframe and ucontext. */
142#define AARCH64_SIGCONTEXT_REG_SIZE 8
143#define AARCH64_RT_SIGFRAME_UCONTEXT_OFFSET 128
144#define AARCH64_UCONTEXT_SIGCONTEXT_OFFSET 176
145#define AARCH64_SIGCONTEXT_XO_OFFSET 8
05c71722
AH
146#define AARCH64_SIGCONTEXT_RESERVED_OFFSET 288
147
74b3c713
AH
148#define AARCH64_SIGCONTEXT_RESERVED_SIZE 4096
149
05c71722
AH
150/* Unique identifiers that may be used for aarch64_ctx.magic. */
151#define AARCH64_EXTRA_MAGIC 0x45585401
152#define AARCH64_FPSIMD_MAGIC 0x46508001
153#define AARCH64_SVE_MAGIC 0x53564501
33f0202d 154#define AARCH64_MORELLO_MAGIC 0x4d524c01
05c71722
AH
155
156/* Defines for the extra_context that follows an AARCH64_EXTRA_MAGIC. */
157#define AARCH64_EXTRA_DATAP_OFFSET 8
158
159/* Defines for the fpsimd that follows an AARCH64_FPSIMD_MAGIC. */
160#define AARCH64_FPSIMD_FPSR_OFFSET 8
161#define AARCH64_FPSIMD_FPCR_OFFSET 12
162#define AARCH64_FPSIMD_V0_OFFSET 16
163#define AARCH64_FPSIMD_VREG_SIZE 16
164
165/* Defines for the sve structure that follows an AARCH64_SVE_MAGIC. */
166#define AARCH64_SVE_CONTEXT_VL_OFFSET 8
167#define AARCH64_SVE_CONTEXT_REGS_OFFSET 16
168#define AARCH64_SVE_CONTEXT_P_REGS_OFFSET(vq) (32 * vq * 16)
169#define AARCH64_SVE_CONTEXT_FFR_OFFSET(vq) \
170 (AARCH64_SVE_CONTEXT_P_REGS_OFFSET (vq) + (16 * vq * 2))
171#define AARCH64_SVE_CONTEXT_SIZE(vq) \
172 (AARCH64_SVE_CONTEXT_FFR_OFFSET (vq) + (vq * 2))
173
33f0202d
LM
174/* Defines for the Morello sigcontext data, which is define in the kernel like
175 so:
176
177 struct morello_context
178 {
179 struct _aarch64_ctx head;
180 __u64 __pad;
181 __kernel_uintcap_t cregs[31];
182 __kernel_uintcap_t csp;
183 __kernel_uintcap_t rcsp;
184 __kernel_uintcap_t pcc;
185 };
186
187*/
188
189#define AARCH64_MORELLO_SIGCONTEXT_SIZE (8 + 8 + 34 * 16)
190#define AARCH64_MORELLO_SIGCONTEXT_C0_OFFSET 16
05c71722
AH
191
192/* Read an aarch64_ctx, returning the magic value, and setting *SIZE to the
193 size, or return 0 on error. */
194
195static uint32_t
196read_aarch64_ctx (CORE_ADDR ctx_addr, enum bfd_endian byte_order,
197 uint32_t *size)
198{
199 uint32_t magic = 0;
200 gdb_byte buf[4];
201
202 if (target_read_memory (ctx_addr, buf, 4) != 0)
203 return 0;
204 magic = extract_unsigned_integer (buf, 4, byte_order);
205
206 if (target_read_memory (ctx_addr + 4, buf, 4) != 0)
207 return 0;
208 *size = extract_unsigned_integer (buf, 4, byte_order);
209
210 return magic;
211}
1ae3db19
MS
212
213/* Implement the "init" method of struct tramp_frame. */
214
215static void
216aarch64_linux_sigframe_init (const struct tramp_frame *self,
217 struct frame_info *this_frame,
218 struct trad_frame_cache *this_cache,
219 CORE_ADDR func)
220{
05c71722
AH
221 struct gdbarch *gdbarch = get_frame_arch (this_frame);
222 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
223 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1ae3db19 224 CORE_ADDR sp = get_frame_register_unsigned (this_frame, AARCH64_SP_REGNUM);
05c71722
AH
225 CORE_ADDR sigcontext_addr = (sp + AARCH64_RT_SIGFRAME_UCONTEXT_OFFSET
226 + AARCH64_UCONTEXT_SIGCONTEXT_OFFSET );
227 CORE_ADDR section = sigcontext_addr + AARCH64_SIGCONTEXT_RESERVED_OFFSET;
74b3c713 228 CORE_ADDR section_end = section + AARCH64_SIGCONTEXT_RESERVED_SIZE;
05c71722
AH
229 CORE_ADDR fpsimd = 0;
230 CORE_ADDR sve_regs = 0;
231 uint32_t size, magic;
74b3c713 232 bool extra_found = false;
05c71722
AH
233 int num_regs = gdbarch_num_regs (gdbarch);
234
33f0202d
LM
235 if (aarch64_debug)
236 {
237 debug_printf ("\naarch64: Entering aarch64_linux_sigframe_init\n");
238 }
239
05c71722 240 /* Read in the integer registers. */
1ae3db19 241
05c71722 242 for (int i = 0; i < 31; i++)
1ae3db19
MS
243 {
244 trad_frame_set_reg_addr (this_cache,
245 AARCH64_X0_REGNUM + i,
246 sigcontext_addr + AARCH64_SIGCONTEXT_XO_OFFSET
05c71722 247 + i * AARCH64_SIGCONTEXT_REG_SIZE);
1ae3db19 248 }
f2205de0
HZ
249 trad_frame_set_reg_addr (this_cache, AARCH64_SP_REGNUM,
250 sigcontext_addr + AARCH64_SIGCONTEXT_XO_OFFSET
251 + 31 * AARCH64_SIGCONTEXT_REG_SIZE);
252 trad_frame_set_reg_addr (this_cache, AARCH64_PC_REGNUM,
253 sigcontext_addr + AARCH64_SIGCONTEXT_XO_OFFSET
254 + 32 * AARCH64_SIGCONTEXT_REG_SIZE);
255
74b3c713
AH
256 /* Search for the FP and SVE sections, stopping at null. */
257 while ((magic = read_aarch64_ctx (section, byte_order, &size)) != 0
258 && size != 0)
05c71722
AH
259 {
260 switch (magic)
261 {
262 case AARCH64_FPSIMD_MAGIC:
263 fpsimd = section;
264 section += size;
265 break;
266
267 case AARCH64_SVE_MAGIC:
268 {
269 /* Check if the section is followed by a full SVE dump, and set
270 sve_regs if it is. */
271 gdb_byte buf[4];
272 uint16_t vq;
273
274 if (!tdep->has_sve ())
275 break;
276
277 if (target_read_memory (section + AARCH64_SVE_CONTEXT_VL_OFFSET,
278 buf, 2) != 0)
279 {
280 section += size;
281 break;
282 }
283 vq = sve_vq_from_vl (extract_unsigned_integer (buf, 2, byte_order));
284
285 if (vq != tdep->vq)
2398abf8
TT
286 error (_("Invalid vector length in signal frame %d vs %s."), vq,
287 pulongest (tdep->vq));
05c71722
AH
288
289 if (size >= AARCH64_SVE_CONTEXT_SIZE (vq))
290 sve_regs = section + AARCH64_SVE_CONTEXT_REGS_OFFSET;
291
292 section += size;
293 break;
294 }
295
33f0202d
LM
296 case AARCH64_MORELLO_MAGIC:
297 {
298 if (aarch64_debug)
299 debug_printf ("aarch64: Found Morello section at %s.\n",
300 paddress (gdbarch, section));
301
302 /* Handle Morello sigcontext. */
303 if (!tdep->has_capability ())
304 break;
305
306 int regno = tdep->cap_reg_base;
307 CORE_ADDR offset = section + AARCH64_MORELLO_SIGCONTEXT_C0_OFFSET;
308 int reg_size = C_REGISTER_SIZE;
309
310 if (aarch64_debug)
311 {
312 debug_printf ("aarch64: Reading C registers from sigreturn "
313 "frame.\n");
314 }
315
316 for (int i = 0; i < AARCH64_C_REGS_NUM; i++)
317 {
318 trad_frame_set_reg_addr (this_cache, regno + i,
319 offset + i * reg_size);
320 }
321
33f0202d
LM
322 if (aarch64_debug)
323 {
324 debug_printf ("aarch64: Reading PCC, CSP and RCSP registers "
325 "from sigreturn frame at %s.\n",
326 paddress (gdbarch, offset + 31 * reg_size));
327 }
328
ee871849 329 trad_frame_set_reg_addr (this_cache, tdep->cap_reg_csp,
33f0202d 330 offset + 31 * reg_size);
ee871849 331 trad_frame_set_reg_addr (this_cache, tdep->cap_reg_rcsp,
33f0202d 332 offset + 32 * reg_size);
ee871849 333 trad_frame_set_reg_addr (this_cache, tdep->cap_reg_pcc,
33f0202d
LM
334 offset + 33 * reg_size);
335
336 section += size;
337 break;
338 }
339
05c71722
AH
340 case AARCH64_EXTRA_MAGIC:
341 {
342 /* Extra is always the last valid section in reserved and points to
343 an additional block of memory filled with more sections. Reset
344 the address to the extra section and continue looking for more
345 structures. */
346 gdb_byte buf[8];
347
348 if (target_read_memory (section + AARCH64_EXTRA_DATAP_OFFSET,
349 buf, 8) != 0)
350 {
351 section += size;
352 break;
353 }
354
355 section = extract_unsigned_integer (buf, 8, byte_order);
74b3c713 356 extra_found = true;
05c71722
AH
357 break;
358 }
359
360 default:
74b3c713 361 section += size;
05c71722
AH
362 break;
363 }
74b3c713
AH
364
365 /* Prevent searching past the end of the reserved section. The extra
366 section does not have a hard coded limit - we have to rely on it ending
367 with nulls. */
368 if (!extra_found && section > section_end)
369 break;
05c71722
AH
370 }
371
372 if (sve_regs != 0)
373 {
374 CORE_ADDR offset;
375
376 for (int i = 0; i < 32; i++)
377 {
378 offset = sve_regs + (i * tdep->vq * 16);
379 trad_frame_set_reg_addr (this_cache, AARCH64_SVE_Z0_REGNUM + i,
380 offset);
381 trad_frame_set_reg_addr (this_cache,
382 num_regs + AARCH64_SVE_V0_REGNUM + i,
383 offset);
384 trad_frame_set_reg_addr (this_cache, num_regs + AARCH64_Q0_REGNUM + i,
385 offset);
386 trad_frame_set_reg_addr (this_cache, num_regs + AARCH64_D0_REGNUM + i,
387 offset);
388 trad_frame_set_reg_addr (this_cache, num_regs + AARCH64_S0_REGNUM + i,
389 offset);
390 trad_frame_set_reg_addr (this_cache, num_regs + AARCH64_H0_REGNUM + i,
391 offset);
392 trad_frame_set_reg_addr (this_cache, num_regs + AARCH64_B0_REGNUM + i,
393 offset);
394 }
395
396 offset = sve_regs + AARCH64_SVE_CONTEXT_P_REGS_OFFSET (tdep->vq);
397 for (int i = 0; i < 16; i++)
398 trad_frame_set_reg_addr (this_cache, AARCH64_SVE_P0_REGNUM + i,
399 offset + (i * tdep->vq * 2));
400
401 offset = sve_regs + AARCH64_SVE_CONTEXT_FFR_OFFSET (tdep->vq);
402 trad_frame_set_reg_addr (this_cache, AARCH64_SVE_FFR_REGNUM, offset);
403 }
404
405 if (fpsimd != 0)
406 {
407 trad_frame_set_reg_addr (this_cache, AARCH64_FPSR_REGNUM,
408 fpsimd + AARCH64_FPSIMD_FPSR_OFFSET);
409 trad_frame_set_reg_addr (this_cache, AARCH64_FPCR_REGNUM,
410 fpsimd + AARCH64_FPSIMD_FPCR_OFFSET);
411
412 /* If there was no SVE section then set up the V registers. */
413 if (sve_regs == 0)
414 for (int i = 0; i < 32; i++)
415 {
416 CORE_ADDR offset = (fpsimd + AARCH64_FPSIMD_V0_OFFSET
417 + (i * AARCH64_FPSIMD_VREG_SIZE));
418
419 trad_frame_set_reg_addr (this_cache, AARCH64_V0_REGNUM + i, offset);
420 trad_frame_set_reg_addr (this_cache,
421 num_regs + AARCH64_Q0_REGNUM + i, offset);
422 trad_frame_set_reg_addr (this_cache,
423 num_regs + AARCH64_D0_REGNUM + i, offset);
424 trad_frame_set_reg_addr (this_cache,
425 num_regs + AARCH64_S0_REGNUM + i, offset);
426 trad_frame_set_reg_addr (this_cache,
427 num_regs + AARCH64_H0_REGNUM + i, offset);
428 trad_frame_set_reg_addr (this_cache,
429 num_regs + AARCH64_B0_REGNUM + i, offset);
430 if (tdep->has_sve ())
431 trad_frame_set_reg_addr (this_cache,
432 num_regs + AARCH64_SVE_V0_REGNUM + i,
433 offset);
434 }
435 }
436
f2205de0 437 trad_frame_set_id (this_cache, frame_id_build (sp, func));
33f0202d
LM
438
439 if (aarch64_debug)
440 debug_printf ("aarch64: Exitting aarch64_linux_sigframe_init\n");
1ae3db19
MS
441}
442
443static const struct tramp_frame aarch64_linux_rt_sigframe =
444{
445 SIGTRAMP_FRAME,
446 4,
447 {
448 /* movz x8, 0x8b (S=1,o=10,h=0,i=0x8b,r=8)
449 Soo1 0010 1hhi iiii iiii iiii iiir rrrr */
7bc02706 450 {0xd2801168, ULONGEST_MAX},
1ae3db19
MS
451
452 /* svc 0x0 (o=0, l=1)
453 1101 0100 oooi iiii iiii iiii iii0 00ll */
7bc02706
TT
454 {0xd4000001, ULONGEST_MAX},
455 {TRAMP_SENTINEL_INSN, ULONGEST_MAX}
1ae3db19
MS
456 },
457 aarch64_linux_sigframe_init
458};
459
d4d793bf 460/* Register maps. */
1ae3db19 461
d4d793bf
AA
462static const struct regcache_map_entry aarch64_linux_gregmap[] =
463 {
464 { 31, AARCH64_X0_REGNUM, 8 }, /* x0 ... x30 */
465 { 1, AARCH64_SP_REGNUM, 8 },
466 { 1, AARCH64_PC_REGNUM, 8 },
467 { 1, AARCH64_CPSR_REGNUM, 8 },
468 { 0 }
469 };
1ae3db19 470
d4d793bf
AA
471static const struct regcache_map_entry aarch64_linux_fpregmap[] =
472 {
473 { 32, AARCH64_V0_REGNUM, 16 }, /* v0 ... v31 */
474 { 1, AARCH64_FPSR_REGNUM, 4 },
475 { 1, AARCH64_FPCR_REGNUM, 4 },
476 { 0 }
477 };
1ae3db19 478
c778c6aa
LM
479/* Since the C register numbers are determined dynamically, we leave
480 placeholders so we can update the numbers later. */
481static struct regcache_map_entry aarch64_linux_cregmap[] =
482 {
ffbda24e
LM
483 { 31, -1, 16 }, /* c0 ... c30 */
484 { 1, -1, 16 }, /* pcc */
485 { 1, -1, 16 }, /* csp */
486 { 1, -1, 16 }, /* ddc */
487 { 1, -1, 16 }, /* ctpidr */
488 { 1, -1, 16 }, /* rcsp */
489 { 1, -1, 16 }, /* rddc */
490 { 1, -1, 16 }, /* rctpidr */
491 { 1, -1, 16 }, /* cid */
492 { 1, -1, 8 }, /* tag_map */
493 { 1, -1, 8 }, /* cctlr */
c778c6aa
LM
494 { 0 }
495 };
496
d4d793bf 497/* Register set definitions. */
a069a2bd 498
d4d793bf 499const struct regset aarch64_linux_gregset =
a069a2bd 500 {
d4d793bf
AA
501 aarch64_linux_gregmap,
502 regcache_supply_regset, regcache_collect_regset
a069a2bd
AA
503 };
504
d4d793bf 505const struct regset aarch64_linux_fpregset =
a069a2bd 506 {
d4d793bf
AA
507 aarch64_linux_fpregmap,
508 regcache_supply_regset, regcache_collect_regset
a069a2bd
AA
509 };
510
c778c6aa
LM
511/* The capability register set. */
512const struct regset aarch64_linux_cregset =
513 {
514 aarch64_linux_cregmap,
515 regcache_supply_regset, regcache_collect_regset
516 };
517
b7fd65b9
AH
518/* The fields in an SVE header at the start of a SVE regset. */
519
520#define SVE_HEADER_SIZE_LENGTH 4
521#define SVE_HEADER_MAX_SIZE_LENGTH 4
522#define SVE_HEADER_VL_LENGTH 2
523#define SVE_HEADER_MAX_VL_LENGTH 2
524#define SVE_HEADER_FLAGS_LENGTH 2
525#define SVE_HEADER_RESERVED_LENGTH 2
526
527#define SVE_HEADER_SIZE_OFFSET 0
528#define SVE_HEADER_MAX_SIZE_OFFSET \
529 (SVE_HEADER_SIZE_OFFSET + SVE_HEADER_SIZE_LENGTH)
530#define SVE_HEADER_VL_OFFSET \
531 (SVE_HEADER_MAX_SIZE_OFFSET + SVE_HEADER_MAX_SIZE_LENGTH)
532#define SVE_HEADER_MAX_VL_OFFSET \
533 (SVE_HEADER_VL_OFFSET + SVE_HEADER_VL_LENGTH)
534#define SVE_HEADER_FLAGS_OFFSET \
535 (SVE_HEADER_MAX_VL_OFFSET + SVE_HEADER_MAX_VL_LENGTH)
536#define SVE_HEADER_RESERVED_OFFSET \
537 (SVE_HEADER_FLAGS_OFFSET + SVE_HEADER_FLAGS_LENGTH)
538#define SVE_HEADER_SIZE \
539 (SVE_HEADER_RESERVED_OFFSET + SVE_HEADER_RESERVED_LENGTH)
540
0c76e06d
AH
541#define SVE_HEADER_FLAG_SVE 1
542
b7fd65b9
AH
543/* Get VQ value from SVE section in the core dump. */
544
545static uint64_t
546aarch64_linux_core_read_vq (struct gdbarch *gdbarch, bfd *abfd)
547{
548 gdb_byte header[SVE_HEADER_SIZE];
549 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
550 asection *sve_section = bfd_get_section_by_name (abfd, ".reg-aarch-sve");
551
552 if (sve_section == nullptr)
553 {
554 /* No SVE state. */
555 return 0;
556 }
557
fd361982 558 size_t size = bfd_section_size (sve_section);
b7fd65b9
AH
559
560 /* Check extended state size. */
561 if (size < SVE_HEADER_SIZE)
562 {
563 warning (_("'.reg-aarch-sve' section in core file too small."));
564 return 0;
565 }
566
567 if (!bfd_get_section_contents (abfd, sve_section, header, 0, SVE_HEADER_SIZE))
568 {
569 warning (_("Couldn't read sve header from "
570 "'.reg-aarch-sve' section in core file."));
571 return 0;
572 }
573
574 uint64_t vl = extract_unsigned_integer (header + SVE_HEADER_VL_OFFSET,
575 SVE_HEADER_VL_LENGTH, byte_order);
576 uint64_t vq = sve_vq_from_vl (vl);
577
578 if (vq > AARCH64_MAX_SVE_VQ)
579 {
580 warning (_("SVE Vector length in core file not supported by this version"
49514353 581 " of GDB. (VQ=%s)"), pulongest (vq));
b7fd65b9
AH
582 return 0;
583 }
584 else if (vq == 0)
585 {
49514353
TT
586 warning (_("SVE Vector length in core file is invalid. (VQ=%s"),
587 pulongest (vq));
b7fd65b9
AH
588 return 0;
589 }
590
591 return vq;
592}
593
0c76e06d
AH
594/* Supply register REGNUM from BUF to REGCACHE, using the register map
595 in REGSET. If REGNUM is -1, do this for all registers in REGSET.
596 If BUF is NULL, set the registers to "unavailable" status. */
597
598static void
599aarch64_linux_supply_sve_regset (const struct regset *regset,
600 struct regcache *regcache,
601 int regnum, const void *buf, size_t size)
602{
603 gdb_byte *header = (gdb_byte *) buf;
604 struct gdbarch *gdbarch = regcache->arch ();
605 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
606
607 if (buf == nullptr)
608 return regcache->supply_regset (regset, regnum, nullptr, size);
609 gdb_assert (size > SVE_HEADER_SIZE);
610
611 /* BUF contains an SVE header followed by a register dump of either the
612 passed in SVE regset or a NEON fpregset. */
613
614 /* Extract required fields from the header. */
0c0a40e0 615 ULONGEST vl = extract_unsigned_integer (header + SVE_HEADER_VL_OFFSET,
0c76e06d
AH
616 SVE_HEADER_VL_LENGTH, byte_order);
617 uint16_t flags = extract_unsigned_integer (header + SVE_HEADER_FLAGS_OFFSET,
618 SVE_HEADER_FLAGS_LENGTH,
619 byte_order);
620
621 if (regnum == -1 || regnum == AARCH64_SVE_VG_REGNUM)
622 {
623 gdb_byte vg_target[8];
624 store_integer ((gdb_byte *)&vg_target, sizeof (uint64_t), byte_order,
625 sve_vg_from_vl (vl));
626 regcache->raw_supply (AARCH64_SVE_VG_REGNUM, &vg_target);
627 }
628
629 if (flags & SVE_HEADER_FLAG_SVE)
630 {
631 /* Register dump is a SVE structure. */
632 regcache->supply_regset (regset, regnum,
633 (gdb_byte *) buf + SVE_HEADER_SIZE,
634 size - SVE_HEADER_SIZE);
635 }
636 else
637 {
638 /* Register dump is a fpsimd structure. First clear the SVE
639 registers. */
640 for (int i = 0; i < AARCH64_SVE_Z_REGS_NUM; i++)
641 regcache->raw_supply_zeroed (AARCH64_SVE_Z0_REGNUM + i);
642 for (int i = 0; i < AARCH64_SVE_P_REGS_NUM; i++)
643 regcache->raw_supply_zeroed (AARCH64_SVE_P0_REGNUM + i);
644 regcache->raw_supply_zeroed (AARCH64_SVE_FFR_REGNUM);
645
646 /* Then supply the fpsimd registers. */
647 regcache->supply_regset (&aarch64_linux_fpregset, regnum,
648 (gdb_byte *) buf + SVE_HEADER_SIZE,
649 size - SVE_HEADER_SIZE);
650 }
651}
652
653/* Collect register REGNUM from REGCACHE to BUF, using the register
654 map in REGSET. If REGNUM is -1, do this for all registers in
655 REGSET. */
656
657static void
658aarch64_linux_collect_sve_regset (const struct regset *regset,
659 const struct regcache *regcache,
660 int regnum, void *buf, size_t size)
661{
662 gdb_byte *header = (gdb_byte *) buf;
663 struct gdbarch *gdbarch = regcache->arch ();
664 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
665 uint64_t vq = gdbarch_tdep (gdbarch)->vq;
666
667 gdb_assert (buf != NULL);
668 gdb_assert (size > SVE_HEADER_SIZE);
669
670 /* BUF starts with a SVE header prior to the register dump. */
671
672 store_unsigned_integer (header + SVE_HEADER_SIZE_OFFSET,
673 SVE_HEADER_SIZE_LENGTH, byte_order, size);
674 store_unsigned_integer (header + SVE_HEADER_MAX_SIZE_OFFSET,
675 SVE_HEADER_MAX_SIZE_LENGTH, byte_order, size);
676 store_unsigned_integer (header + SVE_HEADER_VL_OFFSET, SVE_HEADER_VL_LENGTH,
677 byte_order, sve_vl_from_vq (vq));
678 store_unsigned_integer (header + SVE_HEADER_MAX_VL_OFFSET,
679 SVE_HEADER_MAX_VL_LENGTH, byte_order,
680 sve_vl_from_vq (vq));
681 store_unsigned_integer (header + SVE_HEADER_FLAGS_OFFSET,
682 SVE_HEADER_FLAGS_LENGTH, byte_order,
683 SVE_HEADER_FLAG_SVE);
684 store_unsigned_integer (header + SVE_HEADER_RESERVED_OFFSET,
685 SVE_HEADER_RESERVED_LENGTH, byte_order, 0);
686
687 /* The SVE register dump follows. */
688 regcache->collect_regset (regset, regnum, (gdb_byte *) buf + SVE_HEADER_SIZE,
689 size - SVE_HEADER_SIZE);
690}
691
89203d40 692/* Implement the "iterate_over_regset_sections" gdbarch method. */
1ae3db19 693
4108500a
AA
694static void
695aarch64_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
696 iterate_over_regset_sections_cb *cb,
697 void *cb_data,
698 const struct regcache *regcache)
1ae3db19 699{
0c76e06d
AH
700 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
701
a616bb94
AH
702 cb (".reg", AARCH64_LINUX_SIZEOF_GREGSET, AARCH64_LINUX_SIZEOF_GREGSET,
703 &aarch64_linux_gregset, NULL, cb_data);
0c76e06d
AH
704
705 if (tdep->has_sve ())
706 {
707 /* Create this on the fly in order to handle vector register sizes. */
708 const struct regcache_map_entry sve_regmap[] =
709 {
1885053b
TT
710 { 32, AARCH64_SVE_Z0_REGNUM, (int) (tdep->vq * 16) },
711 { 16, AARCH64_SVE_P0_REGNUM, (int) (tdep->vq * 16 / 8) },
0c76e06d
AH
712 { 1, AARCH64_SVE_FFR_REGNUM, 4 },
713 { 1, AARCH64_FPSR_REGNUM, 4 },
714 { 1, AARCH64_FPCR_REGNUM, 4 },
715 { 0 }
716 };
717
718 const struct regset aarch64_linux_sve_regset =
719 {
720 sve_regmap,
721 aarch64_linux_supply_sve_regset, aarch64_linux_collect_sve_regset,
722 REGSET_VARIABLE_SIZE
723 };
724
725 cb (".reg-aarch-sve",
726 SVE_HEADER_SIZE + regcache_map_entry_size (aarch64_linux_fpregmap),
727 SVE_HEADER_SIZE + regcache_map_entry_size (sve_regmap),
728 &aarch64_linux_sve_regset, "SVE registers", cb_data);
729 }
730 else
731 cb (".reg2", AARCH64_LINUX_SIZEOF_FPREGSET, AARCH64_LINUX_SIZEOF_FPREGSET,
732 &aarch64_linux_fpregset, NULL, cb_data);
59c28372
AH
733
734
735 if (tdep->has_pauth ())
736 {
737 /* Create this on the fly in order to handle the variable location. */
738 const struct regcache_map_entry pauth_regmap[] =
739 {
740 { 2, AARCH64_PAUTH_DMASK_REGNUM (tdep->pauth_reg_base), 8},
741 { 0 }
742 };
743
744 const struct regset aarch64_linux_pauth_regset =
745 {
746 pauth_regmap, regcache_supply_regset, regcache_collect_regset
747 };
748
749 cb (".reg-aarch-pauth", AARCH64_LINUX_SIZEOF_PAUTH,
750 AARCH64_LINUX_SIZEOF_PAUTH, &aarch64_linux_pauth_regset,
751 "pauth registers", cb_data);
752 }
c778c6aa 753
ffbda24e 754 /* Morello capability registers. */
c778c6aa
LM
755 if (tdep->has_capability ())
756 {
ffbda24e 757 cb (".reg-aarch-morello", AARCH64_LINUX_CREGS_SIZE,
c778c6aa
LM
758 AARCH64_LINUX_CREGS_SIZE, &aarch64_linux_cregset,
759 NULL, cb_data);
760 }
1ae3db19
MS
761}
762
b7fd65b9 763/* Implement the "core_read_description" gdbarch method. */
cd3af38d
JW
764
765static const struct target_desc *
766aarch64_linux_core_read_description (struct gdbarch *gdbarch,
767 struct target_ops *target, bfd *abfd)
768{
0f83012e 769 CORE_ADDR hwcap = linux_get_hwcap (target);
1bdd3dce 770 bool pauth_p = hwcap & AARCH64_HWCAP_PACA;
e8424a87
LM
771 /* We cannot use HWCAP2_MORELLO to check for Morello support. Check if
772 we have a NT_ARM_MORELLO register set dump instead. */
773 bool capability_p =
774 (bfd_get_section_by_name (abfd, ".reg-aarch-morello") != nullptr);
cd3af38d 775
6dc0ebde 776 return aarch64_read_description (aarch64_linux_core_read_vq (gdbarch, abfd),
1bdd3dce 777 pauth_p, capability_p);
cd3af38d
JW
778}
779
08248ca9
SDJ
780/* Implementation of `gdbarch_stap_is_single_operand', as defined in
781 gdbarch.h. */
782
783static int
784aarch64_stap_is_single_operand (struct gdbarch *gdbarch, const char *s)
785{
786 return (*s == '#' || isdigit (*s) /* Literal number. */
787 || *s == '[' /* Register indirection. */
788 || isalpha (*s)); /* Register value. */
789}
790
791/* This routine is used to parse a special token in AArch64's assembly.
792
793 The special tokens parsed by it are:
794
795 - Register displacement (e.g, [fp, #-8])
796
797 It returns one if the special token has been parsed successfully,
798 or zero if the current token is not considered special. */
799
800static int
801aarch64_stap_parse_special_token (struct gdbarch *gdbarch,
802 struct stap_parse_info *p)
803{
804 if (*p->arg == '[')
805 {
806 /* Temporary holder for lookahead. */
807 const char *tmp = p->arg;
808 char *endp;
809 /* Used to save the register name. */
810 const char *start;
811 char *regname;
812 int len;
813 int got_minus = 0;
814 long displacement;
815 struct stoken str;
816
817 ++tmp;
818 start = tmp;
819
820 /* Register name. */
821 while (isalnum (*tmp))
822 ++tmp;
823
824 if (*tmp != ',')
825 return 0;
826
827 len = tmp - start;
224c3ddb 828 regname = (char *) alloca (len + 2);
08248ca9
SDJ
829
830 strncpy (regname, start, len);
831 regname[len] = '\0';
832
833 if (user_reg_map_name_to_regnum (gdbarch, regname, len) == -1)
834 error (_("Invalid register name `%s' on expression `%s'."),
835 regname, p->saved_arg);
836
837 ++tmp;
f1735a53 838 tmp = skip_spaces (tmp);
08248ca9
SDJ
839 /* Now we expect a number. It can begin with '#' or simply
840 a digit. */
841 if (*tmp == '#')
842 ++tmp;
843
844 if (*tmp == '-')
845 {
846 ++tmp;
847 got_minus = 1;
848 }
849 else if (*tmp == '+')
850 ++tmp;
851
852 if (!isdigit (*tmp))
853 return 0;
854
855 displacement = strtol (tmp, &endp, 10);
856 tmp = endp;
857
858 /* Skipping last `]'. */
859 if (*tmp++ != ']')
860 return 0;
861
862 /* The displacement. */
410a0ff2
SDJ
863 write_exp_elt_opcode (&p->pstate, OP_LONG);
864 write_exp_elt_type (&p->pstate, builtin_type (gdbarch)->builtin_long);
865 write_exp_elt_longcst (&p->pstate, displacement);
866 write_exp_elt_opcode (&p->pstate, OP_LONG);
08248ca9 867 if (got_minus)
410a0ff2 868 write_exp_elt_opcode (&p->pstate, UNOP_NEG);
08248ca9
SDJ
869
870 /* The register name. */
410a0ff2 871 write_exp_elt_opcode (&p->pstate, OP_REGISTER);
08248ca9
SDJ
872 str.ptr = regname;
873 str.length = len;
410a0ff2
SDJ
874 write_exp_string (&p->pstate, str);
875 write_exp_elt_opcode (&p->pstate, OP_REGISTER);
08248ca9 876
410a0ff2 877 write_exp_elt_opcode (&p->pstate, BINOP_ADD);
08248ca9
SDJ
878
879 /* Casting to the expected type. */
410a0ff2
SDJ
880 write_exp_elt_opcode (&p->pstate, UNOP_CAST);
881 write_exp_elt_type (&p->pstate, lookup_pointer_type (p->arg_type));
882 write_exp_elt_opcode (&p->pstate, UNOP_CAST);
08248ca9 883
410a0ff2 884 write_exp_elt_opcode (&p->pstate, UNOP_IND);
08248ca9
SDJ
885
886 p->arg = tmp;
887 }
888 else
889 return 0;
890
891 return 1;
892}
893
99afc88b
OJ
894/* AArch64 process record-replay constructs: syscall, signal etc. */
895
896struct linux_record_tdep aarch64_linux_record_tdep;
897
898/* Enum that defines the AArch64 linux specific syscall identifiers used for
899 process record/replay. */
900
901enum aarch64_syscall {
902 aarch64_sys_io_setup = 0,
903 aarch64_sys_io_destroy = 1,
904 aarch64_sys_io_submit = 2,
905 aarch64_sys_io_cancel = 3,
906 aarch64_sys_io_getevents = 4,
907 aarch64_sys_setxattr = 5,
908 aarch64_sys_lsetxattr = 6,
909 aarch64_sys_fsetxattr = 7,
910 aarch64_sys_getxattr = 8,
911 aarch64_sys_lgetxattr = 9,
912 aarch64_sys_fgetxattr = 10,
913 aarch64_sys_listxattr = 11,
914 aarch64_sys_llistxattr = 12,
915 aarch64_sys_flistxattr = 13,
916 aarch64_sys_removexattr = 14,
917 aarch64_sys_lremovexattr = 15,
918 aarch64_sys_fremovexattr = 16,
919 aarch64_sys_getcwd = 17,
920 aarch64_sys_lookup_dcookie = 18,
921 aarch64_sys_eventfd2 = 19,
922 aarch64_sys_epoll_create1 = 20,
923 aarch64_sys_epoll_ctl = 21,
924 aarch64_sys_epoll_pwait = 22,
925 aarch64_sys_dup = 23,
926 aarch64_sys_dup3 = 24,
927 aarch64_sys_fcntl = 25,
928 aarch64_sys_inotify_init1 = 26,
929 aarch64_sys_inotify_add_watch = 27,
930 aarch64_sys_inotify_rm_watch = 28,
931 aarch64_sys_ioctl = 29,
932 aarch64_sys_ioprio_set = 30,
933 aarch64_sys_ioprio_get = 31,
934 aarch64_sys_flock = 32,
c955ae73
YQ
935 aarch64_sys_mknodat = 33,
936 aarch64_sys_mkdirat = 34,
937 aarch64_sys_unlinkat = 35,
938 aarch64_sys_symlinkat = 36,
939 aarch64_sys_linkat = 37,
940 aarch64_sys_renameat = 38,
99afc88b
OJ
941 aarch64_sys_umount2 = 39,
942 aarch64_sys_mount = 40,
943 aarch64_sys_pivot_root = 41,
944 aarch64_sys_nfsservctl = 42,
945 aarch64_sys_statfs = 43,
946 aarch64_sys_fstatfs = 44,
947 aarch64_sys_truncate = 45,
948 aarch64_sys_ftruncate = 46,
949 aarch64_sys_fallocate = 47,
c955ae73 950 aarch64_sys_faccessat = 48,
99afc88b
OJ
951 aarch64_sys_chdir = 49,
952 aarch64_sys_fchdir = 50,
953 aarch64_sys_chroot = 51,
954 aarch64_sys_fchmod = 52,
955 aarch64_sys_fchmodat = 53,
956 aarch64_sys_fchownat = 54,
957 aarch64_sys_fchown = 55,
c955ae73 958 aarch64_sys_openat = 56,
99afc88b
OJ
959 aarch64_sys_close = 57,
960 aarch64_sys_vhangup = 58,
961 aarch64_sys_pipe2 = 59,
962 aarch64_sys_quotactl = 60,
963 aarch64_sys_getdents64 = 61,
964 aarch64_sys_lseek = 62,
965 aarch64_sys_read = 63,
966 aarch64_sys_write = 64,
967 aarch64_sys_readv = 65,
968 aarch64_sys_writev = 66,
969 aarch64_sys_pread64 = 67,
970 aarch64_sys_pwrite64 = 68,
971 aarch64_sys_preadv = 69,
972 aarch64_sys_pwritev = 70,
973 aarch64_sys_sendfile = 71,
974 aarch64_sys_pselect6 = 72,
975 aarch64_sys_ppoll = 73,
976 aarch64_sys_signalfd4 = 74,
977 aarch64_sys_vmsplice = 75,
978 aarch64_sys_splice = 76,
979 aarch64_sys_tee = 77,
c955ae73
YQ
980 aarch64_sys_readlinkat = 78,
981 aarch64_sys_newfstatat = 79,
99afc88b
OJ
982 aarch64_sys_fstat = 80,
983 aarch64_sys_sync = 81,
984 aarch64_sys_fsync = 82,
985 aarch64_sys_fdatasync = 83,
986 aarch64_sys_sync_file_range2 = 84,
987 aarch64_sys_sync_file_range = 84,
988 aarch64_sys_timerfd_create = 85,
989 aarch64_sys_timerfd_settime = 86,
990 aarch64_sys_timerfd_gettime = 87,
991 aarch64_sys_utimensat = 88,
992 aarch64_sys_acct = 89,
993 aarch64_sys_capget = 90,
994 aarch64_sys_capset = 91,
995 aarch64_sys_personality = 92,
996 aarch64_sys_exit = 93,
997 aarch64_sys_exit_group = 94,
998 aarch64_sys_waitid = 95,
999 aarch64_sys_set_tid_address = 96,
1000 aarch64_sys_unshare = 97,
1001 aarch64_sys_futex = 98,
1002 aarch64_sys_set_robust_list = 99,
1003 aarch64_sys_get_robust_list = 100,
1004 aarch64_sys_nanosleep = 101,
1005 aarch64_sys_getitimer = 102,
1006 aarch64_sys_setitimer = 103,
1007 aarch64_sys_kexec_load = 104,
1008 aarch64_sys_init_module = 105,
1009 aarch64_sys_delete_module = 106,
1010 aarch64_sys_timer_create = 107,
1011 aarch64_sys_timer_gettime = 108,
1012 aarch64_sys_timer_getoverrun = 109,
1013 aarch64_sys_timer_settime = 110,
1014 aarch64_sys_timer_delete = 111,
1015 aarch64_sys_clock_settime = 112,
1016 aarch64_sys_clock_gettime = 113,
1017 aarch64_sys_clock_getres = 114,
1018 aarch64_sys_clock_nanosleep = 115,
1019 aarch64_sys_syslog = 116,
1020 aarch64_sys_ptrace = 117,
1021 aarch64_sys_sched_setparam = 118,
1022 aarch64_sys_sched_setscheduler = 119,
1023 aarch64_sys_sched_getscheduler = 120,
1024 aarch64_sys_sched_getparam = 121,
1025 aarch64_sys_sched_setaffinity = 122,
1026 aarch64_sys_sched_getaffinity = 123,
1027 aarch64_sys_sched_yield = 124,
1028 aarch64_sys_sched_get_priority_max = 125,
1029 aarch64_sys_sched_get_priority_min = 126,
1030 aarch64_sys_sched_rr_get_interval = 127,
1031 aarch64_sys_kill = 129,
1032 aarch64_sys_tkill = 130,
1033 aarch64_sys_tgkill = 131,
1034 aarch64_sys_sigaltstack = 132,
1035 aarch64_sys_rt_sigsuspend = 133,
1036 aarch64_sys_rt_sigaction = 134,
1037 aarch64_sys_rt_sigprocmask = 135,
1038 aarch64_sys_rt_sigpending = 136,
1039 aarch64_sys_rt_sigtimedwait = 137,
1040 aarch64_sys_rt_sigqueueinfo = 138,
1041 aarch64_sys_rt_sigreturn = 139,
1042 aarch64_sys_setpriority = 140,
1043 aarch64_sys_getpriority = 141,
1044 aarch64_sys_reboot = 142,
1045 aarch64_sys_setregid = 143,
1046 aarch64_sys_setgid = 144,
1047 aarch64_sys_setreuid = 145,
1048 aarch64_sys_setuid = 146,
1049 aarch64_sys_setresuid = 147,
1050 aarch64_sys_getresuid = 148,
1051 aarch64_sys_setresgid = 149,
1052 aarch64_sys_getresgid = 150,
1053 aarch64_sys_setfsuid = 151,
1054 aarch64_sys_setfsgid = 152,
1055 aarch64_sys_times = 153,
1056 aarch64_sys_setpgid = 154,
1057 aarch64_sys_getpgid = 155,
1058 aarch64_sys_getsid = 156,
1059 aarch64_sys_setsid = 157,
1060 aarch64_sys_getgroups = 158,
1061 aarch64_sys_setgroups = 159,
1062 aarch64_sys_uname = 160,
1063 aarch64_sys_sethostname = 161,
1064 aarch64_sys_setdomainname = 162,
1065 aarch64_sys_getrlimit = 163,
1066 aarch64_sys_setrlimit = 164,
1067 aarch64_sys_getrusage = 165,
1068 aarch64_sys_umask = 166,
1069 aarch64_sys_prctl = 167,
1070 aarch64_sys_getcpu = 168,
1071 aarch64_sys_gettimeofday = 169,
1072 aarch64_sys_settimeofday = 170,
1073 aarch64_sys_adjtimex = 171,
1074 aarch64_sys_getpid = 172,
1075 aarch64_sys_getppid = 173,
1076 aarch64_sys_getuid = 174,
1077 aarch64_sys_geteuid = 175,
1078 aarch64_sys_getgid = 176,
1079 aarch64_sys_getegid = 177,
1080 aarch64_sys_gettid = 178,
1081 aarch64_sys_sysinfo = 179,
1082 aarch64_sys_mq_open = 180,
1083 aarch64_sys_mq_unlink = 181,
1084 aarch64_sys_mq_timedsend = 182,
1085 aarch64_sys_mq_timedreceive = 183,
1086 aarch64_sys_mq_notify = 184,
1087 aarch64_sys_mq_getsetattr = 185,
1088 aarch64_sys_msgget = 186,
1089 aarch64_sys_msgctl = 187,
1090 aarch64_sys_msgrcv = 188,
1091 aarch64_sys_msgsnd = 189,
1092 aarch64_sys_semget = 190,
1093 aarch64_sys_semctl = 191,
1094 aarch64_sys_semtimedop = 192,
1095 aarch64_sys_semop = 193,
1096 aarch64_sys_shmget = 194,
1097 aarch64_sys_shmctl = 195,
1098 aarch64_sys_shmat = 196,
1099 aarch64_sys_shmdt = 197,
1100 aarch64_sys_socket = 198,
1101 aarch64_sys_socketpair = 199,
1102 aarch64_sys_bind = 200,
1103 aarch64_sys_listen = 201,
1104 aarch64_sys_accept = 202,
1105 aarch64_sys_connect = 203,
1106 aarch64_sys_getsockname = 204,
1107 aarch64_sys_getpeername = 205,
1108 aarch64_sys_sendto = 206,
1109 aarch64_sys_recvfrom = 207,
1110 aarch64_sys_setsockopt = 208,
1111 aarch64_sys_getsockopt = 209,
1112 aarch64_sys_shutdown = 210,
1113 aarch64_sys_sendmsg = 211,
1114 aarch64_sys_recvmsg = 212,
1115 aarch64_sys_readahead = 213,
1116 aarch64_sys_brk = 214,
1117 aarch64_sys_munmap = 215,
1118 aarch64_sys_mremap = 216,
1119 aarch64_sys_add_key = 217,
1120 aarch64_sys_request_key = 218,
1121 aarch64_sys_keyctl = 219,
1122 aarch64_sys_clone = 220,
1123 aarch64_sys_execve = 221,
1124 aarch64_sys_mmap = 222,
1125 aarch64_sys_fadvise64 = 223,
1126 aarch64_sys_swapon = 224,
1127 aarch64_sys_swapoff = 225,
1128 aarch64_sys_mprotect = 226,
1129 aarch64_sys_msync = 227,
1130 aarch64_sys_mlock = 228,
1131 aarch64_sys_munlock = 229,
1132 aarch64_sys_mlockall = 230,
1133 aarch64_sys_munlockall = 231,
1134 aarch64_sys_mincore = 232,
1135 aarch64_sys_madvise = 233,
1136 aarch64_sys_remap_file_pages = 234,
1137 aarch64_sys_mbind = 235,
1138 aarch64_sys_get_mempolicy = 236,
1139 aarch64_sys_set_mempolicy = 237,
1140 aarch64_sys_migrate_pages = 238,
1141 aarch64_sys_move_pages = 239,
1142 aarch64_sys_rt_tgsigqueueinfo = 240,
1143 aarch64_sys_perf_event_open = 241,
1144 aarch64_sys_accept4 = 242,
1145 aarch64_sys_recvmmsg = 243,
1146 aarch64_sys_wait4 = 260,
1147 aarch64_sys_prlimit64 = 261,
1148 aarch64_sys_fanotify_init = 262,
1149 aarch64_sys_fanotify_mark = 263,
1150 aarch64_sys_name_to_handle_at = 264,
1151 aarch64_sys_open_by_handle_at = 265,
1152 aarch64_sys_clock_adjtime = 266,
1153 aarch64_sys_syncfs = 267,
1154 aarch64_sys_setns = 268,
1155 aarch64_sys_sendmmsg = 269,
1156 aarch64_sys_process_vm_readv = 270,
1157 aarch64_sys_process_vm_writev = 271,
1158 aarch64_sys_kcmp = 272,
1159 aarch64_sys_finit_module = 273,
1160 aarch64_sys_sched_setattr = 274,
1161 aarch64_sys_sched_getattr = 275,
1162};
1163
1164/* aarch64_canonicalize_syscall maps syscall ids from the native AArch64
1165 linux set of syscall ids into a canonical set of syscall ids used by
1166 process record. */
1167
1168static enum gdb_syscall
1169aarch64_canonicalize_syscall (enum aarch64_syscall syscall_number)
1170{
1171#define SYSCALL_MAP(SYSCALL) case aarch64_sys_##SYSCALL: \
1172 return gdb_sys_##SYSCALL
1173
c955ae73
YQ
1174#define UNSUPPORTED_SYSCALL_MAP(SYSCALL) case aarch64_sys_##SYSCALL: \
1175 return gdb_sys_no_syscall
1176
99afc88b
OJ
1177 switch (syscall_number)
1178 {
1179 SYSCALL_MAP (io_setup);
1180 SYSCALL_MAP (io_destroy);
1181 SYSCALL_MAP (io_submit);
1182 SYSCALL_MAP (io_cancel);
1183 SYSCALL_MAP (io_getevents);
1184
1185 SYSCALL_MAP (setxattr);
1186 SYSCALL_MAP (lsetxattr);
1187 SYSCALL_MAP (fsetxattr);
1188 SYSCALL_MAP (getxattr);
1189 SYSCALL_MAP (lgetxattr);
1190 SYSCALL_MAP (fgetxattr);
1191 SYSCALL_MAP (listxattr);
1192 SYSCALL_MAP (llistxattr);
1193 SYSCALL_MAP (flistxattr);
1194 SYSCALL_MAP (removexattr);
1195 SYSCALL_MAP (lremovexattr);
1196 SYSCALL_MAP (fremovexattr);
1197 SYSCALL_MAP (getcwd);
1198 SYSCALL_MAP (lookup_dcookie);
d5219069
YQ
1199 SYSCALL_MAP (eventfd2);
1200 SYSCALL_MAP (epoll_create1);
99afc88b
OJ
1201 SYSCALL_MAP (epoll_ctl);
1202 SYSCALL_MAP (epoll_pwait);
1203 SYSCALL_MAP (dup);
d5219069 1204 SYSCALL_MAP (dup3);
99afc88b 1205 SYSCALL_MAP (fcntl);
d5219069 1206 SYSCALL_MAP (inotify_init1);
99afc88b
OJ
1207 SYSCALL_MAP (inotify_add_watch);
1208 SYSCALL_MAP (inotify_rm_watch);
1209 SYSCALL_MAP (ioctl);
1210 SYSCALL_MAP (ioprio_set);
1211 SYSCALL_MAP (ioprio_get);
1212 SYSCALL_MAP (flock);
c955ae73
YQ
1213 SYSCALL_MAP (mknodat);
1214 SYSCALL_MAP (mkdirat);
1215 SYSCALL_MAP (unlinkat);
1216 SYSCALL_MAP (symlinkat);
1217 SYSCALL_MAP (linkat);
1218 SYSCALL_MAP (renameat);
1219 UNSUPPORTED_SYSCALL_MAP (umount2);
99afc88b 1220 SYSCALL_MAP (mount);
c955ae73 1221 SYSCALL_MAP (pivot_root);
99afc88b
OJ
1222 SYSCALL_MAP (nfsservctl);
1223 SYSCALL_MAP (statfs);
1224 SYSCALL_MAP (truncate);
1225 SYSCALL_MAP (ftruncate);
d5219069 1226 SYSCALL_MAP (fallocate);
c955ae73 1227 SYSCALL_MAP (faccessat);
99afc88b
OJ
1228 SYSCALL_MAP (fchdir);
1229 SYSCALL_MAP (chroot);
1230 SYSCALL_MAP (fchmod);
1231 SYSCALL_MAP (fchmodat);
1232 SYSCALL_MAP (fchownat);
1233 SYSCALL_MAP (fchown);
c955ae73 1234 SYSCALL_MAP (openat);
99afc88b
OJ
1235 SYSCALL_MAP (close);
1236 SYSCALL_MAP (vhangup);
d5219069 1237 SYSCALL_MAP (pipe2);
99afc88b
OJ
1238 SYSCALL_MAP (quotactl);
1239 SYSCALL_MAP (getdents64);
1240 SYSCALL_MAP (lseek);
1241 SYSCALL_MAP (read);
1242 SYSCALL_MAP (write);
1243 SYSCALL_MAP (readv);
1244 SYSCALL_MAP (writev);
1245 SYSCALL_MAP (pread64);
1246 SYSCALL_MAP (pwrite64);
c955ae73
YQ
1247 UNSUPPORTED_SYSCALL_MAP (preadv);
1248 UNSUPPORTED_SYSCALL_MAP (pwritev);
99afc88b
OJ
1249 SYSCALL_MAP (sendfile);
1250 SYSCALL_MAP (pselect6);
1251 SYSCALL_MAP (ppoll);
c955ae73 1252 UNSUPPORTED_SYSCALL_MAP (signalfd4);
99afc88b
OJ
1253 SYSCALL_MAP (vmsplice);
1254 SYSCALL_MAP (splice);
1255 SYSCALL_MAP (tee);
c955ae73
YQ
1256 SYSCALL_MAP (readlinkat);
1257 SYSCALL_MAP (newfstatat);
1258
99afc88b
OJ
1259 SYSCALL_MAP (fstat);
1260 SYSCALL_MAP (sync);
1261 SYSCALL_MAP (fsync);
1262 SYSCALL_MAP (fdatasync);
1263 SYSCALL_MAP (sync_file_range);
c955ae73
YQ
1264 UNSUPPORTED_SYSCALL_MAP (timerfd_create);
1265 UNSUPPORTED_SYSCALL_MAP (timerfd_settime);
1266 UNSUPPORTED_SYSCALL_MAP (timerfd_gettime);
1267 UNSUPPORTED_SYSCALL_MAP (utimensat);
99afc88b
OJ
1268 SYSCALL_MAP (acct);
1269 SYSCALL_MAP (capget);
1270 SYSCALL_MAP (capset);
1271 SYSCALL_MAP (personality);
1272 SYSCALL_MAP (exit);
1273 SYSCALL_MAP (exit_group);
1274 SYSCALL_MAP (waitid);
1275 SYSCALL_MAP (set_tid_address);
1276 SYSCALL_MAP (unshare);
1277 SYSCALL_MAP (futex);
1278 SYSCALL_MAP (set_robust_list);
1279 SYSCALL_MAP (get_robust_list);
1280 SYSCALL_MAP (nanosleep);
1281
1282 SYSCALL_MAP (getitimer);
1283 SYSCALL_MAP (setitimer);
1284 SYSCALL_MAP (kexec_load);
1285 SYSCALL_MAP (init_module);
1286 SYSCALL_MAP (delete_module);
1287 SYSCALL_MAP (timer_create);
1288 SYSCALL_MAP (timer_settime);
1289 SYSCALL_MAP (timer_gettime);
1290 SYSCALL_MAP (timer_getoverrun);
1291 SYSCALL_MAP (timer_delete);
1292 SYSCALL_MAP (clock_settime);
1293 SYSCALL_MAP (clock_gettime);
1294 SYSCALL_MAP (clock_getres);
1295 SYSCALL_MAP (clock_nanosleep);
1296 SYSCALL_MAP (syslog);
1297 SYSCALL_MAP (ptrace);
1298 SYSCALL_MAP (sched_setparam);
1299 SYSCALL_MAP (sched_setscheduler);
1300 SYSCALL_MAP (sched_getscheduler);
1301 SYSCALL_MAP (sched_getparam);
1302 SYSCALL_MAP (sched_setaffinity);
1303 SYSCALL_MAP (sched_getaffinity);
1304 SYSCALL_MAP (sched_yield);
1305 SYSCALL_MAP (sched_get_priority_max);
1306 SYSCALL_MAP (sched_get_priority_min);
1307 SYSCALL_MAP (sched_rr_get_interval);
1308 SYSCALL_MAP (kill);
1309 SYSCALL_MAP (tkill);
1310 SYSCALL_MAP (tgkill);
1311 SYSCALL_MAP (sigaltstack);
1312 SYSCALL_MAP (rt_sigsuspend);
1313 SYSCALL_MAP (rt_sigaction);
1314 SYSCALL_MAP (rt_sigprocmask);
1315 SYSCALL_MAP (rt_sigpending);
1316 SYSCALL_MAP (rt_sigtimedwait);
1317 SYSCALL_MAP (rt_sigqueueinfo);
1318 SYSCALL_MAP (rt_sigreturn);
1319 SYSCALL_MAP (setpriority);
1320 SYSCALL_MAP (getpriority);
1321 SYSCALL_MAP (reboot);
1322 SYSCALL_MAP (setregid);
1323 SYSCALL_MAP (setgid);
1324 SYSCALL_MAP (setreuid);
1325 SYSCALL_MAP (setuid);
1326 SYSCALL_MAP (setresuid);
1327 SYSCALL_MAP (getresuid);
1328 SYSCALL_MAP (setresgid);
1329 SYSCALL_MAP (getresgid);
1330 SYSCALL_MAP (setfsuid);
1331 SYSCALL_MAP (setfsgid);
1332 SYSCALL_MAP (times);
1333 SYSCALL_MAP (setpgid);
1334 SYSCALL_MAP (getpgid);
1335 SYSCALL_MAP (getsid);
1336 SYSCALL_MAP (setsid);
1337 SYSCALL_MAP (getgroups);
1338 SYSCALL_MAP (setgroups);
1339 SYSCALL_MAP (uname);
1340 SYSCALL_MAP (sethostname);
1341 SYSCALL_MAP (setdomainname);
1342 SYSCALL_MAP (getrlimit);
1343 SYSCALL_MAP (setrlimit);
1344 SYSCALL_MAP (getrusage);
1345 SYSCALL_MAP (umask);
1346 SYSCALL_MAP (prctl);
c955ae73 1347 SYSCALL_MAP (getcpu);
99afc88b
OJ
1348 SYSCALL_MAP (gettimeofday);
1349 SYSCALL_MAP (settimeofday);
1350 SYSCALL_MAP (adjtimex);
1351 SYSCALL_MAP (getpid);
1352 SYSCALL_MAP (getppid);
1353 SYSCALL_MAP (getuid);
1354 SYSCALL_MAP (geteuid);
1355 SYSCALL_MAP (getgid);
1356 SYSCALL_MAP (getegid);
1357 SYSCALL_MAP (gettid);
1358 SYSCALL_MAP (sysinfo);
1359 SYSCALL_MAP (mq_open);
1360 SYSCALL_MAP (mq_unlink);
1361 SYSCALL_MAP (mq_timedsend);
1362 SYSCALL_MAP (mq_timedreceive);
1363 SYSCALL_MAP (mq_notify);
1364 SYSCALL_MAP (mq_getsetattr);
1365 SYSCALL_MAP (msgget);
1366 SYSCALL_MAP (msgctl);
1367 SYSCALL_MAP (msgrcv);
1368 SYSCALL_MAP (msgsnd);
1369 SYSCALL_MAP (semget);
1370 SYSCALL_MAP (semctl);
1371 SYSCALL_MAP (semtimedop);
1372 SYSCALL_MAP (semop);
1373 SYSCALL_MAP (shmget);
1374 SYSCALL_MAP (shmctl);
1375 SYSCALL_MAP (shmat);
1376 SYSCALL_MAP (shmdt);
1377 SYSCALL_MAP (socket);
1378 SYSCALL_MAP (socketpair);
1379 SYSCALL_MAP (bind);
1380 SYSCALL_MAP (listen);
1381 SYSCALL_MAP (accept);
1382 SYSCALL_MAP (connect);
1383 SYSCALL_MAP (getsockname);
1384 SYSCALL_MAP (getpeername);
1385 SYSCALL_MAP (sendto);
1386 SYSCALL_MAP (recvfrom);
1387 SYSCALL_MAP (setsockopt);
1388 SYSCALL_MAP (getsockopt);
1389 SYSCALL_MAP (shutdown);
1390 SYSCALL_MAP (sendmsg);
1391 SYSCALL_MAP (recvmsg);
1392 SYSCALL_MAP (readahead);
1393 SYSCALL_MAP (brk);
1394 SYSCALL_MAP (munmap);
1395 SYSCALL_MAP (mremap);
1396 SYSCALL_MAP (add_key);
1397 SYSCALL_MAP (request_key);
1398 SYSCALL_MAP (keyctl);
1399 SYSCALL_MAP (clone);
1400 SYSCALL_MAP (execve);
1401
1402 case aarch64_sys_mmap:
1403 return gdb_sys_mmap2;
1404
1405 SYSCALL_MAP (fadvise64);
1406 SYSCALL_MAP (swapon);
1407 SYSCALL_MAP (swapoff);
1408 SYSCALL_MAP (mprotect);
1409 SYSCALL_MAP (msync);
1410 SYSCALL_MAP (mlock);
1411 SYSCALL_MAP (munlock);
1412 SYSCALL_MAP (mlockall);
1413 SYSCALL_MAP (munlockall);
1414 SYSCALL_MAP (mincore);
1415 SYSCALL_MAP (madvise);
1416 SYSCALL_MAP (remap_file_pages);
1417 SYSCALL_MAP (mbind);
1418 SYSCALL_MAP (get_mempolicy);
1419 SYSCALL_MAP (set_mempolicy);
1420 SYSCALL_MAP (migrate_pages);
1421 SYSCALL_MAP (move_pages);
c955ae73
YQ
1422 UNSUPPORTED_SYSCALL_MAP (rt_tgsigqueueinfo);
1423 UNSUPPORTED_SYSCALL_MAP (perf_event_open);
1424 UNSUPPORTED_SYSCALL_MAP (accept4);
1425 UNSUPPORTED_SYSCALL_MAP (recvmmsg);
1426
1427 SYSCALL_MAP (wait4);
1428
1429 UNSUPPORTED_SYSCALL_MAP (prlimit64);
1430 UNSUPPORTED_SYSCALL_MAP (fanotify_init);
1431 UNSUPPORTED_SYSCALL_MAP (fanotify_mark);
1432 UNSUPPORTED_SYSCALL_MAP (name_to_handle_at);
1433 UNSUPPORTED_SYSCALL_MAP (open_by_handle_at);
1434 UNSUPPORTED_SYSCALL_MAP (clock_adjtime);
1435 UNSUPPORTED_SYSCALL_MAP (syncfs);
1436 UNSUPPORTED_SYSCALL_MAP (setns);
1437 UNSUPPORTED_SYSCALL_MAP (sendmmsg);
1438 UNSUPPORTED_SYSCALL_MAP (process_vm_readv);
1439 UNSUPPORTED_SYSCALL_MAP (process_vm_writev);
1440 UNSUPPORTED_SYSCALL_MAP (kcmp);
1441 UNSUPPORTED_SYSCALL_MAP (finit_module);
1442 UNSUPPORTED_SYSCALL_MAP (sched_setattr);
1443 UNSUPPORTED_SYSCALL_MAP (sched_getattr);
99afc88b 1444 default:
cb65d272 1445 return gdb_sys_no_syscall;
99afc88b
OJ
1446 }
1447}
1448
ea638c43
AH
1449/* Retrieve the syscall number at a ptrace syscall-stop, either on syscall entry
1450 or exit. Return -1 upon error. */
1451
1452static LONGEST
1453aarch64_linux_get_syscall_number (struct gdbarch *gdbarch, thread_info *thread)
1454{
1455 struct regcache *regs = get_thread_regcache (thread);
1456 LONGEST ret;
1457
1458 /* Get the system call number from register x8. */
1459 regs->cooked_read (AARCH64_X0_REGNUM + 8, &ret);
1460
1461 /* On exit from a successful execve, we will be in a new process and all the
1462 registers will be cleared - x0 to x30 will be 0, except for a 1 in x7.
1463 This function will only ever get called when stopped at the entry or exit
1464 of a syscall, so by checking for 0 in x0 (arg0/retval), x1 (arg1), x8
1465 (syscall), x29 (FP) and x30 (LR) we can infer:
30baf67b 1466 1) Either inferior is at exit from successful execve.
ea638c43
AH
1467 2) Or inferior is at entry to a call to io_setup with invalid arguments and
1468 a corrupted FP and LR.
1469 It should be safe enough to assume case 1. */
1470 if (ret == 0)
1471 {
1472 LONGEST x1 = -1, fp = -1, lr = -1;
1473 regs->cooked_read (AARCH64_X0_REGNUM + 1, &x1);
1474 regs->cooked_read (AARCH64_FP_REGNUM, &fp);
1475 regs->cooked_read (AARCH64_LR_REGNUM, &lr);
1476 if (x1 == 0 && fp ==0 && lr == 0)
1477 return aarch64_sys_execve;
1478 }
1479
1480 return ret;
1481}
1482
99afc88b
OJ
1483/* Record all registers but PC register for process-record. */
1484
1485static int
1486aarch64_all_but_pc_registers_record (struct regcache *regcache)
1487{
1488 int i;
1489
1490 for (i = AARCH64_X0_REGNUM; i < AARCH64_PC_REGNUM; i++)
1491 if (record_full_arch_list_add_reg (regcache, i))
1492 return -1;
1493
1494 if (record_full_arch_list_add_reg (regcache, AARCH64_CPSR_REGNUM))
1495 return -1;
1496
1497 return 0;
1498}
1499
1500/* Handler for aarch64 system call instruction recording. */
1501
1502static int
1503aarch64_linux_syscall_record (struct regcache *regcache,
1504 unsigned long svc_number)
1505{
1506 int ret = 0;
1507 enum gdb_syscall syscall_gdb;
1508
1f713e48
SM
1509 syscall_gdb =
1510 aarch64_canonicalize_syscall ((enum aarch64_syscall) svc_number);
99afc88b
OJ
1511
1512 if (syscall_gdb < 0)
1513 {
1514 printf_unfiltered (_("Process record and replay target doesn't "
1515 "support syscall number %s\n"),
1516 plongest (svc_number));
1517 return -1;
1518 }
1519
1520 if (syscall_gdb == gdb_sys_sigreturn
1521 || syscall_gdb == gdb_sys_rt_sigreturn)
1522 {
1523 if (aarch64_all_but_pc_registers_record (regcache))
1524 return -1;
1525 return 0;
1526 }
1527
1528 ret = record_linux_system_call (syscall_gdb, regcache,
1529 &aarch64_linux_record_tdep);
1530 if (ret != 0)
1531 return ret;
1532
1533 /* Record the return value of the system call. */
1534 if (record_full_arch_list_add_reg (regcache, AARCH64_X0_REGNUM))
1535 return -1;
1536 /* Record LR. */
1537 if (record_full_arch_list_add_reg (regcache, AARCH64_LR_REGNUM))
1538 return -1;
1539 /* Record CPSR. */
1540 if (record_full_arch_list_add_reg (regcache, AARCH64_CPSR_REGNUM))
1541 return -1;
1542
1543 return 0;
1544}
1545
7045b1ca
YQ
1546/* Implement the "gcc_target_options" gdbarch method. */
1547
953cff56 1548static std::string
7045b1ca
YQ
1549aarch64_linux_gcc_target_options (struct gdbarch *gdbarch)
1550{
1551 /* GCC doesn't know "-m64". */
953cff56 1552 return {};
7045b1ca
YQ
1553}
1554
c8c305cd
LM
1555/* AArch64 Linux implementation of the report_signal_info gdbarch
1556 hook. Displays information about possible memory tag violations or
1557 capability violations. */
1558
1559static void
1560aarch64_linux_report_signal_info (struct gdbarch *gdbarch,
1561 struct ui_out *uiout,
1562 enum gdb_signal siggnal)
1563{
1564 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1565
1566 if (!tdep->has_capability () || siggnal != GDB_SIGNAL_SEGV)
1567 return;
1568
1569 CORE_ADDR fault_addr = 0;
1570 long si_code = 0;
1571
1572 try
1573 {
1574 /* Sigcode tells us if the segfault is actually a capability
1575 violation. */
1576 si_code = parse_and_eval_long ("$_siginfo.si_code\n");
1577
1578 fault_addr
1579 = parse_and_eval_long ("$_siginfo._sifields._sigfault.si_addr");
1580 }
1581 catch (const gdb_exception &exception)
1582 {
1583 return;
1584 }
1585
1586 /* If this is not a capability violation, just return. */
1587 if (si_code != SEGV_CAPTAGERR && si_code != SEGV_CAPSEALEDERR
1588 && si_code != SEGV_CAPBOUNDSERR && si_code != SEGV_CAPPERMERR
1589 && si_code != SEGV_CAPSTORETAGERR)
1590 return;
1591
1592 uiout->text ("\n");
1593
1594 std::string str_si_code;
1595
1596 switch (si_code)
1597 {
1598 case SEGV_CAPTAGERR:
1599 str_si_code = "tag";
1600 break;
1601 case SEGV_CAPSEALEDERR:
1602 str_si_code = "sealed";
1603 break;
1604 case SEGV_CAPBOUNDSERR:
1605 str_si_code = "bounds";
1606 break;
1607 case SEGV_CAPPERMERR:
1608 str_si_code = "permission";
1609 break;
1610 case SEGV_CAPSTORETAGERR:
1611 str_si_code = "access";
1612 break;
1613 default:
1614 str_si_code = "unknown";
1615 break;
1616 }
1617
1618 std::string str_meaning = "Capability " + str_si_code + " fault";
1619 uiout->field_string ("sigcode-meaning", str_meaning);
1620
1621 /* FIXME-Morello: Show more information about the faults. */
1622 uiout->text (_(" while accessing address "));
1623 uiout->field_core_addr ("fault-addr", gdbarch, fault_addr);
c8c305cd
LM
1624}
1625
c7c3ac5d
LM
1626/* AArch64 Linux implementation of the get_cap_tag_from_address gdbarch
1627 hook. Returns the tag from the capability located at ADDR. */
1628
1629static bool
1630aarch64_linux_get_cap_tag_from_address (struct gdbarch *gdbarch, CORE_ADDR addr)
1631{
1632 gdb::byte_vector cap;
1633
1634 cap = target_read_capability (addr);
1635
1636 if (cap.size () == 0)
1637 return false;
1638
1639 return cap[0] != 0;
1640}
1641
e3636ab1
LM
1642/* AArch64 Linux implementation of the set_cap_tag_from_address gdbarch
1643 hook. Sets the tag from the capability located at ADDR to TAG. */
1644
1645static void
1646aarch64_linux_set_cap_tag_from_address (struct gdbarch *gdbarch, CORE_ADDR addr,
1647 bool tag)
1648{
1649 gdb::byte_vector cap;
1650
1651 /* Read original capability at ADDR. */
1652 cap = target_read_capability (addr);
1653
1654 cap[0] = tag? 1 : 0;
1655
1656 /* Write back the same contents but with a custom tag. */
1657 target_write_capability (addr, cap);
1658}
1659
ffbda24e
LM
1660/* Return the number of Morello memory tag granules contained in the memory
1661 range [addr, addr + len). */
1662
1663static size_t
1664morello_get_tag_granules (CORE_ADDR addr, size_t len, size_t granule_size)
1665{
1666 /* An empty range has 0 tag granules. */
1667 if (len == 0)
1668 return 0;
1669
1670 /* Start address */
1671 CORE_ADDR s_addr = align_down (addr, granule_size);
1672 /* End address */
1673 CORE_ADDR e_addr = align_down (addr + len - 1, granule_size);
1674
1675 /* We always have at least 1 granule because len is non-zero at this
1676 point. */
1677 return 1 + (e_addr - s_addr) / granule_size;
1678}
1679
1680/* Maximum number of tags to request. */
1681#define MAX_TAGS_TO_TRANSFER 1024
1682
1683/* AArch64 Linux implementation of the aarch64_create_memtag_notes_from_range
1684 gdbarch hook. Create core file notes for memory tags. */
1685
1686static std::vector<gdb::byte_vector>
1687aarch64_linux_create_memtag_notes_from_range (struct gdbarch *gdbarch,
1688 CORE_ADDR start_address,
1689 CORE_ADDR end_address)
1690{
1691 /* We only handle CHERI capability tags for now. */
1692
1693 /* Figure out how many tags we need to store in this memory range. */
1694 int granules = morello_get_tag_granules (start_address,
1695 end_address - start_address,
1696 MORELLO_TAG_GRANULE_SIZE);
1697
1698 /* A vector to store multiple notes. */
1699 std::vector<gdb::byte_vector> notes;
1700
1701 /* Add the CHERI note. */
1702 notes.resize (1);
1703 /* Resize to the number of bytes the tag granules will take. */
1704 notes[0].resize (sizeof (struct tag_dump_header) + granules);
1705
1706 /* Retrieve the tags and store them in the vector. */
1707 gdb::byte_vector tags;
1708 CORE_ADDR address = start_address;
1709 while (granules > 0)
1710 {
1711 /* Transfer tags in chunks. */
1712 gdb::byte_vector tags_read;
1713 size_t xfer_len
1714 = (granules >= MAX_TAGS_TO_TRANSFER)? MAX_TAGS_TO_TRANSFER : granules;
1715
1716 /* First clear the vector of tags. */
1717 tags_read.resize (0);
1718
1719 /* Copy tags in chunks. */
1720 while (tags_read.size () < xfer_len)
1721 {
1722 CORE_ADDR addr
1723 = address + tags_read.size () * MORELLO_TAG_GRANULE_SIZE;
1724
1725 /* Always align the address to 16 bytes so we can read the
1726 capability properly. When we have a request to read only the
1727 capability tags, then we won't need to do this. */
1728 CORE_ADDR aligned_addr = align_down (addr, MORELLO_TAG_GRANULE_SIZE);
1729 bool tag
1730 = aarch64_linux_get_cap_tag_from_address (gdbarch, aligned_addr);
1731 gdb_byte tag_byte = (tag == false)? 0 : 1;
1732 tags_read.push_back (tag_byte);
1733 }
1734
1735 /* This process may take a while. Make sure it is interruptible. */
1736 QUIT;
1737
1738 /* Transfer over the tags that have been read. */
1739 tags.insert (tags.end (), tags_read.begin (), tags_read.end ());
1740
1741 /* Adjust the remaining granules and starting address. */
1742 granules -= tags_read.size ();
1743 address += tags_read.size () * MORELLO_TAG_GRANULE_SIZE;
1744 }
1745
1746 /* Create the header. Please note we don't yet compress the tag data.
1747 We may do so in the future to save space, since a capability tag is only
1748 1 bit in size. */
1749 struct tag_dump_header header;
1750 header.format = ELF_CORE_TAG_CHERI;
1751 header.start_vma = start_address;
1752 header.end_vma = end_address;
1753 header.u.cheri.granule_byte_size = MORELLO_TAG_GRANULE_SIZE;
1754 header.u.cheri.tag_bit_size = MORELLO_TAG_BIT_SIZE;
1755 header.u.cheri.__unused = 0;
1756
1757 /* Copy the tags to the note. */
1758 memcpy (notes[0].data (), &header, sizeof (header));
1759 memcpy (notes[0].data () + sizeof (header), tags.data (), tags.size ());
1760
1761 return notes;
1762}
1763
1764/* AArch64 Linux implementation of the aarch64_decode_memtag_note gdbarch
1765 hook. Decode a memory tag note and return the tag that it contains for
1766 a particular address. */
1767
1768static gdb_byte
1769aarch64_linux_decode_memtag_note (struct gdbarch *gdbarch,
1770 gdb::array_view <const gdb_byte> note,
1771 CORE_ADDR address)
1772{
1773 /* Read the header. */
1774 struct tag_dump_header header;
1775 memcpy (&header, note.data (), sizeof (header));
1776
1777 /* Align the address to 16 bytes. We assume the start_vma is already
1778 aligned to the proper boundary, otherwise we would have tags dumped
1779 into two different memory mappings. */
1780 address = align_down (address, MORELLO_TAG_GRANULE_SIZE);
1781 CORE_ADDR offset = address - header.start_vma;
1782 gdb_byte tag;
1783
1784 /* Read the tag. */
1785 memcpy (&tag, note.data () + sizeof (header)
1786 + (offset / header.u.cheri.granule_byte_size), 1);
1787
1788 return tag;
1789}
1790
4a3d7ef8
LM
1791/* Implement the maintenance print capability tag command. */
1792
1793static void
1794maint_print_cap_from_addr_cmd (const char *args, int from_tty)
1795{
1796 gdb::byte_vector cap;
c1df4645
LM
1797
1798 if (args == nullptr)
1799 error (_("Missing argument <address> (64-bit hex)."));
1800
74dda148 1801 CORE_ADDR addr = parse_and_eval_long (args);
4a3d7ef8
LM
1802 cap = target_read_capability (addr);
1803
4f7528c7
LM
1804 if (cap.empty ())
1805 {
1806 fprintf_unfiltered (gdb_stdlog,
1807 "Could not read capability from address %s.\n",
1808 phex_nz (addr, 8));
1809 return;
1810 }
1811
4a3d7ef8
LM
1812 for (auto it : cap)
1813 fprintf_unfiltered (gdb_stdlog, "%02x ", it);
4f7528c7
LM
1814 fputs_unfiltered ("\n", gdb_stdlog);
1815
1816 bool tag = (cap[0] == 1);
1817 uint128_t cap_128bits;
1818 memcpy (&cap_128bits, &cap[1], 16);
1819
1820 capability capability (cap_128bits, tag);
4a3d7ef8 1821
4f7528c7
LM
1822 fprintf_unfiltered (gdb_stdlog, "verbose: %s\n",
1823 capability.to_str (false).c_str ());
4a3d7ef8 1824 fputs_unfiltered ("\n", gdb_stdlog);
4f7528c7
LM
1825 fprintf_unfiltered (gdb_stdlog, "compact: %s\n",
1826 capability.to_str (true).c_str ());
4a3d7ef8
LM
1827}
1828
1829/* Implement the maintenance set capability in memory command. */
1830
1831static void
1832maint_set_capability_in_memory_cmd (const char *args, int from_tty)
1833{
1834 std::string addr_str, tag_str, upper_str, lower_str;
c1df4645
LM
1835
1836 if (args == nullptr)
1837 error (_("Arguments must be <address> <tag> <upper 64 bits>"
1838 " <lower 64 bits>"));
1839
4a3d7ef8
LM
1840 const char *args_ptr = args;
1841
1842 addr_str = extract_string_maybe_quoted (&args_ptr);
c1df4645
LM
1843
1844 if (addr_str.empty ())
1845 error (_("Missing <address> argument (64-bit hex)"));
1846
4a3d7ef8 1847 tag_str = extract_string_maybe_quoted (&args_ptr);
c1df4645
LM
1848
1849 if (tag_str.empty ())
1850 error (_("Missing <tag> argument (0 or 1)"));
1851
4a3d7ef8 1852 upper_str = extract_string_maybe_quoted (&args_ptr);
c1df4645
LM
1853
1854 if (upper_str.empty ())
1855 error (_("Missing <upper 64 bits> argument (64-bit hex)"));
1856
4a3d7ef8
LM
1857 lower_str = extract_string_maybe_quoted (&args_ptr);
1858
c1df4645
LM
1859 if (lower_str.empty ())
1860 error (_("Missing <lower 64 bits> argument (64-bit hex)"));
1861
74dda148
LM
1862 CORE_ADDR addr = parse_and_eval_long (addr_str.c_str ());
1863 CORE_ADDR tag_part = parse_and_eval_long (tag_str.c_str ());
1864 CORE_ADDR half_a = parse_and_eval_long (upper_str.c_str ());
1865 CORE_ADDR half_b = parse_and_eval_long (lower_str.c_str ());
4a3d7ef8
LM
1866
1867 unsigned __int128 a, b;
1868
1869 a = half_a;
1870 b = half_b;
1871
1872 a = (a << 64) | b;
1873 bool tag = (tag_part != 0)? true : false;
1874
1875 gdb::byte_vector cap;
1876
1877 cap.resize (17);
1878 memcpy (cap.data (), &tag, 1);
1879 memcpy (cap.data () + 1, &a, 16);
1880
1881 if (!target_write_capability (addr, {cap.data (), cap.size ()}))
1882 perror_with_name (_("Failed to set capability in memory."));
1883}
1884
237f171e
LM
1885/* Implement the "gdbarch_auxv_parse" hook. */
1886
1887static int
1888aarch64_linux_auxv_parse (gdbarch *gdbarch, gdb_byte **readptr,
1889 gdb_byte *endptr, CORE_ADDR *typep,
1890 CORE_ADDR *valp)
1891{
1892 /* Do some sanity checks first. */
1893 if (endptr == *readptr)
1894 return 0;
1895
1896 if (endptr - *readptr < 16)
1897 return -1;
1898
1899 size_t offset_to_skip = 0;
1900 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1901
1902 /* We're dealing with three different AUXV layouts:
1903
1904 A - The regular AArch64 format: Each type entry is 64-bit and each value
1905 is 64-bit. This is also the case for Morello Hybrid binaries.
1906 B - The Morello pure capability format with libshim: This is a compability
1907 layout and it keeps the 64-bit types and 64-bit values.
1908 C - The Morello pure capability format without libshim: This layout has
1909 64-bit types followed by 64-bit padding. The value is 128-bit.
1910
1911 We need to determine what layout we have, so we can read the data
1912 correctly.
1913
1914 The easiest way to tell the difference is to assume 8-byte entries and
1915 look for any types outside the range [AT_NULL, AT_MINSIGSTKSZ]. If we
1916 find one such type, assume that we have layout C. Otherwise we have
1917 layouts A or B. */
1918 gdb_byte *ptr = *readptr;
1919 while (ptr < endptr)
1920 {
1921 CORE_ADDR type = extract_unsigned_integer (ptr, 8, byte_order);
1922 if (type > AT_MINSIGSTKSZ)
1923 {
1924 offset_to_skip = 8;
1925 break;
1926 }
1927 ptr += 16;
1928 }
1929
1930 /* Now we know what the layout looks like. Read the data. */
1931 ptr = *readptr;
1932 *typep = extract_unsigned_integer (ptr, 8, byte_order);
1933 ptr += 8 + offset_to_skip;
1934 *valp = extract_unsigned_integer (ptr, 8, byte_order);
1935 ptr += 8 + offset_to_skip;
1936
1937 *readptr = ptr;
1938
1939 return 1;
1940}
1941
1ae3db19
MS
1942static void
1943aarch64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
1944{
08248ca9
SDJ
1945 static const char *const stap_integer_prefixes[] = { "#", "", NULL };
1946 static const char *const stap_register_prefixes[] = { "", NULL };
1947 static const char *const stap_register_indirection_prefixes[] = { "[",
1948 NULL };
1949 static const char *const stap_register_indirection_suffixes[] = { "]",
1950 NULL };
1ae3db19
MS
1951 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1952
1953 tdep->lowest_pc = 0x8000;
1954
05feb193
WN
1955 linux_init_abi (info, gdbarch);
1956
1ae3db19
MS
1957 set_solib_svr4_fetch_link_map_offsets (gdbarch,
1958 svr4_lp64_fetch_link_map_offsets);
1959
45e25a36
MS
1960 /* Enable TLS support. */
1961 set_gdbarch_fetch_tls_load_module_address (gdbarch,
1962 svr4_fetch_objfile_link_map);
1963
1ae3db19
MS
1964 /* Shared library handling. */
1965 set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
6dcaef99 1966 set_gdbarch_skip_solib_resolver (gdbarch, glibc_skip_solib_resolver);
1ae3db19 1967
1ae3db19
MS
1968 tramp_frame_prepend_unwinder (gdbarch, &aarch64_linux_rt_sigframe);
1969
1970 /* Enable longjmp. */
1971 tdep->jb_pc = 11;
1972
4108500a
AA
1973 set_gdbarch_iterate_over_regset_sections
1974 (gdbarch, aarch64_linux_iterate_over_regset_sections);
cd3af38d
JW
1975 set_gdbarch_core_read_description
1976 (gdbarch, aarch64_linux_core_read_description);
08248ca9
SDJ
1977
1978 /* SystemTap related. */
1979 set_gdbarch_stap_integer_prefixes (gdbarch, stap_integer_prefixes);
1980 set_gdbarch_stap_register_prefixes (gdbarch, stap_register_prefixes);
1981 set_gdbarch_stap_register_indirection_prefixes (gdbarch,
1982 stap_register_indirection_prefixes);
1983 set_gdbarch_stap_register_indirection_suffixes (gdbarch,
1984 stap_register_indirection_suffixes);
1985 set_gdbarch_stap_is_single_operand (gdbarch, aarch64_stap_is_single_operand);
1986 set_gdbarch_stap_parse_special_token (gdbarch,
1987 aarch64_stap_parse_special_token);
f68f11b7 1988
99afc88b
OJ
1989 /* Reversible debugging, process record. */
1990 set_gdbarch_process_record (gdbarch, aarch64_process_record);
1991 /* Syscall record. */
1992 tdep->aarch64_syscall_record = aarch64_linux_syscall_record;
1993
8727de56
OJ
1994 /* The top byte of a user space address known as the "tag",
1995 is ignored by the kernel and can be regarded as additional
1996 data associated with the address. */
1997 set_gdbarch_significant_addr_bit (gdbarch, 56);
1998
99afc88b
OJ
1999 /* Initialize the aarch64_linux_record_tdep. */
2000 /* These values are the size of the type that will be used in a system
2001 call. They are obtained from Linux Kernel source. */
2002 aarch64_linux_record_tdep.size_pointer
2003 = gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT;
2004 aarch64_linux_record_tdep.size__old_kernel_stat = 32;
2005 aarch64_linux_record_tdep.size_tms = 32;
2006 aarch64_linux_record_tdep.size_loff_t = 8;
2007 aarch64_linux_record_tdep.size_flock = 32;
2008 aarch64_linux_record_tdep.size_oldold_utsname = 45;
2009 aarch64_linux_record_tdep.size_ustat = 32;
7571f7f2
MK
2010 aarch64_linux_record_tdep.size_old_sigaction = 32;
2011 aarch64_linux_record_tdep.size_old_sigset_t = 8;
99afc88b
OJ
2012 aarch64_linux_record_tdep.size_rlimit = 16;
2013 aarch64_linux_record_tdep.size_rusage = 144;
2014 aarch64_linux_record_tdep.size_timeval = 16;
2015 aarch64_linux_record_tdep.size_timezone = 8;
2016 aarch64_linux_record_tdep.size_old_gid_t = 2;
2017 aarch64_linux_record_tdep.size_old_uid_t = 2;
2018 aarch64_linux_record_tdep.size_fd_set = 128;
72aded86 2019 aarch64_linux_record_tdep.size_old_dirent = 280;
99afc88b
OJ
2020 aarch64_linux_record_tdep.size_statfs = 120;
2021 aarch64_linux_record_tdep.size_statfs64 = 120;
2022 aarch64_linux_record_tdep.size_sockaddr = 16;
2023 aarch64_linux_record_tdep.size_int
2024 = gdbarch_int_bit (gdbarch) / TARGET_CHAR_BIT;
2025 aarch64_linux_record_tdep.size_long
2026 = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT;
2027 aarch64_linux_record_tdep.size_ulong
2028 = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT;
2029 aarch64_linux_record_tdep.size_msghdr = 56;
2030 aarch64_linux_record_tdep.size_itimerval = 32;
2031 aarch64_linux_record_tdep.size_stat = 144;
2032 aarch64_linux_record_tdep.size_old_utsname = 325;
2033 aarch64_linux_record_tdep.size_sysinfo = 112;
2034 aarch64_linux_record_tdep.size_msqid_ds = 120;
2035 aarch64_linux_record_tdep.size_shmid_ds = 112;
2036 aarch64_linux_record_tdep.size_new_utsname = 390;
2037 aarch64_linux_record_tdep.size_timex = 208;
2038 aarch64_linux_record_tdep.size_mem_dqinfo = 24;
2039 aarch64_linux_record_tdep.size_if_dqblk = 72;
2040 aarch64_linux_record_tdep.size_fs_quota_stat = 80;
2041 aarch64_linux_record_tdep.size_timespec = 16;
2042 aarch64_linux_record_tdep.size_pollfd = 8;
2043 aarch64_linux_record_tdep.size_NFS_FHSIZE = 32;
2044 aarch64_linux_record_tdep.size_knfsd_fh = 132;
2045 aarch64_linux_record_tdep.size_TASK_COMM_LEN = 16;
7571f7f2
MK
2046 aarch64_linux_record_tdep.size_sigaction = 32;
2047 aarch64_linux_record_tdep.size_sigset_t = 8;
99afc88b
OJ
2048 aarch64_linux_record_tdep.size_siginfo_t = 128;
2049 aarch64_linux_record_tdep.size_cap_user_data_t = 8;
2050 aarch64_linux_record_tdep.size_stack_t = 24;
2051 aarch64_linux_record_tdep.size_off_t = 8;
2052 aarch64_linux_record_tdep.size_stat64 = 144;
2053 aarch64_linux_record_tdep.size_gid_t = 4;
2054 aarch64_linux_record_tdep.size_uid_t = 4;
2055 aarch64_linux_record_tdep.size_PAGE_SIZE = 4096;
2056 aarch64_linux_record_tdep.size_flock64 = 32;
2057 aarch64_linux_record_tdep.size_user_desc = 16;
2058 aarch64_linux_record_tdep.size_io_event = 32;
2059 aarch64_linux_record_tdep.size_iocb = 64;
2060 aarch64_linux_record_tdep.size_epoll_event = 12;
2061 aarch64_linux_record_tdep.size_itimerspec = 32;
2062 aarch64_linux_record_tdep.size_mq_attr = 64;
d9b19c49 2063 aarch64_linux_record_tdep.size_termios = 36;
99afc88b
OJ
2064 aarch64_linux_record_tdep.size_termios2 = 44;
2065 aarch64_linux_record_tdep.size_pid_t = 4;
2066 aarch64_linux_record_tdep.size_winsize = 8;
2067 aarch64_linux_record_tdep.size_serial_struct = 72;
2068 aarch64_linux_record_tdep.size_serial_icounter_struct = 80;
2069 aarch64_linux_record_tdep.size_hayes_esp_config = 12;
2070 aarch64_linux_record_tdep.size_size_t = 8;
2071 aarch64_linux_record_tdep.size_iovec = 16;
b80d067f 2072 aarch64_linux_record_tdep.size_time_t = 8;
99afc88b
OJ
2073
2074 /* These values are the second argument of system call "sys_ioctl".
2075 They are obtained from Linux Kernel source. */
2076 aarch64_linux_record_tdep.ioctl_TCGETS = 0x5401;
2077 aarch64_linux_record_tdep.ioctl_TCSETS = 0x5402;
2078 aarch64_linux_record_tdep.ioctl_TCSETSW = 0x5403;
2079 aarch64_linux_record_tdep.ioctl_TCSETSF = 0x5404;
2080 aarch64_linux_record_tdep.ioctl_TCGETA = 0x5405;
2081 aarch64_linux_record_tdep.ioctl_TCSETA = 0x5406;
2082 aarch64_linux_record_tdep.ioctl_TCSETAW = 0x5407;
2083 aarch64_linux_record_tdep.ioctl_TCSETAF = 0x5408;
2084 aarch64_linux_record_tdep.ioctl_TCSBRK = 0x5409;
2085 aarch64_linux_record_tdep.ioctl_TCXONC = 0x540a;
2086 aarch64_linux_record_tdep.ioctl_TCFLSH = 0x540b;
2087 aarch64_linux_record_tdep.ioctl_TIOCEXCL = 0x540c;
2088 aarch64_linux_record_tdep.ioctl_TIOCNXCL = 0x540d;
2089 aarch64_linux_record_tdep.ioctl_TIOCSCTTY = 0x540e;
2090 aarch64_linux_record_tdep.ioctl_TIOCGPGRP = 0x540f;
2091 aarch64_linux_record_tdep.ioctl_TIOCSPGRP = 0x5410;
2092 aarch64_linux_record_tdep.ioctl_TIOCOUTQ = 0x5411;
2093 aarch64_linux_record_tdep.ioctl_TIOCSTI = 0x5412;
2094 aarch64_linux_record_tdep.ioctl_TIOCGWINSZ = 0x5413;
2095 aarch64_linux_record_tdep.ioctl_TIOCSWINSZ = 0x5414;
2096 aarch64_linux_record_tdep.ioctl_TIOCMGET = 0x5415;
2097 aarch64_linux_record_tdep.ioctl_TIOCMBIS = 0x5416;
2098 aarch64_linux_record_tdep.ioctl_TIOCMBIC = 0x5417;
2099 aarch64_linux_record_tdep.ioctl_TIOCMSET = 0x5418;
2100 aarch64_linux_record_tdep.ioctl_TIOCGSOFTCAR = 0x5419;
2101 aarch64_linux_record_tdep.ioctl_TIOCSSOFTCAR = 0x541a;
2102 aarch64_linux_record_tdep.ioctl_FIONREAD = 0x541b;
2103 aarch64_linux_record_tdep.ioctl_TIOCINQ = 0x541b;
2104 aarch64_linux_record_tdep.ioctl_TIOCLINUX = 0x541c;
2105 aarch64_linux_record_tdep.ioctl_TIOCCONS = 0x541d;
2106 aarch64_linux_record_tdep.ioctl_TIOCGSERIAL = 0x541e;
2107 aarch64_linux_record_tdep.ioctl_TIOCSSERIAL = 0x541f;
2108 aarch64_linux_record_tdep.ioctl_TIOCPKT = 0x5420;
2109 aarch64_linux_record_tdep.ioctl_FIONBIO = 0x5421;
2110 aarch64_linux_record_tdep.ioctl_TIOCNOTTY = 0x5422;
2111 aarch64_linux_record_tdep.ioctl_TIOCSETD = 0x5423;
2112 aarch64_linux_record_tdep.ioctl_TIOCGETD = 0x5424;
2113 aarch64_linux_record_tdep.ioctl_TCSBRKP = 0x5425;
2114 aarch64_linux_record_tdep.ioctl_TIOCTTYGSTRUCT = 0x5426;
2115 aarch64_linux_record_tdep.ioctl_TIOCSBRK = 0x5427;
2116 aarch64_linux_record_tdep.ioctl_TIOCCBRK = 0x5428;
2117 aarch64_linux_record_tdep.ioctl_TIOCGSID = 0x5429;
2118 aarch64_linux_record_tdep.ioctl_TCGETS2 = 0x802c542a;
2119 aarch64_linux_record_tdep.ioctl_TCSETS2 = 0x402c542b;
2120 aarch64_linux_record_tdep.ioctl_TCSETSW2 = 0x402c542c;
2121 aarch64_linux_record_tdep.ioctl_TCSETSF2 = 0x402c542d;
2122 aarch64_linux_record_tdep.ioctl_TIOCGPTN = 0x80045430;
2123 aarch64_linux_record_tdep.ioctl_TIOCSPTLCK = 0x40045431;
2124 aarch64_linux_record_tdep.ioctl_FIONCLEX = 0x5450;
2125 aarch64_linux_record_tdep.ioctl_FIOCLEX = 0x5451;
2126 aarch64_linux_record_tdep.ioctl_FIOASYNC = 0x5452;
2127 aarch64_linux_record_tdep.ioctl_TIOCSERCONFIG = 0x5453;
2128 aarch64_linux_record_tdep.ioctl_TIOCSERGWILD = 0x5454;
2129 aarch64_linux_record_tdep.ioctl_TIOCSERSWILD = 0x5455;
2130 aarch64_linux_record_tdep.ioctl_TIOCGLCKTRMIOS = 0x5456;
2131 aarch64_linux_record_tdep.ioctl_TIOCSLCKTRMIOS = 0x5457;
2132 aarch64_linux_record_tdep.ioctl_TIOCSERGSTRUCT = 0x5458;
2133 aarch64_linux_record_tdep.ioctl_TIOCSERGETLSR = 0x5459;
2134 aarch64_linux_record_tdep.ioctl_TIOCSERGETMULTI = 0x545a;
2135 aarch64_linux_record_tdep.ioctl_TIOCSERSETMULTI = 0x545b;
2136 aarch64_linux_record_tdep.ioctl_TIOCMIWAIT = 0x545c;
2137 aarch64_linux_record_tdep.ioctl_TIOCGICOUNT = 0x545d;
2138 aarch64_linux_record_tdep.ioctl_TIOCGHAYESESP = 0x545e;
2139 aarch64_linux_record_tdep.ioctl_TIOCSHAYESESP = 0x545f;
2140 aarch64_linux_record_tdep.ioctl_FIOQSIZE = 0x5460;
2141
2142 /* These values are the second argument of system call "sys_fcntl"
2143 and "sys_fcntl64". They are obtained from Linux Kernel source. */
2144 aarch64_linux_record_tdep.fcntl_F_GETLK = 5;
2145 aarch64_linux_record_tdep.fcntl_F_GETLK64 = 12;
2146 aarch64_linux_record_tdep.fcntl_F_SETLK64 = 13;
2147 aarch64_linux_record_tdep.fcntl_F_SETLKW64 = 14;
2148
2149 /* The AArch64 syscall calling convention: reg x0-x6 for arguments,
2150 reg x8 for syscall number and return value in reg x0. */
2151 aarch64_linux_record_tdep.arg1 = AARCH64_X0_REGNUM + 0;
2152 aarch64_linux_record_tdep.arg2 = AARCH64_X0_REGNUM + 1;
2153 aarch64_linux_record_tdep.arg3 = AARCH64_X0_REGNUM + 2;
2154 aarch64_linux_record_tdep.arg4 = AARCH64_X0_REGNUM + 3;
2155 aarch64_linux_record_tdep.arg5 = AARCH64_X0_REGNUM + 4;
2156 aarch64_linux_record_tdep.arg6 = AARCH64_X0_REGNUM + 5;
2157 aarch64_linux_record_tdep.arg7 = AARCH64_X0_REGNUM + 6;
2158
f68f11b7
YQ
2159 /* `catch syscall' */
2160 set_xml_syscall_file_name (gdbarch, "syscalls/aarch64-linux.xml");
2161 set_gdbarch_get_syscall_number (gdbarch, aarch64_linux_get_syscall_number);
b6542f81 2162
b6542f81
YQ
2163 set_gdbarch_displaced_step_hw_singlestep (gdbarch,
2164 aarch64_displaced_step_hw_singlestep);
7045b1ca
YQ
2165
2166 set_gdbarch_gcc_target_options (gdbarch, aarch64_linux_gcc_target_options);
237f171e
LM
2167 /* Required for Morello. */
2168 set_gdbarch_auxv_parse (gdbarch, aarch64_linux_auxv_parse);
c8c305cd
LM
2169
2170 if (tdep->has_capability ())
2171 {
7b0fc424
LM
2172 /* Register CHERI-specific linkmap offsets for the AAPCS64_CAP ABI. */
2173 if (tdep->abi == AARCH64_ABI_AAPCS64_CAP)
2174 set_solib_svr4_fetch_link_map_offsets (gdbarch,
2175 svr4_lp64_cheri_fetch_link_map_offsets);
2176
ffbda24e
LM
2177 /* Initialize the register numbers for the core file register set.
2178 Please note the PCC/CSP position in GDB's target description is
2179 the inverse of the position in the Linux Kernel's user_morello_state
2180 data structure. This can cause some confusion. */
c778c6aa 2181 aarch64_linux_cregmap[0].regno = tdep->cap_reg_base;
ffbda24e
LM
2182 aarch64_linux_cregmap[1].regno = tdep->cap_reg_pcc;
2183 aarch64_linux_cregmap[2].regno = tdep->cap_reg_csp;
2184
2185 /* Set the rest of the registers. */
2186 int next_regnum = tdep->cap_reg_base + 33;
2187 for (int i = 3; i <= 10; i++)
2188 {
2189 aarch64_linux_cregmap[i].regno = next_regnum;
2190 next_regnum++;
2191 }
c778c6aa 2192
c8c305cd
LM
2193 set_gdbarch_report_signal_info (gdbarch,
2194 aarch64_linux_report_signal_info);
c7c3ac5d
LM
2195 set_gdbarch_get_cap_tag_from_address (gdbarch,
2196 aarch64_linux_get_cap_tag_from_address);
e3636ab1
LM
2197 set_gdbarch_set_cap_tag_from_address (gdbarch,
2198 aarch64_linux_set_cap_tag_from_address);
ffbda24e
LM
2199
2200 /* Core file helpers. */
2201
2202 /* Core file helper to create memory tag notes for a particular range of
2203 addresses. */
2204 set_gdbarch_create_memtag_notes_from_range (gdbarch,
2205 aarch64_linux_create_memtag_notes_from_range);
2206
2207 /* Core file helper to decode a memory tag note. */
2208 set_gdbarch_decode_memtag_note (gdbarch,
2209 aarch64_linux_decode_memtag_note);
4a3d7ef8 2210
c1df4645
LM
2211 add_cmd ("cap_from_addr", class_maintenance,
2212 maint_print_cap_from_addr_cmd,
2213 _("Print a capability contained in a memory address.\n"
2214 "Syntax is <address> (64-bit hex)"), &maintenanceprintlist);
4a3d7ef8
LM
2215
2216 add_cmd ("cap_in_memory", class_maintenance,
2217 maint_set_capability_in_memory_cmd,
c1df4645
LM
2218 _("Write capability data to a memory address.\n"
2219 "Syntax is <address> <tag> <upper 64 bits> <lower 64 bits>"),
2220 &maintenancelist);
c8c305cd 2221 }
41f42a0b
LM
2222 else
2223 {
2224 /* Displaced stepping. */
2225 /* Note: Morello does not support displaced stepping yet because
2226 adjustments to GPR's may not be correct. This is because GDB can't
2227 make adjustments to the upper 65 bits of the C registers. */
2228 set_gdbarch_max_insn_length (gdbarch,
2229 4 * AARCH64_DISPLACED_MODIFIED_INSNS);
2230 set_gdbarch_displaced_step_copy_insn (gdbarch,
2231 aarch64_displaced_step_copy_insn);
2232 set_gdbarch_displaced_step_fixup (gdbarch, aarch64_displaced_step_fixup);
2233 set_gdbarch_displaced_step_location (gdbarch,
2234 linux_displaced_step_location);
2235 }
1ae3db19
MS
2236}
2237
6c265988 2238void _initialize_aarch64_linux_tdep ();
1ae3db19 2239void
6c265988 2240_initialize_aarch64_linux_tdep ()
1ae3db19
MS
2241{
2242 gdbarch_register_osabi (bfd_arch_aarch64, 0, GDB_OSABI_LINUX,
2243 aarch64_linux_init_abi);
2244}