diff --git a/arch/arm/core/swap_helper.S b/arch/arm/core/swap_helper.S index a40e7720f08..7705352bfc6 100644 --- a/arch/arm/core/swap_helper.S +++ b/arch/arm/core/swap_helper.S @@ -61,6 +61,7 @@ SECTION_FUNC(TEXT, __pendsv) #elif defined(CONFIG_ARMV7_M_ARMV8_M_MAINLINE) movs.n r0, #_EXC_IRQ_DEFAULT_PRIO msr BASEPRI, r0 + isb /* Make the effect of disabling interrupts be realized immediately */ #else #error Unknown ARM architecture #endif /* CONFIG_ARMV6_M_ARMV8_M_BASELINE */ diff --git a/include/arch/arm/cortex_m/asm_inline_gcc.h b/include/arch/arm/cortex_m/asm_inline_gcc.h index 3a719bd1f17..a4a79bb3fef 100644 --- a/include/arch/arm/cortex_m/asm_inline_gcc.h +++ b/include/arch/arm/cortex_m/asm_inline_gcc.h @@ -132,7 +132,8 @@ static ALWAYS_INLINE unsigned int z_arch_irq_lock(void) __asm__ volatile( "mov %1, %2;" "mrs %0, BASEPRI;" - "msr BASEPRI, %1" + "msr BASEPRI, %1;" + "isb;" : "=r"(key), "=r"(tmp) : "i"(_EXC_IRQ_DEFAULT_PRIO) : "memory");