[ARM] Add ARMv8.3 command line option and feature flag
[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   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_free_closure (gdbarch,
1208                                            simple_displaced_step_free_closure);
1209   set_gdbarch_displaced_step_location (gdbarch, linux_displaced_step_location);
1210   set_gdbarch_displaced_step_hw_singlestep (gdbarch,
1211                                             aarch64_displaced_step_hw_singlestep);
1212 }
1213
1214 /* Provide a prototype to silence -Wmissing-prototypes.  */
1215 extern initialize_file_ftype _initialize_aarch64_linux_tdep;
1216
1217 void
1218 _initialize_aarch64_linux_tdep (void)
1219 {
1220   gdbarch_register_osabi (bfd_arch_aarch64, 0, GDB_OSABI_LINUX,
1221                           aarch64_linux_init_abi);
1222 }