]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdbserver/linux-aarch64-low.cc
gdbsupport: move libxxhash configure check to gdbsupport
[thirdparty/binutils-gdb.git] / gdbserver / linux-aarch64-low.cc
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 }