diff --git a/hypervisor/src/kvm/mod.rs b/hypervisor/src/kvm/mod.rs index b07c54447..366914e2a 100644 --- a/hypervisor/src/kvm/mod.rs +++ b/hypervisor/src/kvm/mod.rs @@ -57,8 +57,8 @@ pub use kvm_ioctls::{Cap, Kvm}; /// Export generically-named wrappers of kvm-bindings for Unix-based platforms /// pub use { - kvm_bindings::kvm_create_device as CreateDevice, kvm_bindings::kvm_irq_routing as IrqRouting, - kvm_bindings::kvm_mp_state as MpState, + kvm_bindings::kvm_clock_data as ClockData, kvm_bindings::kvm_create_device as CreateDevice, + kvm_bindings::kvm_irq_routing as IrqRouting, kvm_bindings::kvm_mp_state as MpState, kvm_bindings::kvm_userspace_memory_region as MemoryRegion, kvm_bindings::kvm_vcpu_events as VcpuEvents, kvm_ioctls::DeviceFd, kvm_ioctls::IoEventAddress, kvm_ioctls::VcpuExit, @@ -211,6 +211,20 @@ impl vm::Vm for KvmVm { .map_err(|e| vm::HypervisorVmError::EnableSplitIrq(e.into()))?; Ok(()) } + /// Retrieve guest clock. + #[cfg(target_arch = "x86_64")] + fn get_clock(&self) -> vm::Result { + self.fd + .get_clock() + .map_err(|e| vm::HypervisorVmError::GetClock(e.into())) + } + /// Set guest clock. + #[cfg(target_arch = "x86_64")] + fn set_clock(&self, data: &ClockData) -> vm::Result<()> { + self.fd + .set_clock(data) + .map_err(|e| vm::HypervisorVmError::SetClock(e.into())) + } } /// Wrapper over KVM system ioctls. pub struct KvmHyperVisor { diff --git a/hypervisor/src/vm.rs b/hypervisor/src/vm.rs index 2350f3173..b964badf0 100644 --- a/hypervisor/src/vm.rs +++ b/hypervisor/src/vm.rs @@ -11,6 +11,8 @@ #[cfg(target_arch = "aarch64")] use crate::aarch64::VcpuInit; use crate::cpu::Vcpu; +#[cfg(target_arch = "x86_64")] +use crate::ClockData; use crate::{CreateDevice, DeviceFd, IoEventAddress, IrqRouting, MemoryRegion}; use std::sync::Arc; use thiserror::Error; @@ -97,6 +99,16 @@ pub enum HypervisorVmError { /// #[error("Failed to enable split Irq: {0}")] EnableSplitIrq(#[source] anyhow::Error), + /// + /// Get clock error + /// + #[error("Failed to get clock: {0}")] + GetClock(#[source] anyhow::Error), + /// + /// Set clock error + /// + #[error("Failed to set clock: {0}")] + SetClock(#[source] anyhow::Error), } /// /// Result type for returning from a function @@ -141,4 +153,10 @@ pub trait Vm: Send + Sync { /// Enable split Irq capability #[cfg(target_arch = "x86_64")] fn enable_split_irq(&self) -> Result<()>; + /// Retrieve guest clock. + #[cfg(target_arch = "x86_64")] + fn get_clock(&self) -> Result; + /// Set guest clock. + #[cfg(target_arch = "x86_64")] + fn set_clock(&self, data: &ClockData) -> Result<()>; }