mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2026-08-05 02:19:16 +00:00
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>
This commit is contained in:
committed by
Rob Bradford
parent
dd3a2f2649
commit
4b671954a0
@@ -876,6 +876,8 @@ impl vm::Vm for KvmVm {
|
|||||||
hyperv_synic: AtomicBool::new(false),
|
hyperv_synic: AtomicBool::new(false),
|
||||||
#[cfg(target_arch = "x86_64")]
|
#[cfg(target_arch = "x86_64")]
|
||||||
xsave_size,
|
xsave_size,
|
||||||
|
#[cfg(target_arch = "x86_64")]
|
||||||
|
has_xcrs: self.check_extension(Cap::Xcrs),
|
||||||
#[cfg(feature = "sev_snp")]
|
#[cfg(feature = "sev_snp")]
|
||||||
vm_fd: self.fd.clone(),
|
vm_fd: self.fd.clone(),
|
||||||
#[cfg(feature = "sev_snp")]
|
#[cfg(feature = "sev_snp")]
|
||||||
@@ -1758,6 +1760,8 @@ pub struct KvmVcpu {
|
|||||||
hyperv_synic: AtomicBool,
|
hyperv_synic: AtomicBool,
|
||||||
#[cfg(target_arch = "x86_64")]
|
#[cfg(target_arch = "x86_64")]
|
||||||
xsave_size: i32,
|
xsave_size: i32,
|
||||||
|
#[cfg(target_arch = "x86_64")]
|
||||||
|
has_xcrs: bool,
|
||||||
#[cfg(feature = "sev_snp")]
|
#[cfg(feature = "sev_snp")]
|
||||||
vm_fd: Arc<VmFd>,
|
vm_fd: Arc<VmFd>,
|
||||||
#[cfg(feature = "sev_snp")]
|
#[cfg(feature = "sev_snp")]
|
||||||
@@ -2853,7 +2857,11 @@ impl cpu::Vcpu for KvmVcpu {
|
|||||||
} else {
|
} else {
|
||||||
self.get_xsave()?
|
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 lapic_state = self.get_lapic()?;
|
||||||
let fpu = self.get_fpu()?;
|
let fpu = self.get_fpu()?;
|
||||||
let nested_state = self.nested_state()?;
|
let nested_state = self.nested_state()?;
|
||||||
@@ -3116,7 +3124,9 @@ impl cpu::Vcpu for KvmVcpu {
|
|||||||
} else {
|
} else {
|
||||||
self.set_xsave(&state.xsave)?;
|
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_lapic(&state.lapic_state)?;
|
||||||
self.set_fpu(&state.fpu)?;
|
self.set_fpu(&state.fpu)?;
|
||||||
if let Some(nested_state) = state.nested_state {
|
if let Some(nested_state) = state.nested_state {
|
||||||
|
|||||||
@@ -64,7 +64,6 @@ pub fn check_required_kvm_extensions(kvm: &Kvm) -> KvmResult<()> {
|
|||||||
check_extension!(Cap::UserMemory);
|
check_extension!(Cap::UserMemory);
|
||||||
check_extension!(Cap::UserNmi);
|
check_extension!(Cap::UserNmi);
|
||||||
check_extension!(Cap::VcpuEvents);
|
check_extension!(Cap::VcpuEvents);
|
||||||
check_extension!(Cap::Xcrs);
|
|
||||||
check_extension!(Cap::Xsave);
|
check_extension!(Cap::Xsave);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user