首页 > 解决方案 > pi4 管理程序,处理 irq

问题描述

我正在使用树莓派 4B 板开发管理程序。当我研究中断虚拟化时,遇到一个问题,我按照这个文档
[url] https://developer.arm.com/documentation/102142/0100/Virtualizating-exceptions[/url]

[quote]产生虚拟中断有两种机制:

1 在内核内部,使用 HCR_EL2 中的控件。2 使用 GICv2 或更高版本的中断控制器。[/quote] 我使用方法 1。一切正常,我可以将 IRQ 路由到我的 EL2 代码,我可以将它转发到 EL1 Linux 内核。

但是,当我测试时,我尝试从 EL1 禁用 IRQ,使用“msr daifset,#0xf”,在此之后,IRQ 也不会触发到 EL2。我很困惑,因为上面的文件说 pstate.I 只会影响 vIRQ(for EL1) 而不是 pIRQ(EL2)。我测试了一个 GPIO 中断和 IPI 中断,都失败了。

我在网上搜索,关于这个主题的文章很少,找不到任何额外的设置。我找到的所有文件,都说在EL1中设置I bit,不会影响EL2/3。

谢谢,如果有人可以提供帮助。

标签: arm64raspberry-pi4hypervisor

解决方案


中断处理涉及两个概念,中断路由和中断屏蔽。将 PSTATE.DAIF 设置为 1,将屏蔽中断(但有一些条件),HCR_EL2.AMO、IMO、FMO 会将中断从 EL1 或 EL0 路由到 EL2。

  1. 如果您在 EL1/EL0,HCR_EL2.{IMO,FMO,AMO} 设置为 1,则无法使用 PSTATE.DAIF 位屏蔽中断。在这种情况下,中断将被传递到 EL2。这里假设 HCR_EL2.{E2H, TGE} 为零。
  2. 如果您在 EL1/EL0,HCR_EL2.{IMO,FMO,AMO} 设置为零,则可以使用 PSTATE.DAIF 位屏蔽中断。
  3. 如果您在 EL2,HCR_El2.{IMO,FMO,AMO} 设置为零,无论 PSTATE.DAIF 位如何,都不会传递中断。如果这些设置为 1,则 PSTATE.DAIF 位可以屏蔽中断。

同样,在 SCR_EL3.{EA,IRQ,FIQ} 中有控件,当设置为 1 时,会将中断从 EL2、EL1 或 EL0 路由到 EL3。上述规则在这里也适用。


推荐阅读