From ada85f68f698ceef815fa570706eb5c80dd09d33 Mon Sep 17 00:00:00 2001 From: Jinank Jain Date: Tue, 7 Jun 2022 12:36:24 +0000 Subject: [PATCH] hypervisor: mshv: Override hypervisor R/W behavior for unknown MSR By default Microsoft Hypervisor send a GP to the guest if it tries read/write an unimplemented MSR from the hypervisor prospective. Instead change this behavior to ignore read/write operations for unimplemented MSRs Signed-off-by: Jinank Jain --- hypervisor/src/hypervisor.rs | 5 +++++ hypervisor/src/mshv/mod.rs | 11 +++++++++++ 2 files changed, 16 insertions(+) diff --git a/hypervisor/src/hypervisor.rs b/hypervisor/src/hypervisor.rs index 84839dca8..868379d69 100644 --- a/hypervisor/src/hypervisor.rs +++ b/hypervisor/src/hypervisor.rs @@ -66,6 +66,11 @@ pub enum HypervisorError { /// #[error("Failed to retrieve TDX capabilities:{0}")] TdxCapabilities(#[source] anyhow::Error), + /// + /// Failed to set partition property + /// + #[error("Failed to set partition property:{0}")] + SetPartitionProperty(#[source] anyhow::Error), } /// diff --git a/hypervisor/src/mshv/mod.rs b/hypervisor/src/mshv/mod.rs index 79483513e..d28bb8b80 100644 --- a/hypervisor/src/mshv/mod.rs +++ b/hypervisor/src/mshv/mod.rs @@ -108,6 +108,17 @@ impl hypervisor::Hypervisor for MshvHypervisor { break; } + // Default Microsoft Hypervisor behavior for unimplemented MSR is to + // send a fault to the guest if it tries to access it. It is possible + // to override this behavior with a more suitable option i.e., ignore + // writes from the guest and return zero in attempt to read unimplemented + // MSR. + fd.set_partition_property( + hv_partition_property_code_HV_PARTITION_PROPERTY_UNIMPLEMENTED_MSR_ACTION, + hv_unimplemented_msr_action_HV_UNIMPLEMENTED_MSR_ACTION_IGNORE_WRITE_READ_ZERO as u64, + ) + .map_err(|e| hypervisor::HypervisorError::SetPartitionProperty(e.into()))?; + let msr_list = self.get_msr_list()?; let num_msrs = msr_list.as_fam_struct_ref().nmsrs as usize; let mut msrs = MsrEntries::new(num_msrs).unwrap();