All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sean Christopherson <seanjc@google.com>
To: Xiaoyao Li <xiaoyao.li@intel.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>,
	kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
	 Tom Lendacky <thomas.lendacky@amd.com>,
	Binbin Wu <binbin.wu@linux.intel.com>,
	 Isaku Yamahata <isaku.yamahata@intel.com>,
	Kai Huang <kai.huang@intel.com>
Subject: Re: [PATCH v4 5/6] KVM: x86: Always complete hypercall via function callback
Date: Mon, 2 Dec 2024 10:44:24 -0800	[thread overview]
Message-ID: <Z04ACJSrBSPlyqY4@google.com> (raw)
In-Reply-To: <ce45a9cb-44a4-4a3d-bc81-608a0871ae6d@intel.com>

On Thu, Nov 28, 2024, Xiaoyao Li wrote:
> On 11/28/2024 8:43 AM, Sean Christopherson wrote:
> > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> > index 11434752b467..39be2a891ab4 100644
> > --- a/arch/x86/kvm/x86.c
> > +++ b/arch/x86/kvm/x86.c
> > @@ -9982,10 +9982,11 @@ static int complete_hypercall_exit(struct kvm_vcpu *vcpu)
> >   	return kvm_skip_emulated_instruction(vcpu);
> >   }
> > -unsigned long __kvm_emulate_hypercall(struct kvm_vcpu *vcpu, unsigned long nr,
> > -				      unsigned long a0, unsigned long a1,
> > -				      unsigned long a2, unsigned long a3,
> > -				      int op_64_bit, int cpl)
> > +int __kvm_emulate_hypercall(struct kvm_vcpu *vcpu, unsigned long nr,
> > +			    unsigned long a0, unsigned long a1,
> > +			    unsigned long a2, unsigned long a3,
> > +			    int op_64_bit, int cpl,
> > +			    int (*complete_hypercall)(struct kvm_vcpu *))
> >   {
> >   	unsigned long ret;
> > @@ -10061,7 +10062,7 @@ unsigned long __kvm_emulate_hypercall(struct kvm_vcpu *vcpu, unsigned long nr,
> >   			vcpu->run->hypercall.flags |= KVM_EXIT_HYPERCALL_LONG_MODE;
> >   		WARN_ON_ONCE(vcpu->run->hypercall.flags & KVM_EXIT_HYPERCALL_MBZ);
> > -		vcpu->arch.complete_userspace_io = complete_hypercall_exit;
> > +		vcpu->arch.complete_userspace_io = complete_hypercall;
> >   		/* stat is incremented on completion. */
> >   		return 0;
> >   	}
> > @@ -10071,13 +10072,15 @@ unsigned long __kvm_emulate_hypercall(struct kvm_vcpu *vcpu, unsigned long nr,
> >   	}
> >   out:
> > -	return ret;
> > +	vcpu->run->hypercall.ret = ret;
> > +	complete_hypercall(vcpu);
> > +	return 1;
> 
> shouldn't it be
> 
> 	return complete_hypercall(vcpu);
> 
> ?

Ouch.  Yes, it most definitely should be.

> Originally, kvm_emulate_hypercall() returns kvm_skip_emulated_instruction().
> Now it becomes
> 
> 	kvm_skip_emulated_instruction();
> 	return 1;
> 
> I don't go deep to see if kvm_skip_emulated_instruction() always return 1
> for this case.

It doesn't.  KVM needs to exit to userspace if userspace is single-stepping, or
in the extremely unlikely scenario that KVM can't skip the emulated instruction
(which can very theoretically happen on older AMD CPUs).

  reply	other threads:[~2024-12-02 18:44 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-11-28  0:43 [PATCH v4 0/6] KVM: x86: Prep KVM hypercall handling for TDX Sean Christopherson
2024-11-28  0:43 ` [PATCH v4 1/6] KVM: x86: Play nice with protected guests in complete_hypercall_exit() Sean Christopherson
2024-11-28  3:22   ` Xiaoyao Li
2024-11-29  9:01   ` Nikunj A. Dadhania
2024-12-02 18:54   ` Tom Lendacky
2024-12-03  7:29   ` Binbin Wu
2024-11-28  0:43 ` [PATCH v4 2/6] KVM: x86: Add a helper to check for user interception of KVM hypercalls Sean Christopherson
2024-12-02 18:57   ` Tom Lendacky
2024-11-28  0:43 ` [PATCH v4 3/6] KVM: x86: Move "emulate hypercall" function declarations to x86.h Sean Christopherson
2024-11-28  3:23   ` Xiaoyao Li
2024-12-02 20:05   ` Tom Lendacky
2024-12-03  7:33   ` Binbin Wu
2024-11-28  0:43 ` [PATCH v4 4/6] KVM: x86: Bump hypercall stat prior to fully completing hypercall Sean Christopherson
2024-11-28  3:24   ` Xiaoyao Li
2024-12-02 20:13   ` Tom Lendacky
2024-12-02 20:33     ` Tom Lendacky
2024-12-03  7:37   ` Binbin Wu
2024-11-28  0:43 ` [PATCH v4 5/6] KVM: x86: Always complete hypercall via function callback Sean Christopherson
2024-11-28  3:08   ` Xiaoyao Li
2024-12-02 18:44     ` Sean Christopherson [this message]
2024-12-02 20:57   ` Tom Lendacky
2024-12-02 20:59     ` Tom Lendacky
2024-12-03  0:14       ` Sean Christopherson
2024-11-28  0:43 ` [PATCH v4 6/6] KVM: x86: Refactor __kvm_emulate_hypercall() into a macro Sean Christopherson
2024-11-28  8:38   ` Adrian Hunter
2024-12-10 16:20     ` Paolo Bonzini
2024-12-10 20:03       ` Sean Christopherson
2024-12-12  7:32         ` Adrian Hunter
2024-12-12 15:42           ` Paolo Bonzini
2024-12-12 18:40           ` Sean Christopherson
2024-12-03  8:01   ` Binbin Wu
2024-12-10 16:17   ` Paolo Bonzini
2024-12-10 20:10     ` Sean Christopherson
2024-11-28  1:06 ` [PATCH v4 0/6] KVM: x86: Prep KVM hypercall handling for TDX Huang, Kai
2024-12-19  2:40 ` Sean Christopherson
2025-01-15  9:40   ` Binbin Wu
2025-01-17 19:31     ` Sean Christopherson
2025-01-20  0:37       ` Binbin Wu
2025-01-21 18:04         ` Sean Christopherson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Z04ACJSrBSPlyqY4@google.com \
    --to=seanjc@google.com \
    --cc=binbin.wu@linux.intel.com \
    --cc=isaku.yamahata@intel.com \
    --cc=kai.huang@intel.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pbonzini@redhat.com \
    --cc=thomas.lendacky@amd.com \
    --cc=xiaoyao.li@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.