GDB (xrefs)
/tmp/gdb-8.1/gdb/aarch64-linux-tdep.c
Go to the documentation of this file.
1 /* Target-dependent code for GNU/Linux AArch64.
2 
3  Copyright (C) 2009-2018 Free Software Foundation, Inc.
4  Contributed by ARM Ltd.
5 
6  This file is part of GDB.
7 
8  This program is free software; you can redistribute it and/or modify
9  it under the terms of the GNU General Public License as published by
10  the Free Software Foundation; either version 3 of the License, or
11  (at your option) any later version.
12 
13  This program is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  GNU General Public License for more details.
17 
18  You should have received a copy of the GNU General Public License
19  along with this program. If not, see <http://www.gnu.org/licenses/>. */
20 
21 #include "defs.h"
22 
23 #include "gdbarch.h"
24 #include "arch-utils.h"
25 #include "glibc-tdep.h"
26 #include "linux-tdep.h"
27 #include "aarch64-tdep.h"
28 #include "aarch64-linux-tdep.h"
29 #include "osabi.h"
30 #include "solib-svr4.h"
31 #include "symtab.h"
32 #include "tramp-frame.h"
33 #include "trad-frame.h"
34 
35 #include "inferior.h"
36 #include "regcache.h"
37 #include "regset.h"
38 
39 #include "cli/cli-utils.h"
40 #include "stap-probe.h"
41 #include "parser-defs.h"
42 #include "user-regs.h"
43 #include "xml-syscall.h"
44 #include <ctype.h>
45 
46 #include "record-full.h"
47 #include "linux-record.h"
48 #include "auxv.h"
49 #include "elf/common.h"
50 
51 /* Signal frame handling.
52 
53  +------------+ ^
54  | saved lr | |
55  +->| saved fp |--+
56  | | |
57  | | |
58  | +------------+
59  | | saved lr |
60  +--| saved fp |
61  ^ | |
62  | | |
63  | +------------+
64  ^ | |
65  | | signal |
66  | | | SIGTRAMP_FRAME (struct rt_sigframe)
67  | | saved regs |
68  +--| saved sp |--> interrupted_sp
69  | | saved pc |--> interrupted_pc
70  | | |
71  | +------------+
72  | | saved lr |--> default_restorer (movz x8, NR_sys_rt_sigreturn; svc 0)
73  +--| saved fp |<- FP
74  | | NORMAL_FRAME
75  | |<- SP
76  +------------+
77 
78  On signal delivery, the kernel will create a signal handler stack
79  frame and setup the return address in LR to point at restorer stub.
80  The signal stack frame is defined by:
81 
82  struct rt_sigframe
83  {
84  siginfo_t info;
85  struct ucontext uc;
86  };
87 
88  typedef struct
89  {
90  ... 128 bytes
91  } siginfo_t;
92 
93  The ucontext has the following form:
94  struct ucontext
95  {
96  unsigned long uc_flags;
97  struct ucontext *uc_link;
98  stack_t uc_stack;
99  sigset_t uc_sigmask;
100  struct sigcontext uc_mcontext;
101  };
102 
103  typedef struct sigaltstack
104  {
105  void *ss_sp;
106  int ss_flags;
107  size_t ss_size;
108  } stack_t;
109 
110  struct sigcontext
111  {
112  unsigned long fault_address;
113  unsigned long regs[31];
114  unsigned long sp; / * 31 * /
115  unsigned long pc; / * 32 * /
116  unsigned long pstate; / * 33 * /
117  __u8 __reserved[4096]
118  };
119 
120  The restorer stub will always have the form:
121 
122  d28015a8 movz x8, #0xad
123  d4000001 svc #0x0
124 
125  This is a system call sys_rt_sigreturn.
126 
127  We detect signal frames by snooping the return code for the restorer
128  instruction sequence.
129 
130  The handler then needs to recover the saved register set from
131  ucontext.uc_mcontext. */
132 
133 /* These magic numbers need to reflect the layout of the kernel
134  defined struct rt_sigframe and ucontext. */
135 #define AARCH64_SIGCONTEXT_REG_SIZE 8
136 #define AARCH64_RT_SIGFRAME_UCONTEXT_OFFSET 128
137 #define AARCH64_UCONTEXT_SIGCONTEXT_OFFSET 176
138 #define AARCH64_SIGCONTEXT_XO_OFFSET 8
139 
140 /* Implement the "init" method of struct tramp_frame. */
141 
142 static void
144  struct frame_info *this_frame,
145  struct trad_frame_cache *this_cache,
146  CORE_ADDR func)
147 {
150  sp
153  int i;
154 
155  for (i = 0; i < 31; i++)
156  {
157  trad_frame_set_reg_addr (this_cache,
158  AARCH64_X0_REGNUM + i,
161  }
168 
169  trad_frame_set_id (this_cache, frame_id_build (sp, func));
170 }
171 
173 {
175  4,
176  {
177  /* movz x8, 0x8b (S=1,o=10,h=0,i=0x8b,r=8)
178  Soo1 0010 1hhi iiii iiii iiii iiir rrrr */
179  {0xd2801168, -1},
180 
181  /* svc 0x0 (o=0, l=1)
182  1101 0100 oooi iiii iiii iiii iii0 00ll */
183  {0xd4000001, -1},
184  {TRAMP_SENTINEL_INSN, -1}
185  },
187 };
188 
189 /* Register maps. */
190 
192  {
193  { 31, AARCH64_X0_REGNUM, 8 }, /* x0 ... x30 */
194  { 1, AARCH64_SP_REGNUM, 8 },
195  { 1, AARCH64_PC_REGNUM, 8 },
196  { 1, AARCH64_CPSR_REGNUM, 8 },
197  { 0 }
198  };
199 
201  {
202  { 32, AARCH64_V0_REGNUM, 16 }, /* v0 ... v31 */
203  { 1, AARCH64_FPSR_REGNUM, 4 },
204  { 1, AARCH64_FPCR_REGNUM, 4 },
205  { 0 }
206  };
207 
208 /* Register set definitions. */
209 
211  {
214  };
215 
217  {
220  };
221 
222 /* Implement the "regset_from_core_section" gdbarch method. */
223 
224 static void
227  void *cb_data,
228  const struct regcache *regcache)
229 {
231  NULL, cb_data);
233  NULL, cb_data);
234 }
235 
236 /* Implement the "core_read_description" gdbarch method. */
237 
238 static const struct target_desc *
240  struct target_ops *target, bfd *abfd)
241 {
242  CORE_ADDR aarch64_hwcap = 0;
243 
244  if (target_auxv_search (target, AT_HWCAP, &aarch64_hwcap) != 1)
245  return NULL;
246 
247  return aarch64_read_description ();
248 }
249 
250 /* Implementation of `gdbarch_stap_is_single_operand', as defined in
251  gdbarch.h. */
252 
253 static int
255 {
256  return (*s == '#' || isdigit (*s) /* Literal number. */
257  || *s == '[' /* Register indirection. */
258  || isalpha (*s)); /* Register value. */
259 }
260 
261 /* This routine is used to parse a special token in AArch64's assembly.
262 
263  The special tokens parsed by it are:
264 
265  - Register displacement (e.g, [fp, #-8])
266 
267  It returns one if the special token has been parsed successfully,
268  or zero if the current token is not considered special. */
269 
270 static int
272  struct stap_parse_info *p)
273 {
274  if (*p->arg == '[')
275  {
276  /* Temporary holder for lookahead. */
277  const char *tmp = p->arg;
278  char *endp;
279  /* Used to save the register name. */
280  const char *start;
281  char *regname;
282  int len;
283  int got_minus = 0;
284  long displacement;
285  struct stoken str;
286 
287  ++tmp;
288  start = tmp;
289 
290  /* Register name. */
291  while (isalnum (*tmp))
292  ++tmp;
293 
294  if (*tmp != ',')
295  return 0;
296 
297  len = tmp - start;
298  regname = (char *) alloca (len + 2);
299 
300  strncpy (regname, start, len);
301  regname[len] = '\0';
302 
303  if (user_reg_map_name_to_regnum (gdbarch, regname, len) == -1)
304  error (_("Invalid register name `%s' on expression `%s'."),
305  regname, p->saved_arg);
306 
307  ++tmp;
308  tmp = skip_spaces (tmp);
309  /* Now we expect a number. It can begin with '#' or simply
310  a digit. */
311  if (*tmp == '#')
312  ++tmp;
313 
314  if (*tmp == '-')
315  {
316  ++tmp;
317  got_minus = 1;
318  }
319  else if (*tmp == '+')
320  ++tmp;
321 
322  if (!isdigit (*tmp))
323  return 0;
324 
325  displacement = strtol (tmp, &endp, 10);
326  tmp = endp;
327 
328  /* Skipping last `]'. */
329  if (*tmp++ != ']')
330  return 0;
331 
332  /* The displacement. */
333  write_exp_elt_opcode (&p->pstate, OP_LONG);
334  write_exp_elt_type (&p->pstate, builtin_type (gdbarch)->builtin_long);
335  write_exp_elt_longcst (&p->pstate, displacement);
336  write_exp_elt_opcode (&p->pstate, OP_LONG);
337  if (got_minus)
338  write_exp_elt_opcode (&p->pstate, UNOP_NEG);
339 
340  /* The register name. */
341  write_exp_elt_opcode (&p->pstate, OP_REGISTER);
342  str.ptr = regname;
343  str.length = len;
344  write_exp_string (&p->pstate, str);
345  write_exp_elt_opcode (&p->pstate, OP_REGISTER);
346 
347  write_exp_elt_opcode (&p->pstate, BINOP_ADD);
348 
349  /* Casting to the expected type. */
350  write_exp_elt_opcode (&p->pstate, UNOP_CAST);
352  write_exp_elt_opcode (&p->pstate, UNOP_CAST);
353 
354  write_exp_elt_opcode (&p->pstate, UNOP_IND);
355 
356  p->arg = tmp;
357  }
358  else
359  return 0;
360 
361  return 1;
362 }
363 
364 /* Implement the "get_syscall_number" gdbarch method. */
365 
366 static LONGEST
368  ptid_t ptid)
369 {
370  struct regcache *regs = get_thread_regcache (ptid);
371  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
372 
373  /* The content of register x8. */
375  /* The result. */
376  LONGEST ret;
377 
378  /* Getting the system call number from the register x8. */
379  regcache_cooked_read (regs, AARCH64_DWARF_X0 + 8, buf);
380 
381  ret = extract_signed_integer (buf, X_REGISTER_SIZE, byte_order);
382 
383  return ret;
384 }
385 
386 /* AArch64 process record-replay constructs: syscall, signal etc. */
387 
389 
390 /* Enum that defines the AArch64 linux specific syscall identifiers used for
391  process record/replay. */
392 
654 };
655 
656 /* aarch64_canonicalize_syscall maps syscall ids from the native AArch64
657  linux set of syscall ids into a canonical set of syscall ids used by
658  process record. */
659 
660 static enum gdb_syscall
662 {
663 #define SYSCALL_MAP(SYSCALL) case aarch64_sys_##SYSCALL: \
664  return gdb_sys_##SYSCALL
665 
666 #define UNSUPPORTED_SYSCALL_MAP(SYSCALL) case aarch64_sys_##SYSCALL: \
667  return gdb_sys_no_syscall
668 
669  switch (syscall_number)
670  {
671  SYSCALL_MAP (io_setup);
672  SYSCALL_MAP (io_destroy);
673  SYSCALL_MAP (io_submit);
674  SYSCALL_MAP (io_cancel);
675  SYSCALL_MAP (io_getevents);
676 
677  SYSCALL_MAP (setxattr);
678  SYSCALL_MAP (lsetxattr);
679  SYSCALL_MAP (fsetxattr);
680  SYSCALL_MAP (getxattr);
681  SYSCALL_MAP (lgetxattr);
682  SYSCALL_MAP (fgetxattr);
683  SYSCALL_MAP (listxattr);
684  SYSCALL_MAP (llistxattr);
685  SYSCALL_MAP (flistxattr);
686  SYSCALL_MAP (removexattr);
687  SYSCALL_MAP (lremovexattr);
688  SYSCALL_MAP (fremovexattr);
689  SYSCALL_MAP (getcwd);
690  SYSCALL_MAP (lookup_dcookie);
691  SYSCALL_MAP (eventfd2);
692  SYSCALL_MAP (epoll_create1);
693  SYSCALL_MAP (epoll_ctl);
694  SYSCALL_MAP (epoll_pwait);
695  SYSCALL_MAP (dup);
696  SYSCALL_MAP (dup3);
697  SYSCALL_MAP (fcntl);
698  SYSCALL_MAP (inotify_init1);
699  SYSCALL_MAP (inotify_add_watch);
700  SYSCALL_MAP (inotify_rm_watch);
701  SYSCALL_MAP (ioctl);
702  SYSCALL_MAP (ioprio_set);
703  SYSCALL_MAP (ioprio_get);
704  SYSCALL_MAP (flock);
705  SYSCALL_MAP (mknodat);
706  SYSCALL_MAP (mkdirat);
707  SYSCALL_MAP (unlinkat);
708  SYSCALL_MAP (symlinkat);
709  SYSCALL_MAP (linkat);
710  SYSCALL_MAP (renameat);
711  UNSUPPORTED_SYSCALL_MAP (umount2);
712  SYSCALL_MAP (mount);
713  SYSCALL_MAP (pivot_root);
714  SYSCALL_MAP (nfsservctl);
715  SYSCALL_MAP (statfs);
716  SYSCALL_MAP (truncate);
717  SYSCALL_MAP (ftruncate);
718  SYSCALL_MAP (fallocate);
719  SYSCALL_MAP (faccessat);
720  SYSCALL_MAP (fchdir);
721  SYSCALL_MAP (chroot);
722  SYSCALL_MAP (fchmod);
723  SYSCALL_MAP (fchmodat);
724  SYSCALL_MAP (fchownat);
725  SYSCALL_MAP (fchown);
726  SYSCALL_MAP (openat);
727  SYSCALL_MAP (close);
728  SYSCALL_MAP (vhangup);
729  SYSCALL_MAP (pipe2);
730  SYSCALL_MAP (quotactl);
731  SYSCALL_MAP (getdents64);
732  SYSCALL_MAP (lseek);
733  SYSCALL_MAP (read);
734  SYSCALL_MAP (write);
735  SYSCALL_MAP (readv);
736  SYSCALL_MAP (writev);
737  SYSCALL_MAP (pread64);
738  SYSCALL_MAP (pwrite64);
739  UNSUPPORTED_SYSCALL_MAP (preadv);
740  UNSUPPORTED_SYSCALL_MAP (pwritev);
741  SYSCALL_MAP (sendfile);
742  SYSCALL_MAP (pselect6);
743  SYSCALL_MAP (ppoll);
744  UNSUPPORTED_SYSCALL_MAP (signalfd4);
745  SYSCALL_MAP (vmsplice);
746  SYSCALL_MAP (splice);
747  SYSCALL_MAP (tee);
748  SYSCALL_MAP (readlinkat);
749  SYSCALL_MAP (newfstatat);
750 
751  SYSCALL_MAP (fstat);
752  SYSCALL_MAP (sync);
753  SYSCALL_MAP (fsync);
754  SYSCALL_MAP (fdatasync);
755  SYSCALL_MAP (sync_file_range);
756  UNSUPPORTED_SYSCALL_MAP (timerfd_create);
757  UNSUPPORTED_SYSCALL_MAP (timerfd_settime);
758  UNSUPPORTED_SYSCALL_MAP (timerfd_gettime);
759  UNSUPPORTED_SYSCALL_MAP (utimensat);
760  SYSCALL_MAP (acct);
761  SYSCALL_MAP (capget);
762  SYSCALL_MAP (capset);
763  SYSCALL_MAP (personality);
764  SYSCALL_MAP (exit);
765  SYSCALL_MAP (exit_group);
766  SYSCALL_MAP (waitid);
767  SYSCALL_MAP (set_tid_address);
768  SYSCALL_MAP (unshare);
769  SYSCALL_MAP (futex);
770  SYSCALL_MAP (set_robust_list);
771  SYSCALL_MAP (get_robust_list);
772  SYSCALL_MAP (nanosleep);
773 
774  SYSCALL_MAP (getitimer);
775  SYSCALL_MAP (setitimer);
776  SYSCALL_MAP (kexec_load);
777  SYSCALL_MAP (init_module);
778  SYSCALL_MAP (delete_module);
779  SYSCALL_MAP (timer_create);
780  SYSCALL_MAP (timer_settime);
781  SYSCALL_MAP (timer_gettime);
782  SYSCALL_MAP (timer_getoverrun);
783  SYSCALL_MAP (timer_delete);
784  SYSCALL_MAP (clock_settime);
785  SYSCALL_MAP (clock_gettime);
786  SYSCALL_MAP (clock_getres);
787  SYSCALL_MAP (clock_nanosleep);
788  SYSCALL_MAP (syslog);
790  SYSCALL_MAP (sched_setparam);
791  SYSCALL_MAP (sched_setscheduler);
792  SYSCALL_MAP (sched_getscheduler);
793  SYSCALL_MAP (sched_getparam);
794  SYSCALL_MAP (sched_setaffinity);
795  SYSCALL_MAP (sched_getaffinity);
796  SYSCALL_MAP (sched_yield);
797  SYSCALL_MAP (sched_get_priority_max);
798  SYSCALL_MAP (sched_get_priority_min);
799  SYSCALL_MAP (sched_rr_get_interval);
800  SYSCALL_MAP (kill);
801  SYSCALL_MAP (tkill);
802  SYSCALL_MAP (tgkill);
803  SYSCALL_MAP (sigaltstack);
804  SYSCALL_MAP (rt_sigsuspend);
805  SYSCALL_MAP (rt_sigaction);
806  SYSCALL_MAP (rt_sigprocmask);
807  SYSCALL_MAP (rt_sigpending);
808  SYSCALL_MAP (rt_sigtimedwait);
809  SYSCALL_MAP (rt_sigqueueinfo);
810  SYSCALL_MAP (rt_sigreturn);
811  SYSCALL_MAP (setpriority);
812  SYSCALL_MAP (getpriority);
813  SYSCALL_MAP (reboot);
814  SYSCALL_MAP (setregid);
815  SYSCALL_MAP (setgid);
816  SYSCALL_MAP (setreuid);
817  SYSCALL_MAP (setuid);
818  SYSCALL_MAP (setresuid);
819  SYSCALL_MAP (getresuid);
820  SYSCALL_MAP (setresgid);
821  SYSCALL_MAP (getresgid);
822  SYSCALL_MAP (setfsuid);
823  SYSCALL_MAP (setfsgid);
824  SYSCALL_MAP (times);
825  SYSCALL_MAP (setpgid);
826  SYSCALL_MAP (getpgid);
827  SYSCALL_MAP (getsid);
828  SYSCALL_MAP (setsid);
829  SYSCALL_MAP (getgroups);
830  SYSCALL_MAP (setgroups);
831  SYSCALL_MAP (uname);
832  SYSCALL_MAP (sethostname);
833  SYSCALL_MAP (setdomainname);
834  SYSCALL_MAP (getrlimit);
835  SYSCALL_MAP (setrlimit);
836  SYSCALL_MAP (getrusage);
837  SYSCALL_MAP (umask);
838  SYSCALL_MAP (prctl);
839  SYSCALL_MAP (getcpu);
840  SYSCALL_MAP (gettimeofday);
841  SYSCALL_MAP (settimeofday);
842  SYSCALL_MAP (adjtimex);
843  SYSCALL_MAP (getpid);
844  SYSCALL_MAP (getppid);
845  SYSCALL_MAP (getuid);
846  SYSCALL_MAP (geteuid);
847  SYSCALL_MAP (getgid);
848  SYSCALL_MAP (getegid);
849  SYSCALL_MAP (gettid);
850  SYSCALL_MAP (sysinfo);
851  SYSCALL_MAP (mq_open);
852  SYSCALL_MAP (mq_unlink);
853  SYSCALL_MAP (mq_timedsend);
854  SYSCALL_MAP (mq_timedreceive);
855  SYSCALL_MAP (mq_notify);
856  SYSCALL_MAP (mq_getsetattr);
857  SYSCALL_MAP (msgget);
858  SYSCALL_MAP (msgctl);
859  SYSCALL_MAP (msgrcv);
860  SYSCALL_MAP (msgsnd);
861  SYSCALL_MAP (semget);
862  SYSCALL_MAP (semctl);
863  SYSCALL_MAP (semtimedop);
864  SYSCALL_MAP (semop);
865  SYSCALL_MAP (shmget);
866  SYSCALL_MAP (shmctl);
867  SYSCALL_MAP (shmat);
868  SYSCALL_MAP (shmdt);
869  SYSCALL_MAP (socket);
870  SYSCALL_MAP (socketpair);
871  SYSCALL_MAP (bind);
872  SYSCALL_MAP (listen);
873  SYSCALL_MAP (accept);
874  SYSCALL_MAP (connect);
875  SYSCALL_MAP (getsockname);
876  SYSCALL_MAP (getpeername);
877  SYSCALL_MAP (sendto);
878  SYSCALL_MAP (recvfrom);
879  SYSCALL_MAP (setsockopt);
880  SYSCALL_MAP (getsockopt);
881  SYSCALL_MAP (shutdown);
882  SYSCALL_MAP (sendmsg);
883  SYSCALL_MAP (recvmsg);
884  SYSCALL_MAP (readahead);
885  SYSCALL_MAP (brk);
886  SYSCALL_MAP (munmap);
887  SYSCALL_MAP (mremap);
888  SYSCALL_MAP (add_key);
889  SYSCALL_MAP (request_key);
890  SYSCALL_MAP (keyctl);
891  SYSCALL_MAP (clone);
892  SYSCALL_MAP (execve);
893 
894  case aarch64_sys_mmap:
895  return gdb_sys_mmap2;
896 
897  SYSCALL_MAP (fadvise64);
898  SYSCALL_MAP (swapon);
899  SYSCALL_MAP (swapoff);
900  SYSCALL_MAP (mprotect);
901  SYSCALL_MAP (msync);
902  SYSCALL_MAP (mlock);
903  SYSCALL_MAP (munlock);
904  SYSCALL_MAP (mlockall);
905  SYSCALL_MAP (munlockall);
906  SYSCALL_MAP (mincore);
907  SYSCALL_MAP (madvise);
908  SYSCALL_MAP (remap_file_pages);
909  SYSCALL_MAP (mbind);
910  SYSCALL_MAP (get_mempolicy);
911  SYSCALL_MAP (set_mempolicy);
912  SYSCALL_MAP (migrate_pages);
913  SYSCALL_MAP (move_pages);
914  UNSUPPORTED_SYSCALL_MAP (rt_tgsigqueueinfo);
915  UNSUPPORTED_SYSCALL_MAP (perf_event_open);
916  UNSUPPORTED_SYSCALL_MAP (accept4);
917  UNSUPPORTED_SYSCALL_MAP (recvmmsg);
918 
919  SYSCALL_MAP (wait4);
920 
921  UNSUPPORTED_SYSCALL_MAP (prlimit64);
922  UNSUPPORTED_SYSCALL_MAP (fanotify_init);
923  UNSUPPORTED_SYSCALL_MAP (fanotify_mark);
924  UNSUPPORTED_SYSCALL_MAP (name_to_handle_at);
925  UNSUPPORTED_SYSCALL_MAP (open_by_handle_at);
926  UNSUPPORTED_SYSCALL_MAP (clock_adjtime);
927  UNSUPPORTED_SYSCALL_MAP (syncfs);
928  UNSUPPORTED_SYSCALL_MAP (setns);
929  UNSUPPORTED_SYSCALL_MAP (sendmmsg);
930  UNSUPPORTED_SYSCALL_MAP (process_vm_readv);
931  UNSUPPORTED_SYSCALL_MAP (process_vm_writev);
933  UNSUPPORTED_SYSCALL_MAP (finit_module);
934  UNSUPPORTED_SYSCALL_MAP (sched_setattr);
935  UNSUPPORTED_SYSCALL_MAP (sched_getattr);
936  default:
937  return gdb_sys_no_syscall;
938  }
939 }
940 
941 /* Record all registers but PC register for process-record. */
942 
943 static int
945 {
946  int i;
947 
948  for (i = AARCH64_X0_REGNUM; i < AARCH64_PC_REGNUM; i++)
950  return -1;
951 
953  return -1;
954 
955  return 0;
956 }
957 
958 /* Handler for aarch64 system call instruction recording. */
959 
960 static int
962  unsigned long svc_number)
963 {
964  int ret = 0;
965  enum gdb_syscall syscall_gdb;
966 
967  syscall_gdb =
968  aarch64_canonicalize_syscall ((enum aarch64_syscall) svc_number);
969 
970  if (syscall_gdb < 0)
971  {
972  printf_unfiltered (_("Process record and replay target doesn't "
973  "support syscall number %s\n"),
974  plongest (svc_number));
975  return -1;
976  }
977 
978  if (syscall_gdb == gdb_sys_sigreturn
979  || syscall_gdb == gdb_sys_rt_sigreturn)
980  {
982  return -1;
983  return 0;
984  }
985 
986  ret = record_linux_system_call (syscall_gdb, regcache,
988  if (ret != 0)
989  return ret;
990 
991  /* Record the return value of the system call. */
993  return -1;
994  /* Record LR. */
996  return -1;
997  /* Record CPSR. */
999  return -1;
1000 
1001  return 0;
1002 }
1003 
1004 /* Implement the "gcc_target_options" gdbarch method. */
1005 
1006 static char *
1008 {
1009  /* GCC doesn't know "-m64". */
1010  return NULL;
1011 }
1012 
1013 static void
1015 {
1016  static const char *const stap_integer_prefixes[] = { "#", "", NULL };
1017  static const char *const stap_register_prefixes[] = { "", NULL };
1018  static const char *const stap_register_indirection_prefixes[] = { "[",
1019  NULL };
1020  static const char *const stap_register_indirection_suffixes[] = { "]",
1021  NULL };
1022  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1023 
1024  tdep->lowest_pc = 0x8000;
1025 
1026  linux_init_abi (info, gdbarch);
1027 
1030 
1031  /* Enable TLS support. */
1034 
1035  /* Shared library handling. */
1038 
1040 
1041  /* Enable longjmp. */
1042  tdep->jb_pc = 11;
1043 
1048 
1049  /* SystemTap related. */
1050  set_gdbarch_stap_integer_prefixes (gdbarch, stap_integer_prefixes);
1051  set_gdbarch_stap_register_prefixes (gdbarch, stap_register_prefixes);
1053  stap_register_indirection_prefixes);
1055  stap_register_indirection_suffixes);
1059 
1060  /* Reversible debugging, process record. */
1062  /* Syscall record. */
1064 
1065  /* Initialize the aarch64_linux_record_tdep. */
1066  /* These values are the size of the type that will be used in a system
1067  call. They are obtained from Linux Kernel source. */
1139 
1140  /* These values are the second argument of system call "sys_ioctl".
1141  They are obtained from Linux Kernel source. */
1207 
1208  /* These values are the second argument of system call "sys_fcntl"
1209  and "sys_fcntl64". They are obtained from Linux Kernel source. */
1214 
1215  /* The AArch64 syscall calling convention: reg x0-x6 for arguments,
1216  reg x8 for syscall number and return value in reg x0. */
1224 
1225  /* `catch syscall' */
1226  set_xml_syscall_file_name (gdbarch, "syscalls/aarch64-linux.xml");
1228 
1229  /* Displaced stepping. */
1237 
1239 }
1240 
1241 void
1243 {
1244  gdbarch_register_osabi (bfd_arch_aarch64, 0, GDB_OSABI_LINUX,
1246 }
ssize_t read(int fd, void *buf, size_t count)
Definition: expect-read1.c:26
static char * aarch64_linux_gcc_target_options(struct gdbarch *gdbarch)
void set_gdbarch_gcc_target_options(struct gdbarch *gdbarch, gdbarch_gcc_target_options_ftype gcc_target_options)
Definition: gdbarch.c:5006
void trad_frame_set_reg_addr(struct trad_frame_cache *this_trad_cache, int regnum, CORE_ADDR addr)
Definition: trad-frame.c:126
int size_serial_icounter_struct
Definition: linux-record.h:88
struct frame_id frame_id_build(CORE_ADDR stack_addr, CORE_ADDR code_addr)
Definition: frame.c:624
void set_gdbarch_displaced_step_fixup(struct gdbarch *gdbarch, gdbarch_displaced_step_fixup_ftype displaced_step_fixup)
Definition: gdbarch.c:3982
struct type * arg_type
Definition: stap-probe.h:60
bfd_vma CORE_ADDR
Definition: common-types.h:41
void set_gdbarch_fetch_tls_load_module_address(struct gdbarch *gdbarch, gdbarch_fetch_tls_load_module_address_ftype fetch_tls_load_module_address)
Definition: gdbarch.c:3038
#define TRAMP_SENTINEL_INSN
Definition: tramp-frame.h:44
struct link_map_offsets * svr4_lp64_fetch_link_map_offsets(void)
Definition: solib-svr4.c:3214
const target_desc * aarch64_read_description()
struct regcache * get_thread_regcache(ptid_t ptid)
Definition: regcache.c:434
const char * ptr
Definition: parser-defs.h:91
void set_gdbarch_stap_parse_special_token(struct gdbarch *gdbarch, gdbarch_stap_parse_special_token_ftype stap_parse_special_token)
Definition: gdbarch.c:4499
int record_full_arch_list_add_reg(struct regcache *regcache, int regnum)
Definition: record-full.c:468
int gdbarch_int_bit(struct gdbarch *gdbarch)
Definition: gdbarch.c:1579
void(* func)(char *)
void() iterate_over_regset_sections_cb(const char *sect_name, int size, const struct regset *regset, const char *human_name, void *cb_data)
Definition: gdbarch.h:99
void set_gdbarch_skip_trampoline_code(struct gdbarch *gdbarch, gdbarch_skip_trampoline_code_ftype skip_trampoline_code)
Definition: gdbarch.c:3316
CORE_ADDR glibc_skip_solib_resolver(struct gdbarch *gdbarch, CORE_ADDR pc)
Definition: glibc-tdep.c:38
void set_gdbarch_displaced_step_location(struct gdbarch *gdbarch, gdbarch_displaced_step_location_ftype displaced_step_location)
Definition: gdbarch.c:3999
int gdbarch_ptr_bit(struct gdbarch *gdbarch)
Definition: gdbarch.c:1831
void trad_frame_set_id(struct trad_frame_cache *this_trad_cache, struct frame_id this_id)
Definition: trad-frame.c:171
void set_gdbarch_stap_register_prefixes(struct gdbarch *gdbarch, const char *const *stap_register_prefixes)
Definition: gdbarch.c:4366
int(* aarch64_syscall_record)(struct regcache *regcache, unsigned long svc_number)
Definition: aarch64-tdep.h:75
void regcache_supply_regset(const struct regset *regset, struct regcache *regcache, int regnum, const void *buf, size_t size)
Definition: regcache.c:1192
const char * arg
Definition: stap-probe.h:46
void linux_init_abi(struct gdbarch_info info, struct gdbarch *gdbarch)
Definition: linux-tdep.c:2492
#define AARCH64_DWARF_X0
Definition: aarch64-tdep.h:32
CORE_ADDR(* sigcontext_addr)(struct frame_info *)
Definition: alpha-tdep.h:82
int gdbarch_long_bit(struct gdbarch *gdbarch)
Definition: gdbarch.c:1596
CORE_ADDR lowest_pc
Definition: aarch64-tdep.h:58
static const struct regcache_map_entry aarch64_linux_gregmap[]
char * skip_spaces(char *chp)
Definition: common-utils.c:337
#define _(String)
Definition: gdb_locale.h:35
struct gdbarch_tdep * gdbarch_tdep(struct gdbarch *gdbarch)
Definition: gdbarch.c:1491
void set_gdbarch_displaced_step_hw_singlestep(struct gdbarch *gdbarch, gdbarch_displaced_step_hw_singlestep_ftype displaced_step_hw_singlestep)
Definition: gdbarch.c:3957
void set_gdbarch_process_record(struct gdbarch *gdbarch, gdbarch_process_record_ftype process_record)
Definition: gdbarch.c:4137
PTRACE_TYPE_RET ptrace()
void set_gdbarch_stap_register_indirection_suffixes(struct gdbarch *gdbarch, const char *const *stap_register_indirection_suffixes)
Definition: gdbarch.c:4417
static int aarch64_linux_syscall_record(struct regcache *regcache, unsigned long svc_number)
CORE_ADDR svr4_fetch_objfile_link_map(struct objfile *objfile)
Definition: solib-svr4.c:1579
Definition: regset.h:34
#define AARCH64_SIGCONTEXT_REG_SIZE
void set_gdbarch_stap_integer_prefixes(struct gdbarch *gdbarch, const char *const *stap_integer_prefixes)
Definition: gdbarch.c:4332
static void aarch64_linux_init_abi(struct gdbarch_info info, struct gdbarch *gdbarch)
struct parser_state pstate
Definition: stap-probe.h:49
static const struct regcache_map_entry aarch64_linux_fpregmap[]
void write_exp_elt_longcst(struct parser_state *ps, LONGEST expelt)
Definition: parse.c:255
static void aarch64_linux_iterate_over_regset_sections(struct gdbarch *gdbarch, iterate_over_regset_sections_cb *cb, void *cb_data, const struct regcache *regcache)
#define AARCH64_RT_SIGFRAME_UCONTEXT_OFFSET
int record_linux_system_call(enum gdb_syscall syscall, struct regcache *regcache, struct linux_record_tdep *tdep)
Definition: linux-record.c:241
CORE_ADDR find_solib_trampoline_target(struct frame_info *frame, CORE_ADDR pc)
Definition: minsyms.c:1492
static int aarch64_stap_parse_special_token(struct gdbarch *gdbarch, struct stap_parse_info *p)
Definition: ptid.h:35
static LONGEST aarch64_linux_get_syscall_number(struct gdbarch *gdbarch, ptid_t ptid)
int target_auxv_search(struct target_ops *ops, CORE_ADDR match, CORE_ADDR *valp)
Definition: auxv.c:375
enum bfd_endian gdbarch_byte_order(struct gdbarch *gdbarch)
Definition: gdbarch.c:1509
#define TARGET_CHAR_BIT
Definition: host-defs.h:29
void set_solib_svr4_fetch_link_map_offsets(struct gdbarch *gdbarch, struct link_map_offsets *(*flmo)(void))
Definition: solib-svr4.c:3137
void set_gdbarch_stap_register_indirection_prefixes(struct gdbarch *gdbarch, const char *const *stap_register_indirection_prefixes)
Definition: gdbarch.c:4400
void regcache_collect_regset(const struct regset *regset, const struct regcache *regcache, int regnum, void *buf, size_t size)
Definition: regcache.c:1211
void _initialize_aarch64_linux_tdep(void)
#define SYSCALL_MAP(SYSCALL)
const char * saved_arg
Definition: stap-probe.h:54
#define X_REGISTER_SIZE
Definition: aarch64-tdep.h:37
void aarch64_displaced_step_fixup(struct gdbarch *gdbarch, struct displaced_step_closure *dsc_, CORE_ADDR from, CORE_ADDR to, struct regcache *regs)
void set_xml_syscall_file_name(struct gdbarch *gdbarch, const char *name)
Definition: xml-syscall.c:513
void printf_unfiltered(const char *format,...)
Definition: utils.c:2056
int user_reg_map_name_to_regnum(struct gdbarch *gdbarch, const char *name, int len)
Definition: user-regs.c:130
ULONGEST get_frame_register_unsigned(struct frame_info *frame, int regnum)
Definition: frame.c:1308
void gdbarch_register_osabi(enum bfd_architecture arch, unsigned long machine, enum gdb_osabi osabi, void(*init_osabi)(struct gdbarch_info, struct gdbarch *))
Definition: osabi.c:143
CORE_ADDR linux_displaced_step_location(struct gdbarch *gdbarch)
Definition: linux-tdep.c:2437
#define AARCH64_UCONTEXT_SIGCONTEXT_OFFSET
gdb_syscall
Definition: linux-record.h:183
int aarch64_displaced_step_hw_singlestep(struct gdbarch *gdbarch, struct displaced_step_closure *closure)
const struct regset aarch64_linux_gregset
void write_exp_elt_opcode(struct parser_state *ps, enum exp_opcode expelt)
Definition: parse.c:205
bfd_byte gdb_byte
Definition: common-types.h:38
void set_gdbarch_displaced_step_copy_insn(struct gdbarch *gdbarch, gdbarch_displaced_step_copy_insn_ftype displaced_step_copy_insn)
Definition: gdbarch.c:3940
#define AARCH64_LINUX_SIZEOF_FPREGSET
static void aarch64_linux_sigframe_init(const struct tramp_frame *self, struct frame_info *this_frame, struct trad_frame_cache *this_cache, CORE_ADDR func)
void set_gdbarch_stap_is_single_operand(struct gdbarch *gdbarch, gdbarch_stap_is_single_operand_ftype stap_is_single_operand)
Definition: gdbarch.c:4475
void set_gdbarch_get_syscall_number(struct gdbarch *gdbarch, gdbarch_get_syscall_number_ftype get_syscall_number)
Definition: gdbarch.c:4281
void tramp_frame_prepend_unwinder(struct gdbarch *gdbarch, const struct tramp_frame *tramp_frame)
Definition: tramp-frame.c:146
int aarch64_process_record(struct gdbarch *gdbarch, struct regcache *regcache, CORE_ADDR insn_addr)
enum register_status regcache_cooked_read(struct regcache *regcache, int regnum, gdb_byte *buf)
Definition: regcache.c:661
static LONGEST extract_signed_integer(const gdb_byte *addr, int len, enum bfd_endian byte_order)
Definition: defs.h:570
#define AARCH64_LINUX_SIZEOF_GREGSET
static int aarch64_all_but_pc_registers_record(struct regcache *regcache)
static enum gdb_syscall aarch64_canonicalize_syscall(enum aarch64_syscall syscall_number)
struct m32c_reg * sp
Definition: m32c-tdep.c:119
#define DISPLACED_MODIFIED_INSNS
Definition: aarch64-tdep.h:52
#define UNSUPPORTED_SYSCALL_MAP(SYSCALL)
static const struct target_desc * aarch64_linux_core_read_description(struct gdbarch *gdbarch, struct target_ops *target, bfd *abfd)
aarch64_syscall
void set_gdbarch_iterate_over_regset_sections(struct gdbarch *gdbarch, gdbarch_iterate_over_regset_sections_ftype iterate_over_regset_sections)
Definition: gdbarch.c:3647
ptid_t ptid() const
Definition: regcache.h:325
struct displaced_step_closure * aarch64_displaced_step_copy_insn(struct gdbarch *gdbarch, CORE_ADDR from, CORE_ADDR to, struct regcache *regs)
#define AARCH64_SIGCONTEXT_XO_OFFSET
void set_gdbarch_skip_solib_resolver(struct gdbarch *gdbarch, gdbarch_skip_solib_resolver_ftype skip_solib_resolver)
Definition: gdbarch.c:3333
static const struct tramp_frame aarch64_linux_rt_sigframe
void set_gdbarch_max_insn_length(struct gdbarch *gdbarch, ULONGEST max_insn_length)
Definition: gdbarch.c:3916
void write_exp_string(struct parser_state *ps, struct stoken str)
Definition: parse.c:318
void set_gdbarch_core_read_description(struct gdbarch *gdbarch, gdbarch_core_read_description_ftype core_read_description)
Definition: gdbarch.c:4072
void write_exp_elt_type(struct parser_state *ps, struct type *expelt)
Definition: parse.c:277
static int aarch64_stap_is_single_operand(struct gdbarch *gdbarch, const char *s)
void error(const char *fmt,...)
Definition: errors.c:38
const struct regset aarch64_linux_fpregset
struct linux_record_tdep aarch64_linux_record_tdep
struct type * lookup_pointer_type(struct type *type)
Definition: gdbtypes.c:381
long long LONGEST
Definition: common-types.h:52
Definition: regcache.h:157
int length
Definition: parser-defs.h:93