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