Skip to content

feat: Enhance SVM support and improve PIT handling for Linux guests#1005

Merged
ZR233 merged 6 commits into
devfrom
svm-linux
May 29, 2026
Merged

feat: Enhance SVM support and improve PIT handling for Linux guests#1005
ZR233 merged 6 commits into
devfrom
svm-linux

Conversation

@Josen-B

@Josen-B Josen-B commented May 28, 2026

Copy link
Copy Markdown
Contributor

背景

本 PR 为 AxVisor 的 SVM 后端补充最小化 x86_64 Linux guest 启动支持,使 AMD/SVM 环境下可以通过 QEMU smoke test 启动 Linux rootfs,并完成基础串口交互验证。

此前 SVM 路径主要覆盖较简单的 guest 场景,Linux 启动过程中会依赖更完整的 x86 平台行为,例如 PIT 定时器、外部中断重注入、部分 CPUID/CR4 能力裁剪、RDTSC 处理以及基础 MMIO/PIO 设备访问。本 PR 以“先支持最小 Linux guest 稳定启动”为目标补齐这些能力。

修改内容

  1. 新增 SVM Linux guest 配置与测试入口
  • 添加 linux-x86_64-qemu-smp1-svm.toml,使用 Linux direct boot 方式从 fs 加载 kernel。
  • 调整 SVM QEMU smoke test,使其启动 Linux guest,并通过串口执行简单命令验证 guest 已进入用户态。
  • 当前配置保持单 vCPU,目标是先覆盖最小 Linux 启动路径。
  1. 补齐 SVM Linux 启动所需的 VM-exit 处理
  • 增加 SVM 外部事件队列和中断重注入逻辑。
  • 支持 PIT/serial 等设备产生的中断注入。
  • 处理 HLTPAUSEINTR 等 VM-exit,将其作为 VMM 检查 timer/IRQ 的调度点。
  • 补充部分 MSR、I/O port、x2APIC 访问处理,使 Linux boot path 可以继续推进。
  1. 改进 PIT 设备模型
  • 支持更多 PIT channel mode。
  • 增加 count/status latch 和 read-back command 处理。
  • 改进 channel output/current count 计算,使 Linux 使用 PIT 进行 early timer 初始化时可以得到更合理的行为。
  1. 调整 SVM CPUID、CR4 与 xstate 暴露策略
  • 对 Linux 当前启动路径不需要、且 SVM 后端尚未完整支持的特性进行裁剪。
  • 避免向 guest 暴露 VMX、PCID、TSC deadline、部分 CR4 相关能力等不匹配的 host feature。
  • 对 guest CR4 写入做最小过滤,避免 Linux 根据 host CPUID 开启当前 SVM 模型尚未支持的控制位。
  1. 改进 TSC 相关处理
  • 补充 SVM RDTSC 处理,结合 VMCB tsc_offset 向 guest 返回时间戳。
  • 使 Linux guest 在当前最小平台模型下可以完成启动和基础交互。

当前方式

本 PR 不是完整 PC 平台模拟,而是面向 Linux direct boot 的最小 SVM guest 支持:

  • 使用 Linux boot protocol 直接加载 kernel。
  • 使用 virtio-blk 作为根文件系统设备。
  • 使用 emulated serial、PIT、IOAPIC/vLAPIC 路径满足 early boot 和基础 shell 交互。
  • 通过 CPUID/CR4 裁剪避免 Linux 进入当前 SVM 后端尚未完整实现的高级特性路径。

局限性

  • 当前仅覆盖单 vCPU Linux guest。
  • 仍不是完整 APIC/ACPI/PCI 平台模型。
  • 部分 kernel cmdline 仍用于限制 Linux 进入未支持路径,例如 MSI、x2APIC、部分默认设备初始化等。
  • SVM smoke test 需要 AMD/SVM 环境,本地 Intel 机器无法实际运行该测试,只能做构建和静态检查。
  • TSC/timer 支持仍是最小化实现,后续需要进一步收敛 clocksource 和 timer 行为。

后续工作

  • 继续完善 SVM 下的 timer/clocksource 支持,减少 guest cmdline workaround。
  • 收敛 x86 设备拓扑,避免暴露 Linux 当前不需要的默认硬件。
  • 改进 SVM 中断注入状态机,并补充更多单元测试。
  • 逐步完善 APIC/x2APIC、PCI routing、MSI/MSI-X 等能力。
  • 在 AMD CI 环境中扩大 Linux guest smoke 覆盖范围。

@Josen-B

Josen-B commented May 28, 2026

Copy link
Copy Markdown
Contributor Author

与 VMX Linux 支持的异同

相同点

  • 都采用 Linux direct boot 方式启动 x86_64 Linux guest,而不是 BIOS/UEFI 启动。
  • 都以单 vCPU、最小 Linux rootfs、串口 shell 作为当前验证目标。
  • 都依赖基础 x86 平台设备模型,包括 serial、PIT、IOAPIC/vLAPIC 和 virtio-blk。
  • 都会对 guest 暴露的 CPUID/控制寄存器能力做裁剪,避免 Linux 进入当前 hypervisor 尚未完整支持的路径。
  • 都通过 QEMU smoke test 验证 Linux 能启动到用户态并执行简单命令。
  • 当前都还不是完整 PC 平台模拟,后续仍需要继续完善 timer、IRQ routing、PCI 拓扑和更多设备模型。

