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, ®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 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, ®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 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, ®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 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, ®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 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, ®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 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, ®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 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