diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index 867523e..43135ed 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c @@ -40,6 +40,7 @@ early_param("no-kvmclock", parse_no_kvmclock); static DEFINE_PER_CPU_SHARED_ALIGNED(struct kvm_vcpu_time_info, hv_clock); static struct kvm_wall_clock wall_clock; +static void *boot_clock; /* * The wallclock is the time of day when we booted. Since then, some time may @@ -74,6 +75,19 @@ static cycle_t kvm_clock_read(void) cycle_t ret; src = &get_cpu_var(hv_clock); + + if (boot_clock && 0 == smp_processor_id()) { + if (boot_clock != src) { + int low, high; + low = (int)__pa(src) | 1; + high = ((u64)__pa(src) >> 32); + printk(KERN_INFO "%s: cpu %d at %x:%x (pda)\n", __FUNCTION__, + smp_processor_id(), high, low); + native_write_msr_safe(MSR_KVM_SYSTEM_TIME, low, high); + boot_clock = NULL; + } + } + ret = pvclock_clocksource_read(src); put_cpu_var(hv_clock); return ret; @@ -92,12 +106,18 @@ static struct clocksource kvm_clock = { static int kvm_register_clock(void) { int cpu = smp_processor_id(); + void *ptr; int low, high; - low = (int)__pa(&per_cpu(hv_clock, cpu)) | 1; - high = ((u64)__pa(&per_cpu(hv_clock, cpu)) >> 32); - printk(KERN_DEBUG "%s: cpu %d at %x:%x\n", __FUNCTION__, - cpu, high, low); + ptr = &per_cpu(hv_clock, cpu); + if (0 == cpu) + boot_clock = ptr; + + low = (int)__pa(ptr) | 1; + high = ((u64)__pa(ptr) >> 32); + + printk(KERN_INFO "%s: cpu %d at %x:%x%s\n", __FUNCTION__, + cpu, high, low, boot_clock ? " (boot)" : ""); return native_write_msr_safe(MSR_KVM_SYSTEM_TIME, low, high); }