From 13a7ae3d06cbd84962da52f3240fbfdac5fd8dd3 Mon Sep 17 00:00:00 2001 From: Xiang Xiao Date: Wed, 27 Jul 2022 03:08:14 +0800 Subject: [PATCH] arch: Call board_reset before up_irq_save and spin_trylock since board_reset may call some kernel functions which try to acquire the lock again Signed-off-by: Xiang Xiao --- arch/arm/src/common/arm_assert.c | 19 ++++++++++--------- arch/arm64/src/common/arm64_assert.c | 18 ++++++++++++++---- arch/avr/src/common/up_assert.c | 7 ++++--- arch/ceva/src/common/up_assert.c | 21 +++++++++++---------- arch/hc/src/m9s12/m9s12_assert.c | 7 ++++--- arch/mips/src/mips32/mips_assert.c | 7 ++++--- arch/misoc/src/lm32/lm32_assert.c | 7 ++++--- arch/misoc/src/minerva/minerva_assert.c | 7 ++++--- arch/or1k/src/common/up_assert.c | 7 ++++--- arch/renesas/src/common/up_assert.c | 8 +++++--- arch/risc-v/src/common/riscv_assert.c | 19 ++++++++++--------- arch/sparc/src/common/up_assert.c | 7 ++++--- arch/x86/src/common/up_assert.c | 7 ++++--- arch/x86_64/src/common/up_assert.c | 7 ++++--- arch/xtensa/src/common/xtensa_assert.c | 7 ++++--- arch/z16/src/common/z16_assert.c | 7 ++++--- arch/z80/src/common/z80_assert.c | 7 ++++--- 17 files changed, 98 insertions(+), 71 deletions(-) diff --git a/arch/arm/src/common/arm_assert.c b/arch/arm/src/common/arm_assert.c index 6f5059fe1a..8380a8a0f2 100644 --- a/arch/arm/src/common/arm_assert.c +++ b/arch/arm/src/common/arm_assert.c @@ -467,21 +467,22 @@ static void arm_assert(void) if (CURRENT_REGS || (running_task())->flink == NULL) { +#if CONFIG_BOARD_RESET_ON_ASSERT >= 1 + board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE); +#endif + /* Disable interrupts on this CPU */ up_irq_save(); +#ifdef CONFIG_SMP + /* Try (again) to stop activity on other CPUs */ + + spin_trylock(&g_cpu_irqlock); +#endif + for (; ; ) { -#ifdef CONFIG_SMP - /* Try (again) to stop activity on other CPUs */ - - spin_trylock(&g_cpu_irqlock); -#endif - -#if CONFIG_BOARD_RESET_ON_ASSERT >= 1 - board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE); -#endif #ifdef CONFIG_ARCH_LEDS /* FLASH LEDs a 2Hz */ diff --git a/arch/arm64/src/common/arm64_assert.c b/arch/arm64/src/common/arm64_assert.c index 186240be20..7544357c9c 100644 --- a/arch/arm64/src/common/arm64_assert.c +++ b/arch/arm64/src/common/arm64_assert.c @@ -514,21 +514,31 @@ static void arm64_assert(void) if (CURRENT_REGS || (running_task())->flink == NULL) { + #if CONFIG_BOARD_RESET_ON_ASSERT >= 1 + board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE); +#endif + /* Disable interrupts on this CPU */ up_irq_save(); - for (; ; ) - { #ifdef CONFIG_SMP - /* Try (again) to stop activity on other CPUs */ + /* Try (again) to stop activity on other CPUs */ - spin_trylock(&g_cpu_irqlock); + spin_trylock(&g_cpu_irqlock); #endif + for (; ; ) + { up_mdelay(250); } } + else + { +#if CONFIG_BOARD_RESET_ON_ASSERT >= 2 + board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE); +#endif + } } /**************************************************************************** diff --git a/arch/avr/src/common/up_assert.c b/arch/avr/src/common/up_assert.c index 2af547cca1..b51b14ab9c 100644 --- a/arch/avr/src/common/up_assert.c +++ b/arch/avr/src/common/up_assert.c @@ -72,12 +72,13 @@ static void _up_assert(void) if (g_current_regs || running_task()->flink == NULL) { +#if CONFIG_BOARD_RESET_ON_ASSERT >= 1 + board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE); +#endif + up_irq_save(); for (; ; ) { -#if CONFIG_BOARD_RESET_ON_ASSERT >= 1 - board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE); -#endif #ifdef CONFIG_ARCH_LEDS board_autoled_on(LED_PANIC); up_mdelay(250); diff --git a/arch/ceva/src/common/up_assert.c b/arch/ceva/src/common/up_assert.c index a587fe9279..d95b82a718 100644 --- a/arch/ceva/src/common/up_assert.c +++ b/arch/ceva/src/common/up_assert.c @@ -298,18 +298,20 @@ static void _up_assert(int errorcode) if (up_interrupt_context() || sched_idletask()) { +#if CONFIG_BOARD_RESET_ON_ASSERT >= 1 + board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE); +#endif + up_irq_save(); + +#ifdef CONFIG_SMP + /* Try (again) to stop activity on other CPUs */ + + spin_trylock(&g_cpu_irqlock); +#endif + for (; ; ) { -#ifdef CONFIG_SMP - /* Try (again) to stop activity on other CPUs */ - - spin_trylock(&g_cpu_irqlock); -#endif - -#if CONFIG_BOARD_RESET_ON_ASSERT >= 1 - board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE); -#endif } } else @@ -317,7 +319,6 @@ static void _up_assert(int errorcode) #if CONFIG_BOARD_RESET_ON_ASSERT >= 2 board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE); #endif - exit(errorcode); } } diff --git a/arch/hc/src/m9s12/m9s12_assert.c b/arch/hc/src/m9s12/m9s12_assert.c index 0dd13ab3ea..05779fc28a 100644 --- a/arch/hc/src/m9s12/m9s12_assert.c +++ b/arch/hc/src/m9s12/m9s12_assert.c @@ -268,12 +268,13 @@ static void _up_assert(void) if (g_current_regs || (running_task())->flink == NULL) { +#if CONFIG_BOARD_RESET_ON_ASSERT >= 1 + board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE); +#endif + up_irq_save(); for (; ; ) { -#if CONFIG_BOARD_RESET_ON_ASSERT >= 1 - board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE); -#endif #ifdef CONFIG_ARCH_LEDS board_autoled_on(LED_PANIC); up_mdelay(250); diff --git a/arch/mips/src/mips32/mips_assert.c b/arch/mips/src/mips32/mips_assert.c index 5469bc18f6..964d0d9c45 100644 --- a/arch/mips/src/mips32/mips_assert.c +++ b/arch/mips/src/mips32/mips_assert.c @@ -72,12 +72,13 @@ static void _up_assert(void) if (CURRENT_REGS || running_task()->flink == NULL) { +#if CONFIG_BOARD_RESET_ON_ASSERT >= 1 + board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE); +#endif + up_irq_save(); for (; ; ) { -#if CONFIG_BOARD_RESET_ON_ASSERT >= 1 - board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE); -#endif #ifdef CONFIG_ARCH_LEDS board_autoled_on(LED_PANIC); up_mdelay(250); diff --git a/arch/misoc/src/lm32/lm32_assert.c b/arch/misoc/src/lm32/lm32_assert.c index f0e8c6c279..1f6035078e 100644 --- a/arch/misoc/src/lm32/lm32_assert.c +++ b/arch/misoc/src/lm32/lm32_assert.c @@ -77,12 +77,13 @@ static void _up_assert(void) if (g_current_regs || running_task()->flink == NULL) { +#if CONFIG_BOARD_RESET_ON_ASSERT >= 1 + board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE); +#endif + up_irq_save(); for (; ; ) { -#if CONFIG_BOARD_RESET_ON_ASSERT >= 1 - board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE); -#endif #ifdef CONFIG_ARCH_LEDS board_autoled_on(LED_PANIC); up_mdelay(250); diff --git a/arch/misoc/src/minerva/minerva_assert.c b/arch/misoc/src/minerva/minerva_assert.c index 3e713305a2..61e520ed93 100644 --- a/arch/misoc/src/minerva/minerva_assert.c +++ b/arch/misoc/src/minerva/minerva_assert.c @@ -77,12 +77,13 @@ static void _up_assert(void) if (g_current_regs || running_task()->flink == NULL) { +#if CONFIG_BOARD_RESET_ON_ASSERT >= 1 + board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE); +#endif + up_irq_save(); for (; ; ) { -#if CONFIG_BOARD_RESET_ON_ASSERT >= 1 - board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE); -#endif #ifdef CONFIG_ARCH_LEDS board_autoled_on(LED_PANIC); up_mdelay(250); diff --git a/arch/or1k/src/common/up_assert.c b/arch/or1k/src/common/up_assert.c index c7d3865b19..a76e68ce54 100644 --- a/arch/or1k/src/common/up_assert.c +++ b/arch/or1k/src/common/up_assert.c @@ -312,12 +312,13 @@ static void _up_assert(void) if (CURRENT_REGS || running_task()->flink == NULL) { +#if CONFIG_BOARD_RESET_ON_ASSERT >= 1 + board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE); +#endif + up_irq_save(); for (; ; ) { -#if CONFIG_BOARD_RESET_ON_ASSERT >= 1 - board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE); -#endif #ifdef CONFIG_ARCH_LEDS board_autoled_on(LED_PANIC); up_mdelay(250); diff --git a/arch/renesas/src/common/up_assert.c b/arch/renesas/src/common/up_assert.c index 1bff3444a5..ee632cbaf6 100644 --- a/arch/renesas/src/common/up_assert.c +++ b/arch/renesas/src/common/up_assert.c @@ -74,11 +74,13 @@ static void _up_assert(void) if (g_current_regs || running_task()->flink == NULL) { +#if CONFIG_BOARD_RESET_ON_ASSERT >= 1 + board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE); +#endif + + up_irq_save(); for (; ; ) { -#if CONFIG_BOARD_RESET_ON_ASSERT >= 1 - board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE); -#endif #ifdef CONFIG_ARCH_LEDS board_autoled_on(LED_PANIC); up_mdelay(250); diff --git a/arch/risc-v/src/common/riscv_assert.c b/arch/risc-v/src/common/riscv_assert.c index 488bc88f33..5d1e74b305 100644 --- a/arch/risc-v/src/common/riscv_assert.c +++ b/arch/risc-v/src/common/riscv_assert.c @@ -429,18 +429,19 @@ static void riscv_assert(void) if (CURRENT_REGS || running_task()->flink == NULL) { +#if CONFIG_BOARD_RESET_ON_ASSERT >= 1 + board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE); +#endif + +#ifdef CONFIG_SMP + /* Try (again) to stop activity on other CPUs */ + + spin_trylock(&g_cpu_irqlock); +#endif + up_irq_save(); for (; ; ) { -#ifdef CONFIG_SMP - /* Try (again) to stop activity on other CPUs */ - - spin_trylock(&g_cpu_irqlock); -#endif - -#if CONFIG_BOARD_RESET_ON_ASSERT >= 1 - board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE); -#endif #ifdef CONFIG_ARCH_LEDS board_autoled_on(LED_PANIC); up_mdelay(250); diff --git a/arch/sparc/src/common/up_assert.c b/arch/sparc/src/common/up_assert.c index 9dde88df24..8ecb8ac684 100644 --- a/arch/sparc/src/common/up_assert.c +++ b/arch/sparc/src/common/up_assert.c @@ -73,12 +73,13 @@ static void _up_assert(int errorcode) if (g_current_regs || running_task()->flink == NULL) { +#if CONFIG_BOARD_RESET_ON_ASSERT >= 1 + board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE); +#endif + up_irq_save(); for (; ; ) { -#if CONFIG_BOARD_RESET_ON_ASSERT >= 1 - board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE); -#endif #ifdef CONFIG_ARCH_LEDS board_autoled_on(LED_PANIC); up_mdelay(250); diff --git a/arch/x86/src/common/up_assert.c b/arch/x86/src/common/up_assert.c index f287d37d05..983165e521 100644 --- a/arch/x86/src/common/up_assert.c +++ b/arch/x86/src/common/up_assert.c @@ -234,12 +234,13 @@ static void _up_assert(void) if (g_current_regs || (running_task())->flink == NULL) { +#if CONFIG_BOARD_RESET_ON_ASSERT >= 1 + board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE); +#endif + up_irq_save(); for (; ; ) { -#if CONFIG_BOARD_RESET_ON_ASSERT >= 1 - board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE); -#endif #ifdef CONFIG_ARCH_LEDS board_autoled_on(LED_PANIC); up_mdelay(250); diff --git a/arch/x86_64/src/common/up_assert.c b/arch/x86_64/src/common/up_assert.c index 93ec98c24f..834efcf017 100644 --- a/arch/x86_64/src/common/up_assert.c +++ b/arch/x86_64/src/common/up_assert.c @@ -221,12 +221,13 @@ static void _up_assert(void) if (g_current_regs || (running_task())->flink == NULL) { +#if CONFIG_BOARD_RESET_ON_ASSERT >= 1 + board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE); +#endif + up_irq_save(); for (; ; ) { -#if CONFIG_BOARD_RESET_ON_ASSERT >= 1 - board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE); -#endif #ifdef CONFIG_ARCH_LEDS board_autoled_on(LED_PANIC); up_mdelay(250); diff --git a/arch/xtensa/src/common/xtensa_assert.c b/arch/xtensa/src/common/xtensa_assert.c index b9542b9728..9c46dd50b8 100644 --- a/arch/xtensa/src/common/xtensa_assert.c +++ b/arch/xtensa/src/common/xtensa_assert.c @@ -112,14 +112,15 @@ static void xtensa_assert(void) if (CURRENT_REGS || running_task()->flink == NULL) { +#if CONFIG_BOARD_RESET_ON_ASSERT >= 1 + board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE); +#endif + /* Blink the LEDs forever */ up_irq_save(); for (; ; ) { -#if CONFIG_BOARD_RESET_ON_ASSERT >= 1 - board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE); -#endif #ifdef CONFIG_ARCH_LEDS board_autoled_on(LED_PANIC); up_mdelay(250); diff --git a/arch/z16/src/common/z16_assert.c b/arch/z16/src/common/z16_assert.c index 20864918b1..ffe6081157 100644 --- a/arch/z16/src/common/z16_assert.c +++ b/arch/z16/src/common/z16_assert.c @@ -73,12 +73,13 @@ static void _up_assert(void) if (up_interrupt_context() || running_task()->flink == NULL) { +#if CONFIG_BOARD_RESET_ON_ASSERT >= 1 + board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE); +#endif + up_irq_save(); for (; ; ) { -#if CONFIG_BOARD_RESET_ON_ASSERT >= 1 - board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE); -#endif #ifdef CONFIG_ARCH_LEDS board_autoled_on(LED_PANIC); up_mdelay(250); diff --git a/arch/z80/src/common/z80_assert.c b/arch/z80/src/common/z80_assert.c index ff069ab40c..8312e0fb6d 100644 --- a/arch/z80/src/common/z80_assert.c +++ b/arch/z80/src/common/z80_assert.c @@ -71,12 +71,13 @@ static void _up_assert(void) if (up_interrupt_context() || running_task()->flink == NULL) { +#if CONFIG_BOARD_RESET_ON_ASSERT >= 1 + board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE); +#endif + up_irq_save(); for (; ; ) { -#if CONFIG_BOARD_RESET_ON_ASSERT >= 1 - board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE); -#endif #ifdef CONFIG_ARCH_LEDS board_autoled_on(LED_PANIC); up_mdelay(250);