diff options
Diffstat (limited to 'arch/arm/kvm/handle_exit.c')
| -rw-r--r-- | arch/arm/kvm/handle_exit.c | 32 | 
1 files changed, 20 insertions, 12 deletions
diff --git a/arch/arm/kvm/handle_exit.c b/arch/arm/kvm/handle_exit.c index df4c82d47ad..4c979d466cc 100644 --- a/arch/arm/kvm/handle_exit.c +++ b/arch/arm/kvm/handle_exit.c @@ -26,8 +26,6 @@  #include "trace.h" -#include "trace.h" -  typedef int (*exit_handle_fn)(struct kvm_vcpu *, struct kvm_run *);  static int handle_svc_hyp(struct kvm_vcpu *vcpu, struct kvm_run *run) @@ -40,14 +38,18 @@ static int handle_svc_hyp(struct kvm_vcpu *vcpu, struct kvm_run *run)  static int handle_hvc(struct kvm_vcpu *vcpu, struct kvm_run *run)  { +	int ret; +  	trace_kvm_hvc(*vcpu_pc(vcpu), *vcpu_reg(vcpu, 0),  		      kvm_vcpu_hvc_get_imm(vcpu)); -	if (kvm_psci_call(vcpu)) +	ret = kvm_psci_call(vcpu); +	if (ret < 0) { +		kvm_inject_undefined(vcpu);  		return 1; +	} -	kvm_inject_undefined(vcpu); -	return 1; +	return ret;  }  static int handle_smc(struct kvm_vcpu *vcpu, struct kvm_run *run) @@ -73,23 +75,29 @@ static int handle_dabt_hyp(struct kvm_vcpu *vcpu, struct kvm_run *run)  }  /** - * kvm_handle_wfi - handle a wait-for-interrupts instruction executed by a guest + * kvm_handle_wfx - handle a WFI or WFE instructions trapped in guests   * @vcpu:	the vcpu pointer   * @run:	the kvm_run structure pointer   * - * Simply sets the wait_for_interrupts flag on the vcpu structure, which will - * halt execution of world-switches and schedule other host processes until - * there is an incoming IRQ or FIQ to the VM. + * WFE: Yield the CPU and come back to this vcpu when the scheduler + * decides to. + * WFI: Simply call kvm_vcpu_block(), which will halt execution of + * world-switches and schedule other host processes until there is an + * incoming IRQ or FIQ to the VM.   */ -static int kvm_handle_wfi(struct kvm_vcpu *vcpu, struct kvm_run *run) +static int kvm_handle_wfx(struct kvm_vcpu *vcpu, struct kvm_run *run)  {  	trace_kvm_wfi(*vcpu_pc(vcpu)); -	kvm_vcpu_block(vcpu); +	if (kvm_vcpu_get_hsr(vcpu) & HSR_WFI_IS_WFE) +		kvm_vcpu_on_spin(vcpu); +	else +		kvm_vcpu_block(vcpu); +  	return 1;  }  static exit_handle_fn arm_exit_handlers[] = { -	[HSR_EC_WFI]		= kvm_handle_wfi, +	[HSR_EC_WFI]		= kvm_handle_wfx,  	[HSR_EC_CP15_32]	= kvm_handle_cp15_32,  	[HSR_EC_CP15_64]	= kvm_handle_cp15_64,  	[HSR_EC_CP14_MR]	= kvm_handle_cp14_access,  | 
