WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] hvm: hpet: Fix per-timer enable/disable.

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] hvm: hpet: Fix per-timer enable/disable.
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Tue, 08 Jan 2008 15:10:20 -0800
Delivery-date: Tue, 08 Jan 2008 15:11:36 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1199800665 0
# Node ID 66db23ecd5628d87890abe0744ae3dc20b62bced
# Parent  4fcc8b64c2b5719e542e2d1be3dc93f8a29e6c0a
hvm: hpet: Fix per-timer enable/disable.

The enable/disable per timer interrupt bit is wrongly used as per
timer enable/disable. According to spec, comparator value should
constantly increasing when HPET is globally enabled, no matter
whether the timer interrupt is enabled or not.

From: Haitao Shan <haitao.shan@xxxxxxxxx>
Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
---
 xen/arch/x86/hvm/hpet.c |   18 ++++++------------
 1 files changed, 6 insertions(+), 12 deletions(-)

diff -r 4fcc8b64c2b5 -r 66db23ecd562 xen/arch/x86/hvm/hpet.c
--- a/xen/arch/x86/hvm/hpet.c   Tue Jan 08 10:13:11 2008 +0000
+++ b/xen/arch/x86/hvm/hpet.c   Tue Jan 08 13:57:45 2008 +0000
@@ -75,7 +75,6 @@
                                   (S_TO_NS*TSC_PER_HPET_TICK)/h->tsc_freq)
 
 #define timer_config(h, n)       (h->hpet.timers[n].config)
-#define timer_enabled(h, n)      (timer_config(h, n) & HPET_TN_ENABLE)
 #define timer_is_periodic(h, n)  (timer_config(h, n) & HPET_TN_PERIODIC)
 #define timer_is_32bit(h, n)     (timer_config(h, n) & HPET_TN_32BIT)
 #define hpet_enabled(h)          (h->hpet.config & HPET_CFG_ENABLE)
@@ -195,9 +194,6 @@ static void hpet_set_timer(HPETState *h,
     ASSERT(tn < HPET_TIMER_NUM);
     ASSERT(spin_is_locked(&h->lock));
 
-    if ( !hpet_enabled(h) || !timer_enabled(h, tn) )
-        return;
-
     if ( (tn == 0) && (h->hpet.config & HPET_CFG_LEGACY) )
     {
         /* HPET specification requires PIT shouldn't generate
@@ -308,10 +304,6 @@ static void hpet_write(
         if ( new_val & HPET_TN_32BIT )
             h->hpet.timers[tn].cmp = (uint32_t)h->hpet.timers[tn].cmp;
 
-        if ( !(old_val & HPET_TN_ENABLE) && (new_val & HPET_TN_ENABLE) )
-            hpet_set_timer(h, tn);
-        else if ( (old_val & HPET_TN_ENABLE) && !(new_val & HPET_TN_ENABLE) )
-            hpet_stop_timer(h, tn);
         break;
 
     case HPET_T0_CMP:
@@ -326,7 +318,7 @@ static void hpet_write(
         else
             h->hpet.period[tn] = new_val;
         h->hpet.timers[tn].config &= ~HPET_TN_SETVAL;
-        if ( hpet_enabled(h) && timer_enabled(h, tn) )
+        if ( hpet_enabled(h) )
             hpet_set_timer(h, tn);
         break;
 
@@ -397,13 +389,14 @@ static void hpet_timer_fn(void *opaque)
 
     spin_lock(&h->lock);
 
-    if ( !hpet_enabled(h) || !timer_enabled(h, tn) )
+    if ( !hpet_enabled(h) )
     {
         spin_unlock(&h->lock);
         return;
     }
 
-    hpet_route_interrupt(h, tn);
+    if ( timer_config(h, tn) & HPET_TN_ENABLE )
+        hpet_route_interrupt(h, tn);
 
     if ( timer_is_periodic(h, tn) && (h->hpet.period[tn] != 0) )
     {
@@ -522,7 +515,8 @@ static int hpet_load(struct domain *d, h
                 
     /* Restart the timers */
     for ( i = 0; i < HPET_TIMER_NUM; i++ )
-        hpet_set_timer(hp, i);
+        if ( hpet_enabled(hp) )
+            hpet_set_timer(hp, i);
 
     spin_unlock(&hp->lock);
 

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] hvm: hpet: Fix per-timer enable/disable., Xen patchbot-unstable <=