To support arm64, objtool will need to be able to decode aarch64
instructions. This patch series adds some instruction definitions needed
by objtool and moves out encoding/decoding functionalities that do not
rely on kernel code in order.
Changes since v1[1]:
- Split the isolation of instruction encoder/decoder capabilities in
several steps as suggested by Mark R.
- Exclude dsb encoding where CRm != 0b0x00
- Support dsb FEAT_XS encoding
- Support previously missing barriers
[1] https://lkml.org/lkml/2021/1/20/791
Thanks,
Julien
-->
Julien Thierry (8):
arm64: Move patching utilities out of instruction encoding/decoding
arm64: Move aarch32 condition check functions
arm64: insn: Reduce header dependencies of instruction decoder
arm64: Move instruction encoder/decoder under lib/
arm64: insn: Add SVE instruction class
arm64: insn: Add barrier encodings
arm64: insn: Add some opcodes to instruction decoder
arm64: insn: Add load/store decoding helpers
arch/arm64/include/asm/alternative-macros.h | 3 -
arch/arm64/include/asm/insn.h | 70 +++++-
arch/arm64/include/asm/patching.h | 13 +
arch/arm64/include/asm/probes.h | 2 +-
arch/arm64/include/asm/traps.h | 3 +
arch/arm64/kernel/Makefile | 4 +-
arch/arm64/kernel/ftrace.c | 1 +
arch/arm64/kernel/jump_label.c | 1 +
arch/arm64/kernel/patching.c | 148 ++++++++++++
arch/arm64/kernel/probes/simulate-insn.c | 1 +
arch/arm64/kernel/traps.c | 100 +++++++-
arch/arm64/lib/Makefile | 6 +-
arch/arm64/{kernel => lib}/insn.c | 249 +-------------------
13 files changed, 338 insertions(+), 263 deletions(-)
create mode 100644 arch/arm64/include/asm/patching.h
create mode 100644 arch/arm64/kernel/patching.c
rename arch/arm64/{kernel => lib}/insn.c (86%)
--
2.25.4
SVE has been public for some time now. Let the decoder acknowledge
its existence.
Signed-off-by: Julien Thierry <[email protected]>
---
arch/arm64/include/asm/insn.h | 1 +
arch/arm64/lib/insn.c | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/arch/arm64/include/asm/insn.h b/arch/arm64/include/asm/insn.h
index ffcdeac80026..b55b629c5eab 100644
--- a/arch/arm64/include/asm/insn.h
+++ b/arch/arm64/include/asm/insn.h
@@ -31,6 +31,7 @@
*/
enum aarch64_insn_encoding_class {
AARCH64_INSN_CLS_UNKNOWN, /* UNALLOCATED */
+ AARCH64_INSN_CLS_SVE, /* SVE instructions */
AARCH64_INSN_CLS_DP_IMM, /* Data processing - immediate */
AARCH64_INSN_CLS_DP_REG, /* Data processing - register */
AARCH64_INSN_CLS_DP_FPSIMD, /* Data processing - SIMD and FP */
diff --git a/arch/arm64/lib/insn.c b/arch/arm64/lib/insn.c
index 6ff8826ae7ea..b506a4b1e38c 100644
--- a/arch/arm64/lib/insn.c
+++ b/arch/arm64/lib/insn.c
@@ -23,7 +23,7 @@
static const int aarch64_insn_encoding_class[] = {
AARCH64_INSN_CLS_UNKNOWN,
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,
--
2.25.4