aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/kvmclock.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/kernel/kvmclock.c')
-rw-r--r--arch/x86/kernel/kvmclock.c25
1 files changed, 6 insertions, 19 deletions
diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c
index eb9b76c716c2..6389a6bca11b 100644
--- a/arch/x86/kernel/kvmclock.c
+++ b/arch/x86/kernel/kvmclock.c
@@ -26,8 +26,6 @@
26#include <asm/x86_init.h> 26#include <asm/x86_init.h>
27#include <asm/reboot.h> 27#include <asm/reboot.h>
28 28
29#define KVM_SCALE 22
30
31static int kvmclock = 1; 29static int kvmclock = 1;
32static int msr_kvm_system_time = MSR_KVM_SYSTEM_TIME; 30static int msr_kvm_system_time = MSR_KVM_SYSTEM_TIME;
33static int msr_kvm_wall_clock = MSR_KVM_WALL_CLOCK; 31static int msr_kvm_wall_clock = MSR_KVM_WALL_CLOCK;
@@ -120,21 +118,21 @@ static struct clocksource kvm_clock = {
120 .read = kvm_clock_get_cycles, 118 .read = kvm_clock_get_cycles,
121 .rating = 400, 119 .rating = 400,
122 .mask = CLOCKSOURCE_MASK(64), 120 .mask = CLOCKSOURCE_MASK(64),
123 .mult = 1 << KVM_SCALE,
124 .shift = KVM_SCALE,
125 .flags = CLOCK_SOURCE_IS_CONTINUOUS, 121 .flags = CLOCK_SOURCE_IS_CONTINUOUS,
126}; 122};
127 123
128static int kvm_register_clock(char *txt) 124int kvm_register_clock(char *txt)
129{ 125{
130 int cpu = smp_processor_id(); 126 int cpu = smp_processor_id();
131 int low, high; 127 int low, high, ret;
128
132 low = (int)__pa(&per_cpu(hv_clock, cpu)) | 1; 129 low = (int)__pa(&per_cpu(hv_clock, cpu)) | 1;
133 high = ((u64)__pa(&per_cpu(hv_clock, cpu)) >> 32); 130 high = ((u64)__pa(&per_cpu(hv_clock, cpu)) >> 32);
131 ret = native_write_msr_safe(msr_kvm_system_time, low, high);
134 printk(KERN_INFO "kvm-clock: cpu %d, msr %x:%x, %s\n", 132 printk(KERN_INFO "kvm-clock: cpu %d, msr %x:%x, %s\n",
135 cpu, high, low, txt); 133 cpu, high, low, txt);
136 134
137 return native_write_msr_safe(msr_kvm_system_time, low, high); 135 return ret;
138} 136}
139 137
140#ifdef CONFIG_X86_LOCAL_APIC 138#ifdef CONFIG_X86_LOCAL_APIC
@@ -150,14 +148,6 @@ static void __cpuinit kvm_setup_secondary_clock(void)
150} 148}
151#endif 149#endif
152 150
153#ifdef CONFIG_SMP
154static void __init kvm_smp_prepare_boot_cpu(void)
155{
156 WARN_ON(kvm_register_clock("primary cpu clock"));
157 native_smp_prepare_boot_cpu();
158}
159#endif
160
161/* 151/*
162 * After the clock is registered, the host will keep writing to the 152 * After the clock is registered, the host will keep writing to the
163 * registered memory location. If the guest happens to shutdown, this memory 153 * registered memory location. If the guest happens to shutdown, this memory
@@ -204,15 +194,12 @@ void __init kvmclock_init(void)
204 x86_cpuinit.setup_percpu_clockev = 194 x86_cpuinit.setup_percpu_clockev =
205 kvm_setup_secondary_clock; 195 kvm_setup_secondary_clock;
206#endif 196#endif
207#ifdef CONFIG_SMP
208 smp_ops.smp_prepare_boot_cpu = kvm_smp_prepare_boot_cpu;
209#endif
210 machine_ops.shutdown = kvm_shutdown; 197 machine_ops.shutdown = kvm_shutdown;
211#ifdef CONFIG_KEXEC 198#ifdef CONFIG_KEXEC
212 machine_ops.crash_shutdown = kvm_crash_shutdown; 199 machine_ops.crash_shutdown = kvm_crash_shutdown;
213#endif 200#endif
214 kvm_get_preset_lpj(); 201 kvm_get_preset_lpj();
215 clocksource_register(&kvm_clock); 202 clocksource_register_hz(&kvm_clock, NSEC_PER_SEC);
216 pv_info.paravirt_enabled = 1; 203 pv_info.paravirt_enabled = 1;
217 pv_info.name = "KVM"; 204 pv_info.name = "KVM";
218 205