Skip to content

test(axvisor): validate x86 OVMF ACPI on VMX and SVM - #1931

Open
YoungCIoud wants to merge 4 commits into
rcore-os:devfrom
YoungCIoud:test/axvisor-x86-uefi-validation
Open

test(axvisor): validate x86 OVMF ACPI on VMX and SVM#1931
YoungCIoud wants to merge 4 commits into
rcore-os:devfrom
YoungCIoud:test/axvisor-x86-uefi-validation

Conversation

@YoungCIoud

Copy link
Copy Markdown
Contributor

解决的问题

最新 dev 已经具备 x86_64 Axvisor guest 的 OVMF、fw_cfg 和 ACPI 启动路径,并已有 VMX ovmf-acpi 用例能够启动 Linux initramfs。但是现有证据还不足以稳定回答以下问题:

  • 本次运行实际使用了哪一份 Ostool OVMF,最终装入 guest 的 4 MiB 镜像是否可复核;
  • SVM 是否能使用与 VMX 完全相同的 guest 配置到达同一个 guest-side 成功条件;
  • fw_cfg ACPI table-loader 是否生成了完整且顺序正确的 allocate、pointer 和 checksum 命令;
  • AXVISOR_X86_OVMF_ACPI_PASSED 究竟证明了哪段启动链路,又有哪些能力仍未覆盖。

本 PR 只补齐当前实现的验证与说明,不新增 guest UEFI 产品 feature,也不延续 #1888 中固定 firmware profile、首次 fw_cfg 访问 marker 或全局设备 trace 的早期诊断方案。

改了什么

  • 在准备 x86 guest OVMF 镜像时记录实际 Ostool CODE、VARS 和最终 guest image 的路径、字节数及 SHA-256;同时区分 split CODE/VARSmonolithic CODE 布局,并验证最终镜像固定为 4 MiB。
  • 增加 ovmf-acpi-svm 用例,与 VMX 用例共用同一个 build config、guest TOML、BusyBox initramfs、OVMF 镜像和成功断言;两者只在外层 QEMU 暴露的 VMX/SVM CPU 能力上不同。
  • 扩充 ACPI table-loader 最低层测试,逐项解码并验证 table/rsdp 分配、FADT/XSDT/RSDP 指针修正以及各 ACPI 表 checksum 命令的文件、偏移、范围、宽度和顺序。
  • 更新 Axvisor 测试文档和 x86 UEFI 调试说明,明确运行命令、证据来源、成功条件以及当前不能据此声明的能力。

不包含

  • guest PCI 启动设备或 ESP;
  • EFI 应用加载或 Linux EFI stub 磁盘启动;
  • OVMF VARS 持久化;
  • PCI INTx/MSI/MSI-X 完整链路;
  • INIT/SIPI、NMI 或多 vCPU UEFI guest;
  • 将当前 non-gating 用例升级为 CI 门禁。

实现逻辑

复用现有强证据

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

当前分支已完成以下端到端验证:

cargo xtask axvisor test qemu --arch x86_64 --test-group normal \
  --test-case smoke-vmx
cargo xtask axvisor test qemu --arch x86_64 --test-group normal \
  --test-case smoke-svm
cargo xtask axvisor test qemu --arch x86_64 --test-group normal \
  --test-case ovmf-acpi-vmx
cargo xtask axvisor test qemu --arch x86_64 --test-group normal \
  --test-case ovmf-acpi-svm

四个用例均通过;两个 OVMF 用例均命中:

AXVISOR_X86_OVMF_ACPI_PASSED

VMX 用例需要 Intel/VMX KVM 宿主,SVM 用例需要 AMD/SVM KVM 宿主。构建前还可以单独检查 Ostool 当前选择的固件路径:

cargo xtask ovmf --arch x86_64

已知限制

两个 OVMF 用例通过时仍观察到以下日志:

vpic wire mode change to LAPIC, unimplemented
vpic wire mode change to NULL, unimplemented
VM wire mode should be changed to INTR here, unimplemented

这些日志表明 VM 级 legacy PIC 输出在 INTRLAPICNULL 之间的路由切换尚未实现。当前单 vCPU 用例仍能通过,是因为现有中断注入路径足以支撑该工作负载;本 PR 因此只能证明当前 OVMF/Linux/ACPI 路径成立,不能证明完整 PIC/IOAPIC/LAPIC 切换、PCI 中断或 SMP 中断语义。

该缺口不在本验证 PR 中修复,也不会通过屏蔽 warning、放宽成功条件或扩大 timeout 处理;它进入后续中断完整性与 SMP feature 阶段。

@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 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...HEADcargo fmt --checkcargo 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_hostcargo 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

@YoungCIoud
YoungCIoud force-pushed the test/axvisor-x86-uefi-validation branch from 7a837b6 to 99ceca3 Compare August 9, 2026 11:18
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