Repository navigation
Fix APLIC MSI retriggering for deasserted level interrupts - #11966
zijunteng238-dot wants to merge 6 commits into
Conversation
|
👋 感谢您对 RT-Thread 的贡献!Thank you for your contribution to RT-Thread! 为确保代码符合 RT-Thread 的编码规范,请在你的仓库中执行以下步骤运行代码格式化工作流(如果格式化CI运行失败)。 🛠 操作步骤 | Steps
完成后,提交将自动更新至 如有问题欢迎联系我们,再次感谢您的贡献!💐 |
📌 Code Review Assignment🏷️ Tag: documentationReviewers: @CXSforHPU @GorrayLi @lianux-mm Changed Files (Click to expand)
🏷️ Tag: libcpu_riscvReviewers: @Yaochenger Changed Files (Click to expand)
📊 Current Review Status (Last Updated: 2026-11-01 20:40 CST)
📝 Review Instructions
|
拉取/合并请求描述:(PR description)
[
为什么提交这份PR (why to submit this PR)
在 QEMU 8.2.2 上运行 bsp/qemu-virt64-riscv,采用 RV64、SMP 4 核及 AIA(APLIC/IMSIC)配置时,带有 rt_thread_mdelay(1000) 延时的计数打印程序仅输出 RISC-V test: 0,随后无法继续打印。
经排查,APLIC 驱动在处理电平中断的 EOI 时会无条件写入 setipnum_le。旧版 QEMU 在设备已经撤销中断后,仍可能因该写入产生新的 MSI,形成持续的虚假中断,阻碍系统定时器处理,导致延时线程无法正常恢复执行。
QEMU 上游已通过相关提交修复这一模拟问题。本 PR 在 RT-Thread 的 APLIC 驱动中增加兼容处理,使上述旧版 QEMU 环境也能正常运行。
你的解决方案是什么 (what is your solution)
修改 libcpu/risc-v/common/pic/pic-riscv-aplic.c 中的 aplic_msi_irq_eoi():对于高、低电平中断,先读取 in_clrip 中对应的有效输入状态(rectified input,已考虑中断极性),仅在设备仍保持中断有效时写入 setipnum_le。这样既保留了电平中断的重触发能力,也避免了设备撤销中断后,旧版 QEMU 继续产生虚假 MSI。
同时,将 bsp/qemu-virt64-riscv/applications/main.c 中原先仅打印一次 Hello RISC-V 的程序改为计数循环,依次输出 RISC-V test: 0 至 RISC-V test: 9,每次打印后调用 rt_thread_mdelay(1000)。该程序用于复现问题,并观察修复后的延时与线程恢复行为;完成十次打印和延时后退出 main()。
此外,补充问题记录,说明复现步骤、定位过程、兼容处理方式及验证结果。
请提供验证的bsp和config (provide the config and bsp)
CONFIG_ARCH_RISCV64=y
CONFIG_RT_USING_RISCV_NEW_COMMON=y
CONFIG_RT_USING_SMP=y
CONFIG_RT_CPUS_NR=4
CONFIG_RT_TICK_PER_SECOND=100
CONFIG_RT_USING_SMART is not set
AIA 由 qemu.py 的启动参数控制,RV64 下默认启用。测试时通过添加 -no-aia 切换到传统中断路径,进行对照验证。
验证环境:
在 BSP 目录执行 scons -j8,编译和链接通过。修复后,以下三种运行配置均能完整输出 RISC-V test: 0 至 RISC-V test: 9:
第三项测试使用独立临时磁盘,并将宿主机监听端口调整为自动分配,以避免资源占用;虚拟机中的默认设备组合保持开启。
本次验证覆盖上述 QEMU 8.2.2 环境,尚未覆盖真实 APLIC 硬件、低电平外设及其他 QEMU 版本。
]
当前拉取/合并请求的状态 Intent for your PR
必须选择一项 Choose one (Mandatory):
代码质量 Code Quality:
我在这个拉取/合并请求中已经考虑了 As part of this pull request, I've considered the following:
#if 0代码,不包含已经被注释了的代码 All redundant code is removed and cleaned up