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),
|
||||
#[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<VmFd>,
|
||||
#[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 {
|
||||
|
||||
@@ -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(())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user