arm64 - 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。
谢谢,如果有人可以提供帮助。
解决方案
中断处理涉及两个概念,中断路由和中断屏蔽。将 PSTATE.DAIF 设置为 1,将屏蔽中断(但有一些条件),HCR_EL2.AMO、IMO、FMO 会将中断从 EL1 或 EL0 路由到 EL2。
- 如果您在 EL1/EL0,HCR_EL2.{IMO,FMO,AMO} 设置为 1,则无法使用 PSTATE.DAIF 位屏蔽中断。在这种情况下,中断将被传递到 EL2。这里假设 HCR_EL2.{E2H, TGE} 为零。
- 如果您在 EL1/EL0,HCR_EL2.{IMO,FMO,AMO} 设置为零,则可以使用 PSTATE.DAIF 位屏蔽中断。
- 如果您在 EL2,HCR_El2.{IMO,FMO,AMO} 设置为零,无论 PSTATE.DAIF 位如何,都不会传递中断。如果这些设置为 1,则 PSTATE.DAIF 位可以屏蔽中断。
同样,在 SCR_EL3.{EA,IRQ,FIQ} 中有控件,当设置为 1 时,会将中断从 EL2、EL1 或 EL0 路由到 EL3。上述规则在这里也适用。
推荐阅读
- pycharm - PyCharm 默认折叠/折叠功能
- discord.js - Discord.js,reconlx 按钮页面的问题
- java - 使用 Mockito 进行 Java Swing MVP 单元测试
- php - laravel 上基于角色的路由问题
- swift - 将文本字段添加到 contextMenu
- javascript - 使用 Javascript 的画布,在桌面上工作,但不能在手机上工作
- python-3.x - 在函数内的后台发送电子邮件 - Python FastAPI
- rxjs - Angular11 asyncvalidator 自定义验证器错误未添加到反应式表单错误列表中
- java - 我无法输入双数
- flutter - 将我的颤振应用上传到 Play 商店后出现问题