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