From dc3903012da617939a0965a9cb164cc3a9b822be Mon Sep 17 00:00:00 2001 From: Muminul Islam Date: Fri, 13 Oct 2023 12:49:42 -0700 Subject: [PATCH] hypervisor: Add API to import the isolated pages Add hypervisor VM specific API to import the isolated pages. Hypervisor adds those pages for PSP measurement. Signed-off-by: Jinank Jain Signed-off-by: Muminul Islam --- hypervisor/src/mshv/mod.rs | 28 ++++++++++++++++++++++++++++ hypervisor/src/vm.rs | 15 +++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/hypervisor/src/mshv/mod.rs b/hypervisor/src/mshv/mod.rs index ca3959bb0..c07831b43 100644 --- a/hypervisor/src/mshv/mod.rs +++ b/hypervisor/src/mshv/mod.rs @@ -1286,4 +1286,32 @@ impl vm::Vm for MshvVm { ) .map_err(|e| vm::HypervisorVmError::InitializeSevSnp(e.into())) } + + #[cfg(feature = "sev_snp")] + fn import_isolated_pages( + &self, + page_type: u32, + page_size: u32, + pages: &[u64], + ) -> vm::Result<()> { + if pages.is_empty() { + return Ok(()); + } + + let mut isolated_pages = + vec_with_array_field::(pages.len()); + isolated_pages[0].num_pages = pages.len() as u64; + isolated_pages[0].page_type = page_type; + isolated_pages[0].page_size = page_size; + // SAFETY: isolated_pages initialized with pages.len() and now it is being turned into + // pages_slice with pages.len() again. It is guaranteed to be large enough to hold + // everything from pages. + unsafe { + let pages_slice: &mut [u64] = isolated_pages[0].page_number.as_mut_slice(pages.len()); + pages_slice.copy_from_slice(pages); + } + self.fd + .import_isolated_pages(&isolated_pages[0]) + .map_err(|e| vm::HypervisorVmError::ImportIsolatedPages(e.into())) + } } diff --git a/hypervisor/src/vm.rs b/hypervisor/src/vm.rs index 319885cd0..9f54430f3 100644 --- a/hypervisor/src/vm.rs +++ b/hypervisor/src/vm.rs @@ -220,6 +220,11 @@ pub enum HypervisorVmError { /// #[error("Failed to create Vgic: {0}")] CreateVgic(#[source] anyhow::Error), + /// + /// Import isolated pages error + /// + #[error("Failed to import isolated pages: {0}")] + ImportIsolatedPages(#[source] anyhow::Error), } /// /// Result type for returning from a function @@ -359,6 +364,16 @@ pub trait Vm: Send + Sync + Any { } /// Downcast to the underlying hypervisor VM type fn as_any(&self) -> &dyn Any; + /// Import the isolated pages + #[cfg(feature = "sev_snp")] + fn import_isolated_pages( + &self, + _page_type: u32, + _page_size: u32, + _pages: &[u64], + ) -> Result<()> { + unimplemented!() + } } pub trait VmOps: Send + Sync {