drgn/libdrgn
Omar Sandoval c48cddbdb0 libdrgn: ppc64: fix stack unwinding since Linux v5.11 and before v4.20
linux_kernel_get_initial_registers_ppc64() depends on the size of struct
pt_regs, but this has changed multiple times, in:

- Linux kernel commit 4c2de74cc869 ("powerpc/64: Interrupts save PPR on stack rather than
  thread_struct") (in v4.20)
- Linux kernel commit 66f93c5a02d5 ("powerpc/64: Fix kernel stack
  16-byte alignment") (in v4.20)
- Linux kernel commit 8e560921b58c ("powerpc/book3s64/pkeys:
  Store/restore userspace AMR/IAMR correctly on entry and exit from
  kernel") (in v5.11)

It also depends on the overhead stored before struct pt_regs on the
stack, which changed in Linux kernel commit cd52414d5a6c ("powerpc/64:
ELFv2 use minimal stack frames in int and switch frame sizes") (in
v6.2).

We can handle all of these cases by reading the previous r1 from memory
instead of computing it from a hard-coded size and finding the struct
pt_regs based on that r1 and the actual size of struct pt_regs.

Reported in #232.

Reported-by: Sourabh Jain <jainsourabh679@gmail.com>
Signed-off-by: Omar Sandoval <osandov@osandov.com>
2023-01-04 13:42:28 -08:00
..
build-aux libdrgn: python: fix Py_BuildValue() type in gen_constants.py 2022-12-07 16:46:33 -08:00
examples Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
include libdrgn: replace copies of elfutils headers with generated files 2022-11-01 15:41:53 -07:00
m4 libdrgn: add autoconf option to enable compiler warnings 2022-03-01 15:38:05 -08:00
python drgn.helpers.linux: add proper XArray helpers 2022-12-13 17:46:37 -08:00
.gitignore libdrgn: use memswitch for linux_kernel_object_find 2022-02-08 02:03:11 -08:00
arch_aarch64_defs.py Add StackFrame.sp 2022-11-22 18:47:16 -08:00
arch_aarch64.c libdrgn: platform: replace demangle_return_address() with demangle_cfi_registers() 2022-12-02 13:52:06 -08:00
arch_arm.c Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
arch_i386.c Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
arch_ppc64_defs.py Add StackFrame.sp 2022-11-22 18:47:16 -08:00
arch_ppc64.c libdrgn: ppc64: fix stack unwinding since Linux v5.11 and before v4.20 2023-01-04 13:42:28 -08:00
arch_riscv.c Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
arch_s390x_defs.py libdrgn: add s390x unwinding support 2022-12-19 13:48:44 -08:00
arch_s390x.c libdrgn: add s390x unwinding support 2022-12-19 13:48:44 -08:00
arch_x86_64_defs.py Add StackFrame.sp 2022-11-22 18:47:16 -08:00
arch_x86_64.c Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
array.h Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
binary_buffer.c Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
binary_buffer.h Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
binary_search_tree.h Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
bitops.h Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
cfi.c Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
cfi.h Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
cityhash.h Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
configure.ac Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
debug_info.c libdrgn: get .eh_frame from the correct file 2022-11-28 13:37:29 -08:00
debug_info.h libdrgn: get .eh_frame from the correct file 2022-11-28 13:37:29 -08:00
Doxyfile libdrgn: add read(2) and pread(2) wrappers that don't return short reads 2022-08-26 12:43:20 -07:00
drgn_program_parse_vmcoreinfo.inc.strswitch Add some missing copyright/license notices 2022-11-01 17:14:02 -07:00
drgn.h.in libdrgn: add stub s390 and s390x architectures with relocation implementation 2022-12-19 13:48:44 -08:00
dwarf_constants.c Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
dwarf_constants.h Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
dwarf_info.c libdrgn: dwarf_info: Support DW_TAG_GNU_template_parameter_pack 2022-12-05 15:33:46 -08:00
dwarf_info.h libdrgn: get .eh_frame from the correct file 2022-11-28 13:37:29 -08:00
elf_file.c libdrgn: debug_info: wrap ELF file information in new struct drgn_elf_file 2022-11-28 13:37:29 -08:00
elf_file.h libdrgn: bypass libdwfl with struct drgn_elf_file 2022-11-28 13:37:29 -08:00
error.c Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
error.h Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
hash_table.c Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
hash_table.h Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
helpers.h drgn.helpers.linux: add proper XArray helpers 2022-12-13 17:46:37 -08:00
io.c Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
io.h Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
kdump.c libdrgn: add stub s390 and s390x architectures with relocation implementation 2022-12-19 13:48:44 -08:00
language_c.c libdrgn: add limited support for looking up types with template arguments 2022-12-14 20:55:03 -08:00
language.c Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
language.h Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
lazy_object.c Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
lazy_object.h Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
lexer.c Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
lexer.h Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
linux_kernel_helpers.c drgn.helpers.linux: add proper XArray helpers 2022-12-13 17:46:37 -08:00
linux_kernel_object_find.inc.strswitch Add some missing copyright/license notices 2022-11-01 17:14:02 -07:00
linux_kernel.c Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
linux_kernel.h Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
Makefile.am libdrgn: add s390x unwinding support 2022-12-19 13:48:44 -08:00
memory_reader.c Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
memory_reader.h Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
minmax.h Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
nstring.h Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
object_index.c Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
object_index.h Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
object.c Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
object.h Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
orc_info.c libdrgn: get .eh_frame from the correct file 2022-11-28 13:37:29 -08:00
orc_info.h libdrgn: get .eh_frame from the correct file 2022-11-28 13:37:29 -08:00
orc.h Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
path.c Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
path.h Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
platform.c libdrgn: add stub s390 and s390x architectures with relocation implementation 2022-12-19 13:48:44 -08:00
platform.h libdrgn: add stub s390 and s390x architectures with relocation implementation 2022-12-19 13:48:44 -08:00
pp.h Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
program.c Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
program.h Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
register_state.c libdrgn: make module vs. program platform difference more clear 2022-11-28 12:53:45 -08:00
register_state.h libdrgn: make module vs. program platform difference more clear 2022-11-28 12:53:45 -08:00
serialize.c Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
serialize.h Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
splay_tree.c Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
stack_trace.c libdrgn: platform: replace demangle_return_address() with demangle_cfi_registers() 2022-12-02 13:52:06 -08:00
stack_trace.h Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
string_builder.c Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
string_builder.h Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
symbol.c Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
symbol.h Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
type.c Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
type.h Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
util.h libdrgn: document implementation-defined behavior in add_to_possibly_null_pointer() 2022-12-19 12:07:40 -08:00
vector.c Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00
vector.h Relicense drgn from GPLv3+ to LGPLv2.1+ 2022-11-01 17:05:16 -07:00