diff --git a/hypervisor/src/kvm/aarch64/mod.rs b/hypervisor/src/kvm/aarch64/mod.rs index 61ff79443..5d9a0e55e 100644 --- a/hypervisor/src/kvm/aarch64/mod.rs +++ b/hypervisor/src/kvm/aarch64/mod.rs @@ -114,7 +114,15 @@ pub fn check_required_kvm_extensions(kvm: &Kvm) -> KvmResult<()> { }; } + // SetGuestDebug is required but some kernels have it implemented without the capability flag. + check_extension!(Cap::ImmediateExit); + check_extension!(Cap::Ioeventfd); + check_extension!(Cap::Irqchip); + check_extension!(Cap::Irqfd); + check_extension!(Cap::IrqRouting); + check_extension!(Cap::MpState); check_extension!(Cap::OneReg); + check_extension!(Cap::UserMemory); Ok(()) } diff --git a/hypervisor/src/kvm/x86_64/mod.rs b/hypervisor/src/kvm/x86_64/mod.rs index 0d539551c..77a37c3f7 100644 --- a/hypervisor/src/kvm/x86_64/mod.rs +++ b/hypervisor/src/kvm/x86_64/mod.rs @@ -40,14 +40,29 @@ pub fn check_required_kvm_extensions(kvm: &Kvm) -> KvmResult<()> { }; } + // DeviceCtrl, EnableCap, and SetGuestDebug are also required, but some kernels have + // the features implemented without the capability flags. + check_extension!(Cap::AdjustClock); + check_extension!(Cap::ExtCpuid); check_extension!(Cap::GetTscKhz); check_extension!(Cap::ImmediateExit); + check_extension!(Cap::Ioeventfd); + check_extension!(Cap::Irqchip); + check_extension!(Cap::Irqfd); + check_extension!(Cap::IrqRouting); + check_extension!(Cap::MpState); check_extension!(Cap::SetIdentityMapAddr); check_extension!(Cap::SetTssAddr); check_extension!(Cap::SplitIrqchip); check_extension!(Cap::TscDeadlineTimer); + check_extension!(Cap::UserMemory); + check_extension!(Cap::UserNmi); + check_extension!(Cap::VcpuEvents); + check_extension!(Cap::Xcrs); + check_extension!(Cap::Xsave); Ok(()) } + #[derive(Clone, Serialize, Deserialize)] pub struct VcpuKvmState { pub cpuid: Vec,