Skip to content

refactor(axvm): decouple axvisor arch logic#1471

Merged
ZR233 merged 3 commits into
rcore-os:devfrom
ZR233:codex/axvisor-axvm-arch-decoupling
Jul 2, 2026
Merged

refactor(axvm): decouple axvisor arch logic#1471
ZR233 merged 3 commits into
rcore-os:devfrom
ZR233:codex/axvisor-axvm-arch-decoupling

Conversation

@ZR233

@ZR233 ZR233 commented Jul 2, 2026

Copy link
Copy Markdown
Member

问题

当前 Axvisor 侧仍然承载了多处架构相关职责,包括 vCPU/backend 类型选择、boot protocol/platform synthesis、FDT/guest platform 处理以及部分 VM-exit/runtime 后处理。这会让 Axvisor 和 AxVM 在架构边界上耦合过紧,也让四个架构的虚拟化能力难以在 AxVM 内独立演进。

修改

  • axvm 内重建 arch 边界,引入 CurrentArch/ArchOps,并将 x86_64、aarch64、riscv64、loongarch64 的 HostIf、硬件支持检测、vCPU create/setup、runtime hook、cache/timer、IRQ 注入等能力收敛到各自架构模块。
  • 将通用 vCPU task 生命周期保留在 runtime/vcpus.rs,把 VM-exit 分发、IPI、idle、MMIO 后处理、IO read result 写回等架构差异改为通过 CurrentArch hook 进入。
  • 将 Axvisor 原先的 imagesfdtguest_platform 迁入 axvm::boot,Axvisor 只负责镜像来源、配置装载、manager/shell 和 host 生命周期协调。
  • 清理破坏性 API:删除旧 vmm 模块、旧 cache facade、旧 arch facade 和兼容导出;将 set_ept_root 改名为 set_nested_page_table_root;同步更新调用点和文档。
  • axvmconfig 的 boot protocol 判断改为数据化 matrix,集中表达 x86_64 multiboot 与 x86_64/loongarch64 UEFI 支持关系。
  • 修复 LoongArch 目标编译面:补齐 axvm 对 LoongArch host ACPI probe 所需的 target dependency,修正 IOCSR shared state 类型,并清理目标相关 import。
  • 修复 Axvisor build.rs 的 firmware-only 静态镜像生成,确保 UEFI firmware bytes 按 StaticVmImage::bios: Option<&'static [u8]> 输出。

设计逻辑

这次重构不保留向前兼容 wrapper,目的是让 axvm 成为唯一虚拟化架构边界:

  • Axvisor 不再直接感知架构 vCPU/backend 类型。
  • Guest boot planning、FDT placement、LoongArch firmware DTB/fw_cfg、x86 Linux/multiboot/UEFI patch 等策略迁入 AxVM。
  • Runtime 只保留通用生命周期,架构差异通过明确 hook 表达,避免继续扩散 cfg(target_arch) 分支。

验证

已通过:

  • cargo fmt --check
  • cargo test -p axbuild --lib
  • cargo test -p axvmconfig
  • cargo test -p axaddrspace
  • cargo test -p axvm --lib
  • cargo xtask clippy --package axvm
  • cargo xtask clippy --package axaddrspace
  • cargo xtask clippy --package axvmconfig
  • cargo xtask axvisor test qemu --list
  • cargo xtask axvisor test qemu --arch aarch64 --test-group normal --test-case smoke
  • cargo xtask axvisor test qemu --arch riscv64 --test-group normal --test-case smoke
  • cargo xtask axvisor test qemu --arch x86_64 --test-group normal --test-case smoke-vmx
  • docker run --rm -v "$PWD:/workspace" -w /workspace ghcr.io/rcore-os/tgoskits-container-axvisor-lvz:latest bash -lc 'cargo xtask axvisor test qemu --arch loongarch64 --test-group normal --test-case smoke'
  • docker run --rm -v "$PWD:/workspace" -w /workspace ghcr.io/rcore-os/tgoskits-container-axvisor-lvz:latest bash -lc 'cargo xtask axvisor build --arch loongarch64 --config test-suit/axvisor/normal/qemu/build-loongarch64-unknown-none-softfloat.toml'
  • cargo xtask axvisor build --arch x86_64 --config test-suit/axvisor/uefi/qemu-nimbos/build-x86_64-unknown-none.toml

