mirror of
				https://github.com/FreeRTOS/FreeRTOS-Kernel.git
				synced 2025-11-04 11:09:01 +01:00 
			
		
		
		
	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.
This commit is contained in:
		
							parent
							
								
									7d11089624
								
							
						
					
					
						commit
						4832377117
					
				
							
								
								
									
										9
									
								
								portable/ThirdParty/GCC/RP2040/port.c
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								portable/ThirdParty/GCC/RP2040/port.c
									
									
									
									
										vendored
									
									
								
							@ -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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user