You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by vi...@apache.org on 2021/10/18 18:35:50 UTC

[mynewt-core] branch master updated: Implement OS Coredump CB feature

This is an automated email from the ASF dual-hosted git repository.

vipulrahane pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-core.git


The following commit(s) were added to refs/heads/master by this push:
     new c415baa  Implement OS Coredump CB feature
     new 58d4be4  Merge pull request #2687 from t3zeng/master3
c415baa is described below

commit c415baa9be7b6f49e52e3a3ad4aaf0ddfab75713
Author: Tian Zeng <ti...@proxy.com>
AuthorDate: Mon Sep 13 15:37:03 2021 -0400

    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 ce80fbb..c5f09f3 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 e830e7a..098bf74 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 8af16ca..7f18d80 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, &regs);
     coredump_dump(&regs, 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 f6cd216..8365169 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, &regs);
     coredump_dump(&regs, 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 4d7d7a0..6765c29 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, &regs);
     coredump_dump(&regs, 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 bd4716e..15b5f24 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, &regs);
     coredump_dump(&regs, 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 16069ae..7928d8a 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, &regs);
     coredump_dump(&regs, 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 cf49bf5..454da5b 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, &regs);
     coredump_dump(&regs, 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 8ee620f..d67bead 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