环境阻塞:

  • cargo xtask axvisor test qemu --arch x86_64 --test-group normal --test-case smoke-svm:当前宿主机缺少 AMD SVM/NPT,QEMU 报 hardware virtualization is not supported
  • 第二次复跑 LoongArch smoke 时,rootfs registry 从 raw.githubusercontent.com 下载超时;此前一次 LoongArch smoke 已完整通过,后续又用 build-only 路径确认修复后的 LoongArch 编译无 warning。

补充:cargo xtask clippy --package axvisor 按 xtask 逻辑退出 0,但提示 axvisor 需要使用专用 target/build flow,因此 Axvisor 侧以 qemu smoke 和目标 build 作为实际验证。

@ZR233
ZR233 marked this pull request as ready for review July 2, 2026 03:02

@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 将 Axvisor 中的架构相关职责(vCPU/backend 类型选择、boot protocol/platform synthesis、FDT/guest platform 处理、VM-exit/runtime 后处理)迁入 axvm,使 axvm 成为唯一的虚拟化架构边界。

实现逻辑

  • ArchOps trait:在 axvm/src/arch/mod.rs 中定义统一的架构抽象,四个架构各自实现 ArchOps,通过 CurrentArch 类型别名在编译期选择。每个架构模块只覆盖需要特化的钩子,通用逻辑通过默认实现复用。
  • BootImageProvider trait:将镜像来源(build 时 include_bytes、运行时文件系统读取)与加载逻辑分离,AxVM 负责架构 boot 规划,Axvisor 负责字节来源。
  • BOOT_PROTOCOL_MATRIX:用数据矩阵替代原先分散的 match 分支来验证 boot protocol 与架构的兼容性,更易维护和扩展。
  • 代码收敛runtime/vcpus.rs 中大量 cfg(target_arch) 分支、PendingInterrupt::LoongArchExternal 等架构特化逻辑,均收敛到各架构的 inject_pending_interrupt() 钩子中。
  • API 清理AxVCpuRefvcpu_list()AsVCpuTaskVCpuTask 等从 pub 收窄为 pub(crate),减少公共 API 表面;set_ept_root 重命名为 set_nested_page_table_root

本地验证结果

  • cargo fmt --check:✅ 通过
  • cargo test -p axvmconfig --lib:✅ 16/16 通过
  • cargo test -p axvm --lib:✅ 67/67 通过
  • 未发现 [patch.crates-io]

CI 状态

  • 总 56 个检查:5 success, 28 skipped, 22 cancelled, 1 failure
  • success: spin-lint, sync-lint, formatting, detect changed paths, cancel stale CI
  • failure: Test axvisor loongarch64 qemu / run_container — loongarch64 rootfs 下载超时,属于 CI 基础设施问题,非本 PR 代码引起
  • cancelled/skipped: fork PR 的 run_host 作业按预期被取消/mirror skipped

重复/重叠分析

