[RFC PATCH 00/17] objtool: add base support for arm64

From: Julien Thierry
Date: Wed Jan 20 2021 - 13:59:43 EST


This series enables objtool to start doing stack validation on arm64
kernel builds. It relies on the previous series I sent, refactoring
the arm64 decoder [1].

First, the aarch64 instruction decoder needed to be made available
to code under tools/. This is done in a similar manner to x86
instruction decoded. One limitation I encountered there is that most
of aarch64 instruction decoder is __kprobe annotated. To bypass that
it remove the kprobe include and had to add an empty __kprobe
definition, but I'd welcome a proper solution to that.

Then instruction semantics are progressively added so objtool can track
the stack state through the execution flow.
There are a few things that needed consideration:
- Generation of constants within executable sections, these either
caused objtool to fail decoding or to wrongly decode constants
as jumps or other instructions affecting execution flow and
causing confusion. To solve this, tracking locations referenced
by instructions using literals was needed.
- Jump tables from switch statements in aarch64 don't have enough
information to link branches with the branch instruction leading to
them. For this, we use a gcc plugin to add some information to establish
those missing links in a format that is already supported by objtool

With this, there are still some errors when building with objtool. A
number of cleanups/annotations are needed on the arm64, as well as
handling SYM_DATA objects in objtool.

Those changes can be found on top of this branch here:
git clone https://github.com/julien-thierry/linux.git -b objtoolxarm64-latest

But it would be nice to have some feedback on this before I start submitting everyting.

[1] https://lkml.org/lkml/2021/1/20/791




Julien Thierry (15):
tools: Add some generic functions and headers
tools: arm64: Make aarch64 instruction decoder available to tools
tools: bug: Remove duplicate definition
objtool: arm64: Add base definition for arm64 backend
objtool: arm64: Decode add/sub instructions
objtool: arm64: Decode jump and call related instructions
objtool: arm64: Decode other system instructions
objtool: arm64: Decode load/store instructions
objtool: arm64: Decode LDR instructions
objtool: arm64: Accept padding in code sections
efi: libstub: Ignore relocations for .discard sections
objtool: arm64: Implement functions to add switch tables alternatives
objtool: arm64: Cache section with switch table information
objtool: arm64: Handle supported relocations in alternatives
objtool: arm64: Ignore replacement section for alternative callback

Raphael Gault (2):
gcc-plugins: objtool: Add plugin to detect switch table on arm64
objtool: arm64: Enable stack validation for arm64

arch/arm64/Kconfig | 2 +
drivers/firmware/efi/libstub/Makefile | 2 +-
scripts/Makefile.gcc-plugins | 2 +
scripts/gcc-plugins/Kconfig | 4 +
.../arm64_switch_table_detection_plugin.c | 85 +
tools/arch/arm64/include/asm/aarch64-insn.h | 551 +++++++
tools/arch/arm64/lib/aarch64-insn.c | 1425 +++++++++++++++++
tools/include/asm-generic/bitops/__ffs.h | 11 +
tools/include/linux/bug.h | 6 +-
tools/include/linux/kernel.h | 21 +
tools/include/linux/printk.h | 40 +
tools/objtool/Makefile | 5 +
tools/objtool/arch/arm64/Build | 8 +
tools/objtool/arch/arm64/decode.c | 471 ++++++
.../arch/arm64/include/arch/cfi_regs.h | 14 +
tools/objtool/arch/arm64/include/arch/elf.h | 6 +
.../arch/arm64/include/arch/endianness.h | 9 +
.../objtool/arch/arm64/include/arch/special.h | 23 +
tools/objtool/arch/arm64/special.c | 134 ++
tools/objtool/arch/x86/decode.c | 5 +
tools/objtool/check.c | 6 +
tools/objtool/include/objtool/arch.h | 3 +
tools/objtool/sync-check.sh | 5 +
23 files changed, 2832 insertions(+), 6 deletions(-)
create mode 100644 scripts/gcc-plugins/arm64_switch_table_detection_plugin.c
create mode 100644 tools/arch/arm64/include/asm/aarch64-insn.h
create mode 100644 tools/arch/arm64/lib/aarch64-insn.c
create mode 100644 tools/include/linux/printk.h
create mode 100644 tools/objtool/arch/arm64/Build
create mode 100644 tools/objtool/arch/arm64/decode.c
create mode 100644 tools/objtool/arch/arm64/include/arch/cfi_regs.h
create mode 100644 tools/objtool/arch/arm64/include/arch/elf.h
create mode 100644 tools/objtool/arch/arm64/include/arch/endianness.h
create mode 100644 tools/objtool/arch/arm64/include/arch/special.h
create mode 100644 tools/objtool/arch/arm64/special.c