[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <1687247209-31676-1-git-send-email-tangyouling@loongson.cn>
Date: Tue, 20 Jun 2023 15:46:26 +0800
From: Youling Tang <tangyouling@...ngson.cn>
To: Josh Poimboeuf <jpoimboe@...nel.org>,
Peter Zijlstra <peterz@...radead.org>,
Huacai Chen <chenhuacai@...nel.org>,
madvenka@...ux.microsoft.com
Cc: chenzhongjin@...wei.com, WANG Xuerui <kernel@...0n.name>,
Xi Ruoyao <xry111@...111.site>, live-patching@...r.kernel.org,
linux-kernel@...r.kernel.org, loongarch@...ts.linux.dev,
tangyouling00@...il.com, youling.tang@...look.com
Subject: [RFC PATCH v1 00/23] LoongArch: Add objtool and ORC unwinder support
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@linux.microsoft.com/#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
Powered by blists - more mailing lists