检查了当前所有 open PR(#1469 网络文档、#1451 等),无与本 PR 重叠或冲突的 PR。

唯一的小问题

docs/docs/development/axvisor.md 第 103 行 VmExit / VmExit 是重复的(原来是 VmExit / AxVCpuExitReason 兼容名标注),建议改为只写 VmExit。已在内联评论中指出,不构成阻断。

结论

重构设计合理,测试充分,无阻断问题,APPROVE。

Powered by mimo-v2.5-pro

|------|------|
| `axvm` | VM 抽象:`AxVM`, `AxVMRef`, `VMMemoryRegion`, `VMStatus` |
| `axvm-types` + `axvm/src/vcpu.rs` | vCPU 协议与 wrapper:`VmArchVcpuOps`, `VmExit` / `AxVCpuExitReason`,状态机管理 |
| `axvm-types` + `axvm/src/vcpu.rs` | vCPU 协议与 wrapper:`VmArchVcpuOps`, `VmExit` / `VmExit`,状态机管理 |

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.

文档小问题:VmExit / VmExit 重复了。原来 VmExit / AxVCpuExitReason 是为了标注兼容名,现在旧名已删除,建议改为只保留一个 VmExit

@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 将 Axvisor 的架构相关职责(vCPU/backend 类型选择、boot protocol/platform synthesis、FDT/guest platform 处理、VM-exit/runtime 后处理)迁入 axvm,使 axvm 成为唯一的虚拟化架构边界。

实现逻辑

  • ArchOps traitaxvm/src/arch/mod.rs):定义统一架构抽象,四个架构各自实现,通过 CurrentArch 类型别名在编译期选择,各架构模块只覆盖需要特化的钩子。
  • BootImageProvider traitaxvm/src/boot/mod.rs):将镜像来源(build 时 include_bytes、运行时文件系统读取)与加载逻辑分离,AxVM 负责架构 boot 规划,Axvisor 负责字节来源。
  • BOOT_PROTOCOL_MATRIXaxvmconfig/src/lib.rs):用数据矩阵替代分散的 match 分支,集中表达 boot protocol 与架构的兼容性验证。
  • 代码收敛runtime/vcpus.rs 中大量 cfg(target_arch) 分支收敛到各架构 inject_pending_interrupt() 等钩子中。
  • API 清理AxVCpuRefvcpu_list() 等从 pub 收窄为 pub(crate)set_ept_root 改名为 set_nested_page_table_root
  • 静态类型统一MemoryImage/FirmwareImage 合并为 axvm::boot::StaticVmImage,Axvisor 侧 build.rsconfig.rs 适配 BootImageProvider

本地验证

  • cargo fmt --check:✅ 通过
  • cargo test -p axvmconfig --lib:✅ 16/16 通过
  • cargo test -p axvm --lib:✅ 67/67 通过
  • 未发现 [patch.crates-io]

CI 状态

  • 10 个检查:4 success(spin-lint/run_container、sync-lint/run_container、Detect changed paths、Cancel stale CI)、5 skipped(fork PR 的 run_host 作业和 publish 作业按预期跳过)、1 in_progress(Check formatting/run_host,本地 fmt 已确认通过)、0 failure

重复/重叠分析

