diff --git a/arch/sim/src/sim/posix/sim_hostsmp.c b/arch/sim/src/sim/posix/sim_hostsmp.c index f338c5b38ac..beed1dd332c 100644 --- a/arch/sim/src/sim/posix/sim_hostsmp.c +++ b/arch/sim/src/sim/posix/sim_hostsmp.c @@ -106,6 +106,8 @@ static void *sim_idle_trampoline(void *arg) host_cpu_started(); + sim_unlock(); + /* The idle Loop */ for (; ; ) diff --git a/arch/sim/src/sim/sim_doirq.c b/arch/sim/src/sim/sim_doirq.c index 62fba5aaea4..5adcf15cdfa 100644 --- a/arch/sim/src/sim/sim_doirq.c +++ b/arch/sim/src/sim/sim_doirq.c @@ -27,6 +27,7 @@ #include #include #include +#include #include "sim_internal.h" @@ -34,6 +35,15 @@ * Public Functions ****************************************************************************/ +void sim_unlock(void) +{ + /* wait until cpu0 in idle() */ + + while (!OSINIT_IDLELOOP()); + + sched_unlock(); +} + /**************************************************************************** * Name: sim_doirq ****************************************************************************/ diff --git a/arch/sim/src/sim/sim_internal.h b/arch/sim/src/sim/sim_internal.h index 5660d9d129a..1c35be0d965 100644 --- a/arch/sim/src/sim/sim_internal.h +++ b/arch/sim/src/sim/sim_internal.h @@ -206,6 +206,7 @@ extern char **g_argv; void sim_copyfullstate(xcpt_reg_t *dest, xcpt_reg_t *src); void *sim_doirq(int irq, void *regs); +void sim_unlock(void); /* sim_hostmisc.c ***********************************************************/ diff --git a/include/nuttx/irq.h b/include/nuttx/irq.h index 1f38864b5d3..0c94f71a3ad 100644 --- a/include/nuttx/irq.h +++ b/include/nuttx/irq.h @@ -80,10 +80,7 @@ do \ { \ g_cpu_irqset = 0; \ - SP_DMB(); \ - g_cpu_irqlock = SP_UNLOCKED; \ - SP_DSB(); \ - SP_SEV(); \ + spin_unlock_wo_note(&g_cpu_irqlock); \ } \ while (0) #endif