arm64: Add helper to decode register from instruction
Add a helper to extract the register field from a given instruction. Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Will Deacon <will.deacon@arm.com> Cc: Mark Rutland <mark.rutland@arm.com> Reviewed-by: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com>
This commit is contained in:
parent
c9ee0f9866
commit
8c2dcbd2c4
|
@ -332,6 +332,8 @@ bool aarch64_insn_is_branch(u32 insn);
|
||||||
u64 aarch64_insn_decode_immediate(enum aarch64_insn_imm_type type, u32 insn);
|
u64 aarch64_insn_decode_immediate(enum aarch64_insn_imm_type type, u32 insn);
|
||||||
u32 aarch64_insn_encode_immediate(enum aarch64_insn_imm_type type,
|
u32 aarch64_insn_encode_immediate(enum aarch64_insn_imm_type type,
|
||||||
u32 insn, u64 imm);
|
u32 insn, u64 imm);
|
||||||
|
u32 aarch64_insn_decode_register(enum aarch64_insn_register_type type,
|
||||||
|
u32 insn);
|
||||||
u32 aarch64_insn_gen_branch_imm(unsigned long pc, unsigned long addr,
|
u32 aarch64_insn_gen_branch_imm(unsigned long pc, unsigned long addr,
|
||||||
enum aarch64_insn_branch_type type);
|
enum aarch64_insn_branch_type type);
|
||||||
u32 aarch64_insn_gen_comp_branch_imm(unsigned long pc, unsigned long addr,
|
u32 aarch64_insn_gen_comp_branch_imm(unsigned long pc, unsigned long addr,
|
||||||
|
|
|
@ -417,6 +417,35 @@ u32 __kprobes aarch64_insn_encode_immediate(enum aarch64_insn_imm_type type,
|
||||||
return insn;
|
return insn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u32 aarch64_insn_decode_register(enum aarch64_insn_register_type type,
|
||||||
|
u32 insn)
|
||||||
|
{
|
||||||
|
int shift;
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case AARCH64_INSN_REGTYPE_RT:
|
||||||
|
case AARCH64_INSN_REGTYPE_RD:
|
||||||
|
shift = 0;
|
||||||
|
break;
|
||||||
|
case AARCH64_INSN_REGTYPE_RN:
|
||||||
|
shift = 5;
|
||||||
|
break;
|
||||||
|
case AARCH64_INSN_REGTYPE_RT2:
|
||||||
|
case AARCH64_INSN_REGTYPE_RA:
|
||||||
|
shift = 10;
|
||||||
|
break;
|
||||||
|
case AARCH64_INSN_REGTYPE_RM:
|
||||||
|
shift = 16;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
pr_err("%s: unknown register type encoding %d\n", __func__,
|
||||||
|
type);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (insn >> shift) & GENMASK(4, 0);
|
||||||
|
}
|
||||||
|
|
||||||
static u32 aarch64_insn_encode_register(enum aarch64_insn_register_type type,
|
static u32 aarch64_insn_encode_register(enum aarch64_insn_register_type type,
|
||||||
u32 insn,
|
u32 insn,
|
||||||
enum aarch64_insn_register reg)
|
enum aarch64_insn_register reg)
|
||||||
|
|
Loading…
Reference in New Issue