]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/xen.git/commitdiff
x86: allow disabling the emulated PIT
authorRoger Pau Monné <roger.pau@citrix.com>
Tue, 10 Nov 2015 11:06:28 +0000 (12:06 +0100)
committerJan Beulich <jbeulich@suse.com>
Tue, 10 Nov 2015 11:06:28 +0000 (12:06 +0100)
Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
Reported by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Acked-by: Jan Beulich <jbeulich@suse.com>
xen/arch/x86/hvm/i8254.c

index 8a93c88cf235a780c02a2c195e66229f51aa449d..b517cd636bd820ca38f9bfe765eb0590f5c5b39d 100644 (file)
@@ -382,6 +382,9 @@ static uint32_t pit_ioport_read(struct PITState *pit, uint32_t addr)
 
 void pit_stop_channel0_irq(PITState *pit)
 {
+    if ( !has_vpit(current->domain) )
+        return;
+
     TRACE_0D(TRC_HVM_EMUL_PIT_STOP_TIMER);
     spin_lock(&pit->lock);
     destroy_periodic_time(&pit->pt0);
@@ -393,6 +396,9 @@ static int pit_save(struct domain *d, hvm_domain_context_t *h)
     PITState *pit = domain_vpit(d);
     int rc;
 
+    if ( !has_vpit(d) )
+        return 0;
+
     spin_lock(&pit->lock);
     
     rc = hvm_save_entry(PIT, 0, h, &pit->hw);
@@ -407,6 +413,9 @@ static int pit_load(struct domain *d, hvm_domain_context_t *h)
     PITState *pit = domain_vpit(d);
     int i;
 
+    if ( !has_vpit(d) )
+        return -ENODEV;
+
     spin_lock(&pit->lock);
 
     if ( hvm_load_entry(PIT, h, &pit->hw) )
@@ -437,6 +446,9 @@ void pit_reset(struct domain *d)
     struct hvm_hw_pit_channel *s;
     int i;
 
+    if ( !has_vpit(d) )
+        return;
+
     TRACE_0D(TRC_HVM_EMUL_PIT_STOP_TIMER);
     destroy_periodic_time(&pit->pt0);
     pit->pt0.source = PTSRC_isa;
@@ -458,6 +470,9 @@ void pit_init(struct domain *d, unsigned long cpu_khz)
 {
     PITState *pit = domain_vpit(d);
 
+    if ( !has_vpit(d) )
+        return;
+
     spin_lock_init(&pit->lock);
 
     if ( is_hvm_domain(d) )
@@ -473,6 +488,9 @@ void pit_deinit(struct domain *d)
 {
     PITState *pit = domain_vpit(d);
 
+    if ( !has_vpit(d) )
+        return;
+
     TRACE_0D(TRC_HVM_EMUL_PIT_STOP_TIMER);
     destroy_periodic_time(&pit->pt0);
 }