1 /* Native-dependent code for GNU/Linux AArch64.
3 Copyright (C) 2011-2018 Free Software Foundation, Inc.
4 Contributed by ARM Ltd.
6 This file is part of GDB.
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.
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.
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/>. */
26 #include "linux-nat.h"
27 #include "target-descriptions.h"
30 #include "aarch64-tdep.h"
31 #include "aarch64-linux-tdep.h"
32 #include "aarch32-linux-nat.h"
33 #include "nat/aarch64-linux.h"
34 #include "nat/aarch64-linux-hw-point.h"
36 #include "elf/external.h"
37 #include "elf/common.h"
39 #include "nat/gdb_ptrace.h"
40 #include <sys/utsname.h>
41 #include <asm/ptrace.h>
45 /* Defines ps_err_e, struct ps_prochandle. */
46 #include "gdb_proc_service.h"
49 #define TRAP_HWBKPT 0x0004
52 class aarch64_linux_nat_target final : public linux_nat_target
55 /* Add our register access methods. */
56 void fetch_registers (struct regcache *, int) override;
57 void store_registers (struct regcache *, int) override;
59 const struct target_desc *read_description () override;
61 /* Add our hardware breakpoint and watchpoint implementation. */
62 int can_use_hw_breakpoint (enum bptype, int, int) override;
63 int insert_hw_breakpoint (struct gdbarch *, struct bp_target_info *) override;
64 int remove_hw_breakpoint (struct gdbarch *, struct bp_target_info *) override;
65 int region_ok_for_hw_watchpoint (CORE_ADDR, int) override;
66 int insert_watchpoint (CORE_ADDR, int, enum target_hw_bp_type,
67 struct expression *) override;
68 int remove_watchpoint (CORE_ADDR, int, enum target_hw_bp_type,
69 struct expression *) override;
70 int stopped_by_watchpoint () override;
71 int stopped_data_address (CORE_ADDR *) override;
72 int watchpoint_addr_within_range (CORE_ADDR, CORE_ADDR, int) override;
74 int can_do_single_step () override;
76 /* Override the GNU/Linux inferior startup hook. */
77 void post_startup_inferior (ptid_t) override;
80 static aarch64_linux_nat_target the_aarch64_linux_nat_target;
82 /* Per-process data. We don't bind this to a per-inferior registry
83 because of targets like x86 GNU/Linux that need to keep track of
84 processes that aren't bound to any inferior (e.g., fork children,
87 struct aarch64_process_info
90 struct aarch64_process_info *next;
92 /* The process identifier. */
95 /* Copy of aarch64 hardware debug registers. */
96 struct aarch64_debug_reg_state state;
99 static struct aarch64_process_info *aarch64_process_list = NULL;
101 /* Find process data for process PID. */
103 static struct aarch64_process_info *
104 aarch64_find_process_pid (pid_t pid)
106 struct aarch64_process_info *proc;
108 for (proc = aarch64_process_list; proc; proc = proc->next)
109 if (proc->pid == pid)
115 /* Add process data for process PID. Returns newly allocated info
118 static struct aarch64_process_info *
119 aarch64_add_process (pid_t pid)
121 struct aarch64_process_info *proc;
123 proc = XCNEW (struct aarch64_process_info);
126 proc->next = aarch64_process_list;
127 aarch64_process_list = proc;
132 /* Get data specific info for process PID, creating it if necessary.
133 Never returns NULL. */
135 static struct aarch64_process_info *
136 aarch64_process_info_get (pid_t pid)
138 struct aarch64_process_info *proc;
140 proc = aarch64_find_process_pid (pid);
142 proc = aarch64_add_process (pid);
147 /* Called whenever GDB is no longer debugging process PID. It deletes
148 data structures that keep track of debug register state. */
151 aarch64_forget_process (pid_t pid)
153 struct aarch64_process_info *proc, **proc_link;
155 proc = aarch64_process_list;
156 proc_link = &aarch64_process_list;
160 if (proc->pid == pid)
162 *proc_link = proc->next;
168 proc_link = &proc->next;
173 /* Get debug registers state for process PID. */
175 struct aarch64_debug_reg_state *
176 aarch64_get_debug_reg_state (pid_t pid)
178 return &aarch64_process_info_get (pid)->state;
181 /* Fill GDB's register array with the general-purpose register values
182 from the current thread. */
185 fetch_gregs_from_thread (struct regcache *regcache)
188 struct gdbarch *gdbarch = regcache->arch ();
192 /* Make sure REGS can hold all registers contents on both aarch64
194 gdb_static_assert (sizeof (regs) >= 18 * 4);
196 tid = ptid_get_lwp (regcache_get_ptid (regcache));
198 iovec.iov_base = ®s;
199 if (gdbarch_bfd_arch_info (gdbarch)->bits_per_word == 32)
200 iovec.iov_len = 18 * 4;
202 iovec.iov_len = sizeof (regs);
204 ret = ptrace (PTRACE_GETREGSET, tid, NT_PRSTATUS, &iovec);
206 perror_with_name (_("Unable to fetch general registers."));
208 if (gdbarch_bfd_arch_info (gdbarch)->bits_per_word == 32)
209 aarch32_gp_regcache_supply (regcache, (uint32_t *) regs, 1);
214 for (regno = AARCH64_X0_REGNUM; regno <= AARCH64_CPSR_REGNUM; regno++)
215 regcache_raw_supply (regcache, regno, ®s[regno - AARCH64_X0_REGNUM]);
219 /* Store to the current thread the valid general-purpose register
220 values in the GDB's register array. */
223 store_gregs_to_thread (const struct regcache *regcache)
228 struct gdbarch *gdbarch = regcache->arch ();
230 /* Make sure REGS can hold all registers contents on both aarch64
232 gdb_static_assert (sizeof (regs) >= 18 * 4);
233 tid = ptid_get_lwp (regcache_get_ptid (regcache));
235 iovec.iov_base = ®s;
236 if (gdbarch_bfd_arch_info (gdbarch)->bits_per_word == 32)
237 iovec.iov_len = 18 * 4;
239 iovec.iov_len = sizeof (regs);
241 ret = ptrace (PTRACE_GETREGSET, tid, NT_PRSTATUS, &iovec);
243 perror_with_name (_("Unable to fetch general registers."));
245 if (gdbarch_bfd_arch_info (gdbarch)->bits_per_word == 32)
246 aarch32_gp_regcache_collect (regcache, (uint32_t *) regs, 1);
251 for (regno = AARCH64_X0_REGNUM; regno <= AARCH64_CPSR_REGNUM; regno++)
252 if (REG_VALID == regcache_register_status (regcache, regno))
253 regcache_raw_collect (regcache, regno,
254 ®s[regno - AARCH64_X0_REGNUM]);
257 ret = ptrace (PTRACE_SETREGSET, tid, NT_PRSTATUS, &iovec);
259 perror_with_name (_("Unable to store general registers."));
262 /* Fill GDB's register array with the fp/simd register values
263 from the current thread. */
266 fetch_fpregs_from_thread (struct regcache *regcache)
271 struct gdbarch *gdbarch = regcache->arch ();
273 /* Make sure REGS can hold all VFP registers contents on both aarch64
275 gdb_static_assert (sizeof regs >= VFP_REGS_SIZE);
277 tid = ptid_get_lwp (regcache_get_ptid (regcache));
279 iovec.iov_base = ®s;
281 if (gdbarch_bfd_arch_info (gdbarch)->bits_per_word == 32)
283 iovec.iov_len = VFP_REGS_SIZE;
285 ret = ptrace (PTRACE_GETREGSET, tid, NT_ARM_VFP, &iovec);
287 perror_with_name (_("Unable to fetch VFP registers."));
289 aarch32_vfp_regcache_supply (regcache, (gdb_byte *) ®s, 32);
295 iovec.iov_len = sizeof (regs);
297 ret = ptrace (PTRACE_GETREGSET, tid, NT_FPREGSET, &iovec);
299 perror_with_name (_("Unable to fetch vFP/SIMD registers."));
301 for (regno = AARCH64_V0_REGNUM; regno <= AARCH64_V31_REGNUM; regno++)
302 regcache_raw_supply (regcache, regno,
303 ®s.vregs[regno - AARCH64_V0_REGNUM]);
305 regcache_raw_supply (regcache, AARCH64_FPSR_REGNUM, ®s.fpsr);
306 regcache_raw_supply (regcache, AARCH64_FPCR_REGNUM, ®s.fpcr);
310 /* Store to the current thread the valid fp/simd register
311 values in the GDB's register array. */
314 store_fpregs_to_thread (const struct regcache *regcache)
319 struct gdbarch *gdbarch = regcache->arch ();
321 /* Make sure REGS can hold all VFP registers contents on both aarch64
323 gdb_static_assert (sizeof regs >= VFP_REGS_SIZE);
324 tid = ptid_get_lwp (regcache_get_ptid (regcache));
326 iovec.iov_base = ®s;
328 if (gdbarch_bfd_arch_info (gdbarch)->bits_per_word == 32)
330 iovec.iov_len = VFP_REGS_SIZE;
332 ret = ptrace (PTRACE_GETREGSET, tid, NT_ARM_VFP, &iovec);
334 perror_with_name (_("Unable to fetch VFP registers."));
336 aarch32_vfp_regcache_collect (regcache, (gdb_byte *) ®s, 32);
342 iovec.iov_len = sizeof (regs);
344 ret = ptrace (PTRACE_GETREGSET, tid, NT_FPREGSET, &iovec);
346 perror_with_name (_("Unable to fetch FP/SIMD registers."));
348 for (regno = AARCH64_V0_REGNUM; regno <= AARCH64_V31_REGNUM; regno++)
349 if (REG_VALID == regcache_register_status (regcache, regno))
350 regcache_raw_collect (regcache, regno,
351 (char *) ®s.vregs[regno - AARCH64_V0_REGNUM]);
353 if (REG_VALID == regcache_register_status (regcache, AARCH64_FPSR_REGNUM))
354 regcache_raw_collect (regcache, AARCH64_FPSR_REGNUM,
355 (char *) ®s.fpsr);
356 if (REG_VALID == regcache_register_status (regcache, AARCH64_FPCR_REGNUM))
357 regcache_raw_collect (regcache, AARCH64_FPCR_REGNUM,
358 (char *) ®s.fpcr);
361 if (gdbarch_bfd_arch_info (gdbarch)->bits_per_word == 32)
363 ret = ptrace (PTRACE_SETREGSET, tid, NT_ARM_VFP, &iovec);
365 perror_with_name (_("Unable to store VFP registers."));
369 ret = ptrace (PTRACE_SETREGSET, tid, NT_FPREGSET, &iovec);
371 perror_with_name (_("Unable to store FP/SIMD registers."));
375 /* Implement the "fetch_registers" target_ops method. */
378 aarch64_linux_nat_target::fetch_registers (struct regcache *regcache,
383 fetch_gregs_from_thread (regcache);
384 fetch_fpregs_from_thread (regcache);
386 else if (regno < AARCH64_V0_REGNUM)
387 fetch_gregs_from_thread (regcache);
389 fetch_fpregs_from_thread (regcache);
392 /* Implement the "store_registers" target_ops method. */
395 aarch64_linux_nat_target::store_registers (struct regcache *regcache,
400 store_gregs_to_thread (regcache);
401 store_fpregs_to_thread (regcache);
403 else if (regno < AARCH64_V0_REGNUM)
404 store_gregs_to_thread (regcache);
406 store_fpregs_to_thread (regcache);
409 /* Fill register REGNO (if it is a general-purpose register) in
410 *GREGSETPS with the value in GDB's register array. If REGNO is -1,
411 do this for all registers. */
414 fill_gregset (const struct regcache *regcache,
415 gdb_gregset_t *gregsetp, int regno)
417 regcache_collect_regset (&aarch64_linux_gregset, regcache,
418 regno, (gdb_byte *) gregsetp,
419 AARCH64_LINUX_SIZEOF_GREGSET);
422 /* Fill GDB's register array with the general-purpose register values
426 supply_gregset (struct regcache *regcache, const gdb_gregset_t *gregsetp)
428 regcache_supply_regset (&aarch64_linux_gregset, regcache, -1,
429 (const gdb_byte *) gregsetp,
430 AARCH64_LINUX_SIZEOF_GREGSET);
433 /* Fill register REGNO (if it is a floating-point register) in
434 *FPREGSETP with the value in GDB's register array. If REGNO is -1,
435 do this for all registers. */
438 fill_fpregset (const struct regcache *regcache,
439 gdb_fpregset_t *fpregsetp, int regno)
441 regcache_collect_regset (&aarch64_linux_fpregset, regcache,
442 regno, (gdb_byte *) fpregsetp,
443 AARCH64_LINUX_SIZEOF_FPREGSET);
446 /* Fill GDB's register array with the floating-point register values
450 supply_fpregset (struct regcache *regcache, const gdb_fpregset_t *fpregsetp)
452 regcache_supply_regset (&aarch64_linux_fpregset, regcache, -1,
453 (const gdb_byte *) fpregsetp,
454 AARCH64_LINUX_SIZEOF_FPREGSET);
457 /* linux_nat_new_fork hook. */
460 aarch64_linux_new_fork (struct lwp_info *parent, pid_t child_pid)
463 struct aarch64_debug_reg_state *parent_state;
464 struct aarch64_debug_reg_state *child_state;
466 /* NULL means no watchpoint has ever been set in the parent. In
467 that case, there's nothing to do. */
468 if (parent->arch_private == NULL)
471 /* GDB core assumes the child inherits the watchpoints/hw
472 breakpoints of the parent, and will remove them all from the
473 forked off process. Copy the debug registers mirrors into the
474 new process so that all breakpoints and watchpoints can be
477 parent_pid = ptid_get_pid (parent->ptid);
478 parent_state = aarch64_get_debug_reg_state (parent_pid);
479 child_state = aarch64_get_debug_reg_state (child_pid);
480 *child_state = *parent_state;
484 /* Called by libthread_db. Returns a pointer to the thread local
485 storage (or its descriptor). */
488 ps_get_thread_area (struct ps_prochandle *ph,
489 lwpid_t lwpid, int idx, void **base)
492 = (gdbarch_bfd_arch_info (target_gdbarch ())->bits_per_word == 64);
494 return aarch64_ps_get_thread_area (ph, lwpid, idx, base, is_64bit_p);
498 /* Implement the "post_startup_inferior" target_ops method. */
501 aarch64_linux_nat_target::post_startup_inferior (ptid_t ptid)
503 aarch64_forget_process (ptid_get_pid (ptid));
504 aarch64_linux_get_debug_reg_capacity (ptid_get_pid (ptid));
505 linux_nat_target::post_startup_inferior (ptid);
508 extern struct target_desc *tdesc_arm_with_neon;
510 /* Implement the "read_description" target_ops method. */
512 const struct target_desc *
513 aarch64_linux_nat_target::read_description ()
516 gdb_byte regbuf[VFP_REGS_SIZE];
519 tid = ptid_get_lwp (inferior_ptid);
521 iovec.iov_base = regbuf;
522 iovec.iov_len = VFP_REGS_SIZE;
524 ret = ptrace (PTRACE_GETREGSET, tid, NT_ARM_VFP, &iovec);
526 return tdesc_arm_with_neon;
528 return aarch64_read_description ();
531 /* Convert a native/host siginfo object, into/from the siginfo in the
532 layout of the inferiors' architecture. Returns true if any
533 conversion was done; false otherwise. If DIRECTION is 1, then copy
534 from INF to NATIVE. If DIRECTION is 0, copy from NATIVE to
538 aarch64_linux_siginfo_fixup (siginfo_t *native, gdb_byte *inf, int direction)
540 struct gdbarch *gdbarch = get_frame_arch (get_current_frame ());
542 /* Is the inferior 32-bit? If so, then do fixup the siginfo
544 if (gdbarch_bfd_arch_info (gdbarch)->bits_per_word == 32)
547 aarch64_compat_siginfo_from_siginfo ((struct compat_siginfo *) inf,
550 aarch64_siginfo_from_compat_siginfo (native,
551 (struct compat_siginfo *) inf);
559 /* Returns the number of hardware watchpoints of type TYPE that we can
560 set. Value is positive if we can set CNT watchpoints, zero if
561 setting watchpoints of type TYPE is not supported, and negative if
562 CNT is more than the maximum number of watchpoints of type TYPE
563 that we can support. TYPE is one of bp_hardware_watchpoint,
564 bp_read_watchpoint, bp_write_watchpoint, or bp_hardware_breakpoint.
565 CNT is the number of such watchpoints used so far (including this
566 one). OTHERTYPE is non-zero if other types of watchpoints are
567 currently enabled. */
570 aarch64_linux_nat_target::can_use_hw_breakpoint (enum bptype type,
571 int cnt, int othertype)
573 if (type == bp_hardware_watchpoint || type == bp_read_watchpoint
574 || type == bp_access_watchpoint || type == bp_watchpoint)
576 if (aarch64_num_wp_regs == 0)
579 else if (type == bp_hardware_breakpoint)
581 if (aarch64_num_bp_regs == 0)
585 gdb_assert_not_reached ("unexpected breakpoint type");
587 /* We always return 1 here because we don't have enough information
588 about possible overlap of addresses that they want to watch. As an
589 extreme example, consider the case where all the watchpoints watch
590 the same address and the same region length: then we can handle a
591 virtually unlimited number of watchpoints, due to debug register
592 sharing implemented via reference counts. */
596 /* Insert a hardware-assisted breakpoint at BP_TGT->reqstd_address.
597 Return 0 on success, -1 on failure. */
600 aarch64_linux_nat_target::insert_hw_breakpoint (struct gdbarch *gdbarch,
601 struct bp_target_info *bp_tgt)
604 CORE_ADDR addr = bp_tgt->placed_address = bp_tgt->reqstd_address;
606 const enum target_hw_bp_type type = hw_execute;
607 struct aarch64_debug_reg_state *state
608 = aarch64_get_debug_reg_state (ptid_get_pid (inferior_ptid));
610 gdbarch_breakpoint_from_pc (gdbarch, &addr, &len);
615 "insert_hw_breakpoint on entry (addr=0x%08lx, len=%d))\n",
616 (unsigned long) addr, len);
618 ret = aarch64_handle_breakpoint (type, addr, len, 1 /* is_insert */, state);
622 aarch64_show_debug_reg_state (state,
623 "insert_hw_breakpoint", addr, len, type);
629 /* Remove a hardware-assisted breakpoint at BP_TGT->placed_address.
630 Return 0 on success, -1 on failure. */
633 aarch64_linux_nat_target::remove_hw_breakpoint (struct gdbarch *gdbarch,
634 struct bp_target_info *bp_tgt)
637 CORE_ADDR addr = bp_tgt->placed_address;
639 const enum target_hw_bp_type type = hw_execute;
640 struct aarch64_debug_reg_state *state
641 = aarch64_get_debug_reg_state (ptid_get_pid (inferior_ptid));
643 gdbarch_breakpoint_from_pc (gdbarch, &addr, &len);
647 (gdb_stdlog, "remove_hw_breakpoint on entry (addr=0x%08lx, len=%d))\n",
648 (unsigned long) addr, len);
650 ret = aarch64_handle_breakpoint (type, addr, len, 0 /* is_insert */, state);
654 aarch64_show_debug_reg_state (state,
655 "remove_hw_watchpoint", addr, len, type);
661 /* Implement the "insert_watchpoint" target_ops method.
663 Insert a watchpoint to watch a memory region which starts at
664 address ADDR and whose length is LEN bytes. Watch memory accesses
665 of the type TYPE. Return 0 on success, -1 on failure. */
668 aarch64_linux_nat_target::insert_watchpoint (CORE_ADDR addr, int len,
669 enum target_hw_bp_type type,
670 struct expression *cond)
673 struct aarch64_debug_reg_state *state
674 = aarch64_get_debug_reg_state (ptid_get_pid (inferior_ptid));
677 fprintf_unfiltered (gdb_stdlog,
678 "insert_watchpoint on entry (addr=0x%08lx, len=%d)\n",
679 (unsigned long) addr, len);
681 gdb_assert (type != hw_execute);
683 ret = aarch64_handle_watchpoint (type, addr, len, 1 /* is_insert */, state);
687 aarch64_show_debug_reg_state (state,
688 "insert_watchpoint", addr, len, type);
694 /* Implement the "remove_watchpoint" target_ops method.
695 Remove a watchpoint that watched the memory region which starts at
696 address ADDR, whose length is LEN bytes, and for accesses of the
697 type TYPE. Return 0 on success, -1 on failure. */
700 aarch64_linux_nat_target::remove_watchpoint (CORE_ADDR addr, int len,
701 enum target_hw_bp_type type,
702 struct expression *cond)
705 struct aarch64_debug_reg_state *state
706 = aarch64_get_debug_reg_state (ptid_get_pid (inferior_ptid));
709 fprintf_unfiltered (gdb_stdlog,
710 "remove_watchpoint on entry (addr=0x%08lx, len=%d)\n",
711 (unsigned long) addr, len);
713 gdb_assert (type != hw_execute);
715 ret = aarch64_handle_watchpoint (type, addr, len, 0 /* is_insert */, state);
719 aarch64_show_debug_reg_state (state,
720 "remove_watchpoint", addr, len, type);
726 /* Implement the "region_ok_for_hw_watchpoint" target_ops method. */
729 aarch64_linux_nat_target::region_ok_for_hw_watchpoint (CORE_ADDR addr, int len)
731 return aarch64_linux_region_ok_for_watchpoint (addr, len);
734 /* Implement the "stopped_data_address" target_ops method. */
737 aarch64_linux_nat_target::stopped_data_address (CORE_ADDR *addr_p)
741 struct aarch64_debug_reg_state *state;
743 if (!linux_nat_get_siginfo (inferior_ptid, &siginfo))
746 /* This must be a hardware breakpoint. */
747 if (siginfo.si_signo != SIGTRAP
748 || (siginfo.si_code & 0xffff) != TRAP_HWBKPT)
751 /* Check if the address matches any watched address. */
752 state = aarch64_get_debug_reg_state (ptid_get_pid (inferior_ptid));
753 for (i = aarch64_num_wp_regs - 1; i >= 0; --i)
755 const unsigned int len = aarch64_watchpoint_length (state->dr_ctrl_wp[i]);
756 const CORE_ADDR addr_trap = (CORE_ADDR) siginfo.si_addr;
757 const CORE_ADDR addr_watch = state->dr_addr_wp[i];
759 if (state->dr_ref_count_wp[i]
760 && DR_CONTROL_ENABLED (state->dr_ctrl_wp[i])
761 && addr_trap >= addr_watch
762 && addr_trap < addr_watch + len)
772 /* Implement the "stopped_by_watchpoint" target_ops method. */
775 aarch64_linux_nat_target::stopped_by_watchpoint ()
779 return stopped_data_address (&addr);
782 /* Implement the "watchpoint_addr_within_range" target_ops method. */
785 aarch64_linux_nat_target::watchpoint_addr_within_range (CORE_ADDR addr,
786 CORE_ADDR start, int length)
788 return start <= addr && start + length - 1 >= addr;
791 /* Implement the "can_do_single_step" target_ops method. */
794 aarch64_linux_nat_target::can_do_single_step ()
799 /* Define AArch64 maintenance commands. */
802 add_show_debug_regs_command (void)
804 /* A maintenance command to enable printing the internal DRi mirror
806 add_setshow_boolean_cmd ("show-debug-regs", class_maintenance,
807 &show_debug_regs, _("\
808 Set whether to show variables that mirror the AArch64 debug registers."), _("\
809 Show whether to show variables that mirror the AArch64 debug registers."), _("\
810 Use \"on\" to enable, \"off\" to disable.\n\
811 If enabled, the debug registers values are shown when GDB inserts\n\
812 or removes a hardware breakpoint or watchpoint, and when the inferior\n\
813 triggers a breakpoint or watchpoint."),
816 &maintenance_set_cmdlist,
817 &maintenance_show_cmdlist);
821 _initialize_aarch64_linux_nat (void)
823 struct target_ops *t = &the_aarch64_linux_nat_target;
825 add_show_debug_regs_command ();
827 /* Register the target. */
828 linux_target = &the_aarch64_linux_nat_target;
830 linux_nat_set_new_thread (t, aarch64_linux_new_thread);
831 linux_nat_set_delete_thread (t, aarch64_linux_delete_thread);
832 linux_nat_set_new_fork (t, aarch64_linux_new_fork);
833 linux_nat_set_forget_process (t, aarch64_forget_process);
834 linux_nat_set_prepare_to_resume (t, aarch64_linux_prepare_to_resume);
836 /* Add our siginfo layout converter. */
837 linux_nat_set_siginfo_fixup (t, aarch64_linux_siginfo_fixup);