Export RISC-V architecture-specific struct offsets needed by the vmcore-tasks tool, including signal frame layouts and register context structures used to reconstruct user-space register state from a vmcore dump.
Signed-off-by: Pnina Feder <[email protected]> --- .../admin-guide/kdump/vmcoreinfo.rst | 26 +++++++++++++++++++ arch/riscv/kernel/signal.c | 8 ++++++ arch/riscv/kernel/vmcore_info.c | 11 ++++++++ 3 files changed, 45 insertions(+) diff --git a/Documentation/admin-guide/kdump/vmcoreinfo.rst b/Documentation/admin-guide/kdump/vmcoreinfo.rst index 36103b3cdc05..3c364434b846 100644 --- a/Documentation/admin-guide/kdump/vmcoreinfo.rst +++ b/Documentation/admin-guide/kdump/vmcoreinfo.rst @@ -595,6 +595,32 @@ va_kernel_pa_offset Indicates the offset between the kernel virtual and physical mappings. Used to translate virtual to physical addresses. +STACK_ALIGN +----------- + +Stack alignment requirement for the architecture. Used to locate signal +frames on the user stack. + +(sigcontext, sc_regs) +--------------------- + +Offset of the saved register array within struct sigcontext. Used to +extract user-space register state from signal frames in a vmcore dump. + +_PAGE_PFN_SHIFT +--------------- + +The bit shift to extract the PFN from a page table entry. Used for +virtual-to-physical address translation when walking page tables from +a vmcore dump. + +(rt_sigframe, uc) +----------------- + +Offset of the ucontext member within the RISC-V rt_sigframe structure. +Used to locate the signal context (and thus saved registers) within a +signal frame on the user stack. + Task and VMA metadata ===================== diff --git a/arch/riscv/kernel/signal.c b/arch/riscv/kernel/signal.c index 59784dc117e4..eb03c0ea6aae 100644 --- a/arch/riscv/kernel/signal.c +++ b/arch/riscv/kernel/signal.c @@ -13,6 +13,7 @@ #include <linux/resume_user_mode.h> #include <linux/linkage.h> #include <linux/entry-common.h> +#include <linux/vmcore_info.h> #include <asm/ucontext.h> #include <asm/vdso.h> @@ -40,6 +41,13 @@ struct rt_sigframe { #endif }; +#ifdef CONFIG_VMCORE_INFO +void riscv_rt_signal_frame(void) +{ + VMCOREINFO_OFFSET(rt_sigframe, uc); +} +#endif + #ifdef CONFIG_FPU static long restore_fp_state(struct pt_regs *regs, union __riscv_fp_state __user *sc_fpregs) diff --git a/arch/riscv/kernel/vmcore_info.c b/arch/riscv/kernel/vmcore_info.c index c27efceec3cc..dd174042dba3 100644 --- a/arch/riscv/kernel/vmcore_info.c +++ b/arch/riscv/kernel/vmcore_info.c @@ -3,6 +3,12 @@ #include <linux/vmcore_info.h> #include <linux/pagemap.h> +#include <asm/processor.h> +#include <asm/pgtable-bits.h> +#include <asm/sigcontext.h> + +extern void riscv_rt_signal_frame(void); + static inline u64 get_satp_value(void) { return csr_read(CSR_SATP); @@ -28,4 +34,9 @@ void arch_crash_save_vmcoreinfo(void) kernel_map.va_kernel_pa_offset); vmcoreinfo_append_str("KERNELOFFSET=%lx\n", kaslr_offset()); vmcoreinfo_append_str("NUMBER(satp)=0x%llx\n", get_satp_value()); + riscv_rt_signal_frame(); + + VMCOREINFO_NUMBER(STACK_ALIGN); + VMCOREINFO_OFFSET(sigcontext, sc_regs); + VMCOREINFO_NUMBER(_PAGE_PFN_SHIFT); } -- 2.43.0
