[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |