[RFC PATCH v1 00/23] LoongArch: Add objtool and ORC unwinder support

From: Youling Tang
Date: Tue Jun 20 2023 - 03:47:11 EST


This series of patches adds objtool and ORC unwinder support for
LoongArch.

Patch 01 - 07 are from "Madhavan T. Venkataraman" [1] with minor
code tweaks. The "objtool: Reorganize ORC types" patch was not
added, because LoongArch cannot share `strcut orc_entry`, it also
needs to include ra_offset and ra_reg.

Since the changes in Patch 01 - 08 in [1] are architecture-independent,
it might be better if they could be separated separately from the series
of patches.

ORC unwinder can get a reliable stack trace, which provides a prerequisite
for the subsequent addition of livepatch support.


Instruction decoder
===================

To do this, an instruction decoder needs to be implemented. I have implemented
a simple, table-driven decoder for LoongArch. Only a subset of the instructions
needs to be fully decoded for this purpose:

- Load-Store instructions
- Add instructions
- Branch instructions
- Call instructions
- Return instructions
- Stack pointer authentication instruction


Unwind hints
============

Unwind hints are collected in a special section. Objtool converts unwind hints
to ORC data. The unwinder processes unwind hints to handle special cases
mentioned above.


ORC unwinder
============

Before vmlinux created, we check all metadata, find the stack operation,
note stack state and create orc data. Objtool insert two sections into
vmlinux. '.orc_unwind_ip' and '.orc_unwind'. (For modules, insert
'.rela.orc_unwind_ip' to relocate '.orc_unwind_ip'.) Each insn has only
one stack state in .orc_unwind and orc_unwind_ip hint its pc address.
Through unwinding orc data, we can get stack info both kernel and module.


This is a series of RFC patches, which may require long-term discussions
and revisions. It is not based on the latest code but based on 6.3-rc3.
Any ideas or suggestions are welcome.

base-commit: e8d018dd0257f744ca50a729e3d042cf2ec9da65 (Linux 6.3-rc3)

Link:
[1]: https://lore.kernel.org/lkml/20230202074036.507249-1-madvenka@xxxxxxxxxxxxxxxxxxx/#r

Madhavan T. Venkataraman (7):
objtool: Reorganize CFI code
objtool: Reorganize instruction-related code
objtool: Move decode_instructions() to a separate file
objtool: Reorganize Unwind hint code
objtool: Reorganize ORC code
objtool: Reorganize ORC kernel code
objtool: Introduce STATIC_CHECK

Youling Tang (16):
tools: LoongArch: Copy inst.h and asm.h to tools
objtool: LoongArch: Add base definition for LoongArch
objtool: LoongArch: Implement decoder
objtool: Add annotate_reachable() for objtools
LoongArch: bug: Add reachable annotation to warning macros
objtool: Add next member in struct reloc
objtool: Add orc_print_dump() package
objtool: Add ORC support for LoongArch
LoongArch: Add ORC unwinder support
LoongArch: Support R_LARCH_32_PCREL relocation type in kernel module
LoongArch: Fix fpu.S objtool warning
LoongArch: Annotate unwind_hint
LoongArch: Move some data definitions into the .data section
objtool: Add arch-specific "noreturn" function handling
objtool: Make update_cfi_state() arch-specific function
LoongArch: objtool: Mark non-standard object files and directories

arch/loongarch/Kconfig | 2 +
arch/loongarch/Kconfig.debug | 11 +
arch/loongarch/Makefile | 4 +
arch/loongarch/include/asm/bug.h | 1 +
arch/loongarch/include/asm/module.h | 7 +
arch/loongarch/include/asm/orc_types.h | 58 ++
arch/loongarch/include/asm/stackframe.h | 3 +
arch/loongarch/include/asm/unwind.h | 17 +-
arch/loongarch/include/asm/unwind_hints.h | 110 +++
arch/loongarch/kernel/Makefile | 3 +
arch/loongarch/kernel/entry.S | 2 +
arch/loongarch/kernel/fpu.S | 11 +-
arch/loongarch/kernel/genex.S | 2 +
arch/loongarch/kernel/head.S | 1 +
arch/loongarch/kernel/module.c | 21 +-
arch/loongarch/kernel/relocate_kernel.S | 12 +-
arch/loongarch/kernel/setup.c | 2 +
arch/loongarch/kernel/stacktrace.c | 1 +
arch/loongarch/kernel/unwind_orc.c | 301 +++++++++
arch/loongarch/kernel/vmlinux.lds.S | 3 +
arch/loongarch/power/Makefile | 2 +
arch/loongarch/vdso/Makefile | 2 +
arch/x86/include/asm/unwind.h | 5 -
arch/x86/include/asm/unwind_hints.h | 86 +++
arch/x86/kernel/module.c | 7 +-
arch/x86/kernel/unwind_orc.c | 268 +-------
arch/x86/kernel/vmlinux.lds.S | 2 +-
.../asm => include/asm-generic}/orc_lookup.h | 43 ++
include/linux/compiler.h | 9 +
include/linux/objtool.h | 70 --
kernel/Makefile | 2 +
kernel/orc_lookup.c | 261 ++++++++
scripts/Makefile | 5 +-
tools/arch/loongarch/include/asm/asm.h | 201 ++++++
tools/arch/loongarch/include/asm/inst.h | 629 ++++++++++++++++++
tools/arch/loongarch/include/asm/orc_types.h | 58 ++
.../arch/loongarch/include/asm/unwind_hints.h | 110 +++
tools/arch/x86/include/asm/unwind_hints.h | 160 +++++
tools/include/linux/bitops.h | 10 +
tools/include/linux/objtool.h | 70 --
tools/objtool/Build | 8 +-
tools/objtool/Makefile | 9 +-
tools/objtool/arch/loongarch/Build | 3 +
tools/objtool/arch/loongarch/decode.c | 352 ++++++++++
.../arch/loongarch/include/arch/cfi_regs.h | 14 +
.../objtool/arch/loongarch/include/arch/elf.h | 15 +
.../arch/loongarch/include/arch/special.h | 21 +
tools/objtool/arch/loongarch/orc.c | 155 +++++
tools/objtool/arch/loongarch/special.c | 25 +
tools/objtool/arch/powerpc/special.c | 3 +
tools/objtool/arch/x86/Build | 1 +
tools/objtool/arch/x86/include/arch/elf.h | 1 +
tools/objtool/arch/x86/orc.c | 164 +++++
tools/objtool/arch/x86/special.c | 4 +
tools/objtool/cfi.c | 108 +++
tools/objtool/check.c | 568 +---------------
tools/objtool/decode.c | 136 ++++
tools/objtool/elf.c | 11 +-
tools/objtool/include/objtool/arch.h | 3 +
tools/objtool/include/objtool/cfi.h | 12 +
tools/objtool/include/objtool/check.h | 97 +--
tools/objtool/include/objtool/elf.h | 1 +
tools/objtool/include/objtool/insn.h | 166 +++++
tools/objtool/include/objtool/objtool.h | 3 +
tools/objtool/include/objtool/orc.h | 15 +
tools/objtool/include/objtool/special.h | 3 +
tools/objtool/insn.c | 195 ++++++
tools/objtool/orc_dump.c | 67 +-
tools/objtool/orc_gen.c | 79 +--
tools/objtool/sync-check.sh | 9 +
tools/objtool/unwind_hints.c | 107 +++
71 files changed, 3721 insertions(+), 1206 deletions(-)
create mode 100644 arch/loongarch/include/asm/orc_types.h
create mode 100644 arch/loongarch/include/asm/unwind_hints.h
create mode 100644 arch/loongarch/kernel/unwind_orc.c
rename {arch/x86/include/asm => include/asm-generic}/orc_lookup.h (50%)
create mode 100644 kernel/orc_lookup.c
create mode 100644 tools/arch/loongarch/include/asm/asm.h
create mode 100644 tools/arch/loongarch/include/asm/inst.h
create mode 100644 tools/arch/loongarch/include/asm/orc_types.h
create mode 100644 tools/arch/loongarch/include/asm/unwind_hints.h
create mode 100644 tools/arch/x86/include/asm/unwind_hints.h
create mode 100644 tools/objtool/arch/loongarch/Build
create mode 100644 tools/objtool/arch/loongarch/decode.c
create mode 100644 tools/objtool/arch/loongarch/include/arch/cfi_regs.h
create mode 100644 tools/objtool/arch/loongarch/include/arch/elf.h
create mode 100644 tools/objtool/arch/loongarch/include/arch/special.h
create mode 100644 tools/objtool/arch/loongarch/orc.c
create mode 100644 tools/objtool/arch/loongarch/special.c
create mode 100644 tools/objtool/arch/x86/orc.c
create mode 100644 tools/objtool/cfi.c
create mode 100644 tools/objtool/decode.c
create mode 100644 tools/objtool/include/objtool/insn.h
create mode 100644 tools/objtool/include/objtool/orc.h
create mode 100644 tools/objtool/insn.c
create mode 100644 tools/objtool/unwind_hints.c

--
2.39.2