diff -r 0b0e7c2b4eef xen/arch/x86/time.c --- a/xen/arch/x86/time.c Tue Jan 20 21:21:16 2009 +0800 +++ b/xen/arch/x86/time.c Mon Feb 09 02:21:50 2009 +0800 @@ -1095,22 +1095,21 @@ static void time_calibration_rendezvous( while ( atomic_read(&r->nr_cpus) != (total_cpus - 1) ) cpu_relax(); r->master_stime = read_platform_stime(); - rdtscll(r->master_tsc_stamp); + if ( boot_cpu_has(X86_FEATURE_CONSTANT_TSC) ) + rdtscll(r->master_tsc_stamp); mb(); /* write r->master_* /then/ signal */ atomic_inc(&r->nr_cpus); - c->local_tsc_stamp = r->master_tsc_stamp; } else { atomic_inc(&r->nr_cpus); while ( atomic_read(&r->nr_cpus) != total_cpus ) - cpu_relax(); - mb(); /* receive signal /then/ read r->master_* */ - if ( boot_cpu_has(X86_FEATURE_CONSTANT_TSC) ) - wrmsrl(MSR_IA32_TSC, r->master_tsc_stamp); - rdtscll(c->local_tsc_stamp); - } - + mb(); /* receive signal /then/ read r->master_* */ + } + + if ( boot_cpu_has(X86_FEATURE_CONSTANT_TSC) ) + wrmsrl(MSR_IA32_TSC, r->master_tsc_stamp); + rdtscll(c->local_tsc_stamp); c->stime_local_stamp = get_s_time(); c->stime_master_stamp = r->master_stime;