检查当前所有 open PR(#1468 RK3588 PWM sysfs、#1461 等),无与本 PR 重叠或冲突的 PR。

小问题

docs/docs/development/axvisor.md 第 103 行 VmExit / VmExit 仍然重复(原为 VmExit / AxVCpuExitReason 兼容名标注)。前次审查已指出,建议改为只写一个 VmExit。不构成阻断,已提交内联评论。

结论

重构设计合理——ArchOps trait 边界清晰、BootImageProvider 关注点分离得当、BOOT_PROTOCOL_MATRIX 数据驱动可维护、API 收窄恰当。测试充分,无阻断问题。APPROVE。

Powered by mimo-v2.5-pro

|------|------|
| `axvm` | VM 抽象:`AxVM`, `AxVMRef`, `VMMemoryRegion`, `VMStatus` |
| `axvm-types` + `axvm/src/vcpu.rs` | vCPU 协议与 wrapper:`VmArchVcpuOps`, `VmExit` / `AxVCpuExitReason`,状态机管理 |
| `axvm-types` + `axvm/src/vcpu.rs` | vCPU 协议与 wrapper:`VmArchVcpuOps`, `VmExit` / `VmExit`,状态机管理 |

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.

此处 VmExit / VmExit 仍然重复。原来写的是 VmExit / AxVCpuExitReason 用于标注兼容名,现在旧名已删除,建议改为只保留一个 VmExit。不阻断,可后续顺手修。

@mai-team-app mai-team-app Bot mentioned this pull request Jul 2, 2026
@ZR233
ZR233 merged commit f45f8c2 into rcore-os:dev Jul 2, 2026
56 checks passed

@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 将 Axvisor 中的架构相关职责(vCPU/backend 类型选择、boot protocol/platform synthesis、FDT/guest platform 处理、VM-exit/runtime 后处理)迁入 axvm,使 axvm 成为唯一的虚拟化架构边界。共修改 72 个文件,+1863/-1635 行。

实现逻辑

  • ArchOps traitaxvm/src/arch/mod.rs):定义统一架构抽象,四个架构各自实现 ArchOps,通过 CurrentArch 类型别名在编译期选择。vCPU 创建/设置、中断注入、IPI 目标计算、IO 读写结果回写、cache 操作等架构差异均收敛到各架构模块的 trait 实现中。
  • BootImageProvider traitaxvm/src/boot/mod.rs):将镜像来源(build 时 include_bytes、运行时文件系统读取)与加载逻辑分离,AxVM 负责架构 boot 规划,Axvisor 负责字节来源。StaticVmImage 统一了原先 MemoryImageFirmwareImage 两个独立结构体。
  • BOOT_PROTOCOL_MATRIXaxvmconfig/src/lib.rs):用数据矩阵替代原先分散的 match 分支,集中表达 boot protocol 与架构的兼容性验证,用 requires_firmware_pathrequires_firmware_load_addr 等布尔字段驱动校验逻辑。
  • 代码收敛runtime/vcpus.rs 中大量 cfg(target_arch) 分支、PendingInterrupt::LoongArchExternal 等架构特化逻辑,均收敛到各架构的 inject_pending_interrupt() 钩子中。PendingInterrupt::External 替代了 PendingInterrupt::LoongArchExternal,使中断类型泛化。
  • API 清理AxVCpuRefvcpu_list()pub 收窄为 pub(crate),外部使用 VcpuSnapshot 获取架构无关的 vCPU 状态快照;VCpuState 重命名为 VmVcpuStateset_ept_root 改名为 set_nested_page_table_rootept_root() 改名为 nested_page_table_root()
  • Boot 模块迁移fdt/guest_platform/images/os/axvisor/src/ 迁入 axvm/src/boot/,Axvisor 通过 AxvisorBootImageProvider 实现 BootImageProvider trait 提供镜像字节。

本地验证

  • cargo fmt --check:✅ 通过
  • cargo test -p axvmconfig --lib:✅ 16/16 通过
  • cargo test -p axvm --lib:✅ 67/67 通过
  • 未发现 [patch.crates-io]

CI 状态

  • CI 已通过的检查:spin-lint、sync-lint、formatting、detect changed paths、cancel stale CI 均成功
  • CI 失败Test axvisor loongarch64 qemu / run_container — loongarch64 rootfs 从 raw.githubusercontent.com 下载超时,属于 CI 基础设施问题,非本 PR 代码引起
  • 跳过/取消:fork PR 的 run_host 作业按预期被跳过
  • CI 已通过的检查项无需本地重复测试

重复/重叠分析

检查了当前所有 open PR,无与本 PR 重叠或冲突的 PR。

已有审查意见

前两次审查均 APPROVE,指出 docs/docs/development/axvisor.md 第 103 行 VmExit / VmExit 重复。当前 PR 版本中该问题仍然存在(原为 VmExit / AxVCpuExitReason 兼容名标注,旧名删除后变成了重复),建议后续修复时只保留一个 VmExit。不构成阻断。

结论

重构设计合理——ArchOps trait 边界清晰、BootImageProvider 关注点分离得当、BOOT_PROTOCOL_MATRIX 数据驱动可维护、API 收窄恰当。测试充分,CI 已通过(唯一失败为基础设施问题)。APPROVE。

Powered by mimo-v2.5-pro

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