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