From 982934fba0cdab88682ad1e099a3e10eb10f36bd Mon Sep 17 00:00:00 2001 From: Kevin Hui Date: Wed, 22 Apr 2026 13:11:19 -0700 Subject: [PATCH] vmm: Add SNP zero-page type for IGVM imports Introduce the KVM_SNP_PAGE_TYPE_ZERO page type for ZERO pages. AMD SEV SNP can accept ZERO pages as a page in which the page memory is functionally just zeroes Signed-off-by: Kevin Hui --- vmm/src/igvm/igvm_loader.rs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/vmm/src/igvm/igvm_loader.rs b/vmm/src/igvm/igvm_loader.rs index e60d58667..b27a89777 100644 --- a/vmm/src/igvm/igvm_loader.rs +++ b/vmm/src/igvm/igvm_loader.rs @@ -134,6 +134,8 @@ const KVM_SNP_PAGE_TYPE_NORMAL: u32 = 1; #[cfg(feature = "kvm")] const KVM_SNP_PAGE_TYPE_VMSA: u32 = 2; #[cfg(feature = "kvm")] +const KVM_SNP_PAGE_TYPE_ZERO: u32 = 3; +#[cfg(feature = "kvm")] const KVM_SNP_PAGE_TYPE_UNMEASURED: u32 = 4; #[cfg(feature = "kvm")] const KVM_SNP_PAGE_TYPE_SECRETS: u32 = 5; @@ -144,6 +146,8 @@ const KVM_SNP_PAGE_TYPE_CPUID: u32 = 6; struct PageTypeConfig { isolated_page_size_4kb: u32, normal: u32, + #[allow(dead_code)] + zero: u32, unmeasured: u32, cpuid: u32, secrets: u32, @@ -270,6 +274,7 @@ pub fn load_igvm( HypervisorType::Mshv => PageTypeConfig { isolated_page_size_4kb: mshv_bindings::hv_isolated_page_size_HV_ISOLATED_PAGE_SIZE_4KB, normal: mshv_bindings::hv_isolated_page_type_HV_ISOLATED_PAGE_TYPE_NORMAL, + zero: mshv_bindings::hv_isolated_page_type_HV_ISOLATED_PAGE_TYPE_ZERO, unmeasured: mshv_bindings::hv_isolated_page_type_HV_ISOLATED_PAGE_TYPE_UNMEASURED, cpuid: mshv_bindings::hv_isolated_page_type_HV_ISOLATED_PAGE_TYPE_CPUID, secrets: mshv_bindings::hv_isolated_page_type_HV_ISOLATED_PAGE_TYPE_SECRETS, @@ -279,6 +284,7 @@ pub fn load_igvm( HypervisorType::Kvm => PageTypeConfig { isolated_page_size_4kb: HV_PAGE_SIZE as u32, normal: KVM_SNP_PAGE_TYPE_NORMAL, + zero: KVM_SNP_PAGE_TYPE_ZERO, unmeasured: KVM_SNP_PAGE_TYPE_UNMEASURED, cpuid: KVM_SNP_PAGE_TYPE_CPUID, secrets: KVM_SNP_PAGE_TYPE_SECRETS, @@ -378,9 +384,14 @@ pub fn load_igvm( }); BootPageAcceptance::ExclusiveUnmeasured } else { + let page_type = match hypervisor_type { + #[cfg(feature = "kvm")] + HypervisorType::Kvm if data.is_empty() => page_types.zero, + _ => page_types.normal, + }; gpas.push(GpaPages { gpa: *gpa, - page_type: page_types.normal, + page_type, page_size: page_types.isolated_page_size_4kb, }); BootPageAcceptance::Exclusive @@ -521,6 +532,10 @@ pub fn load_igvm( .map_err(Error::Loader)?; measured_boot_hash_block_inserted = true; imported_page = true; + if let Some(last) = gpas.last_mut() { + debug_assert_eq!(last.gpa, *gpa); + last.page_type = page_types.normal; + } } if !imported_page { loader