From 4b671954a016377e95f13981ba9d19ca1de8536b Mon Sep 17 00:00:00 2001 From: Nikolas Kyx <55556836+nyx191@users.noreply.github.com> Date: Fri, 5 Jun 2026 20:48:40 +0300 Subject: [PATCH] hypervisor: kvm: Support pre-XSAVE x86 CPUs KVM will emulate XSAVE for us, so we need only to skip XCRS setting/retrieval if the respective CPU feature is not available. Signed-off-by: Nikolas Kyx <55556836+nyx191@users.noreply.github.com> --- hypervisor/src/kvm/mod.rs | 14 ++++++++++++-- hypervisor/src/kvm/x86_64/mod.rs | 1 - 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/hypervisor/src/kvm/mod.rs b/hypervisor/src/kvm/mod.rs index 2d6507ce2..a53cef14a 100644 --- a/hypervisor/src/kvm/mod.rs +++ b/hypervisor/src/kvm/mod.rs @@ -876,6 +876,8 @@ impl vm::Vm for KvmVm { hyperv_synic: AtomicBool::new(false), #[cfg(target_arch = "x86_64")] xsave_size, + #[cfg(target_arch = "x86_64")] + has_xcrs: self.check_extension(Cap::Xcrs), #[cfg(feature = "sev_snp")] vm_fd: self.fd.clone(), #[cfg(feature = "sev_snp")] @@ -1758,6 +1760,8 @@ pub struct KvmVcpu { hyperv_synic: AtomicBool, #[cfg(target_arch = "x86_64")] xsave_size: i32, + #[cfg(target_arch = "x86_64")] + has_xcrs: bool, #[cfg(feature = "sev_snp")] vm_fd: Arc, #[cfg(feature = "sev_snp")] @@ -2853,7 +2857,11 @@ impl cpu::Vcpu for KvmVcpu { } else { self.get_xsave()? }; - let xcrs = self.get_xcrs()?; + let xcrs: ExtendedControlRegisters = if self.has_xcrs { + self.get_xcrs()? + } else { + Default::default() + }; let lapic_state = self.get_lapic()?; let fpu = self.get_fpu()?; let nested_state = self.nested_state()?; @@ -3116,7 +3124,9 @@ impl cpu::Vcpu for KvmVcpu { } else { self.set_xsave(&state.xsave)?; } - self.set_xcrs(&state.xcrs)?; + if self.has_xcrs { + self.set_xcrs(&state.xcrs)?; + } self.set_lapic(&state.lapic_state)?; self.set_fpu(&state.fpu)?; if let Some(nested_state) = state.nested_state { diff --git a/hypervisor/src/kvm/x86_64/mod.rs b/hypervisor/src/kvm/x86_64/mod.rs index 62185fd84..82cfd09f8 100644 --- a/hypervisor/src/kvm/x86_64/mod.rs +++ b/hypervisor/src/kvm/x86_64/mod.rs @@ -64,7 +64,6 @@ pub fn check_required_kvm_extensions(kvm: &Kvm) -> KvmResult<()> { check_extension!(Cap::UserMemory); check_extension!(Cap::UserNmi); check_extension!(Cap::VcpuEvents); - check_extension!(Cap::Xcrs); check_extension!(Cap::Xsave); Ok(()) }