hypervisor: provide a generic CpuState structure

Signed-off-by: Wei Liu <liuwe@microsoft.com>
This commit is contained in:
Wei Liu
2022-07-14 15:20:21 +00:00
committed by Liu Wei
parent dd592e86fd
commit 72d552e5e1
4 changed files with 64 additions and 15 deletions

View File

@@ -24,12 +24,12 @@ use vm::DataMatch;
pub mod x86_64;
use crate::device;
use crate::{
IoEventAddress, MpState, UserMemoryRegion, USER_MEMORY_REGION_EXECUTE, USER_MEMORY_REGION_READ,
USER_MEMORY_REGION_WRITE,
CpuState, IoEventAddress, MpState, UserMemoryRegion, USER_MEMORY_REGION_EXECUTE,
USER_MEMORY_REGION_READ, USER_MEMORY_REGION_WRITE,
};
use vmm_sys_util::eventfd::EventFd;
#[cfg(target_arch = "x86_64")]
pub use x86_64::VcpuMshvState as CpuState;
pub use x86_64::VcpuMshvState;
#[cfg(target_arch = "x86_64")]
pub use x86_64::*;
@@ -115,6 +115,23 @@ impl From<IoEventAddress> for mshv_ioctls::IoEventAddress {
}
}
impl From<VcpuMshvState> for CpuState {
fn from(s: VcpuMshvState) -> Self {
CpuState::Mshv(s)
}
}
impl From<CpuState> for VcpuMshvState {
fn from(s: CpuState) -> Self {
match s {
CpuState::Mshv(s) => s,
/* Needed in case other hypervisors are enabled */
#[allow(unreachable_patterns)]
_ => panic!("CpuState is not valid"),
}
}
}
#[derive(Debug, Default, Copy, Clone, Serialize, Deserialize)]
pub struct HvState {
hypercall_page: u64,
@@ -593,6 +610,7 @@ impl cpu::Vcpu for MshvVcpu {
/// Set CPU state
///
fn set_state(&self, state: &CpuState) -> cpu::Result<()> {
let state: VcpuMshvState = state.clone().into();
self.set_msrs(&state.msrs)?;
self.set_vcpu_events(&state.vcpu_events)?;
self.set_regs(&state.regs)?;
@@ -635,7 +653,7 @@ impl cpu::Vcpu for MshvVcpu {
.get_debug_regs()
.map_err(|e| cpu::HypervisorCpuError::GetDebugRegs(e.into()))?;
Ok(CpuState {
Ok(VcpuMshvState {
msrs,
vcpu_events,
regs,
@@ -646,7 +664,8 @@ impl cpu::Vcpu for MshvVcpu {
dbg,
xsave,
misc,
})
}
.into())
}
#[cfg(target_arch = "x86_64")]
///