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