Why FreeRTOS is not masking interrupts while doing a context switch in SWI_Handler?

In the file FreeRTOS_Demo/Source/FreeRTOS-Source/Portable/RVDS/ARM-CA9/portmacro.h, we have the following definition. #define portYIELD() __asm( “SWI 0” ); Now, the corresponding SWI handler in portASM.s is ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; SVC handler is used to start the scheduler and yield a task. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FreeRTOSSWIHandler ; Check whether an iterrupt can occur at this point. PRESERVE8
; Save the context of the current task and select a new task to run.
portSAVE_CONTEXT
LDR R0, =vTaskSwitchContext
BLX R0
vPortRestoreTaskContext portRESTORE_CONTEXT However, nowhere in the above code, interrupts are disabled. Doesn’t it cause any problem if any other interrupt comes and moves a task into the ready queue or schedules a new task in the mean time?

Why FreeRTOS is not masking interrupts while doing a context switch in SWI_Handler?

All IRQs are disabled by the hardware, which is why you can’t find software doing it. The IRQ handler reenables interrupts so interrupts can nest but the SVC handler doesn’t.