19#ifndef ARCH_AARCH64_INSN_H
20#define ARCH_AARCH64_INSN_H
26#define aarch64_debug_printf(fmt, ...) \
27 debug_prefixed_printf_cond (aarch64_debug, "aarch64", fmt, ##__VA_ARGS__)
32#define submask(x) ((1L << ((x) + 1)) - 1)
35#define bits(obj,st,fn) (((obj) >> (st)) & submask ((fn) - (st)))
38#define bit(obj,st) (((obj) >> (st)) & 1)
42#define sbits(obj,st,fn) \
43 ((long) (bits(obj,st,fn) | ((long) bit(obj,fn) * ~ submask (fn - st))))
48#define IS_BTI(instruction) ((instruction & 0xffffff3f) == 0xd503241f)
182#define ENCODE(val, size, offset) \
183 ((uint32_t) ((val & ((1ULL << size) - 1)) << offset))
186 unsigned *rd, int32_t *offset);
195 int *is_cbnz,
unsigned *rn, int32_t *offset);
198 unsigned *
bit,
unsigned *rt, int32_t *imm);
201 int *is64,
unsigned *rt, int32_t *offset);
216 void (*
b) (
const int is_bl,
const int32_t offset,
220 void (*
b_cond) (
const unsigned cond,
const int32_t offset,
224 void (*
cb) (
const int32_t offset,
const int is_cbnz,
225 const unsigned rn,
int is64,
229 void (*
tb) (
const int32_t offset,
int is_tbnz,
230 const unsigned rt,
unsigned bit,
234 void (*
adr) (
const int32_t offset,
const unsigned rd,
239 const unsigned rt,
const int is64,
250#define can_encode_int32(val, bits) \
251 (((val) >> (bits)) == 0 || ((val) >> (bits)) == -1)
263#define emit_b(buf, is_bl, offset) \
264 aarch64_emit_insn (buf, ((is_bl) ? BL : B) | (ENCODE ((offset) >> 2, 26, 0)))
275#define emit_bcond(buf, cond, offset) \
276 aarch64_emit_insn (buf, \
277 BCOND | ENCODE ((offset) >> 2, 19, 5) \
278 | ENCODE ((cond), 4, 0))
291#define emit_cb(buf, is_cbnz, rt, offset) \
292 aarch64_emit_insn (buf, \
293 ((is_cbnz) ? CBNZ : CBZ) \
294 | ENCODE (rt.is64, 1, 31) \
295 | ENCODE (offset >> 2, 19, 5) \
296 | ENCODE (rt.num, 5, 0))
309#define emit_ldr(buf, rt, rn, operand) \
310 aarch64_emit_load_store (buf, rt.is64 ? 3 : 2, LDR, rt, rn, operand)
323#define emit_ldrsw(buf, rt, rn, operand) \
324 aarch64_emit_load_store (buf, 3, LDRSW, rt, rn, operand)
339#define emit_tb(buf, is_tbnz, bit, rt, offset) \
340 aarch64_emit_insn (buf, \
341 ((is_tbnz) ? TBNZ: TBZ) \
342 | ENCODE (bit >> 5, 1, 31) \
343 | ENCODE (bit, 5, 19) \
344 | ENCODE (offset >> 2, 14, 5) \
345 | ENCODE (rt.num, 5, 0))
349#define emit_nop(buf) aarch64_emit_insn (buf, NOP)
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)
aarch64_memory_operand_type
@ MEMORY_OPERAND_PREINDEX
@ MEMORY_OPERAND_POSTINDEX
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)
int aarch64_decode_tb(CORE_ADDR addr, uint32_t insn, int *is_tbnz, unsigned *bit, unsigned *rt, int32_t *imm)
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