The VIM supports the interruption of the currently active interrupt by one with a higher priority. FIQs and IRQs are completely separate but both use the same mechanism.
Note: VIM priority scheme: 00 = Highest Priority - 15 = Lowest Priority
When an interrupt goes from pending to active (FIQ: reading the MSS_VIM_FIQVEC register; IRQ: reading the MSS_VIM_IRQVEC register, or the
coreN_IRQACK going high), then the interrupt is loaded into the corresponding active register (MSS_VIM_ACTFIQ / MSS_VIM_ACTIRQ), and all interrupts of an equal or lesser priority are masked (discarded). If prior to this interrupt being cleared (by writing to the MSS_VIM_FIQVEC register, or MSS_VIM_IRQVEC register) another interrupt of higher priority arrives, then the FIQn/IRQn is asserted and that interrupt made pending as normal. If the CPU switches this interrupt to active (by reading the MSS_VIM_FIQVEC / MSS_VIM_IRQVEC register), then the currently active interrupt is pushed onto a stack. When an interrupt is cleared by reading the MSS_VIM_FIQVEC / MSS_VIM_IRQVEC register, if there are any interrupts on the stack, the first entry is popped off and put back into the MSS_VIM_ACTFIQ / MSS_VIM_ACTIRQ register, so that software retains original context and continues previous operation.
Note: "Masked off" means that the registers are masked off from priority arbitration to interrupt the currently active interrupt, this does not mean that the status bits in the registers are masked off. That is, this priority masking has NO EFFECT on whether the status bits are visible in the masked registers such as the Group M Interrupt Enabled Status/Clear Register.