diff --git a/hypervisor/src/lib.rs b/hypervisor/src/lib.rs index 6800cc66e..865ea02db 100644 --- a/hypervisor/src/lib.rs +++ b/hypervisor/src/lib.rs @@ -184,12 +184,28 @@ pub enum ClockData { #[cfg(target_arch = "x86_64")] impl ClockData { - pub fn reset_flags(&mut self) { + pub fn has_realtime(&self) -> bool { match self { #[cfg(feature = "kvm")] - ClockData::Kvm(s) => s.flags = 0, + ClockData::Kvm(s) => s.flags & kvm_bindings::KVM_CLOCK_REALTIME != 0, #[allow(unreachable_patterns)] - _ => {} + _ => false, + } + } + + pub fn set_realtime(&mut self, realtime: std::time::SystemTime) { + match self { + #[cfg(feature = "kvm")] + ClockData::Kvm(s) => { + if let Ok(time_since_epoch) = realtime.duration_since(std::time::UNIX_EPOCH) { + s.realtime = time_since_epoch.as_nanos() as u64; + s.flags |= kvm_bindings::KVM_CLOCK_REALTIME; + } + } + #[allow(unreachable_patterns)] + _ => { + let _ = realtime; + } } } } diff --git a/vmm/src/vm.rs b/vmm/src/vm.rs index f397892a9..1cbc20a30 100644 --- a/vmm/src/vm.rs +++ b/vmm/src/vm.rs @@ -3244,7 +3244,9 @@ impl Pausable for Vm { .vm .get_clock() .map_err(|e| MigratableError::Pause(anyhow!("Could not get VM clock: {e}")))?; - clock.reset_flags(); + if !clock.has_realtime() { + clock.set_realtime(std::time::SystemTime::now()); + } self.saved_clock = Some(clock); }