v->arch.l1_tsc_scaling_ratio);
if (unlikely(vcpu->hw_tsc_khz != tgt_tsc_khz)) {
- kvm_get_time_scale(NSEC_PER_SEC, tgt_tsc_khz * 1000LL,
- &vcpu->hv_clock.tsc_shift,
- &vcpu->hv_clock.tsc_to_system_mul);
+ u32 shift, mult;
+
+ clocks_calc_mult_shift(&mult, &shift, tgt_tsc_khz, NSEC_PER_MSEC, 600);
+
+ if (shift <= 32) {
+ vcpu->hv_clock.tsc_shift = 0;
+ vcpu->hv_clock.tsc_to_system_mul = mult * BIT(32 - shift);
+ printk("good shift %d mult %u for %ld kHz\n", vcpu->hv_clock.tsc_shift,
+ vcpu->hv_clock.tsc_to_system_mul, tgt_tsc_khz);
+ } else {
+ kvm_get_time_scale(NSEC_PER_SEC, tgt_tsc_khz * 1000LL,
+ &vcpu->hv_clock.tsc_shift,
+ &vcpu->hv_clock.tsc_to_system_mul);
+ printk("bad shift %d mult %u for %ld khz\n", vcpu->hv_clock.tsc_shift,
+ vcpu->hv_clock.tsc_to_system_mul, tgt_tsc_khz);
+ }
+
vcpu->hw_tsc_khz = tgt_tsc_khz;
kvm_xen_update_tsc_info(v);
}