不同点

  • VMX 已经有较完整的 x86_64 Linux bring-up 基线;本 PR 的 SVM 支持主要是在对齐这条 Linux 启动路径。
  • VMX 有 VMX preemption timer;SVM 没有完全对应的机制,因此 SVM 当前将 HLTPAUSEINTR 等 VM-exit 作为 VMM 检查 timer/IRQ 的调度点。
  • SVM 需要单独处理 VMCB 中的 virtual interrupt delivery、event injection、tsc_offset 等状态。
  • SVM 的 CPUID/CR4 裁剪策略与 VMX 不完全相同,需要避免暴露 VMX、PCID、TSC deadline 等当前 SVM 后端不匹配的能力。
  • SVM 当前对 Linux 所需的 NPT MMIO decode、PIT 行为、RDTSC 处理仍处于最小支持阶段,后续还需要继续和 VMX 路径收敛。

@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 Review: Enhance SVM support and improve PIT handling for Linux guests

总体评价

本 PR 为 AxVisor 的 SVM 后端补充了最小化 x86_64 Linux guest 启动支持,改动量 +972/-74,覆盖 7 个文件。整体代码质量好,提交历史清晰(5 个 commit,关注点分离合理),PR 描述详尽,局限性说明充分。代码风格与 VMX 路径保持一致。

