cpuidle 中断疑惑点,为什么wfi之前local_irq_disable还能被中断把core踢出wfi?
GIC和各个CPU的接口包括两种硬件信号:
(a)触发CPU中断的信号。nIRQCPU和nFIQCPU信号线,熟悉ARM CPU的工程师对这两个信号线应该不陌生,主要用来触发ARM cpu进入IRQ mode和FIQ mode。
(b)Wake up信号。nFIQOUT和nIRQOUT信号线,去ARM CPU的电源管理模块,用来唤醒CPU的 。
因此disable了CPU的中断仅仅是堵死了中断这一个分支而已,wakeup信号仍在正常工作中。 关全局中断,意味着CPU不再处理(handler)GIC送来的中断,但并不说明GIC送来的中断不能唤醒CPU。 因此,suspend之后,产生中断,CPU醒来,继续执行,直到全局中断再次enable(arch_suspend_enable_irqs),CPU才会跳转到指定的中断handler中去处理中断