KVM: PPC: booke: Do Not start decrementer when SPRN_DEC set 0
[platform/adaptation/renesas_rcar/renesas_kernel.git] / arch / powerpc / kvm / emulate.c
index 141dce3..b6df56d 100644 (file)
@@ -77,13 +77,15 @@ static int kvmppc_dec_enabled(struct kvm_vcpu *vcpu)
 #else
 static int kvmppc_dec_enabled(struct kvm_vcpu *vcpu)
 {
-       return vcpu->arch.tcr & TCR_DIE;
+       /* On BOOKE, DEC = 0 is as good as decrementer not enabled */
+       return (vcpu->arch.tcr & TCR_DIE) && vcpu->arch.dec;
 }
 #endif
 
 void kvmppc_emulate_dec(struct kvm_vcpu *vcpu)
 {
        unsigned long dec_nsec;
+       unsigned long long dec_time;
 
        pr_debug("mtDEC: %x\n", vcpu->arch.dec);
 #ifdef CONFIG_PPC_BOOK3S
@@ -103,11 +105,12 @@ void kvmppc_emulate_dec(struct kvm_vcpu *vcpu)
                 * host ticks. */
 
                hrtimer_try_to_cancel(&vcpu->arch.dec_timer);
-               dec_nsec = vcpu->arch.dec;
-               dec_nsec *= 1000;
-               dec_nsec /= tb_ticks_per_usec;
-               hrtimer_start(&vcpu->arch.dec_timer, ktime_set(0, dec_nsec),
-                             HRTIMER_MODE_REL);
+               dec_time = vcpu->arch.dec;
+               dec_time *= 1000;
+               do_div(dec_time, tb_ticks_per_usec);
+               dec_nsec = do_div(dec_time, NSEC_PER_SEC);
+               hrtimer_start(&vcpu->arch.dec_timer,
+                       ktime_set(dec_time, dec_nsec), HRTIMER_MODE_REL);
                vcpu->arch.dec_jiffies = get_tb();
        } else {
                hrtimer_try_to_cancel(&vcpu->arch.dec_timer);