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.
pull/456/head
Timo Sandmann 3 years ago committed by GitHub
parent 7d11089624
commit 4832377117
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -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
{

Loading…
Cancel
Save