xref: /netbsd-src/external/gpl3/gdb/dist/gdbserver/linux-aarch64-low.cc (revision 2dd295436a0082eb4f8d294f4aa73c223413d0f2)
1 /* GNU/Linux/AArch64 specific low level interface, for the remote server for
2    GDB.
3 
4    Copyright (C) 2009-2023 Free Software Foundation, Inc.
5    Contributed by ARM Ltd.
6 
7    This file is part of GDB.
8 
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13 
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18 
19    You should have received a copy of the GNU General Public License
20    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
21 
22 #include "server.h"
23 #include "linux-low.h"
24 #include "nat/aarch64-linux.h"
25 #include "nat/aarch64-linux-hw-point.h"
26 #include "arch/aarch64-insn.h"
27 #include "linux-aarch32-low.h"
28 #include "elf/common.h"
29 #include "ax.h"
30 #include "tracepoint.h"
31 #include "debug.h"
32 
33 #include <signal.h>
34 #include <sys/user.h>
35 #include "nat/gdb_ptrace.h"
36 #include <asm/ptrace.h>
37 #include <inttypes.h>
38 #include <endian.h>
39 #include <sys/uio.h>
40 
41 #include "gdb_proc_service.h"
42 #include "arch/aarch64.h"
43 #include "arch/aarch64-mte-linux.h"
44 #include "linux-aarch32-tdesc.h"
45 #include "linux-aarch64-tdesc.h"
46 #include "nat/aarch64-mte-linux-ptrace.h"
47 #include "nat/aarch64-sve-linux-ptrace.h"
48 #include "tdesc.h"
49 
50 #ifdef HAVE_SYS_REG_H
51 #include <sys/reg.h>
52 #endif
53 
54 #ifdef HAVE_GETAUXVAL
55 #include <sys/auxv.h>
56 #endif
57 
58 /* Linux target op definitions for the AArch64 architecture.  */
59 
60 class aarch64_target : public linux_process_target
61 {
62 public:
63 
64   const regs_info *get_regs_info () override;
65 
66   int breakpoint_kind_from_pc (CORE_ADDR *pcptr) override;
67 
68   int breakpoint_kind_from_current_state (CORE_ADDR *pcptr) override;
69 
70   const gdb_byte *sw_breakpoint_from_kind (int kind, int *size) override;
71 
72   bool supports_z_point_type (char z_type) override;
73 
74   bool supports_tracepoints () override;
75 
76   bool supports_fast_tracepoints () override;
77 
78   int install_fast_tracepoint_jump_pad
79     (CORE_ADDR tpoint, CORE_ADDR tpaddr, CORE_ADDR collector,
80      CORE_ADDR lockaddr, ULONGEST orig_size, CORE_ADDR *jump_entry,
81      CORE_ADDR *trampoline, ULONGEST *trampoline_size,
82      unsigned char *jjump_pad_insn, ULONGEST *jjump_pad_insn_size,
83      CORE_ADDR *adjusted_insn_addr, CORE_ADDR *adjusted_insn_addr_end,
84      char *err) override;
85 
86   int get_min_fast_tracepoint_insn_len () override;
87 
88   struct emit_ops *emit_ops () override;
89 
90   bool supports_memory_tagging () override;
91 
92   bool fetch_memtags (CORE_ADDR address, size_t len,
93 		      gdb::byte_vector &tags, int type) override;
94 
95   bool store_memtags (CORE_ADDR address, size_t len,
96 		      const gdb::byte_vector &tags, int type) override;
97 
98 protected:
99 
100   void low_arch_setup () override;
101 
102   bool low_cannot_fetch_register (int regno) override;
103 
104   bool low_cannot_store_register (int regno) override;
105 
106   bool low_supports_breakpoints () override;
107 
108   CORE_ADDR low_get_pc (regcache *regcache) override;
109 
110   void low_set_pc (regcache *regcache, CORE_ADDR newpc) override;
111 
112   bool low_breakpoint_at (CORE_ADDR pc) override;
113 
114   int low_insert_point (raw_bkpt_type type, CORE_ADDR addr,
115 			int size, raw_breakpoint *bp) override;
116 
117   int low_remove_point (raw_bkpt_type type, CORE_ADDR addr,
118 			int size, raw_breakpoint *bp) override;
119 
120   bool low_stopped_by_watchpoint () override;
121 
122   CORE_ADDR low_stopped_data_address () override;
123 
124   bool low_siginfo_fixup (siginfo_t *native, gdb_byte *inf,
125 			  int direction) override;
126 
127   arch_process_info *low_new_process () override;
128 
129   void low_delete_process (arch_process_info *info) override;
130 
131   void low_new_thread (lwp_info *) override;
132 
133   void low_delete_thread (arch_lwp_info *) override;
134 
135   void low_new_fork (process_info *parent, process_info *child) override;
136 
137   void low_prepare_to_resume (lwp_info *lwp) override;
138 
139   int low_get_thread_area (int lwpid, CORE_ADDR *addrp) override;
140 
141   bool low_supports_range_stepping () override;
142 
143   bool low_supports_catch_syscall () override;
144 
145   void low_get_syscall_trapinfo (regcache *regcache, int *sysno) override;
146 };
147 
148 /* The singleton target ops object.  */
149 
150 static aarch64_target the_aarch64_target;
151 
152 bool
153 aarch64_target::low_cannot_fetch_register (int regno)
154 {
155   gdb_assert_not_reached ("linux target op low_cannot_fetch_register "
156 			  "is not implemented by the target");
157 }
158 
159 bool
160 aarch64_target::low_cannot_store_register (int regno)
161 {
162   gdb_assert_not_reached ("linux target op low_cannot_store_register "
163 			  "is not implemented by the target");
164 }
165 
166 void
167 aarch64_target::low_prepare_to_resume (lwp_info *lwp)
168 {
169   aarch64_linux_prepare_to_resume (lwp);
170 }
171 
172 /* Per-process arch-specific data we want to keep.  */
173 
174 struct arch_process_info
175 {
176   /* Hardware breakpoint/watchpoint data.
177      The reason for them to be per-process rather than per-thread is
178      due to the lack of information in the gdbserver environment;
179      gdbserver is not told that whether a requested hardware
180      breakpoint/watchpoint is thread specific or not, so it has to set
181      each hw bp/wp for every thread in the current process.  The
182      higher level bp/wp management in gdb will resume a thread if a hw
183      bp/wp trap is not expected for it.  Since the hw bp/wp setting is
184      same for each thread, it is reasonable for the data to live here.
185      */
186   struct aarch64_debug_reg_state debug_reg_state;
187 };
188 
189 /* Return true if the size of register 0 is 8 byte.  */
190 
191 static int
192 is_64bit_tdesc (void)
193 {
194   /* We may not have a current thread at this point, so go straight to
195      the process's target description.  */
196   return register_size (current_process ()->tdesc, 0) == 8;
197 }
198 
199 static void
200 aarch64_fill_gregset (struct regcache *regcache, void *buf)
201 {
202   struct user_pt_regs *regset = (struct user_pt_regs *) buf;
203   int i;
204 
205   for (i = 0; i < AARCH64_X_REGS_NUM; i++)
206     collect_register (regcache, AARCH64_X0_REGNUM + i, &regset->regs[i]);
207   collect_register (regcache, AARCH64_SP_REGNUM, &regset->sp);
208   collect_register (regcache, AARCH64_PC_REGNUM, &regset->pc);
209   collect_register (regcache, AARCH64_CPSR_REGNUM, &regset->pstate);
210 }
211 
212 static void
213 aarch64_store_gregset (struct regcache *regcache, const void *buf)
214 {
215   const struct user_pt_regs *regset = (const struct user_pt_regs *) buf;
216   int i;
217 
218   for (i = 0; i < AARCH64_X_REGS_NUM; i++)
219     supply_register (regcache, AARCH64_X0_REGNUM + i, &regset->regs[i]);
220   supply_register (regcache, AARCH64_SP_REGNUM, &regset->sp);
221   supply_register (regcache, AARCH64_PC_REGNUM, &regset->pc);
222   supply_register (regcache, AARCH64_CPSR_REGNUM, &regset->pstate);
223 }
224 
225 static void
226 aarch64_fill_fpregset (struct regcache *regcache, void *buf)
227 {
228   struct user_fpsimd_state *regset = (struct user_fpsimd_state *) buf;
229   int i;
230 
231   for (i = 0; i < AARCH64_V_REGS_NUM; i++)
232     collect_register (regcache, AARCH64_V0_REGNUM + i, &regset->vregs[i]);
233   collect_register (regcache, AARCH64_FPSR_REGNUM, &regset->fpsr);
234   collect_register (regcache, AARCH64_FPCR_REGNUM, &regset->fpcr);
235 }
236 
237 static void
238 aarch64_store_fpregset (struct regcache *regcache, const void *buf)
239 {
240   const struct user_fpsimd_state *regset
241     = (const struct user_fpsimd_state *) buf;
242   int i;
243 
244   for (i = 0; i < AARCH64_V_REGS_NUM; i++)
245     supply_register (regcache, AARCH64_V0_REGNUM + i, &regset->vregs[i]);
246   supply_register (regcache, AARCH64_FPSR_REGNUM, &regset->fpsr);
247   supply_register (regcache, AARCH64_FPCR_REGNUM, &regset->fpcr);
248 }
249 
250 /* Store the pauth registers to regcache.  */
251 
252 static void
253 aarch64_store_pauthregset (struct regcache *regcache, const void *buf)
254 {
255   uint64_t *pauth_regset = (uint64_t *) buf;
256   int pauth_base = find_regno (regcache->tdesc, "pauth_dmask");
257 
258   if (pauth_base == 0)
259     return;
260 
261   supply_register (regcache, AARCH64_PAUTH_DMASK_REGNUM (pauth_base),
262 		   &pauth_regset[0]);
263   supply_register (regcache, AARCH64_PAUTH_CMASK_REGNUM (pauth_base),
264 		   &pauth_regset[1]);
265 }
266 
267 /* Fill BUF with the MTE registers from the regcache.  */
268 
269 static void
270 aarch64_fill_mteregset (struct regcache *regcache, void *buf)
271 {
272   uint64_t *mte_regset = (uint64_t *) buf;
273   int mte_base = find_regno (regcache->tdesc, "tag_ctl");
274 
275   collect_register (regcache, mte_base, mte_regset);
276 }
277 
278 /* Store the MTE registers to regcache.  */
279 
280 static void
281 aarch64_store_mteregset (struct regcache *regcache, const void *buf)
282 {
283   uint64_t *mte_regset = (uint64_t *) buf;
284   int mte_base = find_regno (regcache->tdesc, "tag_ctl");
285 
286   /* Tag Control register */
287   supply_register (regcache, mte_base, mte_regset);
288 }
289 
290 /* Fill BUF with TLS register from the regcache.  */
291 
292 static void
293 aarch64_fill_tlsregset (struct regcache *regcache, void *buf)
294 {
295   gdb_byte *tls_buf = (gdb_byte *) buf;
296   int tls_regnum  = find_regno (regcache->tdesc, "tpidr");
297 
298   collect_register (regcache, tls_regnum, tls_buf);
299 
300   /* Read TPIDR2, if it exists.  */
301   gdb::optional<int> regnum = find_regno_no_throw (regcache->tdesc, "tpidr2");
302 
303   if (regnum.has_value ())
304     collect_register (regcache, *regnum, tls_buf + sizeof (uint64_t));
305 }
306 
307 /* Store TLS register to regcache.  */
308 
309 static void
310 aarch64_store_tlsregset (struct regcache *regcache, const void *buf)
311 {
312   gdb_byte *tls_buf = (gdb_byte *) buf;
313   int tls_regnum  = find_regno (regcache->tdesc, "tpidr");
314 
315   supply_register (regcache, tls_regnum, tls_buf);
316 
317   /* Write TPIDR2, if it exists.  */
318   gdb::optional<int> regnum = find_regno_no_throw (regcache->tdesc, "tpidr2");
319 
320   if (regnum.has_value ())
321     supply_register (regcache, *regnum, tls_buf + sizeof (uint64_t));
322 }
323 
324 bool
325 aarch64_target::low_supports_breakpoints ()
326 {
327   return true;
328 }
329 
330 /* Implementation of linux target ops method "low_get_pc".  */
331 
332 CORE_ADDR
333 aarch64_target::low_get_pc (regcache *regcache)
334 {
335   if (register_size (regcache->tdesc, 0) == 8)
336     return linux_get_pc_64bit (regcache);
337   else
338     return linux_get_pc_32bit (regcache);
339 }
340 
341 /* Implementation of linux target ops method "low_set_pc".  */
342 
343 void
344 aarch64_target::low_set_pc (regcache *regcache, CORE_ADDR pc)
345 {
346   if (register_size (regcache->tdesc, 0) == 8)
347     linux_set_pc_64bit (regcache, pc);
348   else
349     linux_set_pc_32bit (regcache, pc);
350 }
351 
352 #define aarch64_breakpoint_len 4
353 
354 /* AArch64 BRK software debug mode instruction.
355    This instruction needs to match gdb/aarch64-tdep.c
356    (aarch64_default_breakpoint).  */
357 static const gdb_byte aarch64_breakpoint[] = {0x00, 0x00, 0x20, 0xd4};
358 
359 /* Implementation of linux target ops method "low_breakpoint_at".  */
360 
361 bool
362 aarch64_target::low_breakpoint_at (CORE_ADDR where)
363 {
364   if (is_64bit_tdesc ())
365     {
366       gdb_byte insn[aarch64_breakpoint_len];
367 
368       read_memory (where, (unsigned char *) &insn, aarch64_breakpoint_len);
369       if (memcmp (insn, aarch64_breakpoint, aarch64_breakpoint_len) == 0)
370 	return true;
371 
372       return false;
373     }
374   else
375     return arm_breakpoint_at (where);
376 }
377 
378 static void
379 aarch64_init_debug_reg_state (struct aarch64_debug_reg_state *state)
380 {
381   int i;
382 
383   for (i = 0; i < AARCH64_HBP_MAX_NUM; ++i)
384     {
385       state->dr_addr_bp[i] = 0;
386       state->dr_ctrl_bp[i] = 0;
387       state->dr_ref_count_bp[i] = 0;
388     }
389 
390   for (i = 0; i < AARCH64_HWP_MAX_NUM; ++i)
391     {
392       state->dr_addr_wp[i] = 0;
393       state->dr_ctrl_wp[i] = 0;
394       state->dr_ref_count_wp[i] = 0;
395     }
396 }
397 
398 /* Return the pointer to the debug register state structure in the
399    current process' arch-specific data area.  */
400 
401 struct aarch64_debug_reg_state *
402 aarch64_get_debug_reg_state (pid_t pid)
403 {
404   struct process_info *proc = find_process_pid (pid);
405 
406   return &proc->priv->arch_private->debug_reg_state;
407 }
408 
409 /* Implementation of target ops method "supports_z_point_type".  */
410 
411 bool
412 aarch64_target::supports_z_point_type (char z_type)
413 {
414   switch (z_type)
415     {
416     case Z_PACKET_SW_BP:
417     case Z_PACKET_HW_BP:
418     case Z_PACKET_WRITE_WP:
419     case Z_PACKET_READ_WP:
420     case Z_PACKET_ACCESS_WP:
421       return true;
422     default:
423       return false;
424     }
425 }
426 
427 /* Implementation of linux target ops method "low_insert_point".
428 
429    It actually only records the info of the to-be-inserted bp/wp;
430    the actual insertion will happen when threads are resumed.  */
431 
432 int
433 aarch64_target::low_insert_point (raw_bkpt_type type, CORE_ADDR addr,
434 				  int len, raw_breakpoint *bp)
435 {
436   int ret;
437   enum target_hw_bp_type targ_type;
438   struct aarch64_debug_reg_state *state
439     = aarch64_get_debug_reg_state (pid_of (current_thread));
440 
441   if (show_debug_regs)
442     fprintf (stderr, "insert_point on entry (addr=0x%08lx, len=%d)\n",
443 	     (unsigned long) addr, len);
444 
445   /* Determine the type from the raw breakpoint type.  */
446   targ_type = raw_bkpt_type_to_target_hw_bp_type (type);
447 
448   if (targ_type != hw_execute)
449     {
450       if (aarch64_region_ok_for_watchpoint (addr, len))
451 	ret = aarch64_handle_watchpoint (targ_type, addr, len,
452 					 1 /* is_insert */,
453 					 current_lwp_ptid (), state);
454       else
455 	ret = -1;
456     }
457   else
458     {
459       if (len == 3)
460 	{
461 	  /* LEN is 3 means the breakpoint is set on a 32-bit thumb
462 	     instruction.   Set it to 2 to correctly encode length bit
463 	     mask in hardware/watchpoint control register.  */
464 	  len = 2;
465 	}
466       ret = aarch64_handle_breakpoint (targ_type, addr, len,
467 				       1 /* is_insert */, current_lwp_ptid (),
468 				       state);
469     }
470 
471   if (show_debug_regs)
472     aarch64_show_debug_reg_state (state, "insert_point", addr, len,
473 				  targ_type);
474 
475   return ret;
476 }
477 
478 /* Implementation of linux target ops method "low_remove_point".
479 
480    It actually only records the info of the to-be-removed bp/wp,
481    the actual removal will be done when threads are resumed.  */
482 
483 int
484 aarch64_target::low_remove_point (raw_bkpt_type type, CORE_ADDR addr,
485 				  int len, raw_breakpoint *bp)
486 {
487   int ret;
488   enum target_hw_bp_type targ_type;
489   struct aarch64_debug_reg_state *state
490     = aarch64_get_debug_reg_state (pid_of (current_thread));
491 
492   if (show_debug_regs)
493     fprintf (stderr, "remove_point on entry (addr=0x%08lx, len=%d)\n",
494 	     (unsigned long) addr, len);
495 
496   /* Determine the type from the raw breakpoint type.  */
497   targ_type = raw_bkpt_type_to_target_hw_bp_type (type);
498 
499   /* Set up state pointers.  */
500   if (targ_type != hw_execute)
501     ret =
502       aarch64_handle_watchpoint (targ_type, addr, len, 0 /* is_insert */,
503 				 current_lwp_ptid (), state);
504   else
505     {
506       if (len == 3)
507 	{
508 	  /* LEN is 3 means the breakpoint is set on a 32-bit thumb
509 	     instruction.   Set it to 2 to correctly encode length bit
510 	     mask in hardware/watchpoint control register.  */
511 	  len = 2;
512 	}
513       ret = aarch64_handle_breakpoint (targ_type, addr, len,
514 				       0 /* is_insert */,  current_lwp_ptid (),
515 				       state);
516     }
517 
518   if (show_debug_regs)
519     aarch64_show_debug_reg_state (state, "remove_point", addr, len,
520 				  targ_type);
521 
522   return ret;
523 }
524 
525 static CORE_ADDR
526 aarch64_remove_non_address_bits (CORE_ADDR pointer)
527 {
528   /* By default, we assume TBI and discard the top 8 bits plus the
529      VA range select bit (55).  */
530   CORE_ADDR mask = AARCH64_TOP_BITS_MASK;
531 
532   /* Check if PAC is available for this target.  */
533   if (tdesc_contains_feature (current_process ()->tdesc,
534 			      "org.gnu.gdb.aarch64.pauth"))
535     {
536       /* Fetch the PAC masks.  These masks are per-process, so we can just
537 	 fetch data from whatever thread we have at the moment.
538 
539 	 Also, we have both a code mask and a data mask.  For now they are the
540 	 same, but this may change in the future.  */
541 
542       struct regcache *regs = get_thread_regcache (current_thread, 1);
543       CORE_ADDR dmask = regcache_raw_get_unsigned_by_name (regs, "pauth_dmask");
544       CORE_ADDR cmask = regcache_raw_get_unsigned_by_name (regs, "pauth_cmask");
545       mask |= aarch64_mask_from_pac_registers (cmask, dmask);
546     }
547 
548   return aarch64_remove_top_bits (pointer, mask);
549 }
550 
551 /* Implementation of linux target ops method "low_stopped_data_address".  */
552 
553 CORE_ADDR
554 aarch64_target::low_stopped_data_address ()
555 {
556   siginfo_t siginfo;
557   int pid, i;
558   struct aarch64_debug_reg_state *state;
559 
560   pid = lwpid_of (current_thread);
561 
562   /* Get the siginfo.  */
563   if (ptrace (PTRACE_GETSIGINFO, pid, NULL, &siginfo) != 0)
564     return (CORE_ADDR) 0;
565 
566   /* Need to be a hardware breakpoint/watchpoint trap.  */
567   if (siginfo.si_signo != SIGTRAP
568       || (siginfo.si_code & 0xffff) != 0x0004 /* TRAP_HWBKPT */)
569     return (CORE_ADDR) 0;
570 
571   /* Make sure to ignore the top byte, otherwise we may not recognize a
572      hardware watchpoint hit.  The stopped data addresses coming from the
573      kernel can potentially be tagged addresses.  */
574   const CORE_ADDR addr_trap
575     = aarch64_remove_non_address_bits ((CORE_ADDR) siginfo.si_addr);
576 
577   /* Check if the address matches any watched address.  */
578   state = aarch64_get_debug_reg_state (pid_of (current_thread));
579   for (i = aarch64_num_wp_regs - 1; i >= 0; --i)
580     {
581       const unsigned int offset
582 	= aarch64_watchpoint_offset (state->dr_ctrl_wp[i]);
583       const unsigned int len = aarch64_watchpoint_length (state->dr_ctrl_wp[i]);
584       const CORE_ADDR addr_watch = state->dr_addr_wp[i] + offset;
585       const CORE_ADDR addr_watch_aligned = align_down (state->dr_addr_wp[i], 8);
586       const CORE_ADDR addr_orig = state->dr_addr_orig_wp[i];
587 
588       if (state->dr_ref_count_wp[i]
589 	  && DR_CONTROL_ENABLED (state->dr_ctrl_wp[i])
590 	  && addr_trap >= addr_watch_aligned
591 	  && addr_trap < addr_watch + len)
592 	{
593 	  /* ADDR_TRAP reports the first address of the memory range
594 	     accessed by the CPU, regardless of what was the memory
595 	     range watched.  Thus, a large CPU access that straddles
596 	     the ADDR_WATCH..ADDR_WATCH+LEN range may result in an
597 	     ADDR_TRAP that is lower than the
598 	     ADDR_WATCH..ADDR_WATCH+LEN range.  E.g.:
599 
600 	     addr: |   4   |   5   |   6   |   7   |   8   |
601 				   |---- range watched ----|
602 		   |----------- range accessed ------------|
603 
604 	     In this case, ADDR_TRAP will be 4.
605 
606 	     To match a watchpoint known to GDB core, we must never
607 	     report *ADDR_P outside of any ADDR_WATCH..ADDR_WATCH+LEN
608 	     range.  ADDR_WATCH <= ADDR_TRAP < ADDR_ORIG is a false
609 	     positive on kernels older than 4.10.  See PR
610 	     external/20207.  */
611 	  return addr_orig;
612 	}
613     }
614 
615   return (CORE_ADDR) 0;
616 }
617 
618 /* Implementation of linux target ops method "low_stopped_by_watchpoint".  */
619 
620 bool
621 aarch64_target::low_stopped_by_watchpoint ()
622 {
623   return (low_stopped_data_address () != 0);
624 }
625 
626 /* Fetch the thread-local storage pointer for libthread_db.  */
627 
628 ps_err_e
629 ps_get_thread_area (struct ps_prochandle *ph,
630 		    lwpid_t lwpid, int idx, void **base)
631 {
632   return aarch64_ps_get_thread_area (ph, lwpid, idx, base,
633 				     is_64bit_tdesc ());
634 }
635 
636 /* Implementation of linux target ops method "low_siginfo_fixup".  */
637 
638 bool
639 aarch64_target::low_siginfo_fixup (siginfo_t *native, gdb_byte *inf,
640 				   int direction)
641 {
642   /* Is the inferior 32-bit?  If so, then fixup the siginfo object.  */
643   if (!is_64bit_tdesc ())
644     {
645       if (direction == 0)
646 	aarch64_compat_siginfo_from_siginfo ((struct compat_siginfo *) inf,
647 					     native);
648       else
649 	aarch64_siginfo_from_compat_siginfo (native,
650 					     (struct compat_siginfo *) inf);
651 
652       return true;
653     }
654 
655   return false;
656 }
657 
658 /* Implementation of linux target ops method "low_new_process".  */
659 
660 arch_process_info *
661 aarch64_target::low_new_process ()
662 {
663   struct arch_process_info *info = XCNEW (struct arch_process_info);
664 
665   aarch64_init_debug_reg_state (&info->debug_reg_state);
666 
667   return info;
668 }
669 
670 /* Implementation of linux target ops method "low_delete_process".  */
671 
672 void
673 aarch64_target::low_delete_process (arch_process_info *info)
674 {
675   xfree (info);
676 }
677 
678 void
679 aarch64_target::low_new_thread (lwp_info *lwp)
680 {
681   aarch64_linux_new_thread (lwp);
682 }
683 
684 void
685 aarch64_target::low_delete_thread (arch_lwp_info *arch_lwp)
686 {
687   aarch64_linux_delete_thread (arch_lwp);
688 }
689 
690 /* Implementation of linux target ops method "low_new_fork".  */
691 
692 void
693 aarch64_target::low_new_fork (process_info *parent,
694 			      process_info *child)
695 {
696   /* These are allocated by linux_add_process.  */
697   gdb_assert (parent->priv != NULL
698 	      && parent->priv->arch_private != NULL);
699   gdb_assert (child->priv != NULL
700 	      && child->priv->arch_private != NULL);
701 
702   /* Linux kernel before 2.6.33 commit
703      72f674d203cd230426437cdcf7dd6f681dad8b0d
704      will inherit hardware debug registers from parent
705      on fork/vfork/clone.  Newer Linux kernels create such tasks with
706      zeroed debug registers.
707 
708      GDB core assumes the child inherits the watchpoints/hw
709      breakpoints of the parent, and will remove them all from the
710      forked off process.  Copy the debug registers mirrors into the
711      new process so that all breakpoints and watchpoints can be
712      removed together.  The debug registers mirror will become zeroed
713      in the end before detaching the forked off process, thus making
714      this compatible with older Linux kernels too.  */
715 
716   *child->priv->arch_private = *parent->priv->arch_private;
717 }
718 
719 /* Wrapper for aarch64_sve_regs_copy_to_reg_buf.  */
720 
721 static void
722 aarch64_sve_regs_copy_to_regcache (struct regcache *regcache, const void *buf)
723 {
724   return aarch64_sve_regs_copy_to_reg_buf (regcache, buf);
725 }
726 
727 /* Wrapper for aarch64_sve_regs_copy_from_reg_buf.  */
728 
729 static void
730 aarch64_sve_regs_copy_from_regcache (struct regcache *regcache, void *buf)
731 {
732   return aarch64_sve_regs_copy_from_reg_buf (regcache, buf);
733 }
734 
735 /* Array containing all the possible register sets for AArch64/Linux.  During
736    architecture setup, these will be checked against the HWCAP/HWCAP2 bits for
737    validity and enabled/disabled accordingly.
738 
739    Their sizes are set to 0 here, but they will be adjusted later depending
740    on whether each register set is available or not.  */
741 static struct regset_info aarch64_regsets[] =
742 {
743   /* GPR registers.  */
744   { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PRSTATUS,
745     0, GENERAL_REGS,
746     aarch64_fill_gregset, aarch64_store_gregset },
747   /* Floating Point (FPU) registers.  */
748   { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_FPREGSET,
749     0, FP_REGS,
750     aarch64_fill_fpregset, aarch64_store_fpregset
751   },
752   /* Scalable Vector Extension (SVE) registers.  */
753   { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_ARM_SVE,
754     0, EXTENDED_REGS,
755     aarch64_sve_regs_copy_from_regcache, aarch64_sve_regs_copy_to_regcache
756   },
757   /* PAC registers.  */
758   { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_ARM_PAC_MASK,
759     0, OPTIONAL_REGS,
760     nullptr, aarch64_store_pauthregset },
761   /* Tagged address control / MTE registers.  */
762   { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_ARM_TAGGED_ADDR_CTRL,
763     0, OPTIONAL_REGS,
764     aarch64_fill_mteregset, aarch64_store_mteregset },
765   /* TLS register.  */
766   { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_ARM_TLS,
767     0, OPTIONAL_REGS,
768     aarch64_fill_tlsregset, aarch64_store_tlsregset },
769   NULL_REGSET
770 };
771 
772 static struct regsets_info aarch64_regsets_info =
773   {
774     aarch64_regsets, /* regsets */
775     0, /* num_regsets */
776     nullptr, /* disabled_regsets */
777   };
778 
779 static struct regs_info regs_info_aarch64 =
780   {
781     nullptr, /* regset_bitmap */
782     nullptr, /* usrregs */
783     &aarch64_regsets_info,
784   };
785 
786 /* Given FEATURES, adjust the available register sets by setting their
787    sizes.  A size of 0 means the register set is disabled and won't be
788    used.  */
789 
790 static void
791 aarch64_adjust_register_sets (const struct aarch64_features &features)
792 {
793   struct regset_info *regset;
794 
795   for (regset = aarch64_regsets; regset->size >= 0; regset++)
796     {
797       switch (regset->nt_type)
798 	{
799 	case NT_PRSTATUS:
800 	  /* General purpose registers are always present.  */
801 	  regset->size = sizeof (struct user_pt_regs);
802 	  break;
803 	case NT_FPREGSET:
804 	  /* This is unavailable when SVE is present.  */
805 	  if (features.vq == 0)
806 	    regset->size = sizeof (struct user_fpsimd_state);
807 	  break;
808 	case NT_ARM_SVE:
809 	  if (features.vq > 0)
810 	    regset->size = SVE_PT_SIZE (AARCH64_MAX_SVE_VQ, SVE_PT_REGS_SVE);
811 	  break;
812 	case NT_ARM_PAC_MASK:
813 	  if (features.pauth)
814 	    regset->size = AARCH64_PAUTH_REGS_SIZE;
815 	  break;
816 	case NT_ARM_TAGGED_ADDR_CTRL:
817 	  if (features.mte)
818 	    regset->size = AARCH64_LINUX_SIZEOF_MTE;
819 	  break;
820 	case NT_ARM_TLS:
821 	  if (features.tls > 0)
822 	    regset->size = AARCH64_TLS_REGISTER_SIZE * features.tls;
823 	  break;
824 	default:
825 	  gdb_assert_not_reached ("Unknown register set found.");
826 	}
827     }
828 }
829 
830 /* Matches HWCAP_PACA in kernel header arch/arm64/include/uapi/asm/hwcap.h.  */
831 #define AARCH64_HWCAP_PACA (1 << 30)
832 
833 /* Implementation of linux target ops method "low_arch_setup".  */
834 
835 void
836 aarch64_target::low_arch_setup ()
837 {
838   unsigned int machine;
839   int is_elf64;
840   int tid;
841 
842   tid = lwpid_of (current_thread);
843 
844   is_elf64 = linux_pid_exe_is_elf_64_file (tid, &machine);
845 
846   if (is_elf64)
847     {
848       struct aarch64_features features;
849 
850       features.vq = aarch64_sve_get_vq (tid);
851       /* A-profile PAC is 64-bit only.  */
852       features.pauth = linux_get_hwcap (8) & AARCH64_HWCAP_PACA;
853       /* A-profile MTE is 64-bit only.  */
854       features.mte = linux_get_hwcap2 (8) & HWCAP2_MTE;
855       features.tls = aarch64_tls_register_count (tid);
856 
857       current_process ()->tdesc = aarch64_linux_read_description (features);
858 
859       /* Adjust the register sets we should use for this particular set of
860 	 features.  */
861       aarch64_adjust_register_sets (features);
862     }
863   else
864     current_process ()->tdesc = aarch32_linux_read_description ();
865 
866   aarch64_linux_get_debug_reg_capacity (lwpid_of (current_thread));
867 }
868 
869 /* Implementation of linux target ops method "get_regs_info".  */
870 
871 const regs_info *
872 aarch64_target::get_regs_info ()
873 {
874   if (!is_64bit_tdesc ())
875     return &regs_info_aarch32;
876 
877   /* AArch64 64-bit registers.  */
878   return &regs_info_aarch64;
879 }
880 
881 /* Implementation of target ops method "supports_tracepoints".  */
882 
883 bool
884 aarch64_target::supports_tracepoints ()
885 {
886   if (current_thread == NULL)
887     return true;
888   else
889     {
890       /* We don't support tracepoints on aarch32 now.  */
891       return is_64bit_tdesc ();
892     }
893 }
894 
895 /* Implementation of linux target ops method "low_get_thread_area".  */
896 
897 int
898 aarch64_target::low_get_thread_area (int lwpid, CORE_ADDR *addrp)
899 {
900   struct iovec iovec;
901   uint64_t reg;
902 
903   iovec.iov_base = &reg;
904   iovec.iov_len = sizeof (reg);
905 
906   if (ptrace (PTRACE_GETREGSET, lwpid, NT_ARM_TLS, &iovec) != 0)
907     return -1;
908 
909   *addrp = reg;
910 
911   return 0;
912 }
913 
914 bool
915 aarch64_target::low_supports_catch_syscall ()
916 {
917   return true;
918 }
919 
920 /* Implementation of linux target ops method "low_get_syscall_trapinfo".  */
921 
922 void
923 aarch64_target::low_get_syscall_trapinfo (regcache *regcache, int *sysno)
924 {
925   int use_64bit = register_size (regcache->tdesc, 0) == 8;
926 
927   if (use_64bit)
928     {
929       long l_sysno;
930 
931       collect_register_by_name (regcache, "x8", &l_sysno);
932       *sysno = (int) l_sysno;
933     }
934   else
935     collect_register_by_name (regcache, "r7", sysno);
936 }
937 
938 /* List of condition codes that we need.  */
939 
940 enum aarch64_condition_codes
941 {
942   EQ = 0x0,
943   NE = 0x1,
944   LO = 0x3,
945   GE = 0xa,
946   LT = 0xb,
947   GT = 0xc,
948   LE = 0xd,
949 };
950 
951 enum aarch64_operand_type
952 {
953   OPERAND_IMMEDIATE,
954   OPERAND_REGISTER,
955 };
956 
957 /* Representation of an operand.  At this time, it only supports register
958    and immediate types.  */
959 
960 struct aarch64_operand
961 {
962   /* Type of the operand.  */
963   enum aarch64_operand_type type;
964 
965   /* Value of the operand according to the type.  */
966   union
967     {
968       uint32_t imm;
969       struct aarch64_register reg;
970     };
971 };
972 
973 /* List of registers that we are currently using, we can add more here as
974    we need to use them.  */
975 
976 /* General purpose scratch registers (64 bit).  */
977 static const struct aarch64_register x0 = { 0, 1 };
978 static const struct aarch64_register x1 = { 1, 1 };
979 static const struct aarch64_register x2 = { 2, 1 };
980 static const struct aarch64_register x3 = { 3, 1 };
981 static const struct aarch64_register x4 = { 4, 1 };
982 
983 /* General purpose scratch registers (32 bit).  */
984 static const struct aarch64_register w0 = { 0, 0 };
985 static const struct aarch64_register w2 = { 2, 0 };
986 
987 /* Intra-procedure scratch registers.  */
988 static const struct aarch64_register ip0 = { 16, 1 };
989 
990 /* Special purpose registers.  */
991 static const struct aarch64_register fp = { 29, 1 };
992 static const struct aarch64_register lr = { 30, 1 };
993 static const struct aarch64_register sp = { 31, 1 };
994 static const struct aarch64_register xzr = { 31, 1 };
995 
996 /* Dynamically allocate a new register.  If we know the register
997    statically, we should make it a global as above instead of using this
998    helper function.  */
999 
1000 static struct aarch64_register
1001 aarch64_register (unsigned num, int is64)
1002 {
1003   return (struct aarch64_register) { num, is64 };
1004 }
1005 
1006 /* Helper function to create a register operand, for instructions with
1007    different types of operands.
1008 
1009    For example:
1010    p += emit_mov (p, x0, register_operand (x1));  */
1011 
1012 static struct aarch64_operand
1013 register_operand (struct aarch64_register reg)
1014 {
1015   struct aarch64_operand operand;
1016 
1017   operand.type = OPERAND_REGISTER;
1018   operand.reg = reg;
1019 
1020   return operand;
1021 }
1022 
1023 /* Helper function to create an immediate operand, for instructions with
1024    different types of operands.
1025 
1026    For example:
1027    p += emit_mov (p, x0, immediate_operand (12));  */
1028 
1029 static struct aarch64_operand
1030 immediate_operand (uint32_t imm)
1031 {
1032   struct aarch64_operand operand;
1033 
1034   operand.type = OPERAND_IMMEDIATE;
1035   operand.imm = imm;
1036 
1037   return operand;
1038 }
1039 
1040 /* Helper function to create an offset memory operand.
1041 
1042    For example:
1043    p += emit_ldr (p, x0, sp, offset_memory_operand (16));  */
1044 
1045 static struct aarch64_memory_operand
1046 offset_memory_operand (int32_t offset)
1047 {
1048   return (struct aarch64_memory_operand) { MEMORY_OPERAND_OFFSET, offset };
1049 }
1050 
1051 /* Helper function to create a pre-index memory operand.
1052 
1053    For example:
1054    p += emit_ldr (p, x0, sp, preindex_memory_operand (16));  */
1055 
1056 static struct aarch64_memory_operand
1057 preindex_memory_operand (int32_t index)
1058 {
1059   return (struct aarch64_memory_operand) { MEMORY_OPERAND_PREINDEX, index };
1060 }
1061 
1062 /* Helper function to create a post-index memory operand.
1063 
1064    For example:
1065    p += emit_ldr (p, x0, sp, postindex_memory_operand (16));  */
1066 
1067 static struct aarch64_memory_operand
1068 postindex_memory_operand (int32_t index)
1069 {
1070   return (struct aarch64_memory_operand) { MEMORY_OPERAND_POSTINDEX, index };
1071 }
1072 
1073 /* System control registers.  These special registers can be written and
1074    read with the MRS and MSR instructions.
1075 
1076    - NZCV: Condition flags.  GDB refers to this register under the CPSR
1077 	   name.
1078    - FPSR: Floating-point status register.
1079    - FPCR: Floating-point control registers.
1080    - TPIDR_EL0: Software thread ID register.  */
1081 
1082 enum aarch64_system_control_registers
1083 {
1084   /*          op0           op1           crn          crm          op2  */
1085   NZCV =      (0x1 << 14) | (0x3 << 11) | (0x4 << 7) | (0x2 << 3) | 0x0,
1086   FPSR =      (0x1 << 14) | (0x3 << 11) | (0x4 << 7) | (0x4 << 3) | 0x1,
1087   FPCR =      (0x1 << 14) | (0x3 << 11) | (0x4 << 7) | (0x4 << 3) | 0x0,
1088   TPIDR_EL0 = (0x1 << 14) | (0x3 << 11) | (0xd << 7) | (0x0 << 3) | 0x2
1089 };
1090 
1091 /* Write a BLR instruction into *BUF.
1092 
1093      BLR rn
1094 
1095    RN is the register to branch to.  */
1096 
1097 static int
1098 emit_blr (uint32_t *buf, struct aarch64_register rn)
1099 {
1100   return aarch64_emit_insn (buf, BLR | ENCODE (rn.num, 5, 5));
1101 }
1102 
1103 /* Write a RET instruction into *BUF.
1104 
1105      RET xn
1106 
1107    RN is the register to branch to.  */
1108 
1109 static int
1110 emit_ret (uint32_t *buf, struct aarch64_register rn)
1111 {
1112   return aarch64_emit_insn (buf, RET | ENCODE (rn.num, 5, 5));
1113 }
1114 
1115 static int
1116 emit_load_store_pair (uint32_t *buf, enum aarch64_opcodes opcode,
1117 		      struct aarch64_register rt,
1118 		      struct aarch64_register rt2,
1119 		      struct aarch64_register rn,
1120 		      struct aarch64_memory_operand operand)
1121 {
1122   uint32_t opc;
1123   uint32_t pre_index;
1124   uint32_t write_back;
1125 
1126   if (rt.is64)
1127     opc = ENCODE (2, 2, 30);
1128   else
1129     opc = ENCODE (0, 2, 30);
1130 
1131   switch (operand.type)
1132     {
1133     case MEMORY_OPERAND_OFFSET:
1134       {
1135 	pre_index = ENCODE (1, 1, 24);
1136 	write_back = ENCODE (0, 1, 23);
1137 	break;
1138       }
1139     case MEMORY_OPERAND_POSTINDEX:
1140       {
1141 	pre_index = ENCODE (0, 1, 24);
1142 	write_back = ENCODE (1, 1, 23);
1143 	break;
1144       }
1145     case MEMORY_OPERAND_PREINDEX:
1146       {
1147 	pre_index = ENCODE (1, 1, 24);
1148 	write_back = ENCODE (1, 1, 23);
1149 	break;
1150       }
1151     default:
1152       return 0;
1153     }
1154 
1155   return aarch64_emit_insn (buf, opcode | opc | pre_index | write_back
1156 			    | ENCODE (operand.index >> 3, 7, 15)
1157 			    | ENCODE (rt2.num, 5, 10)
1158 			    | ENCODE (rn.num, 5, 5) | ENCODE (rt.num, 5, 0));
1159 }
1160 
1161 /* Write a STP instruction into *BUF.
1162 
1163      STP rt, rt2, [rn, #offset]
1164      STP rt, rt2, [rn, #index]!
1165      STP rt, rt2, [rn], #index
1166 
1167    RT and RT2 are the registers to store.
1168    RN is the base address register.
1169    OFFSET is the immediate to add to the base address.  It is limited to a
1170    -512 .. 504 range (7 bits << 3).  */
1171 
1172 static int
1173 emit_stp (uint32_t *buf, struct aarch64_register rt,
1174 	  struct aarch64_register rt2, struct aarch64_register rn,
1175 	  struct aarch64_memory_operand operand)
1176 {
1177   return emit_load_store_pair (buf, STP, rt, rt2, rn, operand);
1178 }
1179 
1180 /* Write a LDP instruction into *BUF.
1181 
1182      LDP rt, rt2, [rn, #offset]
1183      LDP rt, rt2, [rn, #index]!
1184      LDP rt, rt2, [rn], #index
1185 
1186    RT and RT2 are the registers to store.
1187    RN is the base address register.
1188    OFFSET is the immediate to add to the base address.  It is limited to a
1189    -512 .. 504 range (7 bits << 3).  */
1190 
1191 static int
1192 emit_ldp (uint32_t *buf, struct aarch64_register rt,
1193 	  struct aarch64_register rt2, struct aarch64_register rn,
1194 	  struct aarch64_memory_operand operand)
1195 {
1196   return emit_load_store_pair (buf, LDP, rt, rt2, rn, operand);
1197 }
1198 
1199 /* Write a LDP (SIMD&VFP) instruction using Q registers into *BUF.
1200 
1201      LDP qt, qt2, [rn, #offset]
1202 
1203    RT and RT2 are the Q registers to store.
1204    RN is the base address register.
1205    OFFSET is the immediate to add to the base address.  It is limited to
1206    -1024 .. 1008 range (7 bits << 4).  */
1207 
1208 static int
1209 emit_ldp_q_offset (uint32_t *buf, unsigned rt, unsigned rt2,
1210 		   struct aarch64_register rn, int32_t offset)
1211 {
1212   uint32_t opc = ENCODE (2, 2, 30);
1213   uint32_t pre_index = ENCODE (1, 1, 24);
1214 
1215   return aarch64_emit_insn (buf, LDP_SIMD_VFP | opc | pre_index
1216 			    | ENCODE (offset >> 4, 7, 15)
1217 			    | ENCODE (rt2, 5, 10)
1218 			    | ENCODE (rn.num, 5, 5) | ENCODE (rt, 5, 0));
1219 }
1220 
1221 /* Write a STP (SIMD&VFP) instruction using Q registers into *BUF.
1222 
1223      STP qt, qt2, [rn, #offset]
1224 
1225    RT and RT2 are the Q registers to store.
1226    RN is the base address register.
1227    OFFSET is the immediate to add to the base address.  It is limited to
1228    -1024 .. 1008 range (7 bits << 4).  */
1229 
1230 static int
1231 emit_stp_q_offset (uint32_t *buf, unsigned rt, unsigned rt2,
1232 		   struct aarch64_register rn, int32_t offset)
1233 {
1234   uint32_t opc = ENCODE (2, 2, 30);
1235   uint32_t pre_index = ENCODE (1, 1, 24);
1236 
1237   return aarch64_emit_insn (buf, STP_SIMD_VFP | opc | pre_index
1238 			    | ENCODE (offset >> 4, 7, 15)
1239 			    | ENCODE (rt2, 5, 10)
1240 			    | ENCODE (rn.num, 5, 5) | ENCODE (rt, 5, 0));
1241 }
1242 
1243 /* Write a LDRH instruction into *BUF.
1244 
1245      LDRH wt, [xn, #offset]
1246      LDRH wt, [xn, #index]!
1247      LDRH wt, [xn], #index
1248 
1249    RT is the register to store.
1250    RN is the base address register.
1251    OFFSET is the immediate to add to the base address.  It is limited to
1252    0 .. 32760 range (12 bits << 3).  */
1253 
1254 static int
1255 emit_ldrh (uint32_t *buf, struct aarch64_register rt,
1256 	   struct aarch64_register rn,
1257 	   struct aarch64_memory_operand operand)
1258 {
1259   return aarch64_emit_load_store (buf, 1, LDR, rt, rn, operand);
1260 }
1261 
1262 /* Write a LDRB instruction into *BUF.
1263 
1264      LDRB wt, [xn, #offset]
1265      LDRB wt, [xn, #index]!
1266      LDRB wt, [xn], #index
1267 
1268    RT is the register to store.
1269    RN is the base address register.
1270    OFFSET is the immediate to add to the base address.  It is limited to
1271    0 .. 32760 range (12 bits << 3).  */
1272 
1273 static int
1274 emit_ldrb (uint32_t *buf, struct aarch64_register rt,
1275 	   struct aarch64_register rn,
1276 	   struct aarch64_memory_operand operand)
1277 {
1278   return aarch64_emit_load_store (buf, 0, LDR, rt, rn, operand);
1279 }
1280 
1281 
1282 
1283 /* Write a STR instruction into *BUF.
1284 
1285      STR rt, [rn, #offset]
1286      STR rt, [rn, #index]!
1287      STR rt, [rn], #index
1288 
1289    RT is the register to store.
1290    RN is the base address register.
1291    OFFSET is the immediate to add to the base address.  It is limited to
1292    0 .. 32760 range (12 bits << 3).  */
1293 
1294 static int
1295 emit_str (uint32_t *buf, struct aarch64_register rt,
1296 	  struct aarch64_register rn,
1297 	  struct aarch64_memory_operand operand)
1298 {
1299   return aarch64_emit_load_store (buf, rt.is64 ? 3 : 2, STR, rt, rn, operand);
1300 }
1301 
1302 /* Helper function emitting an exclusive load or store instruction.  */
1303 
1304 static int
1305 emit_load_store_exclusive (uint32_t *buf, uint32_t size,
1306 			   enum aarch64_opcodes opcode,
1307 			   struct aarch64_register rs,
1308 			   struct aarch64_register rt,
1309 			   struct aarch64_register rt2,
1310 			   struct aarch64_register rn)
1311 {
1312   return aarch64_emit_insn (buf, opcode | ENCODE (size, 2, 30)
1313 			    | ENCODE (rs.num, 5, 16) | ENCODE (rt2.num, 5, 10)
1314 			    | ENCODE (rn.num, 5, 5) | ENCODE (rt.num, 5, 0));
1315 }
1316 
1317 /* Write a LAXR instruction into *BUF.
1318 
1319      LDAXR rt, [xn]
1320 
1321    RT is the destination register.
1322    RN is the base address register.  */
1323 
1324 static int
1325 emit_ldaxr (uint32_t *buf, struct aarch64_register rt,
1326 	    struct aarch64_register rn)
1327 {
1328   return emit_load_store_exclusive (buf, rt.is64 ? 3 : 2, LDAXR, xzr, rt,
1329 				    xzr, rn);
1330 }
1331 
1332 /* Write a STXR instruction into *BUF.
1333 
1334      STXR ws, rt, [xn]
1335 
1336    RS is the result register, it indicates if the store succeeded or not.
1337    RT is the destination register.
1338    RN is the base address register.  */
1339 
1340 static int
1341 emit_stxr (uint32_t *buf, struct aarch64_register rs,
1342 	   struct aarch64_register rt, struct aarch64_register rn)
1343 {
1344   return emit_load_store_exclusive (buf, rt.is64 ? 3 : 2, STXR, rs, rt,
1345 				    xzr, rn);
1346 }
1347 
1348 /* Write a STLR instruction into *BUF.
1349 
1350      STLR rt, [xn]
1351 
1352    RT is the register to store.
1353    RN is the base address register.  */
1354 
1355 static int
1356 emit_stlr (uint32_t *buf, struct aarch64_register rt,
1357 	   struct aarch64_register rn)
1358 {
1359   return emit_load_store_exclusive (buf, rt.is64 ? 3 : 2, STLR, xzr, rt,
1360 				    xzr, rn);
1361 }
1362 
1363 /* Helper function for data processing instructions with register sources.  */
1364 
1365 static int
1366 emit_data_processing_reg (uint32_t *buf, uint32_t opcode,
1367 			  struct aarch64_register rd,
1368 			  struct aarch64_register rn,
1369 			  struct aarch64_register rm)
1370 {
1371   uint32_t size = ENCODE (rd.is64, 1, 31);
1372 
1373   return aarch64_emit_insn (buf, opcode | size | ENCODE (rm.num, 5, 16)
1374 			    | ENCODE (rn.num, 5, 5) | ENCODE (rd.num, 5, 0));
1375 }
1376 
1377 /* Helper function for data processing instructions taking either a register
1378    or an immediate.  */
1379 
1380 static int
1381 emit_data_processing (uint32_t *buf, enum aarch64_opcodes opcode,
1382 		      struct aarch64_register rd,
1383 		      struct aarch64_register rn,
1384 		      struct aarch64_operand operand)
1385 {
1386   uint32_t size = ENCODE (rd.is64, 1, 31);
1387   /* The opcode is different for register and immediate source operands.  */
1388   uint32_t operand_opcode;
1389 
1390   if (operand.type == OPERAND_IMMEDIATE)
1391     {
1392       /* xxx1 000x xxxx xxxx xxxx xxxx xxxx xxxx */
1393       operand_opcode = ENCODE (8, 4, 25);
1394 
1395       return aarch64_emit_insn (buf, opcode | operand_opcode | size
1396 				| ENCODE (operand.imm, 12, 10)
1397 				| ENCODE (rn.num, 5, 5)
1398 				| ENCODE (rd.num, 5, 0));
1399     }
1400   else
1401     {
1402       /* xxx0 101x xxxx xxxx xxxx xxxx xxxx xxxx */
1403       operand_opcode = ENCODE (5, 4, 25);
1404 
1405       return emit_data_processing_reg (buf, opcode | operand_opcode, rd,
1406 				       rn, operand.reg);
1407     }
1408 }
1409 
1410 /* Write an ADD instruction into *BUF.
1411 
1412      ADD rd, rn, #imm
1413      ADD rd, rn, rm
1414 
1415    This function handles both an immediate and register add.
1416 
1417    RD is the destination register.
1418    RN is the input register.
1419    OPERAND is the source operand, either of type OPERAND_IMMEDIATE or
1420    OPERAND_REGISTER.  */
1421 
1422 static int
1423 emit_add (uint32_t *buf, struct aarch64_register rd,
1424 	  struct aarch64_register rn, struct aarch64_operand operand)
1425 {
1426   return emit_data_processing (buf, ADD, rd, rn, operand);
1427 }
1428 
1429 /* Write a SUB instruction into *BUF.
1430 
1431      SUB rd, rn, #imm
1432      SUB rd, rn, rm
1433 
1434    This function handles both an immediate and register sub.
1435 
1436    RD is the destination register.
1437    RN is the input register.
1438    IMM is the immediate to substract to RN.  */
1439 
1440 static int
1441 emit_sub (uint32_t *buf, struct aarch64_register rd,
1442 	  struct aarch64_register rn, struct aarch64_operand operand)
1443 {
1444   return emit_data_processing (buf, SUB, rd, rn, operand);
1445 }
1446 
1447 /* Write a MOV instruction into *BUF.
1448 
1449      MOV rd, #imm
1450      MOV rd, rm
1451 
1452    This function handles both a wide immediate move and a register move,
1453    with the condition that the source register is not xzr.  xzr and the
1454    stack pointer share the same encoding and this function only supports
1455    the stack pointer.
1456 
1457    RD is the destination register.
1458    OPERAND is the source operand, either of type OPERAND_IMMEDIATE or
1459    OPERAND_REGISTER.  */
1460 
1461 static int
1462 emit_mov (uint32_t *buf, struct aarch64_register rd,
1463 	  struct aarch64_operand operand)
1464 {
1465   if (operand.type == OPERAND_IMMEDIATE)
1466     {
1467       uint32_t size = ENCODE (rd.is64, 1, 31);
1468       /* Do not shift the immediate.  */
1469       uint32_t shift = ENCODE (0, 2, 21);
1470 
1471       return aarch64_emit_insn (buf, MOV | size | shift
1472 				| ENCODE (operand.imm, 16, 5)
1473 				| ENCODE (rd.num, 5, 0));
1474     }
1475   else
1476     return emit_add (buf, rd, operand.reg, immediate_operand (0));
1477 }
1478 
1479 /* Write a MOVK instruction into *BUF.
1480 
1481      MOVK rd, #imm, lsl #shift
1482 
1483    RD is the destination register.
1484    IMM is the immediate.
1485    SHIFT is the logical shift left to apply to IMM.   */
1486 
1487 static int
1488 emit_movk (uint32_t *buf, struct aarch64_register rd, uint32_t imm,
1489 	   unsigned shift)
1490 {
1491   uint32_t size = ENCODE (rd.is64, 1, 31);
1492 
1493   return aarch64_emit_insn (buf, MOVK | size | ENCODE (shift, 2, 21) |
1494 			    ENCODE (imm, 16, 5) | ENCODE (rd.num, 5, 0));
1495 }
1496 
1497 /* Write instructions into *BUF in order to move ADDR into a register.
1498    ADDR can be a 64-bit value.
1499 
1500    This function will emit a series of MOV and MOVK instructions, such as:
1501 
1502      MOV  xd, #(addr)
1503      MOVK xd, #(addr >> 16), lsl #16
1504      MOVK xd, #(addr >> 32), lsl #32
1505      MOVK xd, #(addr >> 48), lsl #48  */
1506 
1507 static int
1508 emit_mov_addr (uint32_t *buf, struct aarch64_register rd, CORE_ADDR addr)
1509 {
1510   uint32_t *p = buf;
1511 
1512   /* The MOV (wide immediate) instruction clears to top bits of the
1513      register.  */
1514   p += emit_mov (p, rd, immediate_operand (addr & 0xffff));
1515 
1516   if ((addr >> 16) != 0)
1517     p += emit_movk (p, rd, (addr >> 16) & 0xffff, 1);
1518   else
1519     return p - buf;
1520 
1521   if ((addr >> 32) != 0)
1522     p += emit_movk (p, rd, (addr >> 32) & 0xffff, 2);
1523   else
1524     return p - buf;
1525 
1526   if ((addr >> 48) != 0)
1527     p += emit_movk (p, rd, (addr >> 48) & 0xffff, 3);
1528 
1529   return p - buf;
1530 }
1531 
1532 /* Write a SUBS instruction into *BUF.
1533 
1534      SUBS rd, rn, rm
1535 
1536    This instruction update the condition flags.
1537 
1538    RD is the destination register.
1539    RN and RM are the source registers.  */
1540 
1541 static int
1542 emit_subs (uint32_t *buf, struct aarch64_register rd,
1543 	   struct aarch64_register rn, struct aarch64_operand operand)
1544 {
1545   return emit_data_processing (buf, SUBS, rd, rn, operand);
1546 }
1547 
1548 /* Write a CMP instruction into *BUF.
1549 
1550      CMP rn, rm
1551 
1552    This instruction is an alias of SUBS xzr, rn, rm.
1553 
1554    RN and RM are the registers to compare.  */
1555 
1556 static int
1557 emit_cmp (uint32_t *buf, struct aarch64_register rn,
1558 	      struct aarch64_operand operand)
1559 {
1560   return emit_subs (buf, xzr, rn, operand);
1561 }
1562 
1563 /* Write a AND instruction into *BUF.
1564 
1565      AND rd, rn, rm
1566 
1567    RD is the destination register.
1568    RN and RM are the source registers.  */
1569 
1570 static int
1571 emit_and (uint32_t *buf, struct aarch64_register rd,
1572 	  struct aarch64_register rn, struct aarch64_register rm)
1573 {
1574   return emit_data_processing_reg (buf, AND, rd, rn, rm);
1575 }
1576 
1577 /* Write a ORR instruction into *BUF.
1578 
1579      ORR rd, rn, rm
1580 
1581    RD is the destination register.
1582    RN and RM are the source registers.  */
1583 
1584 static int
1585 emit_orr (uint32_t *buf, struct aarch64_register rd,
1586 	  struct aarch64_register rn, struct aarch64_register rm)
1587 {
1588   return emit_data_processing_reg (buf, ORR, rd, rn, rm);
1589 }
1590 
1591 /* Write a ORN instruction into *BUF.
1592 
1593      ORN rd, rn, rm
1594 
1595    RD is the destination register.
1596    RN and RM are the source registers.  */
1597 
1598 static int
1599 emit_orn (uint32_t *buf, struct aarch64_register rd,
1600 	  struct aarch64_register rn, struct aarch64_register rm)
1601 {
1602   return emit_data_processing_reg (buf, ORN, rd, rn, rm);
1603 }
1604 
1605 /* Write a EOR instruction into *BUF.
1606 
1607      EOR rd, rn, rm
1608 
1609    RD is the destination register.
1610    RN and RM are the source registers.  */
1611 
1612 static int
1613 emit_eor (uint32_t *buf, struct aarch64_register rd,
1614 	  struct aarch64_register rn, struct aarch64_register rm)
1615 {
1616   return emit_data_processing_reg (buf, EOR, rd, rn, rm);
1617 }
1618 
1619 /* Write a MVN instruction into *BUF.
1620 
1621      MVN rd, rm
1622 
1623    This is an alias for ORN rd, xzr, rm.
1624 
1625    RD is the destination register.
1626    RM is the source register.  */
1627 
1628 static int
1629 emit_mvn (uint32_t *buf, struct aarch64_register rd,
1630 	  struct aarch64_register rm)
1631 {
1632   return emit_orn (buf, rd, xzr, rm);
1633 }
1634 
1635 /* Write a LSLV instruction into *BUF.
1636 
1637      LSLV rd, rn, rm
1638 
1639    RD is the destination register.
1640    RN and RM are the source registers.  */
1641 
1642 static int
1643 emit_lslv (uint32_t *buf, struct aarch64_register rd,
1644 	   struct aarch64_register rn, struct aarch64_register rm)
1645 {
1646   return emit_data_processing_reg (buf, LSLV, rd, rn, rm);
1647 }
1648 
1649 /* Write a LSRV instruction into *BUF.
1650 
1651      LSRV rd, rn, rm
1652 
1653    RD is the destination register.
1654    RN and RM are the source registers.  */
1655 
1656 static int
1657 emit_lsrv (uint32_t *buf, struct aarch64_register rd,
1658 	   struct aarch64_register rn, struct aarch64_register rm)
1659 {
1660   return emit_data_processing_reg (buf, LSRV, rd, rn, rm);
1661 }
1662 
1663 /* Write a ASRV instruction into *BUF.
1664 
1665      ASRV rd, rn, rm
1666 
1667    RD is the destination register.
1668    RN and RM are the source registers.  */
1669 
1670 static int
1671 emit_asrv (uint32_t *buf, struct aarch64_register rd,
1672 	   struct aarch64_register rn, struct aarch64_register rm)
1673 {
1674   return emit_data_processing_reg (buf, ASRV, rd, rn, rm);
1675 }
1676 
1677 /* Write a MUL instruction into *BUF.
1678 
1679      MUL rd, rn, rm
1680 
1681    RD is the destination register.
1682    RN and RM are the source registers.  */
1683 
1684 static int
1685 emit_mul (uint32_t *buf, struct aarch64_register rd,
1686 	  struct aarch64_register rn, struct aarch64_register rm)
1687 {
1688   return emit_data_processing_reg (buf, MUL, rd, rn, rm);
1689 }
1690 
1691 /* Write a MRS instruction into *BUF.  The register size is 64-bit.
1692 
1693      MRS xt, system_reg
1694 
1695    RT is the destination register.
1696    SYSTEM_REG is special purpose register to read.  */
1697 
1698 static int
1699 emit_mrs (uint32_t *buf, struct aarch64_register rt,
1700 	  enum aarch64_system_control_registers system_reg)
1701 {
1702   return aarch64_emit_insn (buf, MRS | ENCODE (system_reg, 15, 5)
1703 			    | ENCODE (rt.num, 5, 0));
1704 }
1705 
1706 /* Write a MSR instruction into *BUF.  The register size is 64-bit.
1707 
1708      MSR system_reg, xt
1709 
1710    SYSTEM_REG is special purpose register to write.
1711    RT is the input register.  */
1712 
1713 static int
1714 emit_msr (uint32_t *buf, enum aarch64_system_control_registers system_reg,
1715 	  struct aarch64_register rt)
1716 {
1717   return aarch64_emit_insn (buf, MSR | ENCODE (system_reg, 15, 5)
1718 			    | ENCODE (rt.num, 5, 0));
1719 }
1720 
1721 /* Write a SEVL instruction into *BUF.
1722 
1723    This is a hint instruction telling the hardware to trigger an event.  */
1724 
1725 static int
1726 emit_sevl (uint32_t *buf)
1727 {
1728   return aarch64_emit_insn (buf, SEVL);
1729 }
1730 
1731 /* Write a WFE instruction into *BUF.
1732 
1733    This is a hint instruction telling the hardware to wait for an event.  */
1734 
1735 static int
1736 emit_wfe (uint32_t *buf)
1737 {
1738   return aarch64_emit_insn (buf, WFE);
1739 }
1740 
1741 /* Write a SBFM instruction into *BUF.
1742 
1743      SBFM rd, rn, #immr, #imms
1744 
1745    This instruction moves the bits from #immr to #imms into the
1746    destination, sign extending the result.
1747 
1748    RD is the destination register.
1749    RN is the source register.
1750    IMMR is the bit number to start at (least significant bit).
1751    IMMS is the bit number to stop at (most significant bit).  */
1752 
1753 static int
1754 emit_sbfm (uint32_t *buf, struct aarch64_register rd,
1755 	   struct aarch64_register rn, uint32_t immr, uint32_t imms)
1756 {
1757   uint32_t size = ENCODE (rd.is64, 1, 31);
1758   uint32_t n = ENCODE (rd.is64, 1, 22);
1759 
1760   return aarch64_emit_insn (buf, SBFM | size | n | ENCODE (immr, 6, 16)
1761 			    | ENCODE (imms, 6, 10) | ENCODE (rn.num, 5, 5)
1762 			    | ENCODE (rd.num, 5, 0));
1763 }
1764 
1765 /* Write a SBFX instruction into *BUF.
1766 
1767      SBFX rd, rn, #lsb, #width
1768 
1769    This instruction moves #width bits from #lsb into the destination, sign
1770    extending the result.  This is an alias for:
1771 
1772      SBFM rd, rn, #lsb, #(lsb + width - 1)
1773 
1774    RD is the destination register.
1775    RN is the source register.
1776    LSB is the bit number to start at (least significant bit).
1777    WIDTH is the number of bits to move.  */
1778 
1779 static int
1780 emit_sbfx (uint32_t *buf, struct aarch64_register rd,
1781 	   struct aarch64_register rn, uint32_t lsb, uint32_t width)
1782 {
1783   return emit_sbfm (buf, rd, rn, lsb, lsb + width - 1);
1784 }
1785 
1786 /* Write a UBFM instruction into *BUF.
1787 
1788      UBFM rd, rn, #immr, #imms
1789 
1790    This instruction moves the bits from #immr to #imms into the
1791    destination, extending the result with zeros.
1792 
1793    RD is the destination register.
1794    RN is the source register.
1795    IMMR is the bit number to start at (least significant bit).
1796    IMMS is the bit number to stop at (most significant bit).  */
1797 
1798 static int
1799 emit_ubfm (uint32_t *buf, struct aarch64_register rd,
1800 	   struct aarch64_register rn, uint32_t immr, uint32_t imms)
1801 {
1802   uint32_t size = ENCODE (rd.is64, 1, 31);
1803   uint32_t n = ENCODE (rd.is64, 1, 22);
1804 
1805   return aarch64_emit_insn (buf, UBFM | size | n | ENCODE (immr, 6, 16)
1806 			    | ENCODE (imms, 6, 10) | ENCODE (rn.num, 5, 5)
1807 			    | ENCODE (rd.num, 5, 0));
1808 }
1809 
1810 /* Write a UBFX instruction into *BUF.
1811 
1812      UBFX rd, rn, #lsb, #width
1813 
1814    This instruction moves #width bits from #lsb into the destination,
1815    extending the result with zeros.  This is an alias for:
1816 
1817      UBFM rd, rn, #lsb, #(lsb + width - 1)
1818 
1819    RD is the destination register.
1820    RN is the source register.
1821    LSB is the bit number to start at (least significant bit).
1822    WIDTH is the number of bits to move.  */
1823 
1824 static int
1825 emit_ubfx (uint32_t *buf, struct aarch64_register rd,
1826 	   struct aarch64_register rn, uint32_t lsb, uint32_t width)
1827 {
1828   return emit_ubfm (buf, rd, rn, lsb, lsb + width - 1);
1829 }
1830 
1831 /* Write a CSINC instruction into *BUF.
1832 
1833      CSINC rd, rn, rm, cond
1834 
1835    This instruction conditionally increments rn or rm and places the result
1836    in rd.  rn is chosen is the condition is true.
1837 
1838    RD is the destination register.
1839    RN and RM are the source registers.
1840    COND is the encoded condition.  */
1841 
1842 static int
1843 emit_csinc (uint32_t *buf, struct aarch64_register rd,
1844 	    struct aarch64_register rn, struct aarch64_register rm,
1845 	    unsigned cond)
1846 {
1847   uint32_t size = ENCODE (rd.is64, 1, 31);
1848 
1849   return aarch64_emit_insn (buf, CSINC | size | ENCODE (rm.num, 5, 16)
1850 			    | ENCODE (cond, 4, 12) | ENCODE (rn.num, 5, 5)
1851 			    | ENCODE (rd.num, 5, 0));
1852 }
1853 
1854 /* Write a CSET instruction into *BUF.
1855 
1856      CSET rd, cond
1857 
1858    This instruction conditionally write 1 or 0 in the destination register.
1859    1 is written if the condition is true.  This is an alias for:
1860 
1861      CSINC rd, xzr, xzr, !cond
1862 
1863    Note that the condition needs to be inverted.
1864 
1865    RD is the destination register.
1866    RN and RM are the source registers.
1867    COND is the encoded condition.  */
1868 
1869 static int
1870 emit_cset (uint32_t *buf, struct aarch64_register rd, unsigned cond)
1871 {
1872   /* The least significant bit of the condition needs toggling in order to
1873      invert it.  */
1874   return emit_csinc (buf, rd, xzr, xzr, cond ^ 0x1);
1875 }
1876 
1877 /* Write LEN instructions from BUF into the inferior memory at *TO.
1878 
1879    Note instructions are always little endian on AArch64, unlike data.  */
1880 
1881 static void
1882 append_insns (CORE_ADDR *to, size_t len, const uint32_t *buf)
1883 {
1884   size_t byte_len = len * sizeof (uint32_t);
1885 #if (__BYTE_ORDER == __BIG_ENDIAN)
1886   uint32_t *le_buf = (uint32_t *) xmalloc (byte_len);
1887   size_t i;
1888 
1889   for (i = 0; i < len; i++)
1890     le_buf[i] = htole32 (buf[i]);
1891 
1892   target_write_memory (*to, (const unsigned char *) le_buf, byte_len);
1893 
1894   xfree (le_buf);
1895 #else
1896   target_write_memory (*to, (const unsigned char *) buf, byte_len);
1897 #endif
1898 
1899   *to += byte_len;
1900 }
1901 
1902 /* Sub-class of struct aarch64_insn_data, store information of
1903    instruction relocation for fast tracepoint.  Visitor can
1904    relocate an instruction from BASE.INSN_ADDR to NEW_ADDR and save
1905    the relocated instructions in buffer pointed by INSN_PTR.  */
1906 
1907 struct aarch64_insn_relocation_data
1908 {
1909   struct aarch64_insn_data base;
1910 
1911   /* The new address the instruction is relocated to.  */
1912   CORE_ADDR new_addr;
1913   /* Pointer to the buffer of relocated instruction(s).  */
1914   uint32_t *insn_ptr;
1915 };
1916 
1917 /* Implementation of aarch64_insn_visitor method "b".  */
1918 
1919 static void
1920 aarch64_ftrace_insn_reloc_b (const int is_bl, const int32_t offset,
1921 			     struct aarch64_insn_data *data)
1922 {
1923   struct aarch64_insn_relocation_data *insn_reloc
1924     = (struct aarch64_insn_relocation_data *) data;
1925   int64_t new_offset
1926     = insn_reloc->base.insn_addr - insn_reloc->new_addr + offset;
1927 
1928   if (can_encode_int32 (new_offset, 28))
1929     insn_reloc->insn_ptr += emit_b (insn_reloc->insn_ptr, is_bl, new_offset);
1930 }
1931 
1932 /* Implementation of aarch64_insn_visitor method "b_cond".  */
1933 
1934 static void
1935 aarch64_ftrace_insn_reloc_b_cond (const unsigned cond, const int32_t offset,
1936 				  struct aarch64_insn_data *data)
1937 {
1938   struct aarch64_insn_relocation_data *insn_reloc
1939     = (struct aarch64_insn_relocation_data *) data;
1940   int64_t new_offset
1941     = insn_reloc->base.insn_addr - insn_reloc->new_addr + offset;
1942 
1943   if (can_encode_int32 (new_offset, 21))
1944     {
1945       insn_reloc->insn_ptr += emit_bcond (insn_reloc->insn_ptr, cond,
1946 					  new_offset);
1947     }
1948   else if (can_encode_int32 (new_offset, 28))
1949     {
1950       /* The offset is out of range for a conditional branch
1951 	 instruction but not for a unconditional branch.  We can use
1952 	 the following instructions instead:
1953 
1954 	 B.COND TAKEN    ; If cond is true, then jump to TAKEN.
1955 	 B NOT_TAKEN     ; Else jump over TAKEN and continue.
1956 	 TAKEN:
1957 	 B #(offset - 8)
1958 	 NOT_TAKEN:
1959 
1960       */
1961 
1962       insn_reloc->insn_ptr += emit_bcond (insn_reloc->insn_ptr, cond, 8);
1963       insn_reloc->insn_ptr += emit_b (insn_reloc->insn_ptr, 0, 8);
1964       insn_reloc->insn_ptr += emit_b (insn_reloc->insn_ptr, 0, new_offset - 8);
1965     }
1966 }
1967 
1968 /* Implementation of aarch64_insn_visitor method "cb".  */
1969 
1970 static void
1971 aarch64_ftrace_insn_reloc_cb (const int32_t offset, const int is_cbnz,
1972 			      const unsigned rn, int is64,
1973 			      struct aarch64_insn_data *data)
1974 {
1975   struct aarch64_insn_relocation_data *insn_reloc
1976     = (struct aarch64_insn_relocation_data *) data;
1977   int64_t new_offset
1978     = insn_reloc->base.insn_addr - insn_reloc->new_addr + offset;
1979 
1980   if (can_encode_int32 (new_offset, 21))
1981     {
1982       insn_reloc->insn_ptr += emit_cb (insn_reloc->insn_ptr, is_cbnz,
1983 				       aarch64_register (rn, is64), new_offset);
1984     }
1985   else if (can_encode_int32 (new_offset, 28))
1986     {
1987       /* The offset is out of range for a compare and branch
1988 	 instruction but not for a unconditional branch.  We can use
1989 	 the following instructions instead:
1990 
1991 	 CBZ xn, TAKEN   ; xn == 0, then jump to TAKEN.
1992 	 B NOT_TAKEN     ; Else jump over TAKEN and continue.
1993 	 TAKEN:
1994 	 B #(offset - 8)
1995 	 NOT_TAKEN:
1996 
1997       */
1998       insn_reloc->insn_ptr += emit_cb (insn_reloc->insn_ptr, is_cbnz,
1999 				       aarch64_register (rn, is64), 8);
2000       insn_reloc->insn_ptr += emit_b (insn_reloc->insn_ptr, 0, 8);
2001       insn_reloc->insn_ptr += emit_b (insn_reloc->insn_ptr, 0, new_offset - 8);
2002     }
2003 }
2004 
2005 /* Implementation of aarch64_insn_visitor method "tb".  */
2006 
2007 static void
2008 aarch64_ftrace_insn_reloc_tb (const int32_t offset, int is_tbnz,
2009 			      const unsigned rt, unsigned bit,
2010 			      struct aarch64_insn_data *data)
2011 {
2012   struct aarch64_insn_relocation_data *insn_reloc
2013     = (struct aarch64_insn_relocation_data *) data;
2014   int64_t new_offset
2015     = insn_reloc->base.insn_addr - insn_reloc->new_addr + offset;
2016 
2017   if (can_encode_int32 (new_offset, 16))
2018     {
2019       insn_reloc->insn_ptr += emit_tb (insn_reloc->insn_ptr, is_tbnz, bit,
2020 				       aarch64_register (rt, 1), new_offset);
2021     }
2022   else if (can_encode_int32 (new_offset, 28))
2023     {
2024       /* The offset is out of range for a test bit and branch
2025 	 instruction but not for a unconditional branch.  We can use
2026 	 the following instructions instead:
2027 
2028 	 TBZ xn, #bit, TAKEN ; xn[bit] == 0, then jump to TAKEN.
2029 	 B NOT_TAKEN         ; Else jump over TAKEN and continue.
2030 	 TAKEN:
2031 	 B #(offset - 8)
2032 	 NOT_TAKEN:
2033 
2034       */
2035       insn_reloc->insn_ptr += emit_tb (insn_reloc->insn_ptr, is_tbnz, bit,
2036 				       aarch64_register (rt, 1), 8);
2037       insn_reloc->insn_ptr += emit_b (insn_reloc->insn_ptr, 0, 8);
2038       insn_reloc->insn_ptr += emit_b (insn_reloc->insn_ptr, 0,
2039 				      new_offset - 8);
2040     }
2041 }
2042 
2043 /* Implementation of aarch64_insn_visitor method "adr".  */
2044 
2045 static void
2046 aarch64_ftrace_insn_reloc_adr (const int32_t offset, const unsigned rd,
2047 			       const int is_adrp,
2048 			       struct aarch64_insn_data *data)
2049 {
2050   struct aarch64_insn_relocation_data *insn_reloc
2051     = (struct aarch64_insn_relocation_data *) data;
2052   /* We know exactly the address the ADR{P,} instruction will compute.
2053      We can just write it to the destination register.  */
2054   CORE_ADDR address = data->insn_addr + offset;
2055 
2056   if (is_adrp)
2057     {
2058       /* Clear the lower 12 bits of the offset to get the 4K page.  */
2059       insn_reloc->insn_ptr += emit_mov_addr (insn_reloc->insn_ptr,
2060 					     aarch64_register (rd, 1),
2061 					     address & ~0xfff);
2062     }
2063   else
2064     insn_reloc->insn_ptr += emit_mov_addr (insn_reloc->insn_ptr,
2065 					   aarch64_register (rd, 1), address);
2066 }
2067 
2068 /* Implementation of aarch64_insn_visitor method "ldr_literal".  */
2069 
2070 static void
2071 aarch64_ftrace_insn_reloc_ldr_literal (const int32_t offset, const int is_sw,
2072 				       const unsigned rt, const int is64,
2073 				       struct aarch64_insn_data *data)
2074 {
2075   struct aarch64_insn_relocation_data *insn_reloc
2076     = (struct aarch64_insn_relocation_data *) data;
2077   CORE_ADDR address = data->insn_addr + offset;
2078 
2079   insn_reloc->insn_ptr += emit_mov_addr (insn_reloc->insn_ptr,
2080 					 aarch64_register (rt, 1), address);
2081 
2082   /* We know exactly what address to load from, and what register we
2083      can use:
2084 
2085      MOV xd, #(oldloc + offset)
2086      MOVK xd, #((oldloc + offset) >> 16), lsl #16
2087      ...
2088 
2089      LDR xd, [xd] ; or LDRSW xd, [xd]
2090 
2091   */
2092 
2093   if (is_sw)
2094     insn_reloc->insn_ptr += emit_ldrsw (insn_reloc->insn_ptr,
2095 					aarch64_register (rt, 1),
2096 					aarch64_register (rt, 1),
2097 					offset_memory_operand (0));
2098   else
2099     insn_reloc->insn_ptr += emit_ldr (insn_reloc->insn_ptr,
2100 				      aarch64_register (rt, is64),
2101 				      aarch64_register (rt, 1),
2102 				      offset_memory_operand (0));
2103 }
2104 
2105 /* Implementation of aarch64_insn_visitor method "others".  */
2106 
2107 static void
2108 aarch64_ftrace_insn_reloc_others (const uint32_t insn,
2109 				  struct aarch64_insn_data *data)
2110 {
2111   struct aarch64_insn_relocation_data *insn_reloc
2112     = (struct aarch64_insn_relocation_data *) data;
2113 
2114   /* The instruction is not PC relative.  Just re-emit it at the new
2115      location.  */
2116   insn_reloc->insn_ptr += aarch64_emit_insn (insn_reloc->insn_ptr, insn);
2117 }
2118 
2119 static const struct aarch64_insn_visitor visitor =
2120 {
2121   aarch64_ftrace_insn_reloc_b,
2122   aarch64_ftrace_insn_reloc_b_cond,
2123   aarch64_ftrace_insn_reloc_cb,
2124   aarch64_ftrace_insn_reloc_tb,
2125   aarch64_ftrace_insn_reloc_adr,
2126   aarch64_ftrace_insn_reloc_ldr_literal,
2127   aarch64_ftrace_insn_reloc_others,
2128 };
2129 
2130 bool
2131 aarch64_target::supports_fast_tracepoints ()
2132 {
2133   return true;
2134 }
2135 
2136 /* Implementation of target ops method
2137    "install_fast_tracepoint_jump_pad".  */
2138 
2139 int
2140 aarch64_target::install_fast_tracepoint_jump_pad
2141   (CORE_ADDR tpoint, CORE_ADDR tpaddr, CORE_ADDR collector,
2142    CORE_ADDR lockaddr, ULONGEST orig_size, CORE_ADDR *jump_entry,
2143    CORE_ADDR *trampoline, ULONGEST *trampoline_size,
2144    unsigned char *jjump_pad_insn, ULONGEST *jjump_pad_insn_size,
2145    CORE_ADDR *adjusted_insn_addr, CORE_ADDR *adjusted_insn_addr_end,
2146    char *err)
2147 {
2148   uint32_t buf[256];
2149   uint32_t *p = buf;
2150   int64_t offset;
2151   int i;
2152   uint32_t insn;
2153   CORE_ADDR buildaddr = *jump_entry;
2154   struct aarch64_insn_relocation_data insn_data;
2155 
2156   /* We need to save the current state on the stack both to restore it
2157      later and to collect register values when the tracepoint is hit.
2158 
2159      The saved registers are pushed in a layout that needs to be in sync
2160      with aarch64_ft_collect_regmap (see linux-aarch64-ipa.c).  Later on
2161      the supply_fast_tracepoint_registers function will fill in the
2162      register cache from a pointer to saved registers on the stack we build
2163      here.
2164 
2165      For simplicity, we set the size of each cell on the stack to 16 bytes.
2166      This way one cell can hold any register type, from system registers
2167      to the 128 bit SIMD&FP registers.  Furthermore, the stack pointer
2168      has to be 16 bytes aligned anyway.
2169 
2170      Note that the CPSR register does not exist on AArch64.  Instead we
2171      can access system bits describing the process state with the
2172      MRS/MSR instructions, namely the condition flags.  We save them as
2173      if they are part of a CPSR register because that's how GDB
2174      interprets these system bits.  At the moment, only the condition
2175      flags are saved in CPSR (NZCV).
2176 
2177      Stack layout, each cell is 16 bytes (descending):
2178 
2179      High *-------- SIMD&FP registers from 31 down to 0. --------*
2180 	  | q31                                                  |
2181 	  .                                                      .
2182 	  .                                                      . 32 cells
2183 	  .                                                      .
2184 	  | q0                                                   |
2185 	  *---- General purpose registers from 30 down to 0. ----*
2186 	  | x30                                                  |
2187 	  .                                                      .
2188 	  .                                                      . 31 cells
2189 	  .                                                      .
2190 	  | x0                                                   |
2191 	  *------------- Special purpose registers. -------------*
2192 	  | SP                                                   |
2193 	  | PC                                                   |
2194 	  | CPSR (NZCV)                                          | 5 cells
2195 	  | FPSR                                                 |
2196 	  | FPCR                                                 | <- SP + 16
2197 	  *------------- collecting_t object --------------------*
2198 	  | TPIDR_EL0               | struct tracepoint *        |
2199      Low  *------------------------------------------------------*
2200 
2201      After this stack is set up, we issue a call to the collector, passing
2202      it the saved registers at (SP + 16).  */
2203 
2204   /* Push SIMD&FP registers on the stack:
2205 
2206        SUB sp, sp, #(32 * 16)
2207 
2208        STP q30, q31, [sp, #(30 * 16)]
2209        ...
2210        STP q0, q1, [sp]
2211 
2212      */
2213   p += emit_sub (p, sp, sp, immediate_operand (32 * 16));
2214   for (i = 30; i >= 0; i -= 2)
2215     p += emit_stp_q_offset (p, i, i + 1, sp, i * 16);
2216 
2217   /* Push general purpose registers on the stack.  Note that we do not need
2218      to push x31 as it represents the xzr register and not the stack
2219      pointer in a STR instruction.
2220 
2221        SUB sp, sp, #(31 * 16)
2222 
2223        STR x30, [sp, #(30 * 16)]
2224        ...
2225        STR x0, [sp]
2226 
2227      */
2228   p += emit_sub (p, sp, sp, immediate_operand (31 * 16));
2229   for (i = 30; i >= 0; i -= 1)
2230     p += emit_str (p, aarch64_register (i, 1), sp,
2231 		   offset_memory_operand (i * 16));
2232 
2233   /* Make space for 5 more cells.
2234 
2235        SUB sp, sp, #(5 * 16)
2236 
2237      */
2238   p += emit_sub (p, sp, sp, immediate_operand (5 * 16));
2239 
2240 
2241   /* Save SP:
2242 
2243        ADD x4, sp, #((32 + 31 + 5) * 16)
2244        STR x4, [sp, #(4 * 16)]
2245 
2246      */
2247   p += emit_add (p, x4, sp, immediate_operand ((32 + 31 + 5) * 16));
2248   p += emit_str (p, x4, sp, offset_memory_operand (4 * 16));
2249 
2250   /* Save PC (tracepoint address):
2251 
2252        MOV  x3, #(tpaddr)
2253        ...
2254 
2255        STR x3, [sp, #(3 * 16)]
2256 
2257      */
2258 
2259   p += emit_mov_addr (p, x3, tpaddr);
2260   p += emit_str (p, x3, sp, offset_memory_operand (3 * 16));
2261 
2262   /* Save CPSR (NZCV), FPSR and FPCR:
2263 
2264        MRS x2, nzcv
2265        MRS x1, fpsr
2266        MRS x0, fpcr
2267 
2268        STR x2, [sp, #(2 * 16)]
2269        STR x1, [sp, #(1 * 16)]
2270        STR x0, [sp, #(0 * 16)]
2271 
2272      */
2273   p += emit_mrs (p, x2, NZCV);
2274   p += emit_mrs (p, x1, FPSR);
2275   p += emit_mrs (p, x0, FPCR);
2276   p += emit_str (p, x2, sp, offset_memory_operand (2 * 16));
2277   p += emit_str (p, x1, sp, offset_memory_operand (1 * 16));
2278   p += emit_str (p, x0, sp, offset_memory_operand (0 * 16));
2279 
2280   /* Push the collecting_t object.  It consist of the address of the
2281      tracepoint and an ID for the current thread.  We get the latter by
2282      reading the tpidr_el0 system register.  It corresponds to the
2283      NT_ARM_TLS register accessible with ptrace.
2284 
2285        MOV x0, #(tpoint)
2286        ...
2287 
2288        MRS x1, tpidr_el0
2289 
2290        STP x0, x1, [sp, #-16]!
2291 
2292      */
2293 
2294   p += emit_mov_addr (p, x0, tpoint);
2295   p += emit_mrs (p, x1, TPIDR_EL0);
2296   p += emit_stp (p, x0, x1, sp, preindex_memory_operand (-16));
2297 
2298   /* Spin-lock:
2299 
2300      The shared memory for the lock is at lockaddr.  It will hold zero
2301      if no-one is holding the lock, otherwise it contains the address of
2302      the collecting_t object on the stack of the thread which acquired it.
2303 
2304      At this stage, the stack pointer points to this thread's collecting_t
2305      object.
2306 
2307      We use the following registers:
2308      - x0: Address of the lock.
2309      - x1: Pointer to collecting_t object.
2310      - x2: Scratch register.
2311 
2312        MOV x0, #(lockaddr)
2313        ...
2314        MOV x1, sp
2315 
2316        ; Trigger an event local to this core.  So the following WFE
2317        ; instruction is ignored.
2318        SEVL
2319      again:
2320        ; Wait for an event.  The event is triggered by either the SEVL
2321        ; or STLR instructions (store release).
2322        WFE
2323 
2324        ; Atomically read at lockaddr.  This marks the memory location as
2325        ; exclusive.  This instruction also has memory constraints which
2326        ; make sure all previous data reads and writes are done before
2327        ; executing it.
2328        LDAXR x2, [x0]
2329 
2330        ; Try again if another thread holds the lock.
2331        CBNZ x2, again
2332 
2333        ; We can lock it!  Write the address of the collecting_t object.
2334        ; This instruction will fail if the memory location is not marked
2335        ; as exclusive anymore.  If it succeeds, it will remove the
2336        ; exclusive mark on the memory location.  This way, if another
2337        ; thread executes this instruction before us, we will fail and try
2338        ; all over again.
2339        STXR w2, x1, [x0]
2340        CBNZ w2, again
2341 
2342      */
2343 
2344   p += emit_mov_addr (p, x0, lockaddr);
2345   p += emit_mov (p, x1, register_operand (sp));
2346 
2347   p += emit_sevl (p);
2348   p += emit_wfe (p);
2349   p += emit_ldaxr (p, x2, x0);
2350   p += emit_cb (p, 1, w2, -2 * 4);
2351   p += emit_stxr (p, w2, x1, x0);
2352   p += emit_cb (p, 1, x2, -4 * 4);
2353 
2354   /* Call collector (struct tracepoint *, unsigned char *):
2355 
2356        MOV x0, #(tpoint)
2357        ...
2358 
2359        ; Saved registers start after the collecting_t object.
2360        ADD x1, sp, #16
2361 
2362        ; We use an intra-procedure-call scratch register.
2363        MOV ip0, #(collector)
2364        ...
2365 
2366        ; And call back to C!
2367        BLR ip0
2368 
2369      */
2370 
2371   p += emit_mov_addr (p, x0, tpoint);
2372   p += emit_add (p, x1, sp, immediate_operand (16));
2373 
2374   p += emit_mov_addr (p, ip0, collector);
2375   p += emit_blr (p, ip0);
2376 
2377   /* Release the lock.
2378 
2379        MOV x0, #(lockaddr)
2380        ...
2381 
2382        ; This instruction is a normal store with memory ordering
2383        ; constraints.  Thanks to this we do not have to put a data
2384        ; barrier instruction to make sure all data read and writes are done
2385        ; before this instruction is executed.  Furthermore, this instruction
2386        ; will trigger an event, letting other threads know they can grab
2387        ; the lock.
2388        STLR xzr, [x0]
2389 
2390      */
2391   p += emit_mov_addr (p, x0, lockaddr);
2392   p += emit_stlr (p, xzr, x0);
2393 
2394   /* Free collecting_t object:
2395 
2396        ADD sp, sp, #16
2397 
2398      */
2399   p += emit_add (p, sp, sp, immediate_operand (16));
2400 
2401   /* Restore CPSR (NZCV), FPSR and FPCR.  And free all special purpose
2402      registers from the stack.
2403 
2404        LDR x2, [sp, #(2 * 16)]
2405        LDR x1, [sp, #(1 * 16)]
2406        LDR x0, [sp, #(0 * 16)]
2407 
2408        MSR NZCV, x2
2409        MSR FPSR, x1
2410        MSR FPCR, x0
2411 
2412        ADD sp, sp #(5 * 16)
2413 
2414      */
2415   p += emit_ldr (p, x2, sp, offset_memory_operand (2 * 16));
2416   p += emit_ldr (p, x1, sp, offset_memory_operand (1 * 16));
2417   p += emit_ldr (p, x0, sp, offset_memory_operand (0 * 16));
2418   p += emit_msr (p, NZCV, x2);
2419   p += emit_msr (p, FPSR, x1);
2420   p += emit_msr (p, FPCR, x0);
2421 
2422   p += emit_add (p, sp, sp, immediate_operand (5 * 16));
2423 
2424   /* Pop general purpose registers:
2425 
2426        LDR x0, [sp]
2427        ...
2428        LDR x30, [sp, #(30 * 16)]
2429 
2430        ADD sp, sp, #(31 * 16)
2431 
2432      */
2433   for (i = 0; i <= 30; i += 1)
2434     p += emit_ldr (p, aarch64_register (i, 1), sp,
2435 		   offset_memory_operand (i * 16));
2436   p += emit_add (p, sp, sp, immediate_operand (31 * 16));
2437 
2438   /* Pop SIMD&FP registers:
2439 
2440        LDP q0, q1, [sp]
2441        ...
2442        LDP q30, q31, [sp, #(30 * 16)]
2443 
2444        ADD sp, sp, #(32 * 16)
2445 
2446      */
2447   for (i = 0; i <= 30; i += 2)
2448     p += emit_ldp_q_offset (p, i, i + 1, sp, i * 16);
2449   p += emit_add (p, sp, sp, immediate_operand (32 * 16));
2450 
2451   /* Write the code into the inferior memory.  */
2452   append_insns (&buildaddr, p - buf, buf);
2453 
2454   /* Now emit the relocated instruction.  */
2455   *adjusted_insn_addr = buildaddr;
2456   target_read_uint32 (tpaddr, &insn);
2457 
2458   insn_data.base.insn_addr = tpaddr;
2459   insn_data.new_addr = buildaddr;
2460   insn_data.insn_ptr = buf;
2461 
2462   aarch64_relocate_instruction (insn, &visitor,
2463 				(struct aarch64_insn_data *) &insn_data);
2464 
2465   /* We may not have been able to relocate the instruction.  */
2466   if (insn_data.insn_ptr == buf)
2467     {
2468       sprintf (err,
2469 	       "E.Could not relocate instruction from %s to %s.",
2470 	       core_addr_to_string_nz (tpaddr),
2471 	       core_addr_to_string_nz (buildaddr));
2472       return 1;
2473     }
2474   else
2475     append_insns (&buildaddr, insn_data.insn_ptr - buf, buf);
2476   *adjusted_insn_addr_end = buildaddr;
2477 
2478   /* Go back to the start of the buffer.  */
2479   p = buf;
2480 
2481   /* Emit a branch back from the jump pad.  */
2482   offset = (tpaddr + orig_size - buildaddr);
2483   if (!can_encode_int32 (offset, 28))
2484     {
2485       sprintf (err,
2486 	       "E.Jump back from jump pad too far from tracepoint "
2487 	       "(offset 0x%" PRIx64 " cannot be encoded in 28 bits).",
2488 	       offset);
2489       return 1;
2490     }
2491 
2492   p += emit_b (p, 0, offset);
2493   append_insns (&buildaddr, p - buf, buf);
2494 
2495   /* Give the caller a branch instruction into the jump pad.  */
2496   offset = (*jump_entry - tpaddr);
2497   if (!can_encode_int32 (offset, 28))
2498     {
2499       sprintf (err,
2500 	       "E.Jump pad too far from tracepoint "
2501 	       "(offset 0x%" PRIx64 " cannot be encoded in 28 bits).",
2502 	       offset);
2503       return 1;
2504     }
2505 
2506   emit_b ((uint32_t *) jjump_pad_insn, 0, offset);
2507   *jjump_pad_insn_size = 4;
2508 
2509   /* Return the end address of our pad.  */
2510   *jump_entry = buildaddr;
2511 
2512   return 0;
2513 }
2514 
2515 /* Helper function writing LEN instructions from START into
2516    current_insn_ptr.  */
2517 
2518 static void
2519 emit_ops_insns (const uint32_t *start, int len)
2520 {
2521   CORE_ADDR buildaddr = current_insn_ptr;
2522 
2523   threads_debug_printf ("Adding %d instrucions at %s",
2524 			len, paddress (buildaddr));
2525 
2526   append_insns (&buildaddr, len, start);
2527   current_insn_ptr = buildaddr;
2528 }
2529 
2530 /* Pop a register from the stack.  */
2531 
2532 static int
2533 emit_pop (uint32_t *buf, struct aarch64_register rt)
2534 {
2535   return emit_ldr (buf, rt, sp, postindex_memory_operand (1 * 16));
2536 }
2537 
2538 /* Push a register on the stack.  */
2539 
2540 static int
2541 emit_push (uint32_t *buf, struct aarch64_register rt)
2542 {
2543   return emit_str (buf, rt, sp, preindex_memory_operand (-1 * 16));
2544 }
2545 
2546 /* Implementation of emit_ops method "emit_prologue".  */
2547 
2548 static void
2549 aarch64_emit_prologue (void)
2550 {
2551   uint32_t buf[16];
2552   uint32_t *p = buf;
2553 
2554   /* This function emit a prologue for the following function prototype:
2555 
2556      enum eval_result_type f (unsigned char *regs,
2557 			      ULONGEST *value);
2558 
2559      The first argument is a buffer of raw registers.  The second
2560      argument is the result of
2561      evaluating the expression, which will be set to whatever is on top of
2562      the stack at the end.
2563 
2564      The stack set up by the prologue is as such:
2565 
2566      High *------------------------------------------------------*
2567 	  | LR                                                   |
2568 	  | FP                                                   | <- FP
2569 	  | x1  (ULONGEST *value)                                |
2570 	  | x0  (unsigned char *regs)                            |
2571      Low  *------------------------------------------------------*
2572 
2573      As we are implementing a stack machine, each opcode can expand the
2574      stack so we never know how far we are from the data saved by this
2575      prologue.  In order to be able refer to value and regs later, we save
2576      the current stack pointer in the frame pointer.  This way, it is not
2577      clobbered when calling C functions.
2578 
2579      Finally, throughout every operation, we are using register x0 as the
2580      top of the stack, and x1 as a scratch register.  */
2581 
2582   p += emit_stp (p, x0, x1, sp, preindex_memory_operand (-2 * 16));
2583   p += emit_str (p, lr, sp, offset_memory_operand (3 * 8));
2584   p += emit_str (p, fp, sp, offset_memory_operand (2 * 8));
2585 
2586   p += emit_add (p, fp, sp, immediate_operand (2 * 8));
2587 
2588 
2589   emit_ops_insns (buf, p - buf);
2590 }
2591 
2592 /* Implementation of emit_ops method "emit_epilogue".  */
2593 
2594 static void
2595 aarch64_emit_epilogue (void)
2596 {
2597   uint32_t buf[16];
2598   uint32_t *p = buf;
2599 
2600   /* Store the result of the expression (x0) in *value.  */
2601   p += emit_sub (p, x1, fp, immediate_operand (1 * 8));
2602   p += emit_ldr (p, x1, x1, offset_memory_operand (0));
2603   p += emit_str (p, x0, x1, offset_memory_operand (0));
2604 
2605   /* Restore the previous state.  */
2606   p += emit_add (p, sp, fp, immediate_operand (2 * 8));
2607   p += emit_ldp (p, fp, lr, fp, offset_memory_operand (0));
2608 
2609   /* Return expr_eval_no_error.  */
2610   p += emit_mov (p, x0, immediate_operand (expr_eval_no_error));
2611   p += emit_ret (p, lr);
2612 
2613   emit_ops_insns (buf, p - buf);
2614 }
2615 
2616 /* Implementation of emit_ops method "emit_add".  */
2617 
2618 static void
2619 aarch64_emit_add (void)
2620 {
2621   uint32_t buf[16];
2622   uint32_t *p = buf;
2623 
2624   p += emit_pop (p, x1);
2625   p += emit_add (p, x0, x1, register_operand (x0));
2626 
2627   emit_ops_insns (buf, p - buf);
2628 }
2629 
2630 /* Implementation of emit_ops method "emit_sub".  */
2631 
2632 static void
2633 aarch64_emit_sub (void)
2634 {
2635   uint32_t buf[16];
2636   uint32_t *p = buf;
2637 
2638   p += emit_pop (p, x1);
2639   p += emit_sub (p, x0, x1, register_operand (x0));
2640 
2641   emit_ops_insns (buf, p - buf);
2642 }
2643 
2644 /* Implementation of emit_ops method "emit_mul".  */
2645 
2646 static void
2647 aarch64_emit_mul (void)
2648 {
2649   uint32_t buf[16];
2650   uint32_t *p = buf;
2651 
2652   p += emit_pop (p, x1);
2653   p += emit_mul (p, x0, x1, x0);
2654 
2655   emit_ops_insns (buf, p - buf);
2656 }
2657 
2658 /* Implementation of emit_ops method "emit_lsh".  */
2659 
2660 static void
2661 aarch64_emit_lsh (void)
2662 {
2663   uint32_t buf[16];
2664   uint32_t *p = buf;
2665 
2666   p += emit_pop (p, x1);
2667   p += emit_lslv (p, x0, x1, x0);
2668 
2669   emit_ops_insns (buf, p - buf);
2670 }
2671 
2672 /* Implementation of emit_ops method "emit_rsh_signed".  */
2673 
2674 static void
2675 aarch64_emit_rsh_signed (void)
2676 {
2677   uint32_t buf[16];
2678   uint32_t *p = buf;
2679 
2680   p += emit_pop (p, x1);
2681   p += emit_asrv (p, x0, x1, x0);
2682 
2683   emit_ops_insns (buf, p - buf);
2684 }
2685 
2686 /* Implementation of emit_ops method "emit_rsh_unsigned".  */
2687 
2688 static void
2689 aarch64_emit_rsh_unsigned (void)
2690 {
2691   uint32_t buf[16];
2692   uint32_t *p = buf;
2693 
2694   p += emit_pop (p, x1);
2695   p += emit_lsrv (p, x0, x1, x0);
2696 
2697   emit_ops_insns (buf, p - buf);
2698 }
2699 
2700 /* Implementation of emit_ops method "emit_ext".  */
2701 
2702 static void
2703 aarch64_emit_ext (int arg)
2704 {
2705   uint32_t buf[16];
2706   uint32_t *p = buf;
2707 
2708   p += emit_sbfx (p, x0, x0, 0, arg);
2709 
2710   emit_ops_insns (buf, p - buf);
2711 }
2712 
2713 /* Implementation of emit_ops method "emit_log_not".  */
2714 
2715 static void
2716 aarch64_emit_log_not (void)
2717 {
2718   uint32_t buf[16];
2719   uint32_t *p = buf;
2720 
2721   /* If the top of the stack is 0, replace it with 1.  Else replace it with
2722      0.  */
2723 
2724   p += emit_cmp (p, x0, immediate_operand (0));
2725   p += emit_cset (p, x0, EQ);
2726 
2727   emit_ops_insns (buf, p - buf);
2728 }
2729 
2730 /* Implementation of emit_ops method "emit_bit_and".  */
2731 
2732 static void
2733 aarch64_emit_bit_and (void)
2734 {
2735   uint32_t buf[16];
2736   uint32_t *p = buf;
2737 
2738   p += emit_pop (p, x1);
2739   p += emit_and (p, x0, x0, x1);
2740 
2741   emit_ops_insns (buf, p - buf);
2742 }
2743 
2744 /* Implementation of emit_ops method "emit_bit_or".  */
2745 
2746 static void
2747 aarch64_emit_bit_or (void)
2748 {
2749   uint32_t buf[16];
2750   uint32_t *p = buf;
2751 
2752   p += emit_pop (p, x1);
2753   p += emit_orr (p, x0, x0, x1);
2754 
2755   emit_ops_insns (buf, p - buf);
2756 }
2757 
2758 /* Implementation of emit_ops method "emit_bit_xor".  */
2759 
2760 static void
2761 aarch64_emit_bit_xor (void)
2762 {
2763   uint32_t buf[16];
2764   uint32_t *p = buf;
2765 
2766   p += emit_pop (p, x1);
2767   p += emit_eor (p, x0, x0, x1);
2768 
2769   emit_ops_insns (buf, p - buf);
2770 }
2771 
2772 /* Implementation of emit_ops method "emit_bit_not".  */
2773 
2774 static void
2775 aarch64_emit_bit_not (void)
2776 {
2777   uint32_t buf[16];
2778   uint32_t *p = buf;
2779 
2780   p += emit_mvn (p, x0, x0);
2781 
2782   emit_ops_insns (buf, p - buf);
2783 }
2784 
2785 /* Implementation of emit_ops method "emit_equal".  */
2786 
2787 static void
2788 aarch64_emit_equal (void)
2789 {
2790   uint32_t buf[16];
2791   uint32_t *p = buf;
2792 
2793   p += emit_pop (p, x1);
2794   p += emit_cmp (p, x0, register_operand (x1));
2795   p += emit_cset (p, x0, EQ);
2796 
2797   emit_ops_insns (buf, p - buf);
2798 }
2799 
2800 /* Implementation of emit_ops method "emit_less_signed".  */
2801 
2802 static void
2803 aarch64_emit_less_signed (void)
2804 {
2805   uint32_t buf[16];
2806   uint32_t *p = buf;
2807 
2808   p += emit_pop (p, x1);
2809   p += emit_cmp (p, x1, register_operand (x0));
2810   p += emit_cset (p, x0, LT);
2811 
2812   emit_ops_insns (buf, p - buf);
2813 }
2814 
2815 /* Implementation of emit_ops method "emit_less_unsigned".  */
2816 
2817 static void
2818 aarch64_emit_less_unsigned (void)
2819 {
2820   uint32_t buf[16];
2821   uint32_t *p = buf;
2822 
2823   p += emit_pop (p, x1);
2824   p += emit_cmp (p, x1, register_operand (x0));
2825   p += emit_cset (p, x0, LO);
2826 
2827   emit_ops_insns (buf, p - buf);
2828 }
2829 
2830 /* Implementation of emit_ops method "emit_ref".  */
2831 
2832 static void
2833 aarch64_emit_ref (int size)
2834 {
2835   uint32_t buf[16];
2836   uint32_t *p = buf;
2837 
2838   switch (size)
2839     {
2840     case 1:
2841       p += emit_ldrb (p, w0, x0, offset_memory_operand (0));
2842       break;
2843     case 2:
2844       p += emit_ldrh (p, w0, x0, offset_memory_operand (0));
2845       break;
2846     case 4:
2847       p += emit_ldr (p, w0, x0, offset_memory_operand (0));
2848       break;
2849     case 8:
2850       p += emit_ldr (p, x0, x0, offset_memory_operand (0));
2851       break;
2852     default:
2853       /* Unknown size, bail on compilation.  */
2854       emit_error = 1;
2855       break;
2856     }
2857 
2858   emit_ops_insns (buf, p - buf);
2859 }
2860 
2861 /* Implementation of emit_ops method "emit_if_goto".  */
2862 
2863 static void
2864 aarch64_emit_if_goto (int *offset_p, int *size_p)
2865 {
2866   uint32_t buf[16];
2867   uint32_t *p = buf;
2868 
2869   /* The Z flag is set or cleared here.  */
2870   p += emit_cmp (p, x0, immediate_operand (0));
2871   /* This instruction must not change the Z flag.  */
2872   p += emit_pop (p, x0);
2873   /* Branch over the next instruction if x0 == 0.  */
2874   p += emit_bcond (p, EQ, 8);
2875 
2876   /* The NOP instruction will be patched with an unconditional branch.  */
2877   if (offset_p)
2878     *offset_p = (p - buf) * 4;
2879   if (size_p)
2880     *size_p = 4;
2881   p += emit_nop (p);
2882 
2883   emit_ops_insns (buf, p - buf);
2884 }
2885 
2886 /* Implementation of emit_ops method "emit_goto".  */
2887 
2888 static void
2889 aarch64_emit_goto (int *offset_p, int *size_p)
2890 {
2891   uint32_t buf[16];
2892   uint32_t *p = buf;
2893 
2894   /* The NOP instruction will be patched with an unconditional branch.  */
2895   if (offset_p)
2896     *offset_p = 0;
2897   if (size_p)
2898     *size_p = 4;
2899   p += emit_nop (p);
2900 
2901   emit_ops_insns (buf, p - buf);
2902 }
2903 
2904 /* Implementation of emit_ops method "write_goto_address".  */
2905 
2906 static void
2907 aarch64_write_goto_address (CORE_ADDR from, CORE_ADDR to, int size)
2908 {
2909   uint32_t insn;
2910 
2911   emit_b (&insn, 0, to - from);
2912   append_insns (&from, 1, &insn);
2913 }
2914 
2915 /* Implementation of emit_ops method "emit_const".  */
2916 
2917 static void
2918 aarch64_emit_const (LONGEST num)
2919 {
2920   uint32_t buf[16];
2921   uint32_t *p = buf;
2922 
2923   p += emit_mov_addr (p, x0, num);
2924 
2925   emit_ops_insns (buf, p - buf);
2926 }
2927 
2928 /* Implementation of emit_ops method "emit_call".  */
2929 
2930 static void
2931 aarch64_emit_call (CORE_ADDR fn)
2932 {
2933   uint32_t buf[16];
2934   uint32_t *p = buf;
2935 
2936   p += emit_mov_addr (p, ip0, fn);
2937   p += emit_blr (p, ip0);
2938 
2939   emit_ops_insns (buf, p - buf);
2940 }
2941 
2942 /* Implementation of emit_ops method "emit_reg".  */
2943 
2944 static void
2945 aarch64_emit_reg (int reg)
2946 {
2947   uint32_t buf[16];
2948   uint32_t *p = buf;
2949 
2950   /* Set x0 to unsigned char *regs.  */
2951   p += emit_sub (p, x0, fp, immediate_operand (2 * 8));
2952   p += emit_ldr (p, x0, x0, offset_memory_operand (0));
2953   p += emit_mov (p, x1, immediate_operand (reg));
2954 
2955   emit_ops_insns (buf, p - buf);
2956 
2957   aarch64_emit_call (get_raw_reg_func_addr ());
2958 }
2959 
2960 /* Implementation of emit_ops method "emit_pop".  */
2961 
2962 static void
2963 aarch64_emit_pop (void)
2964 {
2965   uint32_t buf[16];
2966   uint32_t *p = buf;
2967 
2968   p += emit_pop (p, x0);
2969 
2970   emit_ops_insns (buf, p - buf);
2971 }
2972 
2973 /* Implementation of emit_ops method "emit_stack_flush".  */
2974 
2975 static void
2976 aarch64_emit_stack_flush (void)
2977 {
2978   uint32_t buf[16];
2979   uint32_t *p = buf;
2980 
2981   p += emit_push (p, x0);
2982 
2983   emit_ops_insns (buf, p - buf);
2984 }
2985 
2986 /* Implementation of emit_ops method "emit_zero_ext".  */
2987 
2988 static void
2989 aarch64_emit_zero_ext (int arg)
2990 {
2991   uint32_t buf[16];
2992   uint32_t *p = buf;
2993 
2994   p += emit_ubfx (p, x0, x0, 0, arg);
2995 
2996   emit_ops_insns (buf, p - buf);
2997 }
2998 
2999 /* Implementation of emit_ops method "emit_swap".  */
3000 
3001 static void
3002 aarch64_emit_swap (void)
3003 {
3004   uint32_t buf[16];
3005   uint32_t *p = buf;
3006 
3007   p += emit_ldr (p, x1, sp, offset_memory_operand (0 * 16));
3008   p += emit_str (p, x0, sp, offset_memory_operand (0 * 16));
3009   p += emit_mov (p, x0, register_operand (x1));
3010 
3011   emit_ops_insns (buf, p - buf);
3012 }
3013 
3014 /* Implementation of emit_ops method "emit_stack_adjust".  */
3015 
3016 static void
3017 aarch64_emit_stack_adjust (int n)
3018 {
3019   /* This is not needed with our design.  */
3020   uint32_t buf[16];
3021   uint32_t *p = buf;
3022 
3023   p += emit_add (p, sp, sp, immediate_operand (n * 16));
3024 
3025   emit_ops_insns (buf, p - buf);
3026 }
3027 
3028 /* Implementation of emit_ops method "emit_int_call_1".  */
3029 
3030 static void
3031 aarch64_emit_int_call_1 (CORE_ADDR fn, int arg1)
3032 {
3033   uint32_t buf[16];
3034   uint32_t *p = buf;
3035 
3036   p += emit_mov (p, x0, immediate_operand (arg1));
3037 
3038   emit_ops_insns (buf, p - buf);
3039 
3040   aarch64_emit_call (fn);
3041 }
3042 
3043 /* Implementation of emit_ops method "emit_void_call_2".  */
3044 
3045 static void
3046 aarch64_emit_void_call_2 (CORE_ADDR fn, int arg1)
3047 {
3048   uint32_t buf[16];
3049   uint32_t *p = buf;
3050 
3051   /* Push x0 on the stack.  */
3052   aarch64_emit_stack_flush ();
3053 
3054   /* Setup arguments for the function call:
3055 
3056      x0: arg1
3057      x1: top of the stack
3058 
3059        MOV x1, x0
3060        MOV x0, #arg1  */
3061 
3062   p += emit_mov (p, x1, register_operand (x0));
3063   p += emit_mov (p, x0, immediate_operand (arg1));
3064 
3065   emit_ops_insns (buf, p - buf);
3066 
3067   aarch64_emit_call (fn);
3068 
3069   /* Restore x0.  */
3070   aarch64_emit_pop ();
3071 }
3072 
3073 /* Implementation of emit_ops method "emit_eq_goto".  */
3074 
3075 static void
3076 aarch64_emit_eq_goto (int *offset_p, int *size_p)
3077 {
3078   uint32_t buf[16];
3079   uint32_t *p = buf;
3080 
3081   p += emit_pop (p, x1);
3082   p += emit_cmp (p, x1, register_operand (x0));
3083   /* Branch over the next instruction if x0 != x1.  */
3084   p += emit_bcond (p, NE, 8);
3085   /* The NOP instruction will be patched with an unconditional branch.  */
3086   if (offset_p)
3087     *offset_p = (p - buf) * 4;
3088   if (size_p)
3089     *size_p = 4;
3090   p += emit_nop (p);
3091 
3092   emit_ops_insns (buf, p - buf);
3093 }
3094 
3095 /* Implementation of emit_ops method "emit_ne_goto".  */
3096 
3097 static void
3098 aarch64_emit_ne_goto (int *offset_p, int *size_p)
3099 {
3100   uint32_t buf[16];
3101   uint32_t *p = buf;
3102 
3103   p += emit_pop (p, x1);
3104   p += emit_cmp (p, x1, register_operand (x0));
3105   /* Branch over the next instruction if x0 == x1.  */
3106   p += emit_bcond (p, EQ, 8);
3107   /* The NOP instruction will be patched with an unconditional branch.  */
3108   if (offset_p)
3109     *offset_p = (p - buf) * 4;
3110   if (size_p)
3111     *size_p = 4;
3112   p += emit_nop (p);
3113 
3114   emit_ops_insns (buf, p - buf);
3115 }
3116 
3117 /* Implementation of emit_ops method "emit_lt_goto".  */
3118 
3119 static void
3120 aarch64_emit_lt_goto (int *offset_p, int *size_p)
3121 {
3122   uint32_t buf[16];
3123   uint32_t *p = buf;
3124 
3125   p += emit_pop (p, x1);
3126   p += emit_cmp (p, x1, register_operand (x0));
3127   /* Branch over the next instruction if x0 >= x1.  */
3128   p += emit_bcond (p, GE, 8);
3129   /* The NOP instruction will be patched with an unconditional branch.  */
3130   if (offset_p)
3131     *offset_p = (p - buf) * 4;
3132   if (size_p)
3133     *size_p = 4;
3134   p += emit_nop (p);
3135 
3136   emit_ops_insns (buf, p - buf);
3137 }
3138 
3139 /* Implementation of emit_ops method "emit_le_goto".  */
3140 
3141 static void
3142 aarch64_emit_le_goto (int *offset_p, int *size_p)
3143 {
3144   uint32_t buf[16];
3145   uint32_t *p = buf;
3146 
3147   p += emit_pop (p, x1);
3148   p += emit_cmp (p, x1, register_operand (x0));
3149   /* Branch over the next instruction if x0 > x1.  */
3150   p += emit_bcond (p, GT, 8);
3151   /* The NOP instruction will be patched with an unconditional branch.  */
3152   if (offset_p)
3153     *offset_p = (p - buf) * 4;
3154   if (size_p)
3155     *size_p = 4;
3156   p += emit_nop (p);
3157 
3158   emit_ops_insns (buf, p - buf);
3159 }
3160 
3161 /* Implementation of emit_ops method "emit_gt_goto".  */
3162 
3163 static void
3164 aarch64_emit_gt_goto (int *offset_p, int *size_p)
3165 {
3166   uint32_t buf[16];
3167   uint32_t *p = buf;
3168 
3169   p += emit_pop (p, x1);
3170   p += emit_cmp (p, x1, register_operand (x0));
3171   /* Branch over the next instruction if x0 <= x1.  */
3172   p += emit_bcond (p, LE, 8);
3173   /* The NOP instruction will be patched with an unconditional branch.  */
3174   if (offset_p)
3175     *offset_p = (p - buf) * 4;
3176   if (size_p)
3177     *size_p = 4;
3178   p += emit_nop (p);
3179 
3180   emit_ops_insns (buf, p - buf);
3181 }
3182 
3183 /* Implementation of emit_ops method "emit_ge_got".  */
3184 
3185 static void
3186 aarch64_emit_ge_got (int *offset_p, int *size_p)
3187 {
3188   uint32_t buf[16];
3189   uint32_t *p = buf;
3190 
3191   p += emit_pop (p, x1);
3192   p += emit_cmp (p, x1, register_operand (x0));
3193   /* Branch over the next instruction if x0 <= x1.  */
3194   p += emit_bcond (p, LT, 8);
3195   /* The NOP instruction will be patched with an unconditional branch.  */
3196   if (offset_p)
3197     *offset_p = (p - buf) * 4;
3198   if (size_p)
3199     *size_p = 4;
3200   p += emit_nop (p);
3201 
3202   emit_ops_insns (buf, p - buf);
3203 }
3204 
3205 static struct emit_ops aarch64_emit_ops_impl =
3206 {
3207   aarch64_emit_prologue,
3208   aarch64_emit_epilogue,
3209   aarch64_emit_add,
3210   aarch64_emit_sub,
3211   aarch64_emit_mul,
3212   aarch64_emit_lsh,
3213   aarch64_emit_rsh_signed,
3214   aarch64_emit_rsh_unsigned,
3215   aarch64_emit_ext,
3216   aarch64_emit_log_not,
3217   aarch64_emit_bit_and,
3218   aarch64_emit_bit_or,
3219   aarch64_emit_bit_xor,
3220   aarch64_emit_bit_not,
3221   aarch64_emit_equal,
3222   aarch64_emit_less_signed,
3223   aarch64_emit_less_unsigned,
3224   aarch64_emit_ref,
3225   aarch64_emit_if_goto,
3226   aarch64_emit_goto,
3227   aarch64_write_goto_address,
3228   aarch64_emit_const,
3229   aarch64_emit_call,
3230   aarch64_emit_reg,
3231   aarch64_emit_pop,
3232   aarch64_emit_stack_flush,
3233   aarch64_emit_zero_ext,
3234   aarch64_emit_swap,
3235   aarch64_emit_stack_adjust,
3236   aarch64_emit_int_call_1,
3237   aarch64_emit_void_call_2,
3238   aarch64_emit_eq_goto,
3239   aarch64_emit_ne_goto,
3240   aarch64_emit_lt_goto,
3241   aarch64_emit_le_goto,
3242   aarch64_emit_gt_goto,
3243   aarch64_emit_ge_got,
3244 };
3245 
3246 /* Implementation of target ops method "emit_ops".  */
3247 
3248 emit_ops *
3249 aarch64_target::emit_ops ()
3250 {
3251   return &aarch64_emit_ops_impl;
3252 }
3253 
3254 /* Implementation of target ops method
3255    "get_min_fast_tracepoint_insn_len".  */
3256 
3257 int
3258 aarch64_target::get_min_fast_tracepoint_insn_len ()
3259 {
3260   return 4;
3261 }
3262 
3263 /* Implementation of linux target ops method "low_supports_range_stepping".  */
3264 
3265 bool
3266 aarch64_target::low_supports_range_stepping ()
3267 {
3268   return true;
3269 }
3270 
3271 /* Implementation of target ops method "sw_breakpoint_from_kind".  */
3272 
3273 const gdb_byte *
3274 aarch64_target::sw_breakpoint_from_kind (int kind, int *size)
3275 {
3276   if (is_64bit_tdesc ())
3277     {
3278       *size = aarch64_breakpoint_len;
3279       return aarch64_breakpoint;
3280     }
3281   else
3282     return arm_sw_breakpoint_from_kind (kind, size);
3283 }
3284 
3285 /* Implementation of target ops method "breakpoint_kind_from_pc".  */
3286 
3287 int
3288 aarch64_target::breakpoint_kind_from_pc (CORE_ADDR *pcptr)
3289 {
3290   if (is_64bit_tdesc ())
3291     return aarch64_breakpoint_len;
3292   else
3293     return arm_breakpoint_kind_from_pc (pcptr);
3294 }
3295 
3296 /* Implementation of the target ops method
3297    "breakpoint_kind_from_current_state".  */
3298 
3299 int
3300 aarch64_target::breakpoint_kind_from_current_state (CORE_ADDR *pcptr)
3301 {
3302   if (is_64bit_tdesc ())
3303     return aarch64_breakpoint_len;
3304   else
3305     return arm_breakpoint_kind_from_current_state (pcptr);
3306 }
3307 
3308 /* Returns true if memory tagging is supported.  */
3309 bool
3310 aarch64_target::supports_memory_tagging ()
3311 {
3312   if (current_thread == NULL)
3313     {
3314       /* We don't have any processes running, so don't attempt to
3315 	 use linux_get_hwcap2 as it will try to fetch the current
3316 	 thread id.  Instead, just fetch the auxv from the self
3317 	 PID.  */
3318 #ifdef HAVE_GETAUXVAL
3319       return (getauxval (AT_HWCAP2) & HWCAP2_MTE) != 0;
3320 #else
3321       return true;
3322 #endif
3323     }
3324 
3325   return (linux_get_hwcap2 (8) & HWCAP2_MTE) != 0;
3326 }
3327 
3328 bool
3329 aarch64_target::fetch_memtags (CORE_ADDR address, size_t len,
3330 			       gdb::byte_vector &tags, int type)
3331 {
3332   /* Allocation tags are per-process, so any tid is fine.  */
3333   int tid = lwpid_of (current_thread);
3334 
3335   /* Allocation tag?  */
3336   if (type == static_cast <int> (aarch64_memtag_type::mte_allocation))
3337     return aarch64_mte_fetch_memtags (tid, address, len, tags);
3338 
3339   return false;
3340 }
3341 
3342 bool
3343 aarch64_target::store_memtags (CORE_ADDR address, size_t len,
3344 			       const gdb::byte_vector &tags, int type)
3345 {
3346   /* Allocation tags are per-process, so any tid is fine.  */
3347   int tid = lwpid_of (current_thread);
3348 
3349   /* Allocation tag?  */
3350   if (type == static_cast <int> (aarch64_memtag_type::mte_allocation))
3351     return aarch64_mte_store_memtags (tid, address, len, tags);
3352 
3353   return false;
3354 }
3355 
3356 /* The linux target ops object.  */
3357 
3358 linux_process_target *the_linux_target = &the_aarch64_target;
3359 
3360 void
3361 initialize_low_arch (void)
3362 {
3363   initialize_low_arch_aarch32 ();
3364 
3365   initialize_regsets_info (&aarch64_regsets_info);
3366 }
3367