refactor(axvm): decouple axvisor arch logic#1471
Conversation
There was a problem hiding this comment.
审查总结
修改概述
本 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 清理:
AxVCpuRef、vcpu_list()、AsVCpuTask、VCpuTask等从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`,状态机管理 | |
There was a problem hiding this comment.
文档小问题:VmExit / VmExit 重复了。原来 VmExit / AxVCpuExitReason 是为了标注兼容名,现在旧名已删除,建议改为只保留一个 VmExit。
There was a problem hiding this comment.
审查总结
修改概述
本 PR 将 Axvisor 的架构相关职责(vCPU/backend 类型选择、boot protocol/platform synthesis、FDT/guest platform 处理、VM-exit/runtime 后处理)迁入 axvm,使 axvm 成为唯一的虚拟化架构边界。
实现逻辑
- ArchOps trait(
axvm/src/arch/mod.rs):定义统一架构抽象,四个架构各自实现,通过CurrentArch类型别名在编译期选择,各架构模块只覆盖需要特化的钩子。 - BootImageProvider trait(
axvm/src/boot/mod.rs):将镜像来源(build 时include_bytes、运行时文件系统读取)与加载逻辑分离,AxVM 负责架构 boot 规划,Axvisor 负责字节来源。 - BOOT_PROTOCOL_MATRIX(
axvmconfig/src/lib.rs):用数据矩阵替代分散的 match 分支,集中表达 boot protocol 与架构的兼容性验证。 - 代码收敛:
runtime/vcpus.rs中大量cfg(target_arch)分支收敛到各架构inject_pending_interrupt()等钩子中。 - API 清理:
AxVCpuRef、vcpu_list()等从pub收窄为pub(crate);set_ept_root改名为set_nested_page_table_root。 - 静态类型统一:
MemoryImage/FirmwareImage合并为axvm::boot::StaticVmImage,Axvisor 侧build.rs和config.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`,状态机管理 | |
There was a problem hiding this comment.
此处 VmExit / VmExit 仍然重复。原来写的是 VmExit / AxVCpuExitReason 用于标注兼容名,现在旧名已删除,建议改为只保留一个 VmExit。不阻断,可后续顺手修。
There was a problem hiding this comment.
审查总结
修改概述
本 PR 将 Axvisor 中的架构相关职责(vCPU/backend 类型选择、boot protocol/platform synthesis、FDT/guest platform 处理、VM-exit/runtime 后处理)迁入 axvm,使 axvm 成为唯一的虚拟化架构边界。共修改 72 个文件,+1863/-1635 行。
实现逻辑
- ArchOps trait(
axvm/src/arch/mod.rs):定义统一架构抽象,四个架构各自实现ArchOps,通过CurrentArch类型别名在编译期选择。vCPU 创建/设置、中断注入、IPI 目标计算、IO 读写结果回写、cache 操作等架构差异均收敛到各架构模块的 trait 实现中。 - BootImageProvider trait(
axvm/src/boot/mod.rs):将镜像来源(build 时include_bytes、运行时文件系统读取)与加载逻辑分离,AxVM 负责架构 boot 规划,Axvisor 负责字节来源。StaticVmImage统一了原先MemoryImage和FirmwareImage两个独立结构体。 - BOOT_PROTOCOL_MATRIX(
axvmconfig/src/lib.rs):用数据矩阵替代原先分散的 match 分支,集中表达 boot protocol 与架构的兼容性验证,用requires_firmware_path、requires_firmware_load_addr等布尔字段驱动校验逻辑。 - 代码收敛:
runtime/vcpus.rs中大量cfg(target_arch)分支、PendingInterrupt::LoongArchExternal等架构特化逻辑,均收敛到各架构的inject_pending_interrupt()钩子中。PendingInterrupt::External替代了PendingInterrupt::LoongArchExternal,使中断类型泛化。 - API 清理:
AxVCpuRef、vcpu_list()从pub收窄为pub(crate),外部使用VcpuSnapshot获取架构无关的 vCPU 状态快照;VCpuState重命名为VmVcpuState;set_ept_root改名为set_nested_page_table_root;ept_root()改名为nested_page_table_root()。 - Boot 模块迁移:
fdt/、guest_platform/、images/从os/axvisor/src/迁入axvm/src/boot/,Axvisor 通过AxvisorBootImageProvider实现BootImageProvidertrait 提供镜像字节。
本地验证
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
问题
当前 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 注入等能力收敛到各自架构模块。runtime/vcpus.rs,把 VM-exit 分发、IPI、idle、MMIO 后处理、IO read result 写回等架构差异改为通过CurrentArchhook 进入。images、fdt、guest_platform迁入axvm::boot,Axvisor 只负责镜像来源、配置装载、manager/shell 和 host 生命周期协调。set_ept_root改名为set_nested_page_table_root;同步更新调用点和文档。axvmconfig的 boot protocol 判断改为数据化 matrix,集中表达 x86_64 multiboot 与 x86_64/loongarch64 UEFI 支持关系。axvm对 LoongArch host ACPI probe 所需的 target dependency,修正 IOCSR shared state 类型,并清理目标相关 import。StaticVmImage::bios: Option<&'static [u8]>输出。设计逻辑
这次重构不保留向前兼容 wrapper,目的是让
axvm成为唯一虚拟化架构边界:cfg(target_arch)分支。验证
已通过:
cargo fmt --checkcargo test -p axbuild --libcargo test -p axvmconfigcargo test -p axaddrspacecargo test -p axvm --libcargo xtask clippy --package axvmcargo xtask clippy --package axaddrspacecargo xtask clippy --package axvmconfigcargo xtask axvisor test qemu --listcargo xtask axvisor test qemu --arch aarch64 --test-group normal --test-case smokecargo xtask axvisor test qemu --arch riscv64 --test-group normal --test-case smokecargo xtask axvisor test qemu --arch x86_64 --test-group normal --test-case smoke-vmxdocker 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。补充:
cargo xtask clippy --package axvisor按 xtask 逻辑退出 0,但提示 axvisor 需要使用专用 target/build flow,因此 Axvisor 侧以 qemu smoke 和目标 build 作为实际验证。