[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] x86: platform-timer read function returns 64 bits.



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1216125382 -3600
# Node ID 1c22d42043bb5583bb5f82a204c19ac0d34420e9
# Parent  750eee596adf2836b510b76c5cdd0768371f8ec1
x86: platform-timer read function returns 64 bits.
Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
---
 xen/arch/x86/time.c |   56 +++++++++++++++++++++++-----------------------------
 1 files changed, 25 insertions(+), 31 deletions(-)

diff -r 750eee596adf -r 1c22d42043bb xen/arch/x86/time.c
--- a/xen/arch/x86/time.c       Tue Jul 15 13:19:26 2008 +0100
+++ b/xen/arch/x86/time.c       Tue Jul 15 13:36:22 2008 +0100
@@ -54,14 +54,14 @@ struct cpu_time {
     s_time_t stime_local_stamp;
     s_time_t stime_master_stamp;
     struct time_scale tsc_scale;
-    u32 cstate_plt_count_stamp;
+    u64 cstate_plt_count_stamp;
     struct timer calibration_timer;
 };
 
 struct platform_timesource {
     char *name;
     u64 frequency;
-    u32 (*read_counter)(void);
+    u64 (*read_counter)(void);
     int counter_bits;
 };
 
@@ -340,7 +340,7 @@ static char *freq_string(u64 freq)
  * PLATFORM TIMER 1: PROGRAMMABLE INTERVAL TIMER (LEGACY PIT)
  */
 
-static u32 read_pit_count(void)
+static u64 read_pit_count(void)
 {
     u16 count16;
     u32 count32;
@@ -372,7 +372,7 @@ static void init_pit(struct platform_tim
  * PLATFORM TIMER 2: HIGH PRECISION EVENT TIMER (HPET)
  */
 
-static u32 read_hpet_count(void)
+static u64 read_hpet_count(void)
 {
     return hpet_read32(HPET_COUNTER);
 }
@@ -412,7 +412,7 @@ int use_cyclone;
 /* Cyclone MPMC0 register. */
 static volatile u32 *cyclone_timer;
 
-static u32 read_cyclone_count(void)
+static u64 read_cyclone_count(void)
 {
     return *cyclone_timer;
 }
@@ -462,7 +462,7 @@ u32 pmtmr_ioport;
 /* ACPI PM timer ticks at 3.579545 MHz. */
 #define ACPI_PM_FREQUENCY 3579545
 
-static u32 read_pmtimer_count(void)
+static u64 read_pmtimer_count(void)
 {
     return inl(pmtmr_ioport);
 }
@@ -485,7 +485,7 @@ static int init_pmtimer(struct platform_
  */
 
 static struct platform_timesource plt_src; /* details of chosen timesource  */
-static u32 plt_mask;             /* hardware-width mask                     */
+static u64 plt_mask;             /* hardware-width mask                     */
 static u64 plt_overflow_period;  /* ns between calls to plt_overflow()      */
 static struct time_scale plt_scale; /* scale: platform counter -> nanosecs  */
 
@@ -494,12 +494,12 @@ static s_time_t stime_platform_stamp; /*
 static s_time_t stime_platform_stamp; /* System time at below platform time */
 static u64 platform_timer_stamp;      /* Platform time at above system time */
 static u64 plt_stamp64;          /* 64-bit platform counter stamp           */
-static u32 plt_stamp;            /* hardware-width platform counter stamp   */
+static u64 plt_stamp;            /* hardware-width platform counter stamp   */
 static struct timer plt_overflow_timer;
 
 static void plt_overflow(void *unused)
 {
-    u32 count;
+    u64 count;
 
     spin_lock(&platform_timer_lock);
     count = plt_src.read_counter();
@@ -578,7 +578,7 @@ static void init_platform_timer(void)
          !init_pmtimer(pts) )
         init_pit(pts);
 
-    plt_mask = (u32)~0u >> (32 - pts->counter_bits);
+    plt_mask = (u64)~0ull >> (64 - pts->counter_bits);
 
     set_time_scale(&plt_scale, pts->frequency);
 
@@ -597,31 +597,25 @@ void cstate_save_tsc(void)
 {
     struct cpu_time *t = &this_cpu(cpu_time);
 
-    if (!tsc_invariant){
-        t->cstate_plt_count_stamp = plt_src.read_counter();
-        rdtscll(t->cstate_tsc_stamp);
-    }
+    if ( tsc_invariant )
+        return;
+
+    t->cstate_plt_count_stamp = plt_src.read_counter();
+    rdtscll(t->cstate_tsc_stamp);
 }
 
 void cstate_restore_tsc(void)
 {
-    struct cpu_time *t;
-    u32    plt_count_delta;
-    u64    tsc_delta;
-
-    if (!tsc_invariant){
-        t = &this_cpu(cpu_time);
-
-        /* if platform counter overflow happens, interrupt will bring CPU from
-           C state to working state, so the platform counter won't wrap the
-           cstate_plt_count_stamp, and the 32 bit unsigned platform counter
-           is enough for delta calculation
-         */
-        plt_count_delta = 
-            (plt_src.read_counter() - t->cstate_plt_count_stamp) & plt_mask;
-        tsc_delta = scale_delta(plt_count_delta, &plt_scale)*cpu_khz/1000000UL;
-        wrmsrl(MSR_IA32_TSC,  t->cstate_tsc_stamp + tsc_delta);
-    }
+    struct cpu_time *t = &this_cpu(cpu_time);
+    u64 plt_count_delta, tsc_delta;
+
+    if ( tsc_invariant )
+        return;
+
+    plt_count_delta = (plt_src.read_counter() -
+                       t->cstate_plt_count_stamp) & plt_mask;
+    tsc_delta = scale_delta(plt_count_delta, &plt_scale) * cpu_khz/1000000UL;
+    wrmsrl(MSR_IA32_TSC, t->cstate_tsc_stamp + tsc_delta);
 }
 
 /***************************************************************************

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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.