arm64: introduce aarch64_insn_gen_load_store_reg()
Introduce function to generate load/store (register offset) instructions. Signed-off-by: Zi Shen Lim <zlim.lnx@gmail.com> Acked-by: Will Deacon <will.deacon@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com>
此提交包含在:
@@ -72,6 +72,7 @@ enum aarch64_insn_imm_type {
|
||||
enum aarch64_insn_register_type {
|
||||
AARCH64_INSN_REGTYPE_RT,
|
||||
AARCH64_INSN_REGTYPE_RN,
|
||||
AARCH64_INSN_REGTYPE_RM,
|
||||
};
|
||||
|
||||
enum aarch64_insn_register {
|
||||
@@ -143,12 +144,26 @@ enum aarch64_insn_branch_type {
|
||||
AARCH64_INSN_BRANCH_COMP_NONZERO,
|
||||
};
|
||||
|
||||
enum aarch64_insn_size_type {
|
||||
AARCH64_INSN_SIZE_8,
|
||||
AARCH64_INSN_SIZE_16,
|
||||
AARCH64_INSN_SIZE_32,
|
||||
AARCH64_INSN_SIZE_64,
|
||||
};
|
||||
|
||||
enum aarch64_insn_ldst_type {
|
||||
AARCH64_INSN_LDST_LOAD_REG_OFFSET,
|
||||
AARCH64_INSN_LDST_STORE_REG_OFFSET,
|
||||
};
|
||||
|
||||
#define __AARCH64_INSN_FUNCS(abbr, mask, val) \
|
||||
static __always_inline bool aarch64_insn_is_##abbr(u32 code) \
|
||||
{ return (code & (mask)) == (val); } \
|
||||
static __always_inline u32 aarch64_insn_get_##abbr##_value(void) \
|
||||
{ return (val); }
|
||||
|
||||
__AARCH64_INSN_FUNCS(str_reg, 0x3FE0EC00, 0x38206800)
|
||||
__AARCH64_INSN_FUNCS(ldr_reg, 0x3FE0EC00, 0x38606800)
|
||||
__AARCH64_INSN_FUNCS(b, 0xFC000000, 0x14000000)
|
||||
__AARCH64_INSN_FUNCS(bl, 0xFC000000, 0x94000000)
|
||||
__AARCH64_INSN_FUNCS(cbz, 0xFE000000, 0x34000000)
|
||||
@@ -184,6 +199,11 @@ u32 aarch64_insn_gen_hint(enum aarch64_insn_hint_op op);
|
||||
u32 aarch64_insn_gen_nop(void);
|
||||
u32 aarch64_insn_gen_branch_reg(enum aarch64_insn_register reg,
|
||||
enum aarch64_insn_branch_type type);
|
||||
u32 aarch64_insn_gen_load_store_reg(enum aarch64_insn_register reg,
|
||||
enum aarch64_insn_register base,
|
||||
enum aarch64_insn_register offset,
|
||||
enum aarch64_insn_size_type size,
|
||||
enum aarch64_insn_ldst_type type);
|
||||
|
||||
bool aarch64_insn_hotpatch_safe(u32 old_insn, u32 new_insn);
|
||||
|
||||
|
新增問題並參考
封鎖使用者