]> Pileus Git - ~andy/linux/blobdiff - arch/powerpc/kvm/booke.c
Merge branch 'trivial' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild
[~andy/linux] / arch / powerpc / kvm / booke.c
index 72f13f4a06e0d0bb16e442b9840f87c9c8b1339b..d25a097c852b75469785578cde71daef2043c65b 100644 (file)
@@ -612,6 +612,12 @@ static void kvmppc_fill_pt_regs(struct pt_regs *regs)
        regs->link = lr;
 }
 
+/*
+ * For interrupts needed to be handled by host interrupt handlers,
+ * corresponding host handler are called from here in similar way
+ * (but not exact) as they are called from low level handler
+ * (such as from arch/powerpc/kernel/head_fsl_booke.S).
+ */
 static void kvmppc_restart_interrupt(struct kvm_vcpu *vcpu,
                                     unsigned int exit_nr)
 {
@@ -639,6 +645,17 @@ static void kvmppc_restart_interrupt(struct kvm_vcpu *vcpu,
                kvmppc_fill_pt_regs(&regs);
                performance_monitor_exception(&regs);
                break;
+       case BOOKE_INTERRUPT_WATCHDOG:
+               kvmppc_fill_pt_regs(&regs);
+#ifdef CONFIG_BOOKE_WDT
+               WatchdogException(&regs);
+#else
+               unknown_exception(&regs);
+#endif
+               break;
+       case BOOKE_INTERRUPT_CRITICAL:
+               unknown_exception(&regs);
+               break;
        }
 }
 
@@ -683,6 +700,10 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
                r = RESUME_GUEST;
                break;
 
+       case BOOKE_INTERRUPT_WATCHDOG:
+               r = RESUME_GUEST;
+               break;
+
        case BOOKE_INTERRUPT_DOORBELL:
                kvmppc_account_exit(vcpu, DBELL_EXITS);
                r = RESUME_GUEST;
@@ -1267,6 +1288,11 @@ void kvmppc_decrementer_func(unsigned long data)
 {
        struct kvm_vcpu *vcpu = (struct kvm_vcpu *)data;
 
+       if (vcpu->arch.tcr & TCR_ARE) {
+               vcpu->arch.dec = vcpu->arch.decar;
+               kvmppc_emulate_dec(vcpu);
+       }
+
        kvmppc_set_tsr_bits(vcpu, TSR_DIS);
 }