19#include "gdbsupport/common-defs.h"
36 return (insn & mask) == pattern;
51 unsigned *rd, int32_t *offset)
57 uint32_t immlo = (insn >> 29) & 0x3;
58 int32_t immhi =
sbits (insn, 5, 23) * 4;
60 *is_adrp = (insn >> 31) & 0x1;
61 *rd = (insn >> 0) & 0x1f;
67 *offset = (immhi | immlo) * 4096;
70 *offset = (immhi | immlo);
73 core_addr_to_string_nz (addr), insn,
74 *is_adrp ?
"adrp" :
"adr", *rd);
98 *is_bl = (insn >> 31) & 0x1;
99 *offset =
sbits (insn, 0, 25) * 4;
103 debug_printf (
"decode: 0x%s 0x%x %s 0x%s\n",
104 core_addr_to_string_nz (addr), insn,
106 core_addr_to_string_nz (addr + *offset));
131 *cond = (insn >> 0) & 0xf;
132 *offset =
sbits (insn, 5, 23) * 4;
136 debug_printf (
"decode: 0x%s 0x%x b<%u> 0x%s\n",
137 core_addr_to_string_nz (addr), insn, *cond,
138 core_addr_to_string_nz (addr + *offset));
158 unsigned *rn, int32_t *offset)
164 *rn = (insn >> 0) & 0x1f;
165 *is64 = (insn >> 31) & 0x1;
166 *is_cbnz = (insn >> 24) & 0x1;
167 *offset =
sbits (insn, 5, 23) * 4;
171 debug_printf (
"decode: 0x%s 0x%x %s 0x%s\n",
172 core_addr_to_string_nz (addr), insn,
173 *is_cbnz ?
"cbnz" :
"cbz",
174 core_addr_to_string_nz (addr + *offset));
194 unsigned *
bit,
unsigned *rt, int32_t *imm)
200 *rt = (insn >> 0) & 0x1f;
201 *is_tbnz = (insn >> 24) & 0x1;
202 *
bit = ((insn >> (31 - 4)) & 0x20) | ((insn >> 19) & 0x1f);
203 *imm =
sbits (insn, 5, 18) * 4;
207 debug_printf (
"decode: 0x%s 0x%x %s x%u, #%u, 0x%s\n",
208 core_addr_to_string_nz (addr), insn,
209 *is_tbnz ?
"tbnz" :
"tbz", *rt, *
bit,
210 core_addr_to_string_nz (addr + *imm));
231 int *is64,
unsigned *rt, int32_t *offset)
235 if ((insn & 0x3f000000) == 0x18000000)
237 *is_w = (insn >> 31) & 0x1;
245 *is64 = (insn >> 30) & 0x1;
247 *rt = (insn >> 0) & 0x1f;
248 *offset =
sbits (insn, 5, 23) * 4;
251 debug_printf (
"decode: %s 0x%x %s %s%u, #?\n",
252 core_addr_to_string_nz (addr), insn,
253 *is_w ?
"ldrsw" :
"ldr",
254 *is64 ?
"x" :
"w", *rt);
297 visitor->
cb (offset, is_cbnz, rn, is64, data);
331 switch (operand.
type)
344 uint32_t post_index =
ENCODE (1, 2, 10);
355 uint32_t pre_index =
ENCODE (3, 2, 10);
int aarch64_decode_b(CORE_ADDR addr, uint32_t insn, int *is_bl, int32_t *offset)
int aarch64_decode_adr(CORE_ADDR addr, uint32_t insn, int *is_adrp, unsigned *rd, int32_t *offset)
int aarch64_emit_load_store(uint32_t *buf, uint32_t size, enum aarch64_opcodes opcode, struct aarch64_register rt, struct aarch64_register rn, struct aarch64_memory_operand operand)
int aarch64_decode_cb(CORE_ADDR addr, uint32_t insn, int *is64, int *is_cbnz, unsigned *rn, int32_t *offset)
int aarch64_emit_insn(uint32_t *buf, uint32_t insn)
int aarch64_decode_bcond(CORE_ADDR addr, uint32_t insn, unsigned *cond, int32_t *offset)
void aarch64_relocate_instruction(uint32_t insn, const struct aarch64_insn_visitor *visitor, struct aarch64_insn_data *data)
int aarch64_decode_ldr_literal(CORE_ADDR addr, uint32_t insn, int *is_w, int *is64, unsigned *rt, int32_t *offset)
static int decode_masked_match(uint32_t insn, uint32_t mask, uint32_t pattern)
int aarch64_decode_tb(CORE_ADDR addr, uint32_t insn, int *is_tbnz, unsigned *bit, unsigned *rt, int32_t *imm)
#define sbits(obj, st, fn)
#define aarch64_debug_printf(fmt,...)
@ MEMORY_OPERAND_PREINDEX
@ MEMORY_OPERAND_POSTINDEX
#define ENCODE(val, size, offset)
static const struct aarch64_insn_visitor visitor
void(* ldr_literal)(const int32_t offset, const int is_sw, const unsigned rt, const int is64, struct aarch64_insn_data *data)
void(* tb)(const int32_t offset, int is_tbnz, const unsigned rt, unsigned bit, struct aarch64_insn_data *data)
void(* b_cond)(const unsigned cond, const int32_t offset, struct aarch64_insn_data *data)
void(* adr)(const int32_t offset, const unsigned rd, const int is_adrp, struct aarch64_insn_data *data)
void(* others)(const uint32_t insn, struct aarch64_insn_data *data)
void(* cb)(const int32_t offset, const int is_cbnz, const unsigned rn, int is64, struct aarch64_insn_data *data)
void(* b)(const int is_bl, const int32_t offset, struct aarch64_insn_data *data)
enum aarch64_memory_operand_type type