Skip to content

refactor(axvm): layer RISC-V SBI IPI routing - #1920

Open
ZR233 wants to merge 1 commit into
rcore-os:devfrom
ZR233:codex/refactor-riscv-sbi-ipi-layering
Open

refactor(axvm): layer RISC-V SBI IPI routing#1920
ZR233 wants to merge 1 commit into
rcore-os:devfrom
ZR233:codex/refactor-riscv-sbi-ipi-layering

Conversation

@ZR233

@ZR233 ZR233 commented Aug 7, 2026

Copy link
Copy Markdown
Member

问题

PR #1681 补齐了 RISC-V guest SMP IPI,但协议细节被放进了 AxVM 公共架构位置:ArchOps 出现 RISC-V 专用 cfg,公共 arch/mod.rs 承担 hart-mask 解释与投递,退出原因还依赖 send_to_allsend_to_selfvector 等布尔式字段。这样会混淆 SBI 协议、guest hart 拓扑和 VM 中断传输三个层次,也让当前 vCPU 与远端 vCPU 走不同发布路径。

此外,原有 linux-smp1.toml 被改成了三核配置,失去了单核用例的原始含义。

修改

  • riscv_vcpu 内收口 SBI IPI 协议:
    • 使用带私有字段和只读访问器的 RiscvIpiRequest,显式区分 Legacy 与 SBI v0.2 ABI;
    • 统一完成态为 SuccessInvalidParameterFailed,由 vCPU 负责按 ABI 写回寄存器;
    • 私有 sbi_ipi 模块负责 extension 探测、标准/legacy mask 解码和短读错误;
    • CLEAR_IPI 与 S_SOFT/S_TIMER/S_EXT 注入统一更新保存的 HVIP 和已绑定硬件 CSR。
  • 在 AxVM 内建立清晰分层:
    • VM 层提供 crate-private 的 vcpu_id_for_arch_cpu_id,CPU-up 与 RISC-V IPI 共用同一拓扑解析;
    • arch/riscv64/ipi.rs 解释 hart mask、完整校验目标集合并映射 guest hart 到 vCPU;
    • 所有目标(包括当前 vCPU)统一通过 VmInterruptSender 发布 level-triggered VSSIP,复用队列、唤醒和目标侧 drain 路径;
    • 删除 ArchOps::ipi_targets、公共 arch/mod.rs 的 RISC-V helper/测试 cfg,以及旧的布尔式 SendIPI 路径。
  • 恢复 linux-smp1.toml 的单核含义,新增独立 linux-smp3-ipi.tomlnormal/smp-ipi 回归用例。
  • 增加中文设计文档与源码边界契约测试,固定所有权、数据流、错误语义和锁边界。

关键语义

  1. hart_mask_base == usize::MAX 选择 VM 的全部 guest hart;零 mask 成功且不投递。
  2. 普通 mask 使用 base + bit,溢出、重复映射或任一未映射 hart 均返回 SBI_ERR_INVALID_PARAM
  3. 所有目标验证完成后才开始发布,避免无效请求产生部分副作用。
  4. 验证后的运行时投递错误返回 SBI_ERR_FAILED;已经发布的软件中断不做不可实现的回滚。
  5. CLEAR_IPI 只清当前 vCPU 的 VSSIP,不影响 timer、external 或其他 vCPU。

验证

功能合入前的 dev 基线上,新增的 SMP IPI 用例会因 Linux 无法检测 SBI IPI extension 确定失败;本分支完成实现后通过同一用例。

  • cargo fmt --all
  • cargo test -p axvm --test arch_boundary_contract
  • cargo test -p axvm --features host-test irq::sender::tests
  • cargo xtask clippy --package riscv_vcpu
  • cargo xtask clippy --package axvm
  • cargo xtask axvisor test qemu --arch riscv64 --list
  • cargo xtask axvisor test qemu --arch riscv64 --test-group normal --test-case smp-ipi
    • Linux 启动 3 个 guest CPU
    • 检测到 SBI IPI extension detected
    • /proc/interrupts 出现非零 IPI 计数
    • 输出唯一标记 guest smp ipi pass!
  • cargo xtask axvisor build --arch aarch64
  • git diff --check origin/dev...HEAD

非目标

不引入独立 SBI IPI crate,不修改 vPLIC、宿主 IPI 传输、其他架构协议或共享 QEMU rootfs/success-check 实现。

@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 将 RISC-V guest SBI IPI 的解码、guest hart→vCPU 拓扑解析和通用中断队列投递重新分层;linux-smp1 保持单核,新增三核 QEMU IPI 冒烟用例。book/guideline/feature-development.md 适用:这是共享虚拟化能力,按中风险功能审查;设计材料位于 book/design/axvm-riscv-sbi-ipi.md,方案选择与现有 VmInterruptSender 边界一致,未发现与 base 已合入的 #1681 之外的重复开放 PR。

实现将协议状态留在 riscv_vcpu,由 AxVM RISC-V 层解析拓扑并经 VmInterruptSender 以 level-triggered VSSIP 发布;该方向与 SBI IPI 规范的目标和错误语义一致,改动对其他架构应保持隔离。历史 review/comment 均为空。组织 CI 当前 head 共 75 项完成(38 success、37 预期矩阵 skipped、0 failure),包含 RISC-V Axvisor QEMU 任务成功。

本地已通过:git diff --check origin/dev...HEADcargo fmt --checkcargo test -p axvm --test arch_boundary_contractcargo test -p axvm --features host-test irq::sender::testscargo xtask clippy --package axvmcargo xtask clippy --package riscv_vcpu;并用 cargo xtask axvisor test qemu --arch riscv64 --list 确认 smp-ipi 已被发现。未重复执行组织 CI 已成功的完整 QEMU workload。

阻塞项:新增 QEMU 测试仅证明一个成功工作负载,且 arch_boundary_contract 仅检查源码文本;SBI IPI 路由的可观察边界/失败语义没有行为回归覆盖,见下方。补齐后请重新请求审核。

Powered by gpt-5.6-terra

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