17030b15eSMuminul Islam // SPDX-License-Identifier: Apache-2.0 OR BSD-3-Clause 27030b15eSMuminul Islam // 37030b15eSMuminul Islam // Copyright © 2023, Microsoft Corporation 47030b15eSMuminul Islam // 57030b15eSMuminul Islam /* 67030b15eSMuminul Islam * The IGVM(Independent Guest Virtual Machine) file format 77030b15eSMuminul Islam * is designed to encapsulate all information required to 87030b15eSMuminul Islam * launch a virtual machine on any given virtualization stack, 97030b15eSMuminul Islam * with support for different isolation technologies such as 107030b15eSMuminul Islam * AMD SEV-SNP and Intel TDX. 117030b15eSMuminul Islam * At a conceptual level, this file format is a set of commands created 127030b15eSMuminul Islam * by the tool that generated the file, used by the loader to construct 137030b15eSMuminul Islam * the initial guest state. The file format also contains measurement 147030b15eSMuminul Islam * information that the underlying platform will use to confirm that 157030b15eSMuminul Islam * the file was loaded correctly and signed by the appropriate authorities. 167030b15eSMuminul Islam * 177030b15eSMuminul Islam * The IGVM file is generated by the tool: 187030b15eSMuminul Islam * https://github.com/microsoft/igvm-tooling 197030b15eSMuminul Islam * 207030b15eSMuminul Islam * The IGVM file is parsed by the following crates: 217030b15eSMuminul Islam * https://github.com/microsoft/igvm 227030b15eSMuminul Islam * 237030b15eSMuminul Islam * This module takes the IGVM file, parses it, and loads it to the 247030b15eSMuminul Islam * guest memory. Currently igvm only supported on Microsoft Hypervisor, as 257030b15eSMuminul Islam * booting a legacy VM, as well as SNP based isolated VM. 267030b15eSMuminul Islam */ 277030b15eSMuminul Islam 287030b15eSMuminul Islam pub mod igvm_loader; 297030b15eSMuminul Islam mod loader; 30f6d99d9aSWei Liu use igvm::snp_defs::SevVmsa; 317030b15eSMuminul Islam use igvm_defs::IGVM_VHS_SNP_ID_BLOCK; 32*af285696SRuoqing He use zerocopy::FromZeros; 337030b15eSMuminul Islam 347030b15eSMuminul Islam #[derive(Debug, Clone)] 357030b15eSMuminul Islam pub struct IgvmLoadedInfo { 367030b15eSMuminul Islam pub gpas: Vec<u64>, 377030b15eSMuminul Islam pub vmsa_gpa: u64, 387030b15eSMuminul Islam pub snp_id_block: IGVM_VHS_SNP_ID_BLOCK, 397030b15eSMuminul Islam pub vmsa: SevVmsa, 407030b15eSMuminul Islam } 417030b15eSMuminul Islam 427030b15eSMuminul Islam impl Default for IgvmLoadedInfo { default() -> Self437030b15eSMuminul Islam fn default() -> Self { 447030b15eSMuminul Islam IgvmLoadedInfo { 457030b15eSMuminul Islam gpas: Vec::new(), 467030b15eSMuminul Islam vmsa_gpa: 0, 477030b15eSMuminul Islam snp_id_block: IGVM_VHS_SNP_ID_BLOCK::new_zeroed(), 487030b15eSMuminul Islam vmsa: SevVmsa::new_zeroed(), 497030b15eSMuminul Islam } 507030b15eSMuminul Islam } 517030b15eSMuminul Islam } 527030b15eSMuminul Islam 537030b15eSMuminul Islam pub const HV_PAGE_SIZE: u64 = 4096; 547030b15eSMuminul Islam 557030b15eSMuminul Islam /// The page acceptance used for importing pages into the initial launch context of the guest. 567030b15eSMuminul Islam #[derive(Debug, PartialEq, Eq, Clone, Copy)] 577030b15eSMuminul Islam pub enum BootPageAcceptance { 587030b15eSMuminul Islam /// The page is accepted exclusive (no host visibility) and the page data is measured. 597030b15eSMuminul Islam Exclusive, 607030b15eSMuminul Islam /// The page is accepted exclusive (no host visibility) and the page data is unmeasured. 617030b15eSMuminul Islam ExclusiveUnmeasured, 627030b15eSMuminul Islam /// The page contains hardware-specific VP context information. 637030b15eSMuminul Islam VpContext, 647030b15eSMuminul Islam /// This page communicates error information to the host. 657030b15eSMuminul Islam ErrorPage, 667030b15eSMuminul Islam /// This page communicates hardware-specific secret information and the page data is unmeasured. 677030b15eSMuminul Islam SecretsPage, 687030b15eSMuminul Islam /// This page includes guest-specified CPUID information. 697030b15eSMuminul Islam CpuidPage, 707030b15eSMuminul Islam /// This page should include the enumeration of extended state CPUID leaves. 717030b15eSMuminul Islam CpuidExtendedStatePage, 727030b15eSMuminul Islam } 737030b15eSMuminul Islam 747030b15eSMuminul Islam /// The startup memory type used to notify a well behaved host that memory should be present before attempting to 757030b15eSMuminul Islam /// start the guest. 767030b15eSMuminul Islam #[allow(dead_code)] 777030b15eSMuminul Islam #[derive(Debug, PartialEq, Eq)] 787030b15eSMuminul Islam pub enum StartupMemoryType { 797030b15eSMuminul Islam /// The range is normal memory. 807030b15eSMuminul Islam Ram, 817030b15eSMuminul Islam } 82