mirror of
https://github.com/apache/nuttx.git
synced 2026-06-01 07:45:16 +08:00
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 <xiaoxiang@xiaomi.com>
This commit is contained in:
committed by
David Sidrane
parent
cce7b7ada6
commit
13a7ae3d06
@@ -467,21 +467,22 @@ static void arm_assert(void)
|
|||||||
|
|
||||||
if (CURRENT_REGS || (running_task())->flink == NULL)
|
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 */
|
/* Disable interrupts on this CPU */
|
||||||
|
|
||||||
up_irq_save();
|
up_irq_save();
|
||||||
|
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
/* Try (again) to stop activity on other CPUs */
|
||||||
|
|
||||||
|
spin_trylock(&g_cpu_irqlock);
|
||||||
|
#endif
|
||||||
|
|
||||||
for (; ; )
|
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
|
#ifdef CONFIG_ARCH_LEDS
|
||||||
/* FLASH LEDs a 2Hz */
|
/* FLASH LEDs a 2Hz */
|
||||||
|
|
||||||
|
|||||||
@@ -514,21 +514,31 @@ static void arm64_assert(void)
|
|||||||
|
|
||||||
if (CURRENT_REGS || (running_task())->flink == NULL)
|
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 */
|
/* Disable interrupts on this CPU */
|
||||||
|
|
||||||
up_irq_save();
|
up_irq_save();
|
||||||
|
|
||||||
for (; ; )
|
|
||||||
{
|
|
||||||
#ifdef CONFIG_SMP
|
#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
|
#endif
|
||||||
|
|
||||||
|
for (; ; )
|
||||||
|
{
|
||||||
up_mdelay(250);
|
up_mdelay(250);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if CONFIG_BOARD_RESET_ON_ASSERT >= 2
|
||||||
|
board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
|||||||
@@ -72,12 +72,13 @@ static void _up_assert(void)
|
|||||||
|
|
||||||
if (g_current_regs || running_task()->flink == NULL)
|
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();
|
up_irq_save();
|
||||||
for (; ; )
|
for (; ; )
|
||||||
{
|
{
|
||||||
#if CONFIG_BOARD_RESET_ON_ASSERT >= 1
|
|
||||||
board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE);
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_ARCH_LEDS
|
#ifdef CONFIG_ARCH_LEDS
|
||||||
board_autoled_on(LED_PANIC);
|
board_autoled_on(LED_PANIC);
|
||||||
up_mdelay(250);
|
up_mdelay(250);
|
||||||
|
|||||||
@@ -298,18 +298,20 @@ static void _up_assert(int errorcode)
|
|||||||
|
|
||||||
if (up_interrupt_context() || sched_idletask())
|
if (up_interrupt_context() || sched_idletask())
|
||||||
{
|
{
|
||||||
|
#if CONFIG_BOARD_RESET_ON_ASSERT >= 1
|
||||||
|
board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE);
|
||||||
|
#endif
|
||||||
|
|
||||||
up_irq_save();
|
up_irq_save();
|
||||||
|
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
/* Try (again) to stop activity on other CPUs */
|
||||||
|
|
||||||
|
spin_trylock(&g_cpu_irqlock);
|
||||||
|
#endif
|
||||||
|
|
||||||
for (; ; )
|
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
|
else
|
||||||
@@ -317,7 +319,6 @@ static void _up_assert(int errorcode)
|
|||||||
#if CONFIG_BOARD_RESET_ON_ASSERT >= 2
|
#if CONFIG_BOARD_RESET_ON_ASSERT >= 2
|
||||||
board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE);
|
board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE);
|
||||||
#endif
|
#endif
|
||||||
exit(errorcode);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -268,12 +268,13 @@ static void _up_assert(void)
|
|||||||
|
|
||||||
if (g_current_regs || (running_task())->flink == NULL)
|
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();
|
up_irq_save();
|
||||||
for (; ; )
|
for (; ; )
|
||||||
{
|
{
|
||||||
#if CONFIG_BOARD_RESET_ON_ASSERT >= 1
|
|
||||||
board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE);
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_ARCH_LEDS
|
#ifdef CONFIG_ARCH_LEDS
|
||||||
board_autoled_on(LED_PANIC);
|
board_autoled_on(LED_PANIC);
|
||||||
up_mdelay(250);
|
up_mdelay(250);
|
||||||
|
|||||||
@@ -72,12 +72,13 @@ static void _up_assert(void)
|
|||||||
|
|
||||||
if (CURRENT_REGS || running_task()->flink == NULL)
|
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();
|
up_irq_save();
|
||||||
for (; ; )
|
for (; ; )
|
||||||
{
|
{
|
||||||
#if CONFIG_BOARD_RESET_ON_ASSERT >= 1
|
|
||||||
board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE);
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_ARCH_LEDS
|
#ifdef CONFIG_ARCH_LEDS
|
||||||
board_autoled_on(LED_PANIC);
|
board_autoled_on(LED_PANIC);
|
||||||
up_mdelay(250);
|
up_mdelay(250);
|
||||||
|
|||||||
@@ -77,12 +77,13 @@ static void _up_assert(void)
|
|||||||
|
|
||||||
if (g_current_regs || running_task()->flink == NULL)
|
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();
|
up_irq_save();
|
||||||
for (; ; )
|
for (; ; )
|
||||||
{
|
{
|
||||||
#if CONFIG_BOARD_RESET_ON_ASSERT >= 1
|
|
||||||
board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE);
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_ARCH_LEDS
|
#ifdef CONFIG_ARCH_LEDS
|
||||||
board_autoled_on(LED_PANIC);
|
board_autoled_on(LED_PANIC);
|
||||||
up_mdelay(250);
|
up_mdelay(250);
|
||||||
|
|||||||
@@ -77,12 +77,13 @@ static void _up_assert(void)
|
|||||||
|
|
||||||
if (g_current_regs || running_task()->flink == NULL)
|
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();
|
up_irq_save();
|
||||||
for (; ; )
|
for (; ; )
|
||||||
{
|
{
|
||||||
#if CONFIG_BOARD_RESET_ON_ASSERT >= 1
|
|
||||||
board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE);
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_ARCH_LEDS
|
#ifdef CONFIG_ARCH_LEDS
|
||||||
board_autoled_on(LED_PANIC);
|
board_autoled_on(LED_PANIC);
|
||||||
up_mdelay(250);
|
up_mdelay(250);
|
||||||
|
|||||||
@@ -312,12 +312,13 @@ static void _up_assert(void)
|
|||||||
|
|
||||||
if (CURRENT_REGS || running_task()->flink == NULL)
|
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();
|
up_irq_save();
|
||||||
for (; ; )
|
for (; ; )
|
||||||
{
|
{
|
||||||
#if CONFIG_BOARD_RESET_ON_ASSERT >= 1
|
|
||||||
board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE);
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_ARCH_LEDS
|
#ifdef CONFIG_ARCH_LEDS
|
||||||
board_autoled_on(LED_PANIC);
|
board_autoled_on(LED_PANIC);
|
||||||
up_mdelay(250);
|
up_mdelay(250);
|
||||||
|
|||||||
@@ -74,11 +74,13 @@ static void _up_assert(void)
|
|||||||
|
|
||||||
if (g_current_regs || running_task()->flink == NULL)
|
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 (; ; )
|
for (; ; )
|
||||||
{
|
{
|
||||||
#if CONFIG_BOARD_RESET_ON_ASSERT >= 1
|
|
||||||
board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE);
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_ARCH_LEDS
|
#ifdef CONFIG_ARCH_LEDS
|
||||||
board_autoled_on(LED_PANIC);
|
board_autoled_on(LED_PANIC);
|
||||||
up_mdelay(250);
|
up_mdelay(250);
|
||||||
|
|||||||
@@ -429,18 +429,19 @@ static void riscv_assert(void)
|
|||||||
|
|
||||||
if (CURRENT_REGS || running_task()->flink == NULL)
|
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();
|
up_irq_save();
|
||||||
for (; ; )
|
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
|
#ifdef CONFIG_ARCH_LEDS
|
||||||
board_autoled_on(LED_PANIC);
|
board_autoled_on(LED_PANIC);
|
||||||
up_mdelay(250);
|
up_mdelay(250);
|
||||||
|
|||||||
@@ -73,12 +73,13 @@ static void _up_assert(int errorcode)
|
|||||||
|
|
||||||
if (g_current_regs || running_task()->flink == NULL)
|
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();
|
up_irq_save();
|
||||||
for (; ; )
|
for (; ; )
|
||||||
{
|
{
|
||||||
#if CONFIG_BOARD_RESET_ON_ASSERT >= 1
|
|
||||||
board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE);
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_ARCH_LEDS
|
#ifdef CONFIG_ARCH_LEDS
|
||||||
board_autoled_on(LED_PANIC);
|
board_autoled_on(LED_PANIC);
|
||||||
up_mdelay(250);
|
up_mdelay(250);
|
||||||
|
|||||||
@@ -234,12 +234,13 @@ static void _up_assert(void)
|
|||||||
|
|
||||||
if (g_current_regs || (running_task())->flink == NULL)
|
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();
|
up_irq_save();
|
||||||
for (; ; )
|
for (; ; )
|
||||||
{
|
{
|
||||||
#if CONFIG_BOARD_RESET_ON_ASSERT >= 1
|
|
||||||
board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE);
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_ARCH_LEDS
|
#ifdef CONFIG_ARCH_LEDS
|
||||||
board_autoled_on(LED_PANIC);
|
board_autoled_on(LED_PANIC);
|
||||||
up_mdelay(250);
|
up_mdelay(250);
|
||||||
|
|||||||
@@ -221,12 +221,13 @@ static void _up_assert(void)
|
|||||||
|
|
||||||
if (g_current_regs || (running_task())->flink == NULL)
|
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();
|
up_irq_save();
|
||||||
for (; ; )
|
for (; ; )
|
||||||
{
|
{
|
||||||
#if CONFIG_BOARD_RESET_ON_ASSERT >= 1
|
|
||||||
board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE);
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_ARCH_LEDS
|
#ifdef CONFIG_ARCH_LEDS
|
||||||
board_autoled_on(LED_PANIC);
|
board_autoled_on(LED_PANIC);
|
||||||
up_mdelay(250);
|
up_mdelay(250);
|
||||||
|
|||||||
@@ -112,14 +112,15 @@ static void xtensa_assert(void)
|
|||||||
|
|
||||||
if (CURRENT_REGS || running_task()->flink == NULL)
|
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 */
|
/* Blink the LEDs forever */
|
||||||
|
|
||||||
up_irq_save();
|
up_irq_save();
|
||||||
for (; ; )
|
for (; ; )
|
||||||
{
|
{
|
||||||
#if CONFIG_BOARD_RESET_ON_ASSERT >= 1
|
|
||||||
board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE);
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_ARCH_LEDS
|
#ifdef CONFIG_ARCH_LEDS
|
||||||
board_autoled_on(LED_PANIC);
|
board_autoled_on(LED_PANIC);
|
||||||
up_mdelay(250);
|
up_mdelay(250);
|
||||||
|
|||||||
@@ -73,12 +73,13 @@ static void _up_assert(void)
|
|||||||
|
|
||||||
if (up_interrupt_context() || running_task()->flink == NULL)
|
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();
|
up_irq_save();
|
||||||
for (; ; )
|
for (; ; )
|
||||||
{
|
{
|
||||||
#if CONFIG_BOARD_RESET_ON_ASSERT >= 1
|
|
||||||
board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE);
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_ARCH_LEDS
|
#ifdef CONFIG_ARCH_LEDS
|
||||||
board_autoled_on(LED_PANIC);
|
board_autoled_on(LED_PANIC);
|
||||||
up_mdelay(250);
|
up_mdelay(250);
|
||||||
|
|||||||
@@ -71,12 +71,13 @@ static void _up_assert(void)
|
|||||||
|
|
||||||
if (up_interrupt_context() || running_task()->flink == NULL)
|
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();
|
up_irq_save();
|
||||||
for (; ; )
|
for (; ; )
|
||||||
{
|
{
|
||||||
#if CONFIG_BOARD_RESET_ON_ASSERT >= 1
|
|
||||||
board_reset(CONFIG_BOARD_ASSERT_RESET_VALUE);
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_ARCH_LEDS
|
#ifdef CONFIG_ARCH_LEDS
|
||||||
board_autoled_on(LED_PANIC);
|
board_autoled_on(LED_PANIC);
|
||||||
up_mdelay(250);
|
up_mdelay(250);
|
||||||
|
|||||||
Reference in New Issue
Block a user