Skip to content

feat(aarch64): add WHP backend for ARM64 Windows#1638

Draft
cshung wants to merge 2 commits into
hyperlight-dev:mainfrom
cshung:cshung/whp-aarch64
Draft

feat(aarch64): add WHP backend for ARM64 Windows#1638
cshung wants to merge 2 commits into
hyperlight-dev:mainfrom
cshung:cshung/whp-aarch64

Conversation

@cshung

@cshung cshung commented Jul 12, 2026

Copy link
Copy Markdown
Contributor

Summary

Implements the WHP (Windows Hypervisor Platform) hypervisor backend for aarch64, enabling hyperlight to run micro-VMs on Windows ARM64 systems.

Resolves #1544

Changes

Structural

  • Restructure whp.rs into whp/ directory (mod.rs + x86_64.rs) to support per-architecture implementations, matching the existing kvm/ and mshv/ pattern
  • Fix super::x86_64::hw_interrupts module path after directory restructure

New: whp/aarch64.rs

  • Manual FFI bindings for ARM64 WHP register names, exit reasons, and exit context layout (extracted from Windows SDK WinHvPlatformDefs.h)
  • Full VirtualMachine trait implementation with:
    • MMIO-based I/O handling (ARM64 has no IO ports)
    • Register get/set via WHvGet/SetVirtualProcessorRegisters
    • Surrogate process support (same pattern as x86_64)

Integration

  • Wire WhpVm into hyperlight_vm/aarch64.rs for Windows platform
  • Add WindowsInterruptHandle for aarch64 Windows
  • Add CpuVendor::current() for aarch64 Windows target

