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