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 <kevinhui@meta.com>
This commit is contained in:
Kevin Hui
2026-04-22 13:11:19 -07:00
committed by Rob Bradford
parent e3e22d8e78
commit 982934fba0

View File

@@ -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