From c415baa9be7b6f49e52e3a3ad4aaf0ddfab75713 Mon Sep 17 00:00:00 2001 From: Tian Zeng Date: Mon, 13 Sep 2021 15:37:03 -0400 Subject: [PATCH] Implement OS Coredump CB feature --- kernel/os/include/os/arch/common.h | 1 + kernel/os/include/os/os_fault.h | 4 ++++ kernel/os/src/arch/arc/os_fault.c | 8 ++++++-- kernel/os/src/arch/cortex_m0/os_fault.c | 8 ++++++-- kernel/os/src/arch/cortex_m3/os_fault.c | 8 ++++++-- kernel/os/src/arch/cortex_m33/os_fault.c | 8 ++++++-- kernel/os/src/arch/cortex_m4/os_fault.c | 8 ++++++-- kernel/os/src/arch/cortex_m7/os_fault.c | 8 ++++++-- kernel/os/syscfg.yml | 5 +++++ 9 files changed, 46 insertions(+), 12 deletions(-) diff --git a/kernel/os/include/os/arch/common.h b/kernel/os/include/os/arch/common.h index ce80fbb32e..c5f09f3a7e 100644 --- a/kernel/os/include/os/arch/common.h +++ b/kernel/os/include/os/arch/common.h @@ -71,6 +71,7 @@ void os_set_env(os_stack_t *); void os_arch_init_task_stack(os_stack_t *sf); void os_default_irq_asm(void); void os_assert_cb(void); +void os_coredump_cb(void *tf); #ifdef __cplusplus } diff --git a/kernel/os/include/os/os_fault.h b/kernel/os/include/os/os_fault.h index e830e7afe6..098bf74900 100644 --- a/kernel/os/include/os/os_fault.h +++ b/kernel/os/include/os/os_fault.h @@ -32,6 +32,10 @@ extern "C" { void __assert_func(const char *file, int line, const char *func, const char *e) __attribute((noreturn)); +#if MYNEWT_VAL(OS_COREDUMP_CB) +typedef void (*coredump_cb_t)(void *tf); +#endif + #if MYNEWT_VAL(OS_CRASH_FILE_LINE) #define OS_CRASH() (HAL_DEBUG_BREAK(), __assert_func(__FILE__, __LINE__, NULL, NULL)) #else diff --git a/kernel/os/src/arch/arc/os_fault.c b/kernel/os/src/arch/arc/os_fault.c index 8af16cae4b..7f18d80b4c 100644 --- a/kernel/os/src/arch/arc/os_fault.c +++ b/kernel/os/src/arch/arc/os_fault.c @@ -73,7 +73,7 @@ struct coredump_regs { uint32_t psr; }; -#if MYNEWT_VAL(OS_COREDUMP) +#if MYNEWT_VAL(OS_COREDUMP) && !MYNEWT_VAL(OS_COREDUMP_CB) static void trap_to_coredump(struct trap_frame *tf, struct coredump_regs *regs) { @@ -154,7 +154,7 @@ __assert_func(const char *file, int line, const char *func, const char *e) void os_default_irq(struct trap_frame *tf) { -#if MYNEWT_VAL(OS_COREDUMP) +#if MYNEWT_VAL(OS_COREDUMP) && !MYNEWT_VAL(OS_COREDUMP_CB) struct coredump_regs regs; #endif @@ -171,8 +171,12 @@ os_default_irq(struct trap_frame *tf) tf->ef->r12, tf->ef->lr, tf->ef->pc, tf->ef->psr); #if MYNEWT_VAL(OS_COREDUMP) +#if MYNEWT_VAL(OS_COREDUMP_CB) + os_coredump_cb(tf); +#else trap_to_coredump(tf, ®s); coredump_dump(®s, sizeof(regs)); +#endif #endif hal_system_reset(); } diff --git a/kernel/os/src/arch/cortex_m0/os_fault.c b/kernel/os/src/arch/cortex_m0/os_fault.c index f6cd216b14..8365169d83 100644 --- a/kernel/os/src/arch/cortex_m0/os_fault.c +++ b/kernel/os/src/arch/cortex_m0/os_fault.c @@ -71,7 +71,7 @@ struct coredump_regs { uint32_t psr; }; -#if MYNEWT_VAL(OS_COREDUMP) +#if MYNEWT_VAL(OS_COREDUMP) && !MYNEWT_VAL(OS_COREDUMP_CB) static void trap_to_coredump(struct trap_frame *tf, struct coredump_regs *regs) { @@ -129,7 +129,7 @@ __assert_func(const char *file, int line, const char *func, const char *e) void os_default_irq(struct trap_frame *tf) { -#if MYNEWT_VAL(OS_COREDUMP) +#if MYNEWT_VAL(OS_COREDUMP) && !MYNEWT_VAL(OS_COREDUMP_CB) struct coredump_regs regs; #endif #if MYNEWT_VAL(OS_CRASH_RESTORE_REGS) @@ -151,9 +151,13 @@ os_default_irq(struct trap_frame *tf) os_stacktrace((uintptr_t)(tf->ef + 1)); #if MYNEWT_VAL(OS_COREDUMP) +#if MYNEWT_VAL(OS_COREDUMP_CB) + os_coredump_cb(tf); +#else trap_to_coredump(tf, ®s); coredump_dump(®s, sizeof(regs)); #endif +#endif #if MYNEWT_VAL(OS_CRASH_RESTORE_REGS) if ((SCB->ICSR & SCB_ICSR_VECTACTIVE_Msk) < 16) { diff --git a/kernel/os/src/arch/cortex_m3/os_fault.c b/kernel/os/src/arch/cortex_m3/os_fault.c index 4d7d7a0790..6765c29241 100644 --- a/kernel/os/src/arch/cortex_m3/os_fault.c +++ b/kernel/os/src/arch/cortex_m3/os_fault.c @@ -72,7 +72,7 @@ struct coredump_regs { uint32_t psr; }; -#if MYNEWT_VAL(OS_COREDUMP) +#if MYNEWT_VAL(OS_COREDUMP) && !MYNEWT_VAL(OS_COREDUMP_CB) static void trap_to_coredump(struct trap_frame *tf, struct coredump_regs *regs) { @@ -142,7 +142,7 @@ __assert_func(const char *file, int line, const char *func, const char *e) void os_default_irq(struct trap_frame *tf) { -#if MYNEWT_VAL(OS_COREDUMP) +#if MYNEWT_VAL(OS_COREDUMP) && !MYNEWT_VAL(OS_COREDUMP_CB) struct coredump_regs regs; #endif #if MYNEWT_VAL(OS_CRASH_RESTORE_REGS) @@ -166,9 +166,13 @@ os_default_irq(struct trap_frame *tf) os_stacktrace((uintptr_t)(tf->ef + 1)); #if MYNEWT_VAL(OS_COREDUMP) +#if MYNEWT_VAL(OS_COREDUMP_CB) + os_coredump_cb(tf); +#else trap_to_coredump(tf, ®s); coredump_dump(®s, sizeof(regs)); #endif +#endif #if MYNEWT_VAL(OS_CRASH_RESTORE_REGS) if (((SCB->ICSR & SCB_ICSR_VECTACTIVE_Msk) < 16) && diff --git a/kernel/os/src/arch/cortex_m33/os_fault.c b/kernel/os/src/arch/cortex_m33/os_fault.c index bd4716eb86..15b5f242f8 100644 --- a/kernel/os/src/arch/cortex_m33/os_fault.c +++ b/kernel/os/src/arch/cortex_m33/os_fault.c @@ -77,7 +77,7 @@ struct coredump_regs { uint32_t psr; }; -#if MYNEWT_VAL(OS_COREDUMP) +#if MYNEWT_VAL(OS_COREDUMP) && !MYNEWT_VAL(OS_COREDUMP_CB) static void trap_to_coredump(struct trap_frame *tf, struct coredump_regs *regs) { @@ -204,7 +204,7 @@ os_default_irq(struct trap_frame *tf) #if MYNEWT_VAL(OS_CRASH_LOG) struct log_reboot_info lri; #endif -#if MYNEWT_VAL(OS_COREDUMP) +#if MYNEWT_VAL(OS_COREDUMP) && !MYNEWT_VAL(OS_COREDUMP_CB) struct coredump_regs regs; #endif #if MYNEWT_VAL(OS_CRASH_RESTORE_REGS) @@ -243,9 +243,13 @@ os_default_irq(struct trap_frame *tf) #if MYNEWT_VAL(OS_COREDUMP) hal_watchdog_tickle(); +#if MYNEWT_VAL(OS_COREDUMP_CB) + os_coredump_cb(tf); +#else trap_to_coredump(tf, ®s); coredump_dump(®s, sizeof(regs)); #endif +#endif #if MYNEWT_VAL(OS_CRASH_RESTORE_REGS) if (((SCB->ICSR & SCB_ICSR_VECTACTIVE_Msk) < 16) && diff --git a/kernel/os/src/arch/cortex_m4/os_fault.c b/kernel/os/src/arch/cortex_m4/os_fault.c index 16069ae6c7..7928d8a786 100644 --- a/kernel/os/src/arch/cortex_m4/os_fault.c +++ b/kernel/os/src/arch/cortex_m4/os_fault.c @@ -76,7 +76,7 @@ struct coredump_regs { uint32_t psr; }; -#if MYNEWT_VAL(OS_COREDUMP) +#if MYNEWT_VAL(OS_COREDUMP) && !MYNEWT_VAL(OS_COREDUMP_CB) static void trap_to_coredump(struct trap_frame *tf, struct coredump_regs *regs) { @@ -161,7 +161,7 @@ os_default_irq(struct trap_frame *tf) #if MYNEWT_VAL(OS_CRASH_LOG) struct log_reboot_info lri; #endif -#if MYNEWT_VAL(OS_COREDUMP) +#if MYNEWT_VAL(OS_COREDUMP) && !MYNEWT_VAL(OS_COREDUMP_CB) struct coredump_regs regs; #endif #if MYNEWT_VAL(OS_CRASH_RESTORE_REGS) @@ -196,9 +196,13 @@ os_default_irq(struct trap_frame *tf) #endif #if MYNEWT_VAL(OS_COREDUMP) +#if MYNEWT_VAL(OS_COREDUMP_CB) + os_coredump_cb(tf); +#else trap_to_coredump(tf, ®s); coredump_dump(®s, sizeof(regs)); #endif +#endif #if MYNEWT_VAL(OS_CRASH_RESTORE_REGS) if (((SCB->ICSR & SCB_ICSR_VECTACTIVE_Msk) < 16) && diff --git a/kernel/os/src/arch/cortex_m7/os_fault.c b/kernel/os/src/arch/cortex_m7/os_fault.c index cf49bf556b..454da5ba05 100644 --- a/kernel/os/src/arch/cortex_m7/os_fault.c +++ b/kernel/os/src/arch/cortex_m7/os_fault.c @@ -72,7 +72,7 @@ struct coredump_regs { uint32_t psr; }; -#if MYNEWT_VAL(OS_COREDUMP) +#if MYNEWT_VAL(OS_COREDUMP) && !MYNEWT_VAL(OS_COREDUMP_CB) static void trap_to_coredump(struct trap_frame *tf, struct coredump_regs *regs) { @@ -141,7 +141,7 @@ __assert_func(const char *file, int line, const char *func, const char *e) void os_default_irq(struct trap_frame *tf) { -#if MYNEWT_VAL(OS_COREDUMP) +#if MYNEWT_VAL(OS_COREDUMP) && !MYNEWT_VAL(OS_COREDUMP_CB) struct coredump_regs regs; #endif #if MYNEWT_VAL(OS_CRASH_RESTORE_REGS) @@ -164,9 +164,13 @@ os_default_irq(struct trap_frame *tf) console_printf("BFAR:0x%08lx MMFAR:0x%08lx\n", SCB->BFAR, SCB->MMFAR); #if MYNEWT_VAL(OS_COREDUMP) +#if MYNEWT_VAL(OS_COREDUMP_CB) + os_coredump_cb(tf); +#else trap_to_coredump(tf, ®s); coredump_dump(®s, sizeof(regs)); #endif +#endif #if MYNEWT_VAL(OS_CRASH_RESTORE_REGS) if (((SCB->ICSR & SCB_ICSR_VECTACTIVE_Msk) < 16) && diff --git a/kernel/os/syscfg.yml b/kernel/os/syscfg.yml index 8ee620f533..d67bead087 100644 --- a/kernel/os/syscfg.yml +++ b/kernel/os/syscfg.yml @@ -32,6 +32,11 @@ syscfg.defs: OS_COREDUMP: description: 'Attempt to dump corefile when system crashes' value: 0 + OS_COREDUMP_CB: + description: 'Calls a custom OS coredump callback function' + value: 0 + restriction: + - 'OS_COREDUMP if 1' OS_CRASH_STACKTRACE: description: 'Attempt to print stack trace when system crashes.' value: 0