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

davids5 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new 13a7ae3d06 arch: Call board_reset before up_irq_save and spin_trylock
13a7ae3d06 is described below

commit 13a7ae3d06cbd84962da52f3240fbfdac5fd8dd3
Author: Xiang Xiao <[email protected]>
AuthorDate: Wed Jul 27 03:08:14 2022 +0800

    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 <[email protected]>
---
 arch/arm/src/common/arm_assert.c        | 15 ++++++++-------
 arch/arm64/src/common/arm64_assert.c    | 18 ++++++++++++++----
 arch/avr/src/common/up_assert.c         |  7 ++++---
 arch/ceva/src/common/up_assert.c        | 17 +++++++++--------
 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   | 17 +++++++++--------
 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, 93 insertions(+), 66 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();
 
-      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
 
-#if CONFIG_BOARD_RESET_ON_ASSERT >= 1
-          board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE);
-#endif
+      for (; ; )
+        {
 #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();
-      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
 
-#if CONFIG_BOARD_RESET_ON_ASSERT >= 1
-          board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE);
-#endif
+      for (; ; )
+        {
         }
     }
   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)
     {
-      for (; ; )
-        {
 #if CONFIG_BOARD_RESET_ON_ASSERT >= 1
-          board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE);
+      board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE);
 #endif
+
+      up_irq_save();
+      for (; ; )
+        {
 #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)
     {
-      up_irq_save();
-      for (; ; )
-        {
+#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 */
+      /* Try (again) to stop activity on other CPUs */
 
-          spin_trylock(&g_cpu_irqlock);
+      spin_trylock(&g_cpu_irqlock);
 #endif
 
-#if CONFIG_BOARD_RESET_ON_ASSERT >= 1
-          board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE);
-#endif
+      up_irq_save();
+      for (; ; )
+        {
 #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);

Reply via email to