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