diff options
Diffstat (limited to 'arch/powerpc/kvm/booke.c')
| -rw-r--r-- | arch/powerpc/kvm/booke.c | 26 | 
1 files changed, 26 insertions, 0 deletions
diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c index 72f13f4a06e0..d25a097c852b 100644 --- a/arch/powerpc/kvm/booke.c +++ b/arch/powerpc/kvm/booke.c @@ -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(®s);  		performance_monitor_exception(®s);  		break; +	case BOOKE_INTERRUPT_WATCHDOG: +		kvmppc_fill_pt_regs(®s); +#ifdef CONFIG_BOOKE_WDT +		WatchdogException(®s); +#else +		unknown_exception(®s); +#endif +		break; +	case BOOKE_INTERRUPT_CRITICAL: +		unknown_exception(®s); +		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);  }  | 
