arm64: Add helper to decode register from instruction
commit 8c2dcbd2c4
upstream.
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>
Signed-off-by: James Morse <james.morse@arm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
670b93fd60
commit
f28446994a
@ -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,
|
||||||
|
@ -418,6 +418,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)
|
||||||
|
Reference in New Issue
Block a user