booke/bookehv: Add host crit-watchdog exception support
authorBharat Bhushan <r65777@freescale.com>
Wed, 20 Jun 2012 05:56:53 +0000 (05:56 +0000)
committerAlexander Graf <agraf@suse.de>
Wed, 11 Jul 2012 15:39:36 +0000 (17:39 +0200)
Signed-off-by: Bharat Bhushan <bharat.bhushan@freescale.com>
Signed-off-by: Alexander Graf <agraf@suse.de>
arch/powerpc/include/asm/hw_irq.h
arch/powerpc/kvm/booke.c

index c9aac24..2aadb47 100644 (file)
@@ -34,6 +34,8 @@ extern void __replay_interrupt(unsigned int vector);
 
 extern void timer_interrupt(struct pt_regs *);
 extern void performance_monitor_exception(struct pt_regs *regs);
+extern void WatchdogException(struct pt_regs *regs);
+extern void unknown_exception(struct pt_regs *regs);
 
 #ifdef CONFIG_PPC64
 #include <asm/paca.h>
index 86681ee..d25a097 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;