diff --git a/xen/arch/x86/apic.c b/xen/arch/x86/apic.c index dbea826d48..ab30de939c 100644 --- a/xen/arch/x86/apic.c +++ b/xen/arch/x86/apic.c @@ -1260,8 +1260,10 @@ static int __init calibrate_APIC_clock(void) /* set up multipliers for accurate timer code */ bus_freq = result*HZ; - bus_cycle = (u32) (1000000000000LL/bus_freq); /* in pico seconds */ + bus_cycle = 1000000000000UL / bus_freq; /* in pico seconds */ + bus_cycle += (1000000000000UL % bus_freq) * 2 > bus_freq; bus_scale = (1000*262144)/bus_cycle; + bus_scale += ((1000 * 262144) % bus_cycle) * 2 > bus_cycle; apic_printk(APIC_VERBOSE, "..... bus_scale = %#x\n", bus_scale); /* reset APIC to zero timeout value */ diff --git a/xen/arch/x86/hpet.c b/xen/arch/x86/hpet.c index ae99993d90..86929b9ba1 100644 --- a/xen/arch/x86/hpet.c +++ b/xen/arch/x86/hpet.c @@ -799,9 +799,9 @@ u64 __init hpet_setup(void) hpet_resume(hpet_boot_cfg); hpet_rate = 1000000000000000ULL; /* 10^15 */ - (void)do_div(hpet_rate, hpet_period); + last = do_div(hpet_rate, hpet_period); - return hpet_rate; + return hpet_rate + (last * 2 > hpet_period); } void hpet_resume(u32 *boot_cfg) diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c index bb1b97787f..2d4430b283 100644 --- a/xen/arch/x86/time.c +++ b/xen/arch/x86/time.c @@ -275,7 +275,10 @@ static char *freq_string(u64 freq) { static char s[20]; unsigned int x, y; - y = (unsigned int)do_div(freq, 1000000) / 1000; + + if ( do_div(freq, 1000) > 500 ) + ++freq; + y = (unsigned int)do_div(freq, 1000); x = (unsigned int)freq; snprintf(s, sizeof(s), "%u.%03uMHz", x, y); return s;