变更分析

  1. virtualization/x86_vcpu/src/svm/vcpu.rs (核心,+665/-34):

    • 新增 pending events 队列和中断注入状态机,设计合理
    • CPUID 裁剪与 VMX 路径对齐,正确隐藏 VMX/PCID/TSC-DEADLINE 等不支持特性
    • CR4 过滤(SVM_UNSUPPORTED_GUEST_CR4)防止 guest 启用当前 SVM 模型不支持的控制位
    • decode_npt_mmio_access 实现了 APIC/IOAPIC MMIO 的软件解码,支持 MOV r/m 和 MOV imm 两种基本模式
    • RDTSC 处理正确使用 VMCB tsc_offset,XSETBV 处理了 XCR0 校验逻辑
    • HLT/PAUSE/INTR 均作为 VMM 轮询点,与 SVM 无 preemption timer 的特性匹配
  2. virtualization/x86_vlapic/src/pit.rs (+240):

    • 补齐了所有 6 种 PIT channel mode
    • 增加 status latch、read-back command、count latch
    • consume_irq0_if_due 中的 deadline 推进逻辑正确处理了长时间暂停场景
  3. 配置与测试

    • 新增 linux-x86_64-qemu-smp1-svm.toml,cmdline 中合理禁用了 acpi/x2APIC/MSI 等未完善路径
    • Smoke test 从 nimbus hello_world 切换为 Linux shell `pwd && echo 'guest linux test pass!'
    • QEMU 参数优化(关闭 sata/smbus/i8042/usb 等不必要设备)减少干扰

代码质量亮点

  • has_pending_external_event 去重逻辑避免同一 vector 重复入队
  • arm_virtual_interrupt 正确设置 V_IRQ/IGN_TPR/V_INTR_MASKING/priority
  • reinject_interrupted_event 处理了 SVM exit_int_info 到 event_inj 的重注入
  • setup_io_bitmap 根据 config.emulate_com1 条件截取 COM1 端口,与 VMX 一致

注意事项(非阻塞)

  1. MMIO 解码覆盖有限decode_npt_mmio_access 仅处理 0x89(MOV r→m)、0xC7(MOV imm→m)、0x8B(MOV m→r)。Linux 内核在某些 APIC 访问路径可能使用 MOVZX/MOVSX 等指令,如遇到 NPF 风暴可后续扩展。

  2. V_INTR_MASKING 初始化变化:原代码在 setup_vmcb_control 中始终设置 V_INTR_MASKING;新代码改为在首次 arm_virtual_interrupt 时设置。首次 VMRUN 前 IF 屏蔽未生效,但此时无待注入中断,实际无影响。硬件在中断投递后保留 V_INTR_MASKING,后续行为等价。

  3. SVM smoke 测试环境要求:PR 明确说明该测试仅能在 AMD/SVM 硬件上运行,Intel 环境无法验证。建议后续补充 AMD CI 配置。

关于 apps 测试

本 PR 未新增 Starry apps 测试,仅修改了 axvisor SVM 测试配置。不需要在 QEMU 中运行 Starry 验证 app。

结论

代码结构清晰、防御性措施充分、文档完整。PIT 改进和 SVM 中断注入状态机为后续 Linux guest 支持打下良好基础。Approve。

Powered by mimo-v2.5-pro

Comment thread virtualization/x86_vlapic/src/pit.rs

@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 Review: Enhance SVM support and improve PIT handling for Linux guests

变更概述

本 PR 为 AxVisor 的 SVM 后端补充最小化 x86_64 Linux guest 启动支持(+974/-74,7 个文件,6 个 commit)。主要修改:

  1. SVM vcpu.rs (+665/-34):新增 pending events 队列和中断注入状态机;CPUID 裁剪对齐 VMX 路径;CR4 过滤(SVM_UNSUPPORTED_GUEST_CR4);NPT MMIO 软件解码(APIC/IOAPIC);RDTSC/XSETBV 处理;HLT/PAUSE/INTR 作为 VMM 轮询点。
  2. PIT pit.rs (+242):补齐所有 6 种 channel mode、status latch(含防重复覆盖 guard)、count latch、read-back command。
  3. 配置与测试:新增 linux-x86_64-qemu-smp1-svm.toml,SVM smoke test 从 nimbus hello_world 切换为 Linux shell 验证。
  4. vcpus.rs (+1):PreemptionTimer 回调中增加 timer::check_events() 调用。

实现逻辑分析

  • 中断注入状态机queue_event / inject_pending_events / arm_virtual_interrupt / reinject_interrupted_event 形成完整的 SVM 中断生命周期管理。has_pending_external_event 去重逻辑避免同一 vector 重复入队。arm_virtual_interrupt 正确设置 V_IRQ/IGN_TPR/V_INTR_MASKING/priority,与 AMD APM 一致。
  • CPUID 裁剪:隐藏 VMX/PCID/TSC-DEADLINE/FSGSBASE/SMEP/SMAP/UMIP/LA57/PKS/CET 等当前 SVM 模型不支持的特性,与 VMX 路径策略对齐。CPUID 0xb/0x1f 返回全零,避免 guest 探测 topology 子叶。
  • CR4 过滤handle_cr_write(4)val & !SVM_UNSUPPORTED_GUEST_CR4 防止 guest 启用不支持的 CR4 位,配合 CPUID 裁剪保持一致。
  • MMIO 解码decode_npt_mmio_access 仅处理 0x89(MOV r→m)、0xC7(MOV imm→m)、0x8B(MOV m→r) 三种基本指令模式,覆盖 Linux early boot 路径中最常见的 APIC 访问模式。代码正确处理了 REX prefix、ModRM、SIB 寻址。
  • PIT 改进latch_status 已修复为检查 is_none() 后才覆盖(commit a78bc87),符合 8254 status latch 语义。output_high() 按 mode 实现,consume_irq0_if_due 正确处理周期性 deadline 推进。

本地验证

  • cargo fmt --check:✅ 通过
  • 格式检查无异常
  • SVM smoke test 需要 AMD/SVM 硬件环境,当前 Intel 容器无法实际运行(PR 已明确说明此限制)
  • 本 PR 未新增 Starry apps 测试,仅修改 axvisor SVM 测试配置,不需要在 QEMU 中运行 Starry 验证 app

CI 状态

所有 GitHub Actions 检查均为 skipped 状态。这是因为 SVM smoke test 需要 AMD/KVM 硬件环境,当前 CI runner 无法满足。PR 描述中已明确说明此局限性。这不是阻塞问题,但建议后续补充 AMD CI runner 配置以覆盖 SVM 路径的实际执行验证。

重复/重叠分析

已检查当前所有 open PR(#1006 llama.cpp、#760 UEFI guest、#996 PREV_TASK 优化、#981 namespace、#886 eBPF、#1010 seccomp 等),无与本 PR 重叠的功能。SVM Linux guest 支持在 base branch 和 open PR 中均无重复实现。本 PR 是对 VMX Linux 支持的 SVM 对等实现,两者互补不冲突。

已解决的 Review 问题

Ivans-11 提出的 latch_status() 无条件覆盖 latched_status 问题已在 commit a78bc87 中修复,改为 if self.latched_status.is_none() 守卫。Josen-B 确认并实现了修复。

非阻塞观察

  1. MMIO 解码覆盖有限:仅处理 3 种 MOV 指令。如 Linux 后续路径使用 MOVZX/MOVSX 等指令访问 APIC,可能触发 NPF 风暴。PR 已说明后续可扩展。
  2. V_INTR_MASKING 初始化位置变化:从 setup_vmcb_control 移至首次 arm_virtual_interrupt。首次 VMRUN 前 IF 屏蔽未生效,但此时无待注入中断,实际无影响。
  3. SVM smoke test 仅能构建验证:建议后续配置 AMD CI runner 覆盖实际运行。

结论

代码结构清晰、防御性措施充分、文档完整。中断注入状态机设计合理,PIT 改进符合 8254 语义,CPUID/CR4 裁剪保守且一致。Ivans-11 的 review 意见已在最新 commit 中修复。无阻塞问题。Approve。

Powered by mimo-v2.5-pro

@Josen-B
Josen-B requested a review from Ivans-11 May 29, 2026 02:03
@Josen-B Josen-B changed the title Enhance SVM support and improve PIT handling for Linux guests feat: Enhance SVM support and improve PIT handling for Linux guests May 29, 2026
@ZR233
ZR233 merged commit 615d42d into dev May 29, 2026
81 of 99 checks passed
@ZR233
ZR233 deleted the svm-linux branch May 29, 2026 10:14
This was referenced Jun 3, 2026
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.

3 participants