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