最简单的方法是将 FIQ 中断分配给安全世界,将 IRQ 分配给正常世界。有一个 trustzone 寄存器(SCR或安全配置寄存器)可以将 IRQ/FIQ 路由到监视器或直接路由到当前世界中的操作系统。GIC 本身允许所有中断为 FIQ 或 IRQ(我认为文档将其称为type 0和type 1)。您始终可以路由到监视器,或者您可以动态切换(在世界切换上)中断路由的位置。
World | Normal | Secure
------+--------+--------
FIQ | Monitor| Through
IRQ | Through| Monitor
监视器陷阱将需要保存大量寄存器(保存寄存器的世界切换)。您可以在某种程度上信任安全中断处理程序,但对于正常世界,所有赌注都应该关闭。
也许还有其他方法可以处理它,但这是最不复杂的。例如,您始终可以拥有一个固定的中断源所有者表(他们属于哪个世界)。我想还有很多其他的方法。大多数人总是会陷入监控模式,出于性能原因,这在某种程度上是不可取的。
对于您的管理程序情况,您必须在来宾操作系统中禁止 FIQ 中断。可能它们不会很好地工作,因为它们被认为是 FAST 并且虚拟化会干扰这一点。如果是这种情况,您可以将 SCR 保留在Normal列中(因此 SCR 是恒定的)。