test(axvisor): validate x86 OVMF ACPI on VMX and SVM - #1931
Conversation
There was a problem hiding this comment.
本 PR 为 Axvisor x86 嵌套 OVMF/ACPI 验证补强:记录由 Ostool 选择的 CODE、VARS 和最终 4 MiB guest 镜像证据;新增与既有 VMX 配置对称的 SVM case;并把 fw_cfg ACPI table-loader 的 allocate/pointer/checksum 二进制布局覆盖扩展为逐项断言。产品侧 loader、fw_cfg、ACPI、PIO/MMIO 和中断语义没有改动,影响范围局限于测试编排、测试资产、单元测试和说明文档。
已按 feature-development.md 作为高风险平台/固件验证能力审查:PR 描述说明了问题、边界、复用 Ostool 的理由和未覆盖项;没有新增公开运行时接口或第二套固件来源。Starry syscall/Linux ABI 指南不适用。与 #1888 的固定 profile/trace 方案不同,本 PR 基于当前 dev 已有的运行路径补强证据;检索的相关开放 PR 未发现同一实现的重复项。既有 review、行内评论和 PR 讨论均为空。
验证结果:git diff --check origin/dev...HEAD、cargo fmt --check、cargo test -p axbuild axvisor::test::ovmf(3 passed)、cargo test -p axvm --features host-test --lib arch::x86_64::boot::acpi::fw_cfg::tests::fw_cfg_blobs_describe_the_complete_x86_acpi_loader_plan(1 passed)、cargo clippy -p axbuild -- -D warnings 均通过;cargo xtask axvisor test qemu --arch x86_64 --test-group normal --list 已列出 ovmf-acpi-svm,证明新增 case 的发现/选择路径有效。cargo clippy -p axvm -- -D warnings 命中未改动的 ax-task needless_return 基线告警,未归因于本 PR。
当前组织 CI 为 success=5、skipped=6、failure=1。失败的 Check formatting / run_host 在 cargo fmt 后的 cargo publish --workspace --dry-run --no-verify 阶段失败;这是已由 #1929 跟踪的未发布 ax-errno 0.6.3 基线依赖问题,和本 PR 未改动的依赖元数据无关。当前 CI 没有执行本 PR 新增的 non-gating OVMF case。审查环境不存在 /dev/kvm,因此未重跑需要 KVM 的 VMX/SVM QEMU;此限制与文档中按 Intel/VMX 或 AMD/SVM 宿主分别运行的前置条件一致。新增 case 的 runner 发现与相关单元覆盖已本地验证。
检查了测试放置和失败传播:SVM TOML 位于既有 qemu-acpi-ovmf/ovmf-acpi case 下,使用现有成功 marker 和明确失败 regex;没有放宽已有断言或隐藏失败。未发现未解决问题、遗漏的测试接线或需要阻止合入的风险。维护者匹配到 ZR233(Axvisor/axvm)与 ZCShou(scripts/test-suit/docs);本次为批准结论且暂无额外领域跟进需要,未修改 reviewer 请求。
Powered by gpt-5.6-terra
7a837b6 to
99ceca3
Compare
解决的问题
最新
dev已经具备 x86_64 Axvisor guest 的 OVMF、fw_cfg 和 ACPI 启动路径,并已有 VMXovmf-acpi用例能够启动 Linux initramfs。但是现有证据还不足以稳定回答以下问题:AXVISOR_X86_OVMF_ACPI_PASSED究竟证明了哪段启动链路,又有哪些能力仍未覆盖。本 PR 只补齐当前实现的验证与说明,不新增 guest UEFI 产品 feature,也不延续 #1888 中固定 firmware profile、首次 fw_cfg 访问 marker 或全局设备 trace 的早期诊断方案。
改了什么
split CODE/VARS与monolithic CODE布局,并验证最终镜像固定为 4 MiB。ovmf-acpi-svm用例,与 VMX 用例共用同一个 build config、guest TOML、BusyBox initramfs、OVMF 镜像和成功断言;两者只在外层 QEMU 暴露的 VMX/SVM CPU 能力上不同。不包含
实现逻辑
复用现有强证据
dev已有的AXVISOR_X86_OVMF_ACPI_PASSED来自嵌套 Linux initramfs。只有在 OVMF 完成 kernel handoff、Linux 进入早期用户态,并且 guest 能读取 DSDT、APIC、FACP、SPCR、发现ttyS0、初始化 IOAPIC 且 online CPU 集合为0时才会输出。这个判据比“OVMF 首次访问 fw_cfg”更强,因此本 PR 不在产品代码中增加新的诊断 marker,也不改变 loader、fw_cfg、ACPI、PIO/MMIO 或中断运行语义。
固件来源保持单一
OVMF 的版本选择、下载、缓存和完整性校验继续由 Ostool 负责。Axvisor 测试层只组装当前 guest 所需的 4 MiB 镜像,并打印本次实际输入和输出的摘要,不增加第二套 firmware profile、下载器或 manifest。
VMX/SVM 只验证 backend 差异
两个用例不通过 Cargo feature 选择 VMX 或 SVM。Axvisor 仍根据运行时 CPUID 选择 backend;测试配置只改变外层 QEMU 的 CPU capability,从而保证结果差异可以归因于 VMX/SVM,而不是不同 guest 配置或固件资产。
协议错误尽量在最低层暴露
端到端 OVMF 用例证明完整启动结果;table-loader 单元测试则直接检查固件将要消费的二进制命令布局。这样在后续回归时,可以区分 ACPI loader 生成错误与固件、虚拟化 backend 或 guest OS 运行错误。
验证
先确认测试用例能够被 runner 发现:
cargo xtask axvisor test qemu --arch x86_64 --test-group normal --list当前分支已完成以下端到端验证:
四个用例均通过;两个 OVMF 用例均命中:
VMX 用例需要 Intel/VMX KVM 宿主,SVM 用例需要 AMD/SVM KVM 宿主。构建前还可以单独检查 Ostool 当前选择的固件路径:
已知限制
两个 OVMF 用例通过时仍观察到以下日志:
这些日志表明 VM 级 legacy PIC 输出在
INTR、LAPIC和NULL之间的路由切换尚未实现。当前单 vCPU 用例仍能通过,是因为现有中断注入路径足以支撑该工作负载;本 PR 因此只能证明当前 OVMF/Linux/ACPI 路径成立,不能证明完整 PIC/IOAPIC/LAPIC 切换、PCI 中断或 SMP 中断语义。该缺口不在本验证 PR 中修复,也不会通过屏蔽 warning、放宽成功条件或扩大 timeout 处理;它进入后续中断完整性与 SMP feature 阶段。