2020-06-03 19:59:49 +00:00
|
|
|
// Copyright © 2019 Intel Corporation
|
|
|
|
//
|
2020-06-26 00:06:14 +00:00
|
|
|
// SPDX-License-Identifier: Apache-2.0 OR BSD-3-Clause
|
2020-06-03 19:59:49 +00:00
|
|
|
//
|
2020-06-28 16:32:56 +00:00
|
|
|
// Copyright © 2020, Microsoft Corporation
|
2020-06-03 19:59:49 +00:00
|
|
|
//
|
|
|
|
// Copyright 2018-2019 CrowdStrike, Inc.
|
|
|
|
//
|
|
|
|
//
|
|
|
|
use crate::vm::Vm;
|
|
|
|
#[cfg(target_arch = "x86_64")]
|
2020-12-03 23:24:57 +00:00
|
|
|
use crate::x86_64::CpuId;
|
|
|
|
#[cfg(target_arch = "x86_64")]
|
|
|
|
use crate::x86_64::MsrList;
|
2020-12-04 23:35:29 +00:00
|
|
|
#[cfg(all(feature = "kvm", target_arch = "x86_64"))]
|
2020-06-03 19:59:49 +00:00
|
|
|
use kvm_ioctls::Cap;
|
|
|
|
use std::sync::Arc;
|
|
|
|
|
|
|
|
use thiserror::Error;
|
|
|
|
|
|
|
|
#[derive(Error, Debug)]
|
|
|
|
///
|
|
|
|
///
|
|
|
|
pub enum HypervisorError {
|
2020-12-03 23:24:57 +00:00
|
|
|
///
|
|
|
|
/// hypervisor creation error
|
|
|
|
///
|
|
|
|
#[error("Failed to create the hypervisor: {0}")]
|
|
|
|
HypervisorCreate(#[source] anyhow::Error),
|
2020-06-03 19:59:49 +00:00
|
|
|
///
|
|
|
|
/// Vm creation failure
|
|
|
|
///
|
|
|
|
#[error("Failed to create Vm: {0}")]
|
|
|
|
VmCreate(#[source] anyhow::Error),
|
|
|
|
///
|
|
|
|
/// Vm setup failure
|
|
|
|
///
|
|
|
|
#[error("Failed to setup Vm: {0}")]
|
|
|
|
VmSetup(#[source] anyhow::Error),
|
|
|
|
///
|
|
|
|
/// API version error
|
|
|
|
///
|
|
|
|
#[error("Failed to get API Version: {0}")]
|
|
|
|
GetApiVersion(#[source] anyhow::Error),
|
|
|
|
///
|
|
|
|
/// Vcpu mmap error
|
|
|
|
///
|
|
|
|
#[error("Failed to get Vcpu Mmap: {0}")]
|
|
|
|
GetVcpuMmap(#[source] anyhow::Error),
|
|
|
|
///
|
|
|
|
/// Max Vcpu error
|
|
|
|
///
|
|
|
|
#[error("Failed to get number of max vcpus: {0}")]
|
|
|
|
GetMaxVcpu(#[source] anyhow::Error),
|
|
|
|
///
|
|
|
|
/// CpuId error
|
|
|
|
///
|
2020-09-02 15:50:22 +00:00
|
|
|
#[error("Failed to get cpuid: {0}")]
|
2020-06-03 19:59:49 +00:00
|
|
|
GetCpuId(#[source] anyhow::Error),
|
2020-06-29 16:00:49 +00:00
|
|
|
///
|
|
|
|
/// Failed to retrieve list of MSRs.
|
|
|
|
///
|
|
|
|
#[error("Failed to get the list of supported MSRs: {0}")]
|
|
|
|
GetMsrList(#[source] anyhow::Error),
|
2020-09-07 10:10:58 +00:00
|
|
|
///
|
|
|
|
/// API version is not compatible
|
|
|
|
///
|
|
|
|
#[error("Incompatible API version")]
|
|
|
|
IncompatibleApiVersion,
|
2020-06-03 19:59:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
///
|
|
|
|
/// Result type for returning from a function
|
|
|
|
///
|
|
|
|
pub type Result<T> = std::result::Result<T, HypervisorError>;
|
|
|
|
|
|
|
|
///
|
|
|
|
/// Trait to represent a Hypervisor
|
|
|
|
///
|
|
|
|
/// This crate provides a hypervisor-agnostic interfaces
|
|
|
|
///
|
|
|
|
pub trait Hypervisor: Send + Sync {
|
|
|
|
///
|
|
|
|
/// Create a Vm using the underlying hypervisor
|
|
|
|
/// Return a hypervisor-agnostic Vm trait object
|
|
|
|
///
|
|
|
|
fn create_vm(&self) -> Result<Arc<dyn Vm>>;
|
2020-12-04 23:35:29 +00:00
|
|
|
#[cfg(feature = "kvm")]
|
2020-06-03 19:59:49 +00:00
|
|
|
///
|
|
|
|
/// Returns the size of the memory mapping required to use the vcpu's structures
|
|
|
|
///
|
|
|
|
fn get_vcpu_mmap_size(&self) -> Result<usize>;
|
2020-12-04 23:35:29 +00:00
|
|
|
#[cfg(feature = "kvm")]
|
2020-06-03 19:59:49 +00:00
|
|
|
///
|
|
|
|
/// Gets the recommended maximum number of VCPUs per VM.
|
|
|
|
///
|
|
|
|
fn get_max_vcpus(&self) -> Result<usize>;
|
2020-12-04 23:35:29 +00:00
|
|
|
#[cfg(feature = "kvm")]
|
2020-06-03 19:59:49 +00:00
|
|
|
///
|
|
|
|
/// Gets the recommended number of VCPUs per VM.
|
|
|
|
///
|
|
|
|
fn get_nr_vcpus(&self) -> Result<usize>;
|
2020-12-04 23:35:29 +00:00
|
|
|
#[cfg(all(feature = "kvm", target_arch = "x86_64"))]
|
2020-06-03 19:59:49 +00:00
|
|
|
///
|
|
|
|
/// Checks if a particular `Cap` is available.
|
|
|
|
///
|
|
|
|
fn check_capability(&self, c: Cap) -> bool;
|
|
|
|
#[cfg(target_arch = "x86_64")]
|
|
|
|
///
|
|
|
|
/// Get the supported CpuID
|
|
|
|
///
|
|
|
|
fn get_cpuid(&self) -> Result<CpuId>;
|
2020-12-03 23:24:57 +00:00
|
|
|
#[cfg(not(feature = "mshv"))]
|
2020-06-03 19:59:49 +00:00
|
|
|
///
|
|
|
|
/// Check particular extensions if any
|
|
|
|
///
|
|
|
|
fn check_required_extensions(&self) -> Result<()>;
|
2020-06-29 16:00:49 +00:00
|
|
|
#[cfg(target_arch = "x86_64")]
|
|
|
|
///
|
|
|
|
/// Retrieve the list of MSRs supported by the hypervisor.
|
|
|
|
///
|
|
|
|
fn get_msr_list(&self) -> Result<MsrList>;
|
2020-06-03 19:59:49 +00:00
|
|
|
}
|