From d2d13beb28ad77f550af2f5c48ea7c40fe6b60ea Mon Sep 17 00:00:00 2001 From: Oliver Anderson Date: Mon, 27 Jul 2026 09:01:36 +0200 Subject: [PATCH] hypervisor: hypervisor_type method on Vcpu trait Although it is already possible to obtain the hypervisor type from the hypervisor trait object, there is currently no way for functions that only have a vCPU object to work with to know what the hypervisor backend is. In the rare case where there is significant divergence between the supported hypervisor backends when working with vCPU objects the caller must necessarily branch on the hypervisor type. We thus introduce a hypervisor_type method on the Vcpu trait. This will be utilized in a follow up commit where we need special handling when configuring MSRs of vCPUs. Signed-off-by: Oliver Anderson On-behalf-of: SAP oliver.anderson@sap.com --- hypervisor/src/cpu.rs | 7 ++++++- hypervisor/src/kvm/mod.rs | 4 ++++ hypervisor/src/mshv/mod.rs | 4 ++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/hypervisor/src/cpu.rs b/hypervisor/src/cpu.rs index 38ecb7cf1..ce24e7b6f 100644 --- a/hypervisor/src/cpu.rs +++ b/hypervisor/src/cpu.rs @@ -30,7 +30,7 @@ use crate::arch::aarch64::ExtendedReg; use crate::arch::x86::{CpuIdEntry, FpuState, LapicState, MsrEntry, SpecialRegisters}; #[cfg(feature = "tdx")] use crate::kvm::{TdxExitDetails, TdxExitStatus}; -use crate::{CpuState, MpState, StandardRegisters}; +use crate::{CpuState, HypervisorType, MpState, StandardRegisters}; #[cfg(target_arch = "x86_64")] #[derive(Copy, Clone, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)] @@ -679,4 +679,9 @@ pub trait Vcpu: Send + Sync { /// Trigger NMI interrupt /// fn nmi(&self) -> Result<()>; + + /// + /// The type of the hypervisor backing this vCPU + /// + fn hypervisor_type(&self) -> HypervisorType; } diff --git a/hypervisor/src/kvm/mod.rs b/hypervisor/src/kvm/mod.rs index 70b4423c2..4c84feb88 100644 --- a/hypervisor/src/kvm/mod.rs +++ b/hypervisor/src/kvm/mod.rs @@ -3765,6 +3765,10 @@ impl cpu::Vcpu for KvmVcpu { Ok(()) } + + fn hypervisor_type(&self) -> HypervisorType { + HypervisorType::Kvm + } } #[cfg(target_arch = "aarch64")] diff --git a/hypervisor/src/mshv/mod.rs b/hypervisor/src/mshv/mod.rs index c861af14f..a56a290d8 100644 --- a/hypervisor/src/mshv/mod.rs +++ b/hypervisor/src/mshv/mod.rs @@ -1626,6 +1626,10 @@ impl cpu::Vcpu for MshvVcpu { Ok(()) } + + fn hypervisor_type(&self) -> HypervisorType { + HypervisorType::Mshv + } } impl MshvVcpu {