arm64: insn: simplify insn group identification
The only code which needs to check for an entire instruction group is the aarch64_insn_is_steppable() helper function used by kprobes, which must not be instrumented, and only needs to check for the "Branch, exception generation and system instructions" class. Currently we have an out-of-line helper in insn.c which must be marked as __kprobes, which indexes a table with some bits extracted from the instruction. In aarch64_insn_is_steppable() we then need to compare the result with an expected enum value. It would be simpler to have a predicate for this, as with the other aarch64_insn_is_*() helpers, which would be always inlined to prevent inadvertent instrumentation, and would permit better code generation. This patch adds a predicate function for this instruction group using the existing __AARCH64_INSN_FUNCS() helpers, and removes the existing out-of-line helper. As the only class we currently care about is the branch+exception+sys class, I have only added helpers for this, and left the other classes unimplemented for now. There should be no functional change as a result of this patch. Signed-off-by: Mark Rutland <mark.rutland@arm.com> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Joey Gouly <joey.gouly@arm.com> Cc: Will Deacon <will@kernel.org> Reviewed-by: Joey Gouly <joey.gouly@arm.com> Link: https://lore.kernel.org/r/20221114135928.3000571-4-mark.rutland@arm.com Signed-off-by: Will Deacon <will@kernel.org>
This commit is contained in:
committed by
Will Deacon
parent
9b948e79d5
commit
4488f90c86
@@ -20,30 +20,6 @@
|
||||
#define AARCH64_INSN_N_BIT BIT(22)
|
||||
#define AARCH64_INSN_LSL_12 BIT(22)
|
||||
|
||||
static const int aarch64_insn_encoding_class[] = {
|
||||
AARCH64_INSN_CLS_UNKNOWN,
|
||||
AARCH64_INSN_CLS_UNKNOWN,
|
||||
AARCH64_INSN_CLS_SVE,
|
||||
AARCH64_INSN_CLS_UNKNOWN,
|
||||
AARCH64_INSN_CLS_LDST,
|
||||
AARCH64_INSN_CLS_DP_REG,
|
||||
AARCH64_INSN_CLS_LDST,
|
||||
AARCH64_INSN_CLS_DP_FPSIMD,
|
||||
AARCH64_INSN_CLS_DP_IMM,
|
||||
AARCH64_INSN_CLS_DP_IMM,
|
||||
AARCH64_INSN_CLS_BR_SYS,
|
||||
AARCH64_INSN_CLS_BR_SYS,
|
||||
AARCH64_INSN_CLS_LDST,
|
||||
AARCH64_INSN_CLS_DP_REG,
|
||||
AARCH64_INSN_CLS_LDST,
|
||||
AARCH64_INSN_CLS_DP_FPSIMD,
|
||||
};
|
||||
|
||||
enum aarch64_insn_encoding_class __kprobes aarch64_get_insn_class(u32 insn)
|
||||
{
|
||||
return aarch64_insn_encoding_class[(insn >> 25) & 0xf];
|
||||
}
|
||||
|
||||
static int __kprobes aarch64_get_imm_shift_mask(enum aarch64_insn_imm_type type,
|
||||
u32 *maskp, int *shiftp)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user