[Devel] [svt-core] [PATCH rh7 v1 3/5] ms/kvm/x86: Pass return code of kvm_emulate_hypercall

Andrey Smetanin asmetanin at virtuozzo.com
Fri Feb 19 03:28:52 PST 2016



On 02/19/2016 02:25 PM, Andrey Smetanin wrote:
> Pass the return code from kvm_emulate_hypercall on to the caller,
> in order to allow it to indicate to the userspace that
> the hypercall has to be handled there.
>
> Also adjust all the existing code paths to return 1 to make sure the
> hypercall isn't passed to the userspace without setting kvm_run
> appropriately.
>
> Signed-off-by: Andrey Smetanin <asmetanin at virtuozzo.com>
> Reviewed-by: Roman Kagan <rkagan at virtuozzo.com>
> CC: Gleb Natapov <gleb at kernel.org>
> CC: Paolo Bonzini <pbonzini at redhat.com>
> CC: Joerg Roedel <joro at 8bytes.org>
> CC: "K. Y. Srinivasan" <kys at microsoft.com>
> CC: Haiyang Zhang <haiyangz at microsoft.com>
> CC: Roman Kagan <rkagan at virtuozzo.com>
> CC: Denis V. Lunev <den at openvz.org>
> CC: qemu-devel at nongnu.org
> Signed-off-by: Paolo Bonzini <pbonzini at redhat.com>
> (cherry picked from commit 0d9c055eaaf41bebb0e6b095fff447523121fad3)
> ---
>   arch/x86/kvm/hyperv.c | 2 +-
>   arch/x86/kvm/svm.c    | 3 +--
>   arch/x86/kvm/vmx.c    | 2 +-
>   3 files changed, 3 insertions(+), 4 deletions(-)
>
> diff --git a/arch/x86/kvm/hyperv.c b/arch/x86/kvm/hyperv.c
> index c4c1a80..7638214 100644
> --- a/arch/x86/kvm/hyperv.c
> +++ b/arch/x86/kvm/hyperv.c
> @@ -1056,7 +1056,7 @@ int kvm_hv_hypercall(struct kvm_vcpu *vcpu)
>   	 */
>   	if (kvm_x86_ops->get_cpl(vcpu) != 0 || !is_protmode(vcpu)) {
>   		kvm_queue_exception(vcpu, UD_VECTOR);
> -		return 0;
> +		return 1;
>   	}
>
>   	kvm_x86_ops->get_cs_db_l_bits(vcpu, &cs_db, &cs_l);
> diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
> index f8bde17..12850b2 100644
> --- a/arch/x86/kvm/svm.c
> +++ b/arch/x86/kvm/svm.c
> @@ -1942,8 +1942,7 @@ static int vmmcall_interception(struct vcpu_svm *svm)
>   {
>   	svm->next_rip = kvm_rip_read(&svm->vcpu) + 3;
>   	skip_emulated_instruction(&svm->vcpu);
> -	kvm_emulate_hypercall(&svm->vcpu);
> -	return 1;
> +	return kvm_emulate_hypercall(&svm->vcpu);
>   }
>
>   static unsigned long nested_svm_get_tdp_cr3(struct kvm_vcpu *vcpu)
> diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
> index 4474efc..8a7f697 100644
> --- a/arch/x86/kvm/vmx.c
> +++ b/arch/x86/kvm/vmx.c
> @@ -5301,7 +5301,7 @@ static int handle_vmcall(struct kvm_vcpu *vcpu)
>   {
>   	skip_emulated_instruction(vcpu);
>   	kvm_emulate_hypercall(vcpu);
> -	return 1;
> +	return kvm_emulate_hypercall(vcpu);
bad error here, kvm_emulate_hypercall is called twice will resend this 
patch with V2.
>   }
>
>   static int handle_invd(struct kvm_vcpu *vcpu)
>


More information about the Devel mailing list