Skip to content

refactor(somehal): modernize x86 qemu irq routing#1430

Merged
ZR233 merged 1 commit into
devfrom
codex/x86-qemu-irq-refactor
Jun 29, 2026
Merged

refactor(somehal): modernize x86 qemu irq routing#1430
ZR233 merged 1 commit into
devfrom
codex/x86-qemu-irq-refactor

Conversation

@ZR233

@ZR233 ZR233 commented Jun 29, 2026

Copy link
Copy Markdown
Member

背景

当前 x86 QEMU 动态平台的中断路径仍混有一些旧式假设:外部 GSI 可以绕过 rdif_intc::Intc 直接改 IOAPIC,trap vector 和 GSI 之间存在全局原子旁路表,LAPIC IPI 发送缺少超时,xAPIC APIC ID 也存在潜在截断风险。这些行为和 GIC 风格的“外部中断控制器 / CPU 本地接口”分层不一致,在多核和虚拟化场景下更容易形成锁等待或路由状态不一致。

修改内容

  • 重构 somehal x86 中断层,拆出 lapicvector 模块:
    • LAPIC/x2APIC 只处理 timer、IPI、EOI、spurious 相关语义。
    • X86IoApicIntc 集中持有 ACPI GSI route、vector route 和 destination 状态。
    • 移除 VECTOR_ROUTES / IOAPIC_GSI_ROUTES 全局原子旁路表,以及 set_ioapic_gsi_enabled_from_irq 这类外部 bypass API。
  • IOAPIC enable/affinity 统一通过 rdif_intc::Intc controller 锁修改,避免 axhal/axplat-dyn/AxVM 直接改 GSI。
  • x86 LAPIC/IPI 改为运行时区分 x2APIC MSR 与 xAPIC MMIO:
    • x2APIC 保留完整 u32 APIC ID。
    • xAPIC 和 IOAPIC 物理 destination 对不可编码的 APIC ID 返回错误,避免静默截断。
    • IPI delivery-pending 等待加入有限超时。
  • someboot x86 AP 启动和 LAPIC timer 初始化同步支持 x2APIC。
  • axipi::run_on_cpu_sync_raw() 增加超时返回;irq-framework 禁止在 IRQ 上下文中触发远程 per-CPU 同步 enable/disable,避免互等死锁。
  • AxVM x86 host IRQ mask/unmask 改为通过 host IrqId 的正常 enable 路径。
  • 更新 arch-platform-porting 技能文档,记录现代 x86 QEMU IRQ 契约。

验证

  • cargo fmt
  • cargo test -p somehal arch::tests::
  • cargo test -p someboot
  • cargo test -p irq-framework --test std_sim
  • cargo test -p ax-ipi sync_call_wait
  • cargo xtask clippy --package somehal
  • cargo xtask clippy --package someboot
  • cargo xtask clippy --package irq-framework
  • cargo xtask clippy --package ax-ipi
  • cargo xtask clippy --package ax-hal
  • cargo xtask clippy --package axplat-dyn
  • cargo xtask clippy --package ax-runtime
  • cargo xtask clippy --package axvm
  • cargo xtask arceos test qemu --arch x86_64 --test-group rust --test-case task-ipi
  • cargo xtask starry test qemu --arch x86_64 --test-case qemu-smp4/system

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR #1430 审查意见

变更概述

本 PR 重构了 somehal x86 QEMU 中断路由层,将原来散落在 mod.rs 中的 LAPIC/x2APIC 逻辑拆分为独立的 lapic.rsvector.rs 模块,移除了全局原子旁路表 VECTOR_ROUTES / IOAPIC_GSI_ROUTES 和外部 bypass API set_ioapic_gsi_enabled_from_irq,使 IOAPIC 操作统一经过 rdif_intc::Intc 锁路径。

实现逻辑

  • 模块拆分lapic.rs 封装 EOI、IPI 发送(运行时区分 x2APIC MSR / xAPIC MMIO);vector.rs 封装 vector→IrqId 映射和保留 vector 校验。X86IoApicIntc 内部新增 vector_routes: Vec<(usize, IrqId)> 替代全局原子表。
  • x2APIC 支持somebootsomehal 均运行时检测 IA32_APIC_BASE.X2APIC_ENABLE,x2APIC 保留完整 u32 APIC ID,xAPIC 对 >0xFF ID 返回 InvalidCpu 错误,避免静默截断。
  • IPI 超时someboot::send_ipisomehal::lapic 均增加 IPI_DELIVERY_WAIT_SPINS 有限等待,超时返回 Erraxipi::run_on_cpu_sync_raw() 使用 Arc 替代裸指针并增加 SYNC_IPI_SPIN_LIMIT 超时。
  • IRQ 上下文保护registry::enable 在 per-CPU 远程 enable 前检查 in_irq_context(),返回 InIrqContext,避免 IRQ 中等待 IPI 导致死锁。
  • AxVM 统一路径host/irq.rsset_ioapic_gsi_enabled_from_irq 简化为 set_host_irq_enable,通过 ax_hal::irq::set_enable 走标准 IrqId enable 路径。
  • 未知 vector 处理begin_irq 对未路由的 vector 发送 EOI 并记录 warning,不再静默分发为 CPU-local IRQ(旧行为可能导致错误处理)。

测试与验证

  • cargo fmt --check
  • cargo test -p somehal arch::tests::(12 tests)✅
  • cargo test -p someboot(16+3 tests)✅
  • cargo test -p irq-framework --test std_sim(36 tests,含新增 remote_per_cpu_enable_from_irq_context_is_rejected_without_ipi)✅
  • cargo test -p ax-ipi sync_call_wait(2 tests)✅
  • cargo clippy -p somehal / irq-framework / ax-ipi 均无 warning ✅

CI 状态

head sha 6125f754 的 CI 运行中,Test axvisor x86_64 svm hosted / run_hostsuccess,其余多个 job(starry qemu、arceos qemu、loongarch64、riscv64、board、axloader 等)为 skipped,属于 CI 路径过滤和 run_host/run_container 互斥的预期行为,不影响本 PR 变更表面的覆盖判断。

重复与重叠分析

搜索了 dev 分支上的其他 open PR,#1417(net-bench)、#1432(ax-net rx wake 修复)、#1076 等均与本 PR 的 x86 IRQ 中断层重构无重叠。

未解决事项

无阻塞问题。本 PR 无 [patch.crates-io],无合并冲突,测试覆盖充分,CI 已通过相关路径。

Powered by mimo-v2.5-pro

@ZR233
ZR233 merged commit 799b5c0 into dev Jun 29, 2026
104 of 123 checks passed
@ZR233
ZR233 deleted the codex/x86-qemu-irq-refactor branch June 29, 2026 11:13
@github-actions github-actions Bot mentioned this pull request Jun 29, 2026
This was referenced Jul 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant