xref: /cloud-hypervisor/vmm/src/igvm/mod.rs (revision af28569611640c1bf06539dd6eeb766c9b0a3984)
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