Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FreeRTOS/FreeRTOS-Kernel.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimo Sandmann <tsandmann@users.noreply.github.com>2021-12-28 23:30:03 +0300
committerGitHub <noreply@github.com>2021-12-28 23:30:03 +0300
commit4832377117b4198db43009f2b548497d9cdbf8da (patch)
tree10b6f327700eb24c8fdc818cf36f0b913747424e
parent7d11089624cb18ef0052fd2fc96bb86d0d6d4109 (diff)
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.
-rw-r--r--portable/ThirdParty/GCC/RP2040/port.c9
1 files 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
{