From 4832377117b4198db43009f2b548497d9cdbf8da Mon Sep 17 00:00:00 2001 From: Timo Sandmann Date: Tue, 28 Dec 2021 21:30:03 +0100 Subject: [PATCH] smp branch: bugfix for race condition on RP2040 (#431) * Bugfix for race condition on RP2040 in vPortEnableInterrupts() RP2040 SMP port: Since spin_unlock() re-enables interrupts, pxYieldSpinLock has to be updated first to avoid a possible race condition. * Bugfix for invalid sanity checks on RP2040 RP2040 SMP port: Testing pxYieldSpinLock for NULL does not work reliable in these places, because another/new lock might already be set when configASSERT() is executed. --- portable/ThirdParty/GCC/RP2040/port.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/portable/ThirdParty/GCC/RP2040/port.c b/portable/ThirdParty/GCC/RP2040/port.c index c267a8310..a2270b1e9 100644 --- a/portable/ThirdParty/GCC/RP2040/port.c +++ b/portable/ThirdParty/GCC/RP2040/port.c @@ -375,8 +375,9 @@ void vPortEnableInterrupts( void ) #if ( configSUPPORT_PICO_SYNC_INTEROP == 1 ) if( pxYieldSpinLock ) { - spin_unlock(pxYieldSpinLock, ulYieldSpinLockSaveValue); + spin_lock_t* const pxTmpLock = pxYieldSpinLock; pxYieldSpinLock = NULL; + spin_unlock( pxTmpLock, ulYieldSpinLockSaveValue ); } #endif __asm volatile ( " cpsie i " ::: "memory" ); @@ -782,9 +783,6 @@ __attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void ) ulYieldSpinLockSaveValue = ulSave; xEventGroupWaitBits( xEventGroup, prvGetEventGroupBit(pxLock->spin_lock), pdTRUE, pdFALSE, portMAX_DELAY); - /* sanity check that interrupts were disabled, then re-enabled during the call, which will have - * taken care of the yield */ - configASSERT( pxYieldSpinLock == NULL); } } @@ -857,9 +855,6 @@ __attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void ) xEventGroupWaitBits( xEventGroup, prvGetEventGroupBit(pxLock->spin_lock), pdTRUE, pdFALSE, uxTicksToWait ); - /* sanity check that interrupts were disabled, then re-enabled during the call, which will have - * taken care of the yield */ - configASSERT( pxYieldSpinLock == NULL ); } else {