首页 > 解决方案 > aarch64 非安全组 1 中断未停用(但作为组 0 中断,ISR 运行正常)

问题描述

我正在 qemu-system-aarch64 上测试一个简单的裸机程序。我添加了一个简单的外围设备来生成中断,当我启用外围设备并给它一个命令时,它会生成中断。我分配了中断 ID 208。(SPI 196、208-32=196)。
当我将中断分配给组 0 时,它可以很好地处理两个中断。但是当我将中断分配给非安全组 1 时,停用从第一个中断开始不起作用。我只显示下面两种设置的区别。

要在 ISR 中获取中断 ID,在使用组 0 时,我使用mrs x0, s3_0_c12_c8_0(ICC_IAR0_EL1, interrupt ack register for group 0)获取 ID,但在使用非安全组 1 时,我使用mrs x0, s3_0_c12_c12_0(ICC_IAR1_EL1, ack for group 1)获取 INTID。这没问题,因为在这两种情况下我都得到了 ID 208 ok。
要将 IRQ 分配到一个组中,对于组 0 的情况,我将位“0”写入相应的 GICD_GROUPR 位,对于 NS-group1 的情况,我将位“1”写入 GICD_GROUPR 寄存器位。当然,组 0 和组 1 都在 ICC_IGRPEN1_EL3 寄存器中启用。(裸机程序在 EL3 中运行)
问题是停用。这对 NS-group1 不起作用:对于 0 组测试,我将 INTID 值写入 ICC_EOIR0_EL1(中断结束)寄存器,并将值写入 ICC_DIR_EL1(停用)寄存器。但是对于 NS-group1 的情况,我将 INTID 值写入 ICC_EOIR1_EL1 和 ICC_DIR_EL1。

我尝试了其他设置,但找不到它,但仍在尝试找到我错过的内容。如果有了解 aarch64 的人能给我一些建议,我将不胜感激。谢谢!

标签: exceptioninterruptarm64

解决方案


推荐阅读