diff options
Diffstat (limited to 'arch/x86/kernel/kvmclock.c')
-rw-r--r-- | arch/x86/kernel/kvmclock.c | 25 |
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 | |||
31 | static int kvmclock = 1; | 29 | static int kvmclock = 1; |
32 | static int msr_kvm_system_time = MSR_KVM_SYSTEM_TIME; | 30 | static int msr_kvm_system_time = MSR_KVM_SYSTEM_TIME; |
33 | static int msr_kvm_wall_clock = MSR_KVM_WALL_CLOCK; | 31 | static 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 | ||
128 | static int kvm_register_clock(char *txt) | 124 | int 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 | ||
154 | static 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 | ||