diff --git a/arch/Kconfig b/arch/Kconfig index 45bdb7e8fd71a59..601a31761777faf 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -115,6 +115,7 @@ config RISCV bool select ARCH_IS_SET select ARCH_SUPPORTS_COREDUMP + select ARCH_SUPPORTS_COREDUMP_PRIV_STACKS select ARCH_SUPPORTS_ROM_START if !SOC_FAMILY_ESPRESSIF_ESP32 select ARCH_SUPPORTS_EMPTY_IRQ_SPURIOUS select ARCH_HAS_CODE_DATA_RELOCATION diff --git a/arch/riscv/core/coredump.c b/arch/riscv/core/coredump.c index 70d7a9976d4ad2a..ad258ccc9b96bf3 100644 --- a/arch/riscv/core/coredump.c +++ b/arch/riscv/core/coredump.c @@ -5,6 +5,7 @@ */ #include +#include #include #ifndef CONFIG_64BIT @@ -116,3 +117,21 @@ uint16_t arch_coredump_tgt_code_get(void) { return COREDUMP_TGT_RISC_V; } + +#if defined(CONFIG_DEBUG_COREDUMP_DUMP_THREAD_PRIV_STACK) +void arch_coredump_priv_stack_dump(struct k_thread *thread) +{ + uintptr_t start_addr, end_addr; + + start_addr = thread->arch.priv_stack_start; + + if (start_addr == 0U) { + return; + } + + start_addr += Z_RISCV_STACK_GUARD_SIZE; + end_addr = start_addr + Z_STACK_PTR_ALIGN(CONFIG_PRIVILEGED_STACK_SIZE); + + coredump_memory_dump(start_addr, end_addr); +} +#endif /* CONFIG_DEBUG_COREDUMP_DUMP_THREAD_PRIV_STACK */