whp: implement safe wrappers for VM, vCPU, and instruction emulation#665
whp: implement safe wrappers for VM, vCPU, and instruction emulation#665lstocchi wants to merge 1 commit into
Conversation
d3579ef to
71a27dd
Compare
|
/gemini review |
There was a problem hiding this comment.
Code Review
This pull request introduces a Windows Hypervisor Platform (WHP) backend for libkrun, implementing core functionality for VM partition management, vCPU execution, memory mapping, and instruction emulation. It also includes a mechanism for detecting host TSC frequency using CPUID or the Windows High-Resolution Performance Counter. Feedback was provided to improve the robustness of the CPUID-based frequency detection by verifying the maximum supported leaf before accessing specific leaves, ensuring better compatibility across various CPU architectures.
dd5b990 to
08ec97b
Compare
|
GitHub is broken so I can't tag the specific line in the code ("internal error") anyways here: // CPUID 0x15 — TSC / Core Crystal Clock (Intel SDM)
// TSC frequency in Hz = ECX * (EBX / EAX).
// We use a 1 Hz crystal with EBX = tsc_freq_hz to avoid rounding.
cpuid_results.push(WHV_X64_CPUID_RESULT {
Function: 0x15,
Reserved: [0; 3],
Eax: 1,
Ebx: tsc_freq_hz as u32,
Ecx: 1,
Edx: 0,
});I ran this PR through Claude Opus 4.6 and GPT-5.4 — both independently flagged
Footnotes
|
bce6905 to
4d31a48
Compare
|
@mtjhrc you're right and yes it could be potentially a problem. Fixed it. In my mind we would never use this code because I am going to enable Hyper-V enlightenments in next PRs and I expect modern Linux to detect and rely on them. Hyper-V enlightenments are features that, once detected, allow the guest to say "hey, I'm a virtual VM and I'm talking with a Windows hypervisor" .... and one of these features is the Reference TSC Page. Instead of the guest trying to "guess" the hardware frequency or worrying about whether the physical TSC is stable across CPU cores, the hypervisor provides a shared memory page. This page contains a scale and offset that the guest uses to calculate time mathematically: However, if a user uses a kernel without the hyperv modules or some older guest we still need to have the fallback code works properly. So nice catch. 👍 |
|
Hi, QEMU whpx maintainer here adding some comments
Good. Supporting Windows 11 onwards (and leaving Windows 10 behind which doesn't support a bunch of this) cuts down on the pain a lot.
The CPUID invariant TSC stuff isn't parsed by Linux for AMD processors unfortunately and I don't think it's worth having given that Hyper-V enlightenments will cover this anyway.
You don't need this workaround at least for Linux use cases. This workaround is for manually injected interrupts (ie not using WHvRequestInterrupt) which in practice means non-APIC interrupts. For libkrun, you'll (hopefully, or something is going wrong) have only an APIC without a legacy PIC. And then have Hyper-V enlightenments do the trick instead of the kernel trying to find a timer calibration source.
Depending on Windows release this one is a bit variable, we migrated away from it in the QEMU 11.0 cycle. Newer Windows releases ship a winhvemulation that is backed by this codebase: https://github.com/microsoft/openvmm/tree/e42e9614f35496e28171ee5785416e1904606552/vm/x86/x86emu/src which might be worthwhile to directly incorporate. |
Hey @mediouni-m , thanks for your comments. Really appreciated
Yeah, you're right. I added a fallback way to calculate it but i just stuff it into CPUID 0x15 which is just intel-centric. I did not have the time to look at how to stuff it for AMD tbh. I was hoping to use another CPUID, but as i'm trying to create a first version for Windows asap i was focusing on the hardware i have and then iterate over it.
Thanks for the explanation 👍 I'll remove it then
i'll give it a look and update it a follow-up PR, thanks!! |
This commit introduces the foundational Rust abstractions for the Windows Hypervisor Platform (WHP) backend. It encapsulates the raw C FFI bindings into safe, idiomatic Rust structs (`WhpVm`, `WhpVcpu`, and `WhpEmulator`). Key features include: - Partition & vCPU Management: Safe wrappers for partition configuration, CPUID masking, memory mapping, and `WHvRunVirtualProcessor` exit routing. - High-Performance Register I/O: Introduces const-generic helpers (`get_registers<N>` and `set_registers<N>`) to guarantee stack-allocated, zero-overhead register reads/writes on the VM-exit hot path. - Robust TSC Calibration: Implements accurate host TSC frequency detection via CPUID 0x15/0x16, with a reliable `QueryPerformanceCounter` (QPC) calibration fallback for AMD/older hardware. - Emulation: Integrates WHP's built-in x86 emulator for MMIO and PIO handling. Signed-off-by: lstocchi <lstocchi@redhat.com>
This commit introduces the foundational Rust abstractions for the Windows Hypervisor Platform (WHP) backend. I took inspiration from the hvf crate (you'll find
WhpVm,WhpVcpu, andWhpEmulator).Key features include:
WHvRunVirtualProcessorexit routing.get_registers<N>andset_registers<N>) to guarantee stack-allocated, zero-overhead register reads/writes on the VM-exit hot path.QueryPerformanceCounter(QPC) calibration fallback for AMD/older hardware.In a follow-up PR i'll add the hyper-v enlightements as this is already a big one.