summaryrefslogtreecommitdiff
path: root/usr/src/uts/intel/io/vmm/io/vrtc.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/intel/io/vmm/io/vrtc.c')
-rw-r--r--usr/src/uts/intel/io/vmm/io/vrtc.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/usr/src/uts/intel/io/vmm/io/vrtc.c b/usr/src/uts/intel/io/vmm/io/vrtc.c
index 644532f077..fd4fafdff6 100644
--- a/usr/src/uts/intel/io/vmm/io/vrtc.c
+++ b/usr/src/uts/intel/io/vmm/io/vrtc.c
@@ -970,6 +970,23 @@ vrtc_localize_resources(struct vrtc *vrtc)
vmm_glue_callout_localize(&vrtc->callout);
}
+void
+vrtc_pause(struct vrtc *vrtc)
+{
+ VRTC_LOCK(vrtc);
+ callout_stop(&vrtc->callout);
+ VRTC_UNLOCK(vrtc);
+}
+
+void
+vrtc_resume(struct vrtc *vrtc)
+{
+ VRTC_LOCK(vrtc);
+ ASSERT(!callout_active(&vrtc->callout));
+ vrtc_callout_reset(vrtc, vrtc_freq(vrtc));
+ VRTC_UNLOCK(vrtc);
+}
+
static int
vrtc_data_read(void *datap, const vmm_data_req_t *req)
{
@@ -1020,8 +1037,9 @@ vrtc_data_write(void *datap, const vmm_data_req_t *req)
time_t curtime = vrtc_curtime(vrtc, NULL);
secs_to_rtc(curtime, vrtc, 1);
- /* Make sure the callout is appropriately scheduled */
- vrtc_callout_reset(vrtc, vrtc_freq(vrtc));
+ if (!vm_is_paused(vrtc->vm)) {
+ vrtc_callout_reset(vrtc, vrtc_freq(vrtc));
+ }
VRTC_UNLOCK(vrtc);
return (0);