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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux Kernel]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux SCSI]

  Powered by Linux