Cross-compilation fix

  • Move vmm-sys-util to unix-only dependencies (it doesn't compile on Windows)

Verification

Verified compilation on three targets:

  • x86_64-pc-windows-msvc (native) — just clippy debug/release pass
  • aarch64-pc-windows-msvc (cross-compile) — cargo check passes
  • aarch64-unknown-linux-gnu (cross-compile) — cargo check --features kvm passes

Note: No runtime testing was possible — requires actual ARM64 Windows hardware with Hyper-V enabled. CI has no ARM64 Windows runners.

Why manual FFI bindings?

The windows crate (v0.62) does not expose ARM64 WHP types (register names, exit reasons, exit context structs). All definitions were extracted from the Windows SDK header WinHvPlatformDefs.h (SDK 10.0.26100.0) which has full ARM64 support behind #ifdef _ARM64_.

cshung and others added 2 commits July 11, 2026 07:43
Implement the WHP hypervisor backend for aarch64 Windows, enabling
hyperlight to run micro-VMs on Windows ARM64 systems.

Changes:
- Restructure whp.rs into whp/ directory (whp/mod.rs + whp/x86_64.rs)
  to support per-architecture implementations (matching kvm/mshv pattern)
- Add whp/aarch64.rs with full VirtualMachine trait implementation:
  - Manual FFI bindings for ARM64 WHP register names, exit reasons, and
    exit context layout (from Windows SDK WinHvPlatformDefs.h)
  - Run loop handling MMIO-based I/O (ARM64 has no IO ports)
  - Register get/set via WHvGet/SetVirtualProcessorRegisters
  - Surrogate process support (same pattern as x86_64)
- Wire WhpVm into hyperlight_vm/aarch64.rs for Windows platform
- Fix super::x86_64::hw_interrupts path after directory restructure

Resolves: hyperlight-dev#1544

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 6f20a05d-6bee-4e2e-b320-12f8d9759bbc
Signed-off-by: cshung <3410332+cshung@users.noreply.github.com>
- Move vmm-sys-util to unix-only dependencies (it doesn't compile on Windows)
- Fix WHV_UINT128 field access (requires Anonymous wrapper on windows crate)
- Add CpuVendor::current() for aarch64 Windows target
- Remove redundant partition_handle inherent method and unused cancelled field
- Fix unused import warnings
- Add #[allow(dead_code)] on exit reason constants module

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 6f20a05d-6bee-4e2e-b320-12f8d9759bbc
Signed-off-by: cshung <3410332+cshung@users.noreply.github.com>
Copilot AI review requested due to automatic review settings July 12, 2026 15:02
@cshung cshung added kind/enhancement For PRs adding features, improving functionality, docs, tests, etc. ready-for-review PR is ready for (re-)review labels Jul 12, 2026

Copilot AI 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.

Pull request overview

Adds a Windows Hypervisor Platform (WHP) backend for Windows/aarch64 so Hyperlight can run micro-VMs on ARM64 Windows systems, aligning WHP’s structure with existing per-arch hypervisor layouts.

Changes:

  • Introduces whp/aarch64.rs implementing the VirtualMachine trait for ARM64 WHP, including MMIO-based exit handling and register get/set via WHvGet/SetVirtualProcessorRegisters.
  • Restructures the WHP backend into whp/ with per-architecture modules and fixes x86_64 interrupt helper module paths.
  • Wires WHP into the aarch64 Hyperlight VM path on Windows and moves vmm-sys-util into unix-only dependencies to fix Windows builds.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
src/hyperlight_host/src/sandbox/snapshot/file/config.rs Adds Windows/aarch64 CPU vendor token for snapshot config.
src/hyperlight_host/src/hypervisor/virtual_machine/whp/x86_64.rs Updates hw_interrupts module paths after WHP directory restructure.
src/hyperlight_host/src/hypervisor/virtual_machine/whp/mod.rs New per-arch WHP module dispatcher (x86_64 vs aarch64).
src/hyperlight_host/src/hypervisor/virtual_machine/whp/aarch64.rs New ARM64 WHP backend implementation and manual ARM64 WHP FFI bindings.
src/hyperlight_host/src/hypervisor/hyperlight_vm/aarch64.rs Selects WHP on Windows/aarch64 and adds Windows interrupt handle wiring.
src/hyperlight_host/Cargo.toml Makes vmm-sys-util unix-only to avoid Windows compilation failures.

Comment on lines +598 to +601
return Ok(VmExit::IoOut(
port as u16,
(off as u64).to_le_bytes().to_vec(),
));
Comment on lines +716 to +725
let fpsr = self.get_reg64(WHV_ARM64_REGISTER_FPSR).map_err(|_| {
RegisterError::GetFpu(super::super::HypervisorError::WindowsError(
windows_result::Error::from_hresult(HRESULT(0)),
))
})? as u32;
let fpcr = self.get_reg64(WHV_ARM64_REGISTER_FPCR).map_err(|_| {
RegisterError::GetFpu(super::super::HypervisorError::WindowsError(
windows_result::Error::from_hresult(HRESULT(0)),
))
})? as u32;
Comment on lines +736 to +747
self.set_reg64(WHV_ARM64_REGISTER_FPSR, fpu.fpsr as u64)
.map_err(|_| {
RegisterError::SetFpu(super::super::HypervisorError::WindowsError(
windows_result::Error::from_hresult(HRESULT(0)),
))
})?;
self.set_reg64(WHV_ARM64_REGISTER_FPCR, fpu.fpcr as u64)
.map_err(|_| {
RegisterError::SetFpu(super::super::HypervisorError::WindowsError(
windows_result::Error::from_hresult(HRESULT(0)),
))
})?;
Comment on lines +839 to +848
let module = unsafe { LoadLibraryA(s!("winhvplatform.dll"))? };
let proc = unsafe { GetProcAddress(module, s!("WHvMapGpaRange2")) };
match proc {
Some(f) => Ok(unsafe { std::mem::transmute(f) }),
None => {
unsafe {
windows::Win32::Foundation::FreeLibrary(module).ok();
}
Err(windows_result::Error::from_hresult(HRESULT(-1)))
}
Comment on lines +137 to +138
// Windows does not expose MIDR_EL1 directly; use a fixed vendor
// string. All current Windows ARM64 devices use Qualcomm/ARM cores.
@cshung cshung marked this pull request as draft July 13, 2026 02:13
@github-actions github-actions Bot removed the ready-for-review PR is ready for (re-)review label Jul 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

kind/enhancement For PRs adding features, improving functionality, docs, tests, etc.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support AArch64 on Windows

2 participants