Use pulongest in aarch64-linux-tdep.c
[deliverable/binutils-gdb.git] / gdb / aarch64-linux-tdep.c
1 /* Target-dependent code for GNU/Linux AArch64.
2
3 Copyright (C) 2009-2018 Free Software Foundation, Inc.
4 Contributed by ARM Ltd.
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20
21 #include "defs.h"
22
23 #include "gdbarch.h"
24 #include "arch-utils.h"
25 #include "glibc-tdep.h"
26 #include "linux-tdep.h"
27 #include "aarch64-tdep.h"
28 #include "aarch64-linux-tdep.h"
29 #include "osabi.h"
30 #include "solib-svr4.h"
31 #include "symtab.h"
32 #include "tramp-frame.h"
33 #include "trad-frame.h"
34
35 #include "inferior.h"
36 #include "regcache.h"
37 #include "regset.h"
38
39 #include "cli/cli-utils.h"
40 #include "stap-probe.h"
41 #include "parser-defs.h"
42 #include "user-regs.h"
43 #include "xml-syscall.h"
44 #include <ctype.h>
45
46 #include "record-full.h"
47 #include "linux-record.h"
48 #include "auxv.h"
49 #include "elf/common.h"
50
51 /* Signal frame handling.
52
53 +------------+ ^
54 | saved lr | |
55 +->| saved fp |--+
56 | | |
57 | | |
58 | +------------+
59 | | saved lr |
60 +--| saved fp |
61 ^ | |
62 | | |
63 | +------------+
64 ^ | |
65 | | signal |
66 | | | SIGTRAMP_FRAME (struct rt_sigframe)
67 | | saved regs |
68 +--| saved sp |--> interrupted_sp
69 | | saved pc |--> interrupted_pc
70 | | |
71 | +------------+
72 | | saved lr |--> default_restorer (movz x8, NR_sys_rt_sigreturn; svc 0)
73 +--| saved fp |<- FP
74 | | NORMAL_FRAME
75 | |<- SP
76 +------------+
77
78 On signal delivery, the kernel will create a signal handler stack
79 frame and setup the return address in LR to point at restorer stub.
80 The signal stack frame is defined by:
81
82 struct rt_sigframe
83 {
84 siginfo_t info;
85 struct ucontext uc;
86 };
87
88 typedef struct
89 {
90 ... 128 bytes
91 } siginfo_t;
92
93 The ucontext has the following form:
94 struct ucontext
95 {
96 unsigned long uc_flags;
97 struct ucontext *uc_link;
98 stack_t uc_stack;
99 sigset_t uc_sigmask;
100 struct sigcontext uc_mcontext;
101 };
102
103 typedef struct sigaltstack
104 {
105 void *ss_sp;
106 int ss_flags;
107 size_t ss_size;
108 } stack_t;
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 restorer stub will always have the form:
121
122 d28015a8 movz x8, #0xad
123 d4000001 svc #0x0
124
125 This is a system call sys_rt_sigreturn.
126
127 We detect signal frames by snooping the return code for the restorer
128 instruction sequence.
129
130 The handler then needs to recover the saved register set from
131 ucontext.uc_mcontext. */
132
133 /* These magic numbers need to reflect the layout of the kernel
134 defined struct rt_sigframe and ucontext. */
135 #define AARCH64_SIGCONTEXT_REG_SIZE 8
136 #define AARCH64_RT_SIGFRAME_UCONTEXT_OFFSET 128
137 #define AARCH64_UCONTEXT_SIGCONTEXT_OFFSET 176
138 #define AARCH64_SIGCONTEXT_XO_OFFSET 8
139
140 /* Implement the "init" method of struct tramp_frame. */
141
142 static void
143 aarch64_linux_sigframe_init (const struct tramp_frame *self,
144 struct frame_info *this_frame,
145 struct trad_frame_cache *this_cache,
146 CORE_ADDR func)
147 {
148 CORE_ADDR sp = get_frame_register_unsigned (this_frame, AARCH64_SP_REGNUM);
149 CORE_ADDR sigcontext_addr =
150 sp
151 + AARCH64_RT_SIGFRAME_UCONTEXT_OFFSET
152 + AARCH64_UCONTEXT_SIGCONTEXT_OFFSET;
153 int i;
154
155 for (i = 0; i < 31; i++)
156 {
157 trad_frame_set_reg_addr (this_cache,
158 AARCH64_X0_REGNUM + i,
159 sigcontext_addr + AARCH64_SIGCONTEXT_XO_OFFSET
160 + i * AARCH64_SIGCONTEXT_REG_SIZE);
161 }
162 trad_frame_set_reg_addr (this_cache, AARCH64_SP_REGNUM,
163 sigcontext_addr + AARCH64_SIGCONTEXT_XO_OFFSET
164 + 31 * AARCH64_SIGCONTEXT_REG_SIZE);
165 trad_frame_set_reg_addr (this_cache, AARCH64_PC_REGNUM,
166 sigcontext_addr + AARCH64_SIGCONTEXT_XO_OFFSET
167 + 32 * AARCH64_SIGCONTEXT_REG_SIZE);
168
169 trad_frame_set_id (this_cache, frame_id_build (sp, func));
170 }
171
172 static const struct tramp_frame aarch64_linux_rt_sigframe =
173 {
174 SIGTRAMP_FRAME,
175 4,
176 {
177 /* movz x8, 0x8b (S=1,o=10,h=0,i=0x8b,r=8)
178 Soo1 0010 1hhi iiii iiii iiii iiir rrrr */
179 {0xd2801168, -1},
180
181 /* svc 0x0 (o=0, l=1)
182 1101 0100 oooi iiii iiii iiii iii0 00ll */
183 {0xd4000001, -1},
184 {TRAMP_SENTINEL_INSN, -1}
185 },
186 aarch64_linux_sigframe_init
187 };
188
189 /* Register maps. */
190
191 static const struct regcache_map_entry aarch64_linux_gregmap[] =
192 {
193 { 31, AARCH64_X0_REGNUM, 8 }, /* x0 ... x30 */
194 { 1, AARCH64_SP_REGNUM, 8 },
195 { 1, AARCH64_PC_REGNUM, 8 },
196 { 1, AARCH64_CPSR_REGNUM, 8 },
197 { 0 }
198 };
199
200 static const struct regcache_map_entry aarch64_linux_fpregmap[] =
201 {
202 { 32, AARCH64_V0_REGNUM, 16 }, /* v0 ... v31 */
203 { 1, AARCH64_FPSR_REGNUM, 4 },
204 { 1, AARCH64_FPCR_REGNUM, 4 },
205 { 0 }
206 };
207
208 /* Register set definitions. */
209
210 const struct regset aarch64_linux_gregset =
211 {
212 aarch64_linux_gregmap,
213 regcache_supply_regset, regcache_collect_regset
214 };
215
216 const struct regset aarch64_linux_fpregset =
217 {
218 aarch64_linux_fpregmap,
219 regcache_supply_regset, regcache_collect_regset
220 };
221
222 /* The fields in an SVE header at the start of a SVE regset. */
223
224 #define SVE_HEADER_SIZE_LENGTH 4
225 #define SVE_HEADER_MAX_SIZE_LENGTH 4
226 #define SVE_HEADER_VL_LENGTH 2
227 #define SVE_HEADER_MAX_VL_LENGTH 2
228 #define SVE_HEADER_FLAGS_LENGTH 2
229 #define SVE_HEADER_RESERVED_LENGTH 2
230
231 #define SVE_HEADER_SIZE_OFFSET 0
232 #define SVE_HEADER_MAX_SIZE_OFFSET \
233 (SVE_HEADER_SIZE_OFFSET + SVE_HEADER_SIZE_LENGTH)
234 #define SVE_HEADER_VL_OFFSET \
235 (SVE_HEADER_MAX_SIZE_OFFSET + SVE_HEADER_MAX_SIZE_LENGTH)
236 #define SVE_HEADER_MAX_VL_OFFSET \
237 (SVE_HEADER_VL_OFFSET + SVE_HEADER_VL_LENGTH)
238 #define SVE_HEADER_FLAGS_OFFSET \
239 (SVE_HEADER_MAX_VL_OFFSET + SVE_HEADER_MAX_VL_LENGTH)
240 #define SVE_HEADER_RESERVED_OFFSET \
241 (SVE_HEADER_FLAGS_OFFSET + SVE_HEADER_FLAGS_LENGTH)
242 #define SVE_HEADER_SIZE \
243 (SVE_HEADER_RESERVED_OFFSET + SVE_HEADER_RESERVED_LENGTH)
244
245 #define SVE_HEADER_FLAG_SVE 1
246
247 /* Get VQ value from SVE section in the core dump. */
248
249 static uint64_t
250 aarch64_linux_core_read_vq (struct gdbarch *gdbarch, bfd *abfd)
251 {
252 gdb_byte header[SVE_HEADER_SIZE];
253 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
254 asection *sve_section = bfd_get_section_by_name (abfd, ".reg-aarch-sve");
255
256 if (sve_section == nullptr)
257 {
258 /* No SVE state. */
259 return 0;
260 }
261
262 size_t size = bfd_section_size (abfd, sve_section);
263
264 /* Check extended state size. */
265 if (size < SVE_HEADER_SIZE)
266 {
267 warning (_("'.reg-aarch-sve' section in core file too small."));
268 return 0;
269 }
270
271 if (!bfd_get_section_contents (abfd, sve_section, header, 0, SVE_HEADER_SIZE))
272 {
273 warning (_("Couldn't read sve header from "
274 "'.reg-aarch-sve' section in core file."));
275 return 0;
276 }
277
278 uint64_t vl = extract_unsigned_integer (header + SVE_HEADER_VL_OFFSET,
279 SVE_HEADER_VL_LENGTH, byte_order);
280 uint64_t vq = sve_vq_from_vl (vl);
281
282 if (vq > AARCH64_MAX_SVE_VQ)
283 {
284 warning (_("SVE Vector length in core file not supported by this version"
285 " of GDB. (VQ=%s)"), pulongest (vq));
286 return 0;
287 }
288 else if (vq == 0)
289 {
290 warning (_("SVE Vector length in core file is invalid. (VQ=%s"),
291 pulongest (vq));
292 return 0;
293 }
294
295 return vq;
296 }
297
298 /* Supply register REGNUM from BUF to REGCACHE, using the register map
299 in REGSET. If REGNUM is -1, do this for all registers in REGSET.
300 If BUF is NULL, set the registers to "unavailable" status. */
301
302 static void
303 aarch64_linux_supply_sve_regset (const struct regset *regset,
304 struct regcache *regcache,
305 int regnum, const void *buf, size_t size)
306 {
307 gdb_byte *header = (gdb_byte *) buf;
308 struct gdbarch *gdbarch = regcache->arch ();
309 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
310
311 if (buf == nullptr)
312 return regcache->supply_regset (regset, regnum, nullptr, size);
313 gdb_assert (size > SVE_HEADER_SIZE);
314
315 /* BUF contains an SVE header followed by a register dump of either the
316 passed in SVE regset or a NEON fpregset. */
317
318 /* Extract required fields from the header. */
319 uint64_t vl = extract_unsigned_integer (header + SVE_HEADER_VL_OFFSET,
320 SVE_HEADER_VL_LENGTH, byte_order);
321 uint16_t flags = extract_unsigned_integer (header + SVE_HEADER_FLAGS_OFFSET,
322 SVE_HEADER_FLAGS_LENGTH,
323 byte_order);
324
325 if (regnum == -1 || regnum == AARCH64_SVE_VG_REGNUM)
326 {
327 gdb_byte vg_target[8];
328 store_integer ((gdb_byte *)&vg_target, sizeof (uint64_t), byte_order,
329 sve_vg_from_vl (vl));
330 regcache->raw_supply (AARCH64_SVE_VG_REGNUM, &vg_target);
331 }
332
333 if (flags & SVE_HEADER_FLAG_SVE)
334 {
335 /* Register dump is a SVE structure. */
336 regcache->supply_regset (regset, regnum,
337 (gdb_byte *) buf + SVE_HEADER_SIZE,
338 size - SVE_HEADER_SIZE);
339 }
340 else
341 {
342 /* Register dump is a fpsimd structure. First clear the SVE
343 registers. */
344 for (int i = 0; i < AARCH64_SVE_Z_REGS_NUM; i++)
345 regcache->raw_supply_zeroed (AARCH64_SVE_Z0_REGNUM + i);
346 for (int i = 0; i < AARCH64_SVE_P_REGS_NUM; i++)
347 regcache->raw_supply_zeroed (AARCH64_SVE_P0_REGNUM + i);
348 regcache->raw_supply_zeroed (AARCH64_SVE_FFR_REGNUM);
349
350 /* Then supply the fpsimd registers. */
351 regcache->supply_regset (&aarch64_linux_fpregset, regnum,
352 (gdb_byte *) buf + SVE_HEADER_SIZE,
353 size - SVE_HEADER_SIZE);
354 }
355 }
356
357 /* Collect register REGNUM from REGCACHE to BUF, using the register
358 map in REGSET. If REGNUM is -1, do this for all registers in
359 REGSET. */
360
361 static void
362 aarch64_linux_collect_sve_regset (const struct regset *regset,
363 const struct regcache *regcache,
364 int regnum, void *buf, size_t size)
365 {
366 gdb_byte *header = (gdb_byte *) buf;
367 struct gdbarch *gdbarch = regcache->arch ();
368 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
369 uint64_t vq = gdbarch_tdep (gdbarch)->vq;
370
371 gdb_assert (buf != NULL);
372 gdb_assert (size > SVE_HEADER_SIZE);
373
374 /* BUF starts with a SVE header prior to the register dump. */
375
376 store_unsigned_integer (header + SVE_HEADER_SIZE_OFFSET,
377 SVE_HEADER_SIZE_LENGTH, byte_order, size);
378 store_unsigned_integer (header + SVE_HEADER_MAX_SIZE_OFFSET,
379 SVE_HEADER_MAX_SIZE_LENGTH, byte_order, size);
380 store_unsigned_integer (header + SVE_HEADER_VL_OFFSET, SVE_HEADER_VL_LENGTH,
381 byte_order, sve_vl_from_vq (vq));
382 store_unsigned_integer (header + SVE_HEADER_MAX_VL_OFFSET,
383 SVE_HEADER_MAX_VL_LENGTH, byte_order,
384 sve_vl_from_vq (vq));
385 store_unsigned_integer (header + SVE_HEADER_FLAGS_OFFSET,
386 SVE_HEADER_FLAGS_LENGTH, byte_order,
387 SVE_HEADER_FLAG_SVE);
388 store_unsigned_integer (header + SVE_HEADER_RESERVED_OFFSET,
389 SVE_HEADER_RESERVED_LENGTH, byte_order, 0);
390
391 /* The SVE register dump follows. */
392 regcache->collect_regset (regset, regnum, (gdb_byte *) buf + SVE_HEADER_SIZE,
393 size - SVE_HEADER_SIZE);
394 }
395
396 /* Implement the "regset_from_core_section" gdbarch method. */
397
398 static void
399 aarch64_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
400 iterate_over_regset_sections_cb *cb,
401 void *cb_data,
402 const struct regcache *regcache)
403 {
404 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
405
406 cb (".reg", AARCH64_LINUX_SIZEOF_GREGSET, AARCH64_LINUX_SIZEOF_GREGSET,
407 &aarch64_linux_gregset, NULL, cb_data);
408
409 if (tdep->has_sve ())
410 {
411 /* Create this on the fly in order to handle vector register sizes. */
412 const struct regcache_map_entry sve_regmap[] =
413 {
414 { 32, AARCH64_SVE_Z0_REGNUM, tdep->vq * 16 },
415 { 16, AARCH64_SVE_P0_REGNUM, tdep->vq * 16 / 8 },
416 { 1, AARCH64_SVE_FFR_REGNUM, 4 },
417 { 1, AARCH64_FPSR_REGNUM, 4 },
418 { 1, AARCH64_FPCR_REGNUM, 4 },
419 { 0 }
420 };
421
422 const struct regset aarch64_linux_sve_regset =
423 {
424 sve_regmap,
425 aarch64_linux_supply_sve_regset, aarch64_linux_collect_sve_regset,
426 REGSET_VARIABLE_SIZE
427 };
428
429 cb (".reg-aarch-sve",
430 SVE_HEADER_SIZE + regcache_map_entry_size (aarch64_linux_fpregmap),
431 SVE_HEADER_SIZE + regcache_map_entry_size (sve_regmap),
432 &aarch64_linux_sve_regset, "SVE registers", cb_data);
433 }
434 else
435 cb (".reg2", AARCH64_LINUX_SIZEOF_FPREGSET, AARCH64_LINUX_SIZEOF_FPREGSET,
436 &aarch64_linux_fpregset, NULL, cb_data);
437 }
438
439 /* Implement the "core_read_description" gdbarch method. */
440
441 static const struct target_desc *
442 aarch64_linux_core_read_description (struct gdbarch *gdbarch,
443 struct target_ops *target, bfd *abfd)
444 {
445 CORE_ADDR aarch64_hwcap = 0;
446
447 if (target_auxv_search (target, AT_HWCAP, &aarch64_hwcap) != 1)
448 return NULL;
449
450 return aarch64_read_description (aarch64_linux_core_read_vq (gdbarch, abfd));
451 }
452
453 /* Implementation of `gdbarch_stap_is_single_operand', as defined in
454 gdbarch.h. */
455
456 static int
457 aarch64_stap_is_single_operand (struct gdbarch *gdbarch, const char *s)
458 {
459 return (*s == '#' || isdigit (*s) /* Literal number. */
460 || *s == '[' /* Register indirection. */
461 || isalpha (*s)); /* Register value. */
462 }
463
464 /* This routine is used to parse a special token in AArch64's assembly.
465
466 The special tokens parsed by it are:
467
468 - Register displacement (e.g, [fp, #-8])
469
470 It returns one if the special token has been parsed successfully,
471 or zero if the current token is not considered special. */
472
473 static int
474 aarch64_stap_parse_special_token (struct gdbarch *gdbarch,
475 struct stap_parse_info *p)
476 {
477 if (*p->arg == '[')
478 {
479 /* Temporary holder for lookahead. */
480 const char *tmp = p->arg;
481 char *endp;
482 /* Used to save the register name. */
483 const char *start;
484 char *regname;
485 int len;
486 int got_minus = 0;
487 long displacement;
488 struct stoken str;
489
490 ++tmp;
491 start = tmp;
492
493 /* Register name. */
494 while (isalnum (*tmp))
495 ++tmp;
496
497 if (*tmp != ',')
498 return 0;
499
500 len = tmp - start;
501 regname = (char *) alloca (len + 2);
502
503 strncpy (regname, start, len);
504 regname[len] = '\0';
505
506 if (user_reg_map_name_to_regnum (gdbarch, regname, len) == -1)
507 error (_("Invalid register name `%s' on expression `%s'."),
508 regname, p->saved_arg);
509
510 ++tmp;
511 tmp = skip_spaces (tmp);
512 /* Now we expect a number. It can begin with '#' or simply
513 a digit. */
514 if (*tmp == '#')
515 ++tmp;
516
517 if (*tmp == '-')
518 {
519 ++tmp;
520 got_minus = 1;
521 }
522 else if (*tmp == '+')
523 ++tmp;
524
525 if (!isdigit (*tmp))
526 return 0;
527
528 displacement = strtol (tmp, &endp, 10);
529 tmp = endp;
530
531 /* Skipping last `]'. */
532 if (*tmp++ != ']')
533 return 0;
534
535 /* The displacement. */
536 write_exp_elt_opcode (&p->pstate, OP_LONG);
537 write_exp_elt_type (&p->pstate, builtin_type (gdbarch)->builtin_long);
538 write_exp_elt_longcst (&p->pstate, displacement);
539 write_exp_elt_opcode (&p->pstate, OP_LONG);
540 if (got_minus)
541 write_exp_elt_opcode (&p->pstate, UNOP_NEG);
542
543 /* The register name. */
544 write_exp_elt_opcode (&p->pstate, OP_REGISTER);
545 str.ptr = regname;
546 str.length = len;
547 write_exp_string (&p->pstate, str);
548 write_exp_elt_opcode (&p->pstate, OP_REGISTER);
549
550 write_exp_elt_opcode (&p->pstate, BINOP_ADD);
551
552 /* Casting to the expected type. */
553 write_exp_elt_opcode (&p->pstate, UNOP_CAST);
554 write_exp_elt_type (&p->pstate, lookup_pointer_type (p->arg_type));
555 write_exp_elt_opcode (&p->pstate, UNOP_CAST);
556
557 write_exp_elt_opcode (&p->pstate, UNOP_IND);
558
559 p->arg = tmp;
560 }
561 else
562 return 0;
563
564 return 1;
565 }
566
567 /* Implement the "get_syscall_number" gdbarch method. */
568
569 static LONGEST
570 aarch64_linux_get_syscall_number (struct gdbarch *gdbarch,
571 thread_info *thread)
572 {
573 struct regcache *regs = get_thread_regcache (thread);
574 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
575
576 /* The content of register x8. */
577 gdb_byte buf[X_REGISTER_SIZE];
578 /* The result. */
579 LONGEST ret;
580
581 /* Getting the system call number from the register x8. */
582 regs->cooked_read (AARCH64_DWARF_X0 + 8, buf);
583
584 ret = extract_signed_integer (buf, X_REGISTER_SIZE, byte_order);
585
586 return ret;
587 }
588
589 /* AArch64 process record-replay constructs: syscall, signal etc. */
590
591 struct linux_record_tdep aarch64_linux_record_tdep;
592
593 /* Enum that defines the AArch64 linux specific syscall identifiers used for
594 process record/replay. */
595
596 enum aarch64_syscall {
597 aarch64_sys_io_setup = 0,
598 aarch64_sys_io_destroy = 1,
599 aarch64_sys_io_submit = 2,
600 aarch64_sys_io_cancel = 3,
601 aarch64_sys_io_getevents = 4,
602 aarch64_sys_setxattr = 5,
603 aarch64_sys_lsetxattr = 6,
604 aarch64_sys_fsetxattr = 7,
605 aarch64_sys_getxattr = 8,
606 aarch64_sys_lgetxattr = 9,
607 aarch64_sys_fgetxattr = 10,
608 aarch64_sys_listxattr = 11,
609 aarch64_sys_llistxattr = 12,
610 aarch64_sys_flistxattr = 13,
611 aarch64_sys_removexattr = 14,
612 aarch64_sys_lremovexattr = 15,
613 aarch64_sys_fremovexattr = 16,
614 aarch64_sys_getcwd = 17,
615 aarch64_sys_lookup_dcookie = 18,
616 aarch64_sys_eventfd2 = 19,
617 aarch64_sys_epoll_create1 = 20,
618 aarch64_sys_epoll_ctl = 21,
619 aarch64_sys_epoll_pwait = 22,
620 aarch64_sys_dup = 23,
621 aarch64_sys_dup3 = 24,
622 aarch64_sys_fcntl = 25,
623 aarch64_sys_inotify_init1 = 26,
624 aarch64_sys_inotify_add_watch = 27,
625 aarch64_sys_inotify_rm_watch = 28,
626 aarch64_sys_ioctl = 29,
627 aarch64_sys_ioprio_set = 30,
628 aarch64_sys_ioprio_get = 31,
629 aarch64_sys_flock = 32,
630 aarch64_sys_mknodat = 33,
631 aarch64_sys_mkdirat = 34,
632 aarch64_sys_unlinkat = 35,
633 aarch64_sys_symlinkat = 36,
634 aarch64_sys_linkat = 37,
635 aarch64_sys_renameat = 38,
636 aarch64_sys_umount2 = 39,
637 aarch64_sys_mount = 40,
638 aarch64_sys_pivot_root = 41,
639 aarch64_sys_nfsservctl = 42,
640 aarch64_sys_statfs = 43,
641 aarch64_sys_fstatfs = 44,
642 aarch64_sys_truncate = 45,
643 aarch64_sys_ftruncate = 46,
644 aarch64_sys_fallocate = 47,
645 aarch64_sys_faccessat = 48,
646 aarch64_sys_chdir = 49,
647 aarch64_sys_fchdir = 50,
648 aarch64_sys_chroot = 51,
649 aarch64_sys_fchmod = 52,
650 aarch64_sys_fchmodat = 53,
651 aarch64_sys_fchownat = 54,
652 aarch64_sys_fchown = 55,
653 aarch64_sys_openat = 56,
654 aarch64_sys_close = 57,
655 aarch64_sys_vhangup = 58,
656 aarch64_sys_pipe2 = 59,
657 aarch64_sys_quotactl = 60,
658 aarch64_sys_getdents64 = 61,
659 aarch64_sys_lseek = 62,
660 aarch64_sys_read = 63,
661 aarch64_sys_write = 64,
662 aarch64_sys_readv = 65,
663 aarch64_sys_writev = 66,
664 aarch64_sys_pread64 = 67,
665 aarch64_sys_pwrite64 = 68,
666 aarch64_sys_preadv = 69,
667 aarch64_sys_pwritev = 70,
668 aarch64_sys_sendfile = 71,
669 aarch64_sys_pselect6 = 72,
670 aarch64_sys_ppoll = 73,
671 aarch64_sys_signalfd4 = 74,
672 aarch64_sys_vmsplice = 75,
673 aarch64_sys_splice = 76,
674 aarch64_sys_tee = 77,
675 aarch64_sys_readlinkat = 78,
676 aarch64_sys_newfstatat = 79,
677 aarch64_sys_fstat = 80,
678 aarch64_sys_sync = 81,
679 aarch64_sys_fsync = 82,
680 aarch64_sys_fdatasync = 83,
681 aarch64_sys_sync_file_range2 = 84,
682 aarch64_sys_sync_file_range = 84,
683 aarch64_sys_timerfd_create = 85,
684 aarch64_sys_timerfd_settime = 86,
685 aarch64_sys_timerfd_gettime = 87,
686 aarch64_sys_utimensat = 88,
687 aarch64_sys_acct = 89,
688 aarch64_sys_capget = 90,
689 aarch64_sys_capset = 91,
690 aarch64_sys_personality = 92,
691 aarch64_sys_exit = 93,
692 aarch64_sys_exit_group = 94,
693 aarch64_sys_waitid = 95,
694 aarch64_sys_set_tid_address = 96,
695 aarch64_sys_unshare = 97,
696 aarch64_sys_futex = 98,
697 aarch64_sys_set_robust_list = 99,
698 aarch64_sys_get_robust_list = 100,
699 aarch64_sys_nanosleep = 101,
700 aarch64_sys_getitimer = 102,
701 aarch64_sys_setitimer = 103,
702 aarch64_sys_kexec_load = 104,
703 aarch64_sys_init_module = 105,
704 aarch64_sys_delete_module = 106,
705 aarch64_sys_timer_create = 107,
706 aarch64_sys_timer_gettime = 108,
707 aarch64_sys_timer_getoverrun = 109,
708 aarch64_sys_timer_settime = 110,
709 aarch64_sys_timer_delete = 111,
710 aarch64_sys_clock_settime = 112,
711 aarch64_sys_clock_gettime = 113,
712 aarch64_sys_clock_getres = 114,
713 aarch64_sys_clock_nanosleep = 115,
714 aarch64_sys_syslog = 116,
715 aarch64_sys_ptrace = 117,
716 aarch64_sys_sched_setparam = 118,
717 aarch64_sys_sched_setscheduler = 119,
718 aarch64_sys_sched_getscheduler = 120,
719 aarch64_sys_sched_getparam = 121,
720 aarch64_sys_sched_setaffinity = 122,
721 aarch64_sys_sched_getaffinity = 123,
722 aarch64_sys_sched_yield = 124,
723 aarch64_sys_sched_get_priority_max = 125,
724 aarch64_sys_sched_get_priority_min = 126,
725 aarch64_sys_sched_rr_get_interval = 127,
726 aarch64_sys_kill = 129,
727 aarch64_sys_tkill = 130,
728 aarch64_sys_tgkill = 131,
729 aarch64_sys_sigaltstack = 132,
730 aarch64_sys_rt_sigsuspend = 133,
731 aarch64_sys_rt_sigaction = 134,
732 aarch64_sys_rt_sigprocmask = 135,
733 aarch64_sys_rt_sigpending = 136,
734 aarch64_sys_rt_sigtimedwait = 137,
735 aarch64_sys_rt_sigqueueinfo = 138,
736 aarch64_sys_rt_sigreturn = 139,
737 aarch64_sys_setpriority = 140,
738 aarch64_sys_getpriority = 141,
739 aarch64_sys_reboot = 142,
740 aarch64_sys_setregid = 143,
741 aarch64_sys_setgid = 144,
742 aarch64_sys_setreuid = 145,
743 aarch64_sys_setuid = 146,
744 aarch64_sys_setresuid = 147,
745 aarch64_sys_getresuid = 148,
746 aarch64_sys_setresgid = 149,
747 aarch64_sys_getresgid = 150,
748 aarch64_sys_setfsuid = 151,
749 aarch64_sys_setfsgid = 152,
750 aarch64_sys_times = 153,
751 aarch64_sys_setpgid = 154,
752 aarch64_sys_getpgid = 155,
753 aarch64_sys_getsid = 156,
754 aarch64_sys_setsid = 157,
755 aarch64_sys_getgroups = 158,
756 aarch64_sys_setgroups = 159,
757 aarch64_sys_uname = 160,
758 aarch64_sys_sethostname = 161,
759 aarch64_sys_setdomainname = 162,
760 aarch64_sys_getrlimit = 163,
761 aarch64_sys_setrlimit = 164,
762 aarch64_sys_getrusage = 165,
763 aarch64_sys_umask = 166,
764 aarch64_sys_prctl = 167,
765 aarch64_sys_getcpu = 168,
766 aarch64_sys_gettimeofday = 169,
767 aarch64_sys_settimeofday = 170,
768 aarch64_sys_adjtimex = 171,
769 aarch64_sys_getpid = 172,
770 aarch64_sys_getppid = 173,
771 aarch64_sys_getuid = 174,
772 aarch64_sys_geteuid = 175,
773 aarch64_sys_getgid = 176,
774 aarch64_sys_getegid = 177,
775 aarch64_sys_gettid = 178,
776 aarch64_sys_sysinfo = 179,
777 aarch64_sys_mq_open = 180,
778 aarch64_sys_mq_unlink = 181,
779 aarch64_sys_mq_timedsend = 182,
780 aarch64_sys_mq_timedreceive = 183,
781 aarch64_sys_mq_notify = 184,
782 aarch64_sys_mq_getsetattr = 185,
783 aarch64_sys_msgget = 186,
784 aarch64_sys_msgctl = 187,
785 aarch64_sys_msgrcv = 188,
786 aarch64_sys_msgsnd = 189,
787 aarch64_sys_semget = 190,
788 aarch64_sys_semctl = 191,
789 aarch64_sys_semtimedop = 192,
790 aarch64_sys_semop = 193,
791 aarch64_sys_shmget = 194,
792 aarch64_sys_shmctl = 195,
793 aarch64_sys_shmat = 196,
794 aarch64_sys_shmdt = 197,
795 aarch64_sys_socket = 198,
796 aarch64_sys_socketpair = 199,
797 aarch64_sys_bind = 200,
798 aarch64_sys_listen = 201,
799 aarch64_sys_accept = 202,
800 aarch64_sys_connect = 203,
801 aarch64_sys_getsockname = 204,
802 aarch64_sys_getpeername = 205,
803 aarch64_sys_sendto = 206,
804 aarch64_sys_recvfrom = 207,
805 aarch64_sys_setsockopt = 208,
806 aarch64_sys_getsockopt = 209,
807 aarch64_sys_shutdown = 210,
808 aarch64_sys_sendmsg = 211,
809 aarch64_sys_recvmsg = 212,
810 aarch64_sys_readahead = 213,
811 aarch64_sys_brk = 214,
812 aarch64_sys_munmap = 215,
813 aarch64_sys_mremap = 216,
814 aarch64_sys_add_key = 217,
815 aarch64_sys_request_key = 218,
816 aarch64_sys_keyctl = 219,
817 aarch64_sys_clone = 220,
818 aarch64_sys_execve = 221,
819 aarch64_sys_mmap = 222,
820 aarch64_sys_fadvise64 = 223,
821 aarch64_sys_swapon = 224,
822 aarch64_sys_swapoff = 225,
823 aarch64_sys_mprotect = 226,
824 aarch64_sys_msync = 227,
825 aarch64_sys_mlock = 228,
826 aarch64_sys_munlock = 229,
827 aarch64_sys_mlockall = 230,
828 aarch64_sys_munlockall = 231,
829 aarch64_sys_mincore = 232,
830 aarch64_sys_madvise = 233,
831 aarch64_sys_remap_file_pages = 234,
832 aarch64_sys_mbind = 235,
833 aarch64_sys_get_mempolicy = 236,
834 aarch64_sys_set_mempolicy = 237,
835 aarch64_sys_migrate_pages = 238,
836 aarch64_sys_move_pages = 239,
837 aarch64_sys_rt_tgsigqueueinfo = 240,
838 aarch64_sys_perf_event_open = 241,
839 aarch64_sys_accept4 = 242,
840 aarch64_sys_recvmmsg = 243,
841 aarch64_sys_wait4 = 260,
842 aarch64_sys_prlimit64 = 261,
843 aarch64_sys_fanotify_init = 262,
844 aarch64_sys_fanotify_mark = 263,
845 aarch64_sys_name_to_handle_at = 264,
846 aarch64_sys_open_by_handle_at = 265,
847 aarch64_sys_clock_adjtime = 266,
848 aarch64_sys_syncfs = 267,
849 aarch64_sys_setns = 268,
850 aarch64_sys_sendmmsg = 269,
851 aarch64_sys_process_vm_readv = 270,
852 aarch64_sys_process_vm_writev = 271,
853 aarch64_sys_kcmp = 272,
854 aarch64_sys_finit_module = 273,
855 aarch64_sys_sched_setattr = 274,
856 aarch64_sys_sched_getattr = 275,
857 };
858
859 /* aarch64_canonicalize_syscall maps syscall ids from the native AArch64
860 linux set of syscall ids into a canonical set of syscall ids used by
861 process record. */
862
863 static enum gdb_syscall
864 aarch64_canonicalize_syscall (enum aarch64_syscall syscall_number)
865 {
866 #define SYSCALL_MAP(SYSCALL) case aarch64_sys_##SYSCALL: \
867 return gdb_sys_##SYSCALL
868
869 #define UNSUPPORTED_SYSCALL_MAP(SYSCALL) case aarch64_sys_##SYSCALL: \
870 return gdb_sys_no_syscall
871
872 switch (syscall_number)
873 {
874 SYSCALL_MAP (io_setup);
875 SYSCALL_MAP (io_destroy);
876 SYSCALL_MAP (io_submit);
877 SYSCALL_MAP (io_cancel);
878 SYSCALL_MAP (io_getevents);
879
880 SYSCALL_MAP (setxattr);
881 SYSCALL_MAP (lsetxattr);
882 SYSCALL_MAP (fsetxattr);
883 SYSCALL_MAP (getxattr);
884 SYSCALL_MAP (lgetxattr);
885 SYSCALL_MAP (fgetxattr);
886 SYSCALL_MAP (listxattr);
887 SYSCALL_MAP (llistxattr);
888 SYSCALL_MAP (flistxattr);
889 SYSCALL_MAP (removexattr);
890 SYSCALL_MAP (lremovexattr);
891 SYSCALL_MAP (fremovexattr);
892 SYSCALL_MAP (getcwd);
893 SYSCALL_MAP (lookup_dcookie);
894 SYSCALL_MAP (eventfd2);
895 SYSCALL_MAP (epoll_create1);
896 SYSCALL_MAP (epoll_ctl);
897 SYSCALL_MAP (epoll_pwait);
898 SYSCALL_MAP (dup);
899 SYSCALL_MAP (dup3);
900 SYSCALL_MAP (fcntl);
901 SYSCALL_MAP (inotify_init1);
902 SYSCALL_MAP (inotify_add_watch);
903 SYSCALL_MAP (inotify_rm_watch);
904 SYSCALL_MAP (ioctl);
905 SYSCALL_MAP (ioprio_set);
906 SYSCALL_MAP (ioprio_get);
907 SYSCALL_MAP (flock);
908 SYSCALL_MAP (mknodat);
909 SYSCALL_MAP (mkdirat);
910 SYSCALL_MAP (unlinkat);
911 SYSCALL_MAP (symlinkat);
912 SYSCALL_MAP (linkat);
913 SYSCALL_MAP (renameat);
914 UNSUPPORTED_SYSCALL_MAP (umount2);
915 SYSCALL_MAP (mount);
916 SYSCALL_MAP (pivot_root);
917 SYSCALL_MAP (nfsservctl);
918 SYSCALL_MAP (statfs);
919 SYSCALL_MAP (truncate);
920 SYSCALL_MAP (ftruncate);
921 SYSCALL_MAP (fallocate);
922 SYSCALL_MAP (faccessat);
923 SYSCALL_MAP (fchdir);
924 SYSCALL_MAP (chroot);
925 SYSCALL_MAP (fchmod);
926 SYSCALL_MAP (fchmodat);
927 SYSCALL_MAP (fchownat);
928 SYSCALL_MAP (fchown);
929 SYSCALL_MAP (openat);
930 SYSCALL_MAP (close);
931 SYSCALL_MAP (vhangup);
932 SYSCALL_MAP (pipe2);
933 SYSCALL_MAP (quotactl);
934 SYSCALL_MAP (getdents64);
935 SYSCALL_MAP (lseek);
936 SYSCALL_MAP (read);
937 SYSCALL_MAP (write);
938 SYSCALL_MAP (readv);
939 SYSCALL_MAP (writev);
940 SYSCALL_MAP (pread64);
941 SYSCALL_MAP (pwrite64);
942 UNSUPPORTED_SYSCALL_MAP (preadv);
943 UNSUPPORTED_SYSCALL_MAP (pwritev);
944 SYSCALL_MAP (sendfile);
945 SYSCALL_MAP (pselect6);
946 SYSCALL_MAP (ppoll);
947 UNSUPPORTED_SYSCALL_MAP (signalfd4);
948 SYSCALL_MAP (vmsplice);
949 SYSCALL_MAP (splice);
950 SYSCALL_MAP (tee);
951 SYSCALL_MAP (readlinkat);
952 SYSCALL_MAP (newfstatat);
953
954 SYSCALL_MAP (fstat);
955 SYSCALL_MAP (sync);
956 SYSCALL_MAP (fsync);
957 SYSCALL_MAP (fdatasync);
958 SYSCALL_MAP (sync_file_range);
959 UNSUPPORTED_SYSCALL_MAP (timerfd_create);
960 UNSUPPORTED_SYSCALL_MAP (timerfd_settime);
961 UNSUPPORTED_SYSCALL_MAP (timerfd_gettime);
962 UNSUPPORTED_SYSCALL_MAP (utimensat);
963 SYSCALL_MAP (acct);
964 SYSCALL_MAP (capget);
965 SYSCALL_MAP (capset);
966 SYSCALL_MAP (personality);
967 SYSCALL_MAP (exit);
968 SYSCALL_MAP (exit_group);
969 SYSCALL_MAP (waitid);
970 SYSCALL_MAP (set_tid_address);
971 SYSCALL_MAP (unshare);
972 SYSCALL_MAP (futex);
973 SYSCALL_MAP (set_robust_list);
974 SYSCALL_MAP (get_robust_list);
975 SYSCALL_MAP (nanosleep);
976
977 SYSCALL_MAP (getitimer);
978 SYSCALL_MAP (setitimer);
979 SYSCALL_MAP (kexec_load);
980 SYSCALL_MAP (init_module);
981 SYSCALL_MAP (delete_module);
982 SYSCALL_MAP (timer_create);
983 SYSCALL_MAP (timer_settime);
984 SYSCALL_MAP (timer_gettime);
985 SYSCALL_MAP (timer_getoverrun);
986 SYSCALL_MAP (timer_delete);
987 SYSCALL_MAP (clock_settime);
988 SYSCALL_MAP (clock_gettime);
989 SYSCALL_MAP (clock_getres);
990 SYSCALL_MAP (clock_nanosleep);
991 SYSCALL_MAP (syslog);
992 SYSCALL_MAP (ptrace);
993 SYSCALL_MAP (sched_setparam);
994 SYSCALL_MAP (sched_setscheduler);
995 SYSCALL_MAP (sched_getscheduler);
996 SYSCALL_MAP (sched_getparam);
997 SYSCALL_MAP (sched_setaffinity);
998 SYSCALL_MAP (sched_getaffinity);
999 SYSCALL_MAP (sched_yield);
1000 SYSCALL_MAP (sched_get_priority_max);
1001 SYSCALL_MAP (sched_get_priority_min);
1002 SYSCALL_MAP (sched_rr_get_interval);
1003 SYSCALL_MAP (kill);
1004 SYSCALL_MAP (tkill);
1005 SYSCALL_MAP (tgkill);
1006 SYSCALL_MAP (sigaltstack);
1007 SYSCALL_MAP (rt_sigsuspend);
1008 SYSCALL_MAP (rt_sigaction);
1009 SYSCALL_MAP (rt_sigprocmask);
1010 SYSCALL_MAP (rt_sigpending);
1011 SYSCALL_MAP (rt_sigtimedwait);
1012 SYSCALL_MAP (rt_sigqueueinfo);
1013 SYSCALL_MAP (rt_sigreturn);
1014 SYSCALL_MAP (setpriority);
1015 SYSCALL_MAP (getpriority);
1016 SYSCALL_MAP (reboot);
1017 SYSCALL_MAP (setregid);
1018 SYSCALL_MAP (setgid);
1019 SYSCALL_MAP (setreuid);
1020 SYSCALL_MAP (setuid);
1021 SYSCALL_MAP (setresuid);
1022 SYSCALL_MAP (getresuid);
1023 SYSCALL_MAP (setresgid);
1024 SYSCALL_MAP (getresgid);
1025 SYSCALL_MAP (setfsuid);
1026 SYSCALL_MAP (setfsgid);
1027 SYSCALL_MAP (times);
1028 SYSCALL_MAP (setpgid);
1029 SYSCALL_MAP (getpgid);
1030 SYSCALL_MAP (getsid);
1031 SYSCALL_MAP (setsid);
1032 SYSCALL_MAP (getgroups);
1033 SYSCALL_MAP (setgroups);
1034 SYSCALL_MAP (uname);
1035 SYSCALL_MAP (sethostname);
1036 SYSCALL_MAP (setdomainname);
1037 SYSCALL_MAP (getrlimit);
1038 SYSCALL_MAP (setrlimit);
1039 SYSCALL_MAP (getrusage);
1040 SYSCALL_MAP (umask);
1041 SYSCALL_MAP (prctl);
1042 SYSCALL_MAP (getcpu);
1043 SYSCALL_MAP (gettimeofday);
1044 SYSCALL_MAP (settimeofday);
1045 SYSCALL_MAP (adjtimex);
1046 SYSCALL_MAP (getpid);
1047 SYSCALL_MAP (getppid);
1048 SYSCALL_MAP (getuid);
1049 SYSCALL_MAP (geteuid);
1050 SYSCALL_MAP (getgid);
1051 SYSCALL_MAP (getegid);
1052 SYSCALL_MAP (gettid);
1053 SYSCALL_MAP (sysinfo);
1054 SYSCALL_MAP (mq_open);
1055 SYSCALL_MAP (mq_unlink);
1056 SYSCALL_MAP (mq_timedsend);
1057 SYSCALL_MAP (mq_timedreceive);
1058 SYSCALL_MAP (mq_notify);
1059 SYSCALL_MAP (mq_getsetattr);
1060 SYSCALL_MAP (msgget);
1061 SYSCALL_MAP (msgctl);
1062 SYSCALL_MAP (msgrcv);
1063 SYSCALL_MAP (msgsnd);
1064 SYSCALL_MAP (semget);
1065 SYSCALL_MAP (semctl);
1066 SYSCALL_MAP (semtimedop);
1067 SYSCALL_MAP (semop);
1068 SYSCALL_MAP (shmget);
1069 SYSCALL_MAP (shmctl);
1070 SYSCALL_MAP (shmat);
1071 SYSCALL_MAP (shmdt);
1072 SYSCALL_MAP (socket);
1073 SYSCALL_MAP (socketpair);
1074 SYSCALL_MAP (bind);
1075 SYSCALL_MAP (listen);
1076 SYSCALL_MAP (accept);
1077 SYSCALL_MAP (connect);
1078 SYSCALL_MAP (getsockname);
1079 SYSCALL_MAP (getpeername);
1080 SYSCALL_MAP (sendto);
1081 SYSCALL_MAP (recvfrom);
1082 SYSCALL_MAP (setsockopt);
1083 SYSCALL_MAP (getsockopt);
1084 SYSCALL_MAP (shutdown);
1085 SYSCALL_MAP (sendmsg);
1086 SYSCALL_MAP (recvmsg);
1087 SYSCALL_MAP (readahead);
1088 SYSCALL_MAP (brk);
1089 SYSCALL_MAP (munmap);
1090 SYSCALL_MAP (mremap);
1091 SYSCALL_MAP (add_key);
1092 SYSCALL_MAP (request_key);
1093 SYSCALL_MAP (keyctl);
1094 SYSCALL_MAP (clone);
1095 SYSCALL_MAP (execve);
1096
1097 case aarch64_sys_mmap:
1098 return gdb_sys_mmap2;
1099
1100 SYSCALL_MAP (fadvise64);
1101 SYSCALL_MAP (swapon);
1102 SYSCALL_MAP (swapoff);
1103 SYSCALL_MAP (mprotect);
1104 SYSCALL_MAP (msync);
1105 SYSCALL_MAP (mlock);
1106 SYSCALL_MAP (munlock);
1107 SYSCALL_MAP (mlockall);
1108 SYSCALL_MAP (munlockall);
1109 SYSCALL_MAP (mincore);
1110 SYSCALL_MAP (madvise);
1111 SYSCALL_MAP (remap_file_pages);
1112 SYSCALL_MAP (mbind);
1113 SYSCALL_MAP (get_mempolicy);
1114 SYSCALL_MAP (set_mempolicy);
1115 SYSCALL_MAP (migrate_pages);
1116 SYSCALL_MAP (move_pages);
1117 UNSUPPORTED_SYSCALL_MAP (rt_tgsigqueueinfo);
1118 UNSUPPORTED_SYSCALL_MAP (perf_event_open);
1119 UNSUPPORTED_SYSCALL_MAP (accept4);
1120 UNSUPPORTED_SYSCALL_MAP (recvmmsg);
1121
1122 SYSCALL_MAP (wait4);
1123
1124 UNSUPPORTED_SYSCALL_MAP (prlimit64);
1125 UNSUPPORTED_SYSCALL_MAP (fanotify_init);
1126 UNSUPPORTED_SYSCALL_MAP (fanotify_mark);
1127 UNSUPPORTED_SYSCALL_MAP (name_to_handle_at);
1128 UNSUPPORTED_SYSCALL_MAP (open_by_handle_at);
1129 UNSUPPORTED_SYSCALL_MAP (clock_adjtime);
1130 UNSUPPORTED_SYSCALL_MAP (syncfs);
1131 UNSUPPORTED_SYSCALL_MAP (setns);
1132 UNSUPPORTED_SYSCALL_MAP (sendmmsg);
1133 UNSUPPORTED_SYSCALL_MAP (process_vm_readv);
1134 UNSUPPORTED_SYSCALL_MAP (process_vm_writev);
1135 UNSUPPORTED_SYSCALL_MAP (kcmp);
1136 UNSUPPORTED_SYSCALL_MAP (finit_module);
1137 UNSUPPORTED_SYSCALL_MAP (sched_setattr);
1138 UNSUPPORTED_SYSCALL_MAP (sched_getattr);
1139 default:
1140 return gdb_sys_no_syscall;
1141 }
1142 }
1143
1144 /* Record all registers but PC register for process-record. */
1145
1146 static int
1147 aarch64_all_but_pc_registers_record (struct regcache *regcache)
1148 {
1149 int i;
1150
1151 for (i = AARCH64_X0_REGNUM; i < AARCH64_PC_REGNUM; i++)
1152 if (record_full_arch_list_add_reg (regcache, i))
1153 return -1;
1154
1155 if (record_full_arch_list_add_reg (regcache, AARCH64_CPSR_REGNUM))
1156 return -1;
1157
1158 return 0;
1159 }
1160
1161 /* Handler for aarch64 system call instruction recording. */
1162
1163 static int
1164 aarch64_linux_syscall_record (struct regcache *regcache,
1165 unsigned long svc_number)
1166 {
1167 int ret = 0;
1168 enum gdb_syscall syscall_gdb;
1169
1170 syscall_gdb =
1171 aarch64_canonicalize_syscall ((enum aarch64_syscall) svc_number);
1172
1173 if (syscall_gdb < 0)
1174 {
1175 printf_unfiltered (_("Process record and replay target doesn't "
1176 "support syscall number %s\n"),
1177 plongest (svc_number));
1178 return -1;
1179 }
1180
1181 if (syscall_gdb == gdb_sys_sigreturn
1182 || syscall_gdb == gdb_sys_rt_sigreturn)
1183 {
1184 if (aarch64_all_but_pc_registers_record (regcache))
1185 return -1;
1186 return 0;
1187 }
1188
1189 ret = record_linux_system_call (syscall_gdb, regcache,
1190 &aarch64_linux_record_tdep);
1191 if (ret != 0)
1192 return ret;
1193
1194 /* Record the return value of the system call. */
1195 if (record_full_arch_list_add_reg (regcache, AARCH64_X0_REGNUM))
1196 return -1;
1197 /* Record LR. */
1198 if (record_full_arch_list_add_reg (regcache, AARCH64_LR_REGNUM))
1199 return -1;
1200 /* Record CPSR. */
1201 if (record_full_arch_list_add_reg (regcache, AARCH64_CPSR_REGNUM))
1202 return -1;
1203
1204 return 0;
1205 }
1206
1207 /* Implement the "gcc_target_options" gdbarch method. */
1208
1209 static char *
1210 aarch64_linux_gcc_target_options (struct gdbarch *gdbarch)
1211 {
1212 /* GCC doesn't know "-m64". */
1213 return NULL;
1214 }
1215
1216 static void
1217 aarch64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
1218 {
1219 static const char *const stap_integer_prefixes[] = { "#", "", NULL };
1220 static const char *const stap_register_prefixes[] = { "", NULL };
1221 static const char *const stap_register_indirection_prefixes[] = { "[",
1222 NULL };
1223 static const char *const stap_register_indirection_suffixes[] = { "]",
1224 NULL };
1225 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1226
1227 tdep->lowest_pc = 0x8000;
1228
1229 linux_init_abi (info, gdbarch);
1230
1231 set_solib_svr4_fetch_link_map_offsets (gdbarch,
1232 svr4_lp64_fetch_link_map_offsets);
1233
1234 /* Enable TLS support. */
1235 set_gdbarch_fetch_tls_load_module_address (gdbarch,
1236 svr4_fetch_objfile_link_map);
1237
1238 /* Shared library handling. */
1239 set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
1240 set_gdbarch_skip_solib_resolver (gdbarch, glibc_skip_solib_resolver);
1241
1242 tramp_frame_prepend_unwinder (gdbarch, &aarch64_linux_rt_sigframe);
1243
1244 /* Enable longjmp. */
1245 tdep->jb_pc = 11;
1246
1247 set_gdbarch_iterate_over_regset_sections
1248 (gdbarch, aarch64_linux_iterate_over_regset_sections);
1249 set_gdbarch_core_read_description
1250 (gdbarch, aarch64_linux_core_read_description);
1251
1252 /* SystemTap related. */
1253 set_gdbarch_stap_integer_prefixes (gdbarch, stap_integer_prefixes);
1254 set_gdbarch_stap_register_prefixes (gdbarch, stap_register_prefixes);
1255 set_gdbarch_stap_register_indirection_prefixes (gdbarch,
1256 stap_register_indirection_prefixes);
1257 set_gdbarch_stap_register_indirection_suffixes (gdbarch,
1258 stap_register_indirection_suffixes);
1259 set_gdbarch_stap_is_single_operand (gdbarch, aarch64_stap_is_single_operand);
1260 set_gdbarch_stap_parse_special_token (gdbarch,
1261 aarch64_stap_parse_special_token);
1262
1263 /* Reversible debugging, process record. */
1264 set_gdbarch_process_record (gdbarch, aarch64_process_record);
1265 /* Syscall record. */
1266 tdep->aarch64_syscall_record = aarch64_linux_syscall_record;
1267
1268 /* The top byte of a user space address known as the "tag",
1269 is ignored by the kernel and can be regarded as additional
1270 data associated with the address. */
1271 set_gdbarch_significant_addr_bit (gdbarch, 56);
1272
1273 /* Initialize the aarch64_linux_record_tdep. */
1274 /* These values are the size of the type that will be used in a system
1275 call. They are obtained from Linux Kernel source. */
1276 aarch64_linux_record_tdep.size_pointer
1277 = gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT;
1278 aarch64_linux_record_tdep.size__old_kernel_stat = 32;
1279 aarch64_linux_record_tdep.size_tms = 32;
1280 aarch64_linux_record_tdep.size_loff_t = 8;
1281 aarch64_linux_record_tdep.size_flock = 32;
1282 aarch64_linux_record_tdep.size_oldold_utsname = 45;
1283 aarch64_linux_record_tdep.size_ustat = 32;
1284 aarch64_linux_record_tdep.size_old_sigaction = 32;
1285 aarch64_linux_record_tdep.size_old_sigset_t = 8;
1286 aarch64_linux_record_tdep.size_rlimit = 16;
1287 aarch64_linux_record_tdep.size_rusage = 144;
1288 aarch64_linux_record_tdep.size_timeval = 16;
1289 aarch64_linux_record_tdep.size_timezone = 8;
1290 aarch64_linux_record_tdep.size_old_gid_t = 2;
1291 aarch64_linux_record_tdep.size_old_uid_t = 2;
1292 aarch64_linux_record_tdep.size_fd_set = 128;
1293 aarch64_linux_record_tdep.size_old_dirent = 280;
1294 aarch64_linux_record_tdep.size_statfs = 120;
1295 aarch64_linux_record_tdep.size_statfs64 = 120;
1296 aarch64_linux_record_tdep.size_sockaddr = 16;
1297 aarch64_linux_record_tdep.size_int
1298 = gdbarch_int_bit (gdbarch) / TARGET_CHAR_BIT;
1299 aarch64_linux_record_tdep.size_long
1300 = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT;
1301 aarch64_linux_record_tdep.size_ulong
1302 = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT;
1303 aarch64_linux_record_tdep.size_msghdr = 56;
1304 aarch64_linux_record_tdep.size_itimerval = 32;
1305 aarch64_linux_record_tdep.size_stat = 144;
1306 aarch64_linux_record_tdep.size_old_utsname = 325;
1307 aarch64_linux_record_tdep.size_sysinfo = 112;
1308 aarch64_linux_record_tdep.size_msqid_ds = 120;
1309 aarch64_linux_record_tdep.size_shmid_ds = 112;
1310 aarch64_linux_record_tdep.size_new_utsname = 390;
1311 aarch64_linux_record_tdep.size_timex = 208;
1312 aarch64_linux_record_tdep.size_mem_dqinfo = 24;
1313 aarch64_linux_record_tdep.size_if_dqblk = 72;
1314 aarch64_linux_record_tdep.size_fs_quota_stat = 80;
1315 aarch64_linux_record_tdep.size_timespec = 16;
1316 aarch64_linux_record_tdep.size_pollfd = 8;
1317 aarch64_linux_record_tdep.size_NFS_FHSIZE = 32;
1318 aarch64_linux_record_tdep.size_knfsd_fh = 132;
1319 aarch64_linux_record_tdep.size_TASK_COMM_LEN = 16;
1320 aarch64_linux_record_tdep.size_sigaction = 32;
1321 aarch64_linux_record_tdep.size_sigset_t = 8;
1322 aarch64_linux_record_tdep.size_siginfo_t = 128;
1323 aarch64_linux_record_tdep.size_cap_user_data_t = 8;
1324 aarch64_linux_record_tdep.size_stack_t = 24;
1325 aarch64_linux_record_tdep.size_off_t = 8;
1326 aarch64_linux_record_tdep.size_stat64 = 144;
1327 aarch64_linux_record_tdep.size_gid_t = 4;
1328 aarch64_linux_record_tdep.size_uid_t = 4;
1329 aarch64_linux_record_tdep.size_PAGE_SIZE = 4096;
1330 aarch64_linux_record_tdep.size_flock64 = 32;
1331 aarch64_linux_record_tdep.size_user_desc = 16;
1332 aarch64_linux_record_tdep.size_io_event = 32;
1333 aarch64_linux_record_tdep.size_iocb = 64;
1334 aarch64_linux_record_tdep.size_epoll_event = 12;
1335 aarch64_linux_record_tdep.size_itimerspec = 32;
1336 aarch64_linux_record_tdep.size_mq_attr = 64;
1337 aarch64_linux_record_tdep.size_termios = 36;
1338 aarch64_linux_record_tdep.size_termios2 = 44;
1339 aarch64_linux_record_tdep.size_pid_t = 4;
1340 aarch64_linux_record_tdep.size_winsize = 8;
1341 aarch64_linux_record_tdep.size_serial_struct = 72;
1342 aarch64_linux_record_tdep.size_serial_icounter_struct = 80;
1343 aarch64_linux_record_tdep.size_hayes_esp_config = 12;
1344 aarch64_linux_record_tdep.size_size_t = 8;
1345 aarch64_linux_record_tdep.size_iovec = 16;
1346 aarch64_linux_record_tdep.size_time_t = 8;
1347
1348 /* These values are the second argument of system call "sys_ioctl".
1349 They are obtained from Linux Kernel source. */
1350 aarch64_linux_record_tdep.ioctl_TCGETS = 0x5401;
1351 aarch64_linux_record_tdep.ioctl_TCSETS = 0x5402;
1352 aarch64_linux_record_tdep.ioctl_TCSETSW = 0x5403;
1353 aarch64_linux_record_tdep.ioctl_TCSETSF = 0x5404;
1354 aarch64_linux_record_tdep.ioctl_TCGETA = 0x5405;
1355 aarch64_linux_record_tdep.ioctl_TCSETA = 0x5406;
1356 aarch64_linux_record_tdep.ioctl_TCSETAW = 0x5407;
1357 aarch64_linux_record_tdep.ioctl_TCSETAF = 0x5408;
1358 aarch64_linux_record_tdep.ioctl_TCSBRK = 0x5409;
1359 aarch64_linux_record_tdep.ioctl_TCXONC = 0x540a;
1360 aarch64_linux_record_tdep.ioctl_TCFLSH = 0x540b;
1361 aarch64_linux_record_tdep.ioctl_TIOCEXCL = 0x540c;
1362 aarch64_linux_record_tdep.ioctl_TIOCNXCL = 0x540d;
1363 aarch64_linux_record_tdep.ioctl_TIOCSCTTY = 0x540e;
1364 aarch64_linux_record_tdep.ioctl_TIOCGPGRP = 0x540f;
1365 aarch64_linux_record_tdep.ioctl_TIOCSPGRP = 0x5410;
1366 aarch64_linux_record_tdep.ioctl_TIOCOUTQ = 0x5411;
1367 aarch64_linux_record_tdep.ioctl_TIOCSTI = 0x5412;
1368 aarch64_linux_record_tdep.ioctl_TIOCGWINSZ = 0x5413;
1369 aarch64_linux_record_tdep.ioctl_TIOCSWINSZ = 0x5414;
1370 aarch64_linux_record_tdep.ioctl_TIOCMGET = 0x5415;
1371 aarch64_linux_record_tdep.ioctl_TIOCMBIS = 0x5416;
1372 aarch64_linux_record_tdep.ioctl_TIOCMBIC = 0x5417;
1373 aarch64_linux_record_tdep.ioctl_TIOCMSET = 0x5418;
1374 aarch64_linux_record_tdep.ioctl_TIOCGSOFTCAR = 0x5419;
1375 aarch64_linux_record_tdep.ioctl_TIOCSSOFTCAR = 0x541a;
1376 aarch64_linux_record_tdep.ioctl_FIONREAD = 0x541b;
1377 aarch64_linux_record_tdep.ioctl_TIOCINQ = 0x541b;
1378 aarch64_linux_record_tdep.ioctl_TIOCLINUX = 0x541c;
1379 aarch64_linux_record_tdep.ioctl_TIOCCONS = 0x541d;
1380 aarch64_linux_record_tdep.ioctl_TIOCGSERIAL = 0x541e;
1381 aarch64_linux_record_tdep.ioctl_TIOCSSERIAL = 0x541f;
1382 aarch64_linux_record_tdep.ioctl_TIOCPKT = 0x5420;
1383 aarch64_linux_record_tdep.ioctl_FIONBIO = 0x5421;
1384 aarch64_linux_record_tdep.ioctl_TIOCNOTTY = 0x5422;
1385 aarch64_linux_record_tdep.ioctl_TIOCSETD = 0x5423;
1386 aarch64_linux_record_tdep.ioctl_TIOCGETD = 0x5424;
1387 aarch64_linux_record_tdep.ioctl_TCSBRKP = 0x5425;
1388 aarch64_linux_record_tdep.ioctl_TIOCTTYGSTRUCT = 0x5426;
1389 aarch64_linux_record_tdep.ioctl_TIOCSBRK = 0x5427;
1390 aarch64_linux_record_tdep.ioctl_TIOCCBRK = 0x5428;
1391 aarch64_linux_record_tdep.ioctl_TIOCGSID = 0x5429;
1392 aarch64_linux_record_tdep.ioctl_TCGETS2 = 0x802c542a;
1393 aarch64_linux_record_tdep.ioctl_TCSETS2 = 0x402c542b;
1394 aarch64_linux_record_tdep.ioctl_TCSETSW2 = 0x402c542c;
1395 aarch64_linux_record_tdep.ioctl_TCSETSF2 = 0x402c542d;
1396 aarch64_linux_record_tdep.ioctl_TIOCGPTN = 0x80045430;
1397 aarch64_linux_record_tdep.ioctl_TIOCSPTLCK = 0x40045431;
1398 aarch64_linux_record_tdep.ioctl_FIONCLEX = 0x5450;
1399 aarch64_linux_record_tdep.ioctl_FIOCLEX = 0x5451;
1400 aarch64_linux_record_tdep.ioctl_FIOASYNC = 0x5452;
1401 aarch64_linux_record_tdep.ioctl_TIOCSERCONFIG = 0x5453;
1402 aarch64_linux_record_tdep.ioctl_TIOCSERGWILD = 0x5454;
1403 aarch64_linux_record_tdep.ioctl_TIOCSERSWILD = 0x5455;
1404 aarch64_linux_record_tdep.ioctl_TIOCGLCKTRMIOS = 0x5456;
1405 aarch64_linux_record_tdep.ioctl_TIOCSLCKTRMIOS = 0x5457;
1406 aarch64_linux_record_tdep.ioctl_TIOCSERGSTRUCT = 0x5458;
1407 aarch64_linux_record_tdep.ioctl_TIOCSERGETLSR = 0x5459;
1408 aarch64_linux_record_tdep.ioctl_TIOCSERGETMULTI = 0x545a;
1409 aarch64_linux_record_tdep.ioctl_TIOCSERSETMULTI = 0x545b;
1410 aarch64_linux_record_tdep.ioctl_TIOCMIWAIT = 0x545c;
1411 aarch64_linux_record_tdep.ioctl_TIOCGICOUNT = 0x545d;
1412 aarch64_linux_record_tdep.ioctl_TIOCGHAYESESP = 0x545e;
1413 aarch64_linux_record_tdep.ioctl_TIOCSHAYESESP = 0x545f;
1414 aarch64_linux_record_tdep.ioctl_FIOQSIZE = 0x5460;
1415
1416 /* These values are the second argument of system call "sys_fcntl"
1417 and "sys_fcntl64". They are obtained from Linux Kernel source. */
1418 aarch64_linux_record_tdep.fcntl_F_GETLK = 5;
1419 aarch64_linux_record_tdep.fcntl_F_GETLK64 = 12;
1420 aarch64_linux_record_tdep.fcntl_F_SETLK64 = 13;
1421 aarch64_linux_record_tdep.fcntl_F_SETLKW64 = 14;
1422
1423 /* The AArch64 syscall calling convention: reg x0-x6 for arguments,
1424 reg x8 for syscall number and return value in reg x0. */
1425 aarch64_linux_record_tdep.arg1 = AARCH64_X0_REGNUM + 0;
1426 aarch64_linux_record_tdep.arg2 = AARCH64_X0_REGNUM + 1;
1427 aarch64_linux_record_tdep.arg3 = AARCH64_X0_REGNUM + 2;
1428 aarch64_linux_record_tdep.arg4 = AARCH64_X0_REGNUM + 3;
1429 aarch64_linux_record_tdep.arg5 = AARCH64_X0_REGNUM + 4;
1430 aarch64_linux_record_tdep.arg6 = AARCH64_X0_REGNUM + 5;
1431 aarch64_linux_record_tdep.arg7 = AARCH64_X0_REGNUM + 6;
1432
1433 /* `catch syscall' */
1434 set_xml_syscall_file_name (gdbarch, "syscalls/aarch64-linux.xml");
1435 set_gdbarch_get_syscall_number (gdbarch, aarch64_linux_get_syscall_number);
1436
1437 /* Displaced stepping. */
1438 set_gdbarch_max_insn_length (gdbarch, 4 * DISPLACED_MODIFIED_INSNS);
1439 set_gdbarch_displaced_step_copy_insn (gdbarch,
1440 aarch64_displaced_step_copy_insn);
1441 set_gdbarch_displaced_step_fixup (gdbarch, aarch64_displaced_step_fixup);
1442 set_gdbarch_displaced_step_location (gdbarch, linux_displaced_step_location);
1443 set_gdbarch_displaced_step_hw_singlestep (gdbarch,
1444 aarch64_displaced_step_hw_singlestep);
1445
1446 set_gdbarch_gcc_target_options (gdbarch, aarch64_linux_gcc_target_options);
1447 }
1448
1449 void
1450 _initialize_aarch64_linux_tdep (void)
1451 {
1452 gdbarch_register_osabi (bfd_arch_aarch64, 0, GDB_OSABI_LINUX,
1453 aarch64_linux_init_abi);
1454 }
This page took 0.07861 seconds and 5 git commands to generate.