KVM Archive on lore.kernel.org
 help / color / Atom feed
* [PATCH] KVM: nVMX: Ignore segment base for VMX memory operand when segment not FS or GS
@ 2019-07-15 15:47 Liran Alon
  2019-07-15 16:22 ` Vitaly Kuznetsov
  0 siblings, 1 reply; 6+ messages in thread
From: Liran Alon @ 2019-07-15 15:47 UTC (permalink / raw)
  To: pbonzini, rkrcmar, kvm; +Cc: max, Liran Alon, Joao Martins

As reported by Maxime at
https://bugzilla.kernel.org/show_bug.cgi?id=204175:

In vmx/nested.c::get_vmx_mem_address(), when the guest runs in long mode,
the base address of the memory operand is computed with a simple:
    *ret = s.base + off;

This is incorrect, the base applies only to FS and GS, not to the others.
Because of that, if the guest uses a VMX instruction based on DS and has
a DS.base that is non-zero, KVM wrongfully adds the base to the
resulting address.

Reported-by: Maxime Villard <max@m00nbsd.net>
Reviewed-by: Joao Martins <joao.m.martins@oracle.com>
Signed-off-by: Liran Alon <liran.alon@oracle.com>
---
 arch/x86/kvm/vmx/nested.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c
index 18efb338ed8a..e01e1b6b8167 100644
--- a/arch/x86/kvm/vmx/nested.c
+++ b/arch/x86/kvm/vmx/nested.c
@@ -4068,6 +4068,8 @@ int get_vmx_mem_address(struct kvm_vcpu *vcpu, unsigned long exit_qualification,
 		 * mode, e.g. a 32-bit address size can yield a 64-bit virtual
 		 * address when using FS/GS with a non-zero base.
 		 */
+		if ((seg_reg != VCPU_SREG_FS) && (seg_reg != VCPU_SREG_GS))
+			s.base = 0;
 		*ret = s.base + off;
 
 		/* Long mode: #GP(0)/#SS(0) if the memory address is in a
-- 
2.20.1


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] KVM: nVMX: Ignore segment base for VMX memory operand when segment not FS or GS
  2019-07-15 15:47 [PATCH] KVM: nVMX: Ignore segment base for VMX memory operand when segment not FS or GS Liran Alon
@ 2019-07-15 16:22 ` Vitaly Kuznetsov
  2019-07-15 17:21   ` Sean Christopherson
  0 siblings, 1 reply; 6+ messages in thread
From: Vitaly Kuznetsov @ 2019-07-15 16:22 UTC (permalink / raw)
  To: Liran Alon; +Cc: max, Joao Martins, pbonzini, rkrcmar, kvm

Liran Alon <liran.alon@oracle.com> writes:

> As reported by Maxime at
> https://bugzilla.kernel.org/show_bug.cgi?id=204175:
>
> In vmx/nested.c::get_vmx_mem_address(), when the guest runs in long mode,
> the base address of the memory operand is computed with a simple:
>     *ret = s.base + off;
>
> This is incorrect, the base applies only to FS and GS, not to the others.
> Because of that, if the guest uses a VMX instruction based on DS and has
> a DS.base that is non-zero, KVM wrongfully adds the base to the
> resulting address.
>
> Reported-by: Maxime Villard <max@m00nbsd.net>
> Reviewed-by: Joao Martins <joao.m.martins@oracle.com>
> Signed-off-by: Liran Alon <liran.alon@oracle.com>
> ---
>  arch/x86/kvm/vmx/nested.c | 2 ++
>  1 file changed, 2 insertions(+)
>
> diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c
> index 18efb338ed8a..e01e1b6b8167 100644
> --- a/arch/x86/kvm/vmx/nested.c
> +++ b/arch/x86/kvm/vmx/nested.c
> @@ -4068,6 +4068,8 @@ int get_vmx_mem_address(struct kvm_vcpu *vcpu, unsigned long exit_qualification,
>  		 * mode, e.g. a 32-bit address size can yield a 64-bit virtual
>  		 * address when using FS/GS with a non-zero base.
>  		 */
> +		if ((seg_reg != VCPU_SREG_FS) && (seg_reg != VCPU_SREG_GS))
> +			s.base = 0;

(personal preference)
 
 I'd rather write this as

    /* In long mode only FS and GS bases are considered */
    if (seg_reg == VCPU_SREG_FS || seg_reg == VCPU_SREG_GS)
       *ret = s.base + off;
    else 
       *ret = off;

>  		*ret = s.base + off;
>  
>  		/* Long mode: #GP(0)/#SS(0) if the memory address is in a

As-is or rewritten with my suggestion,

Reviewed-by: Vitaly Kuznetsov <vkuznets@redhat.com>

-- 
Vitaly

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] KVM: nVMX: Ignore segment base for VMX memory operand when segment not FS or GS
  2019-07-15 16:22 ` Vitaly Kuznetsov
@ 2019-07-15 17:21   ` Sean Christopherson
  2019-07-15 18:28     ` Paolo Bonzini
  0 siblings, 1 reply; 6+ messages in thread
From: Sean Christopherson @ 2019-07-15 17:21 UTC (permalink / raw)
  To: Vitaly Kuznetsov; +Cc: Liran Alon, max, Joao Martins, pbonzini, rkrcmar, kvm

On Mon, Jul 15, 2019 at 06:22:52PM +0200, Vitaly Kuznetsov wrote:
> Liran Alon <liran.alon@oracle.com> writes:
> 
> > As reported by Maxime at
> > https://bugzilla.kernel.org/show_bug.cgi?id=204175:
> >
> > In vmx/nested.c::get_vmx_mem_address(), when the guest runs in long mode,
> > the base address of the memory operand is computed with a simple:
> >     *ret = s.base + off;
> >
> > This is incorrect, the base applies only to FS and GS, not to the others.
> > Because of that, if the guest uses a VMX instruction based on DS and has
> > a DS.base that is non-zero, KVM wrongfully adds the base to the
> > resulting address.
> >
> > Reported-by: Maxime Villard <max@m00nbsd.net>
> > Reviewed-by: Joao Martins <joao.m.martins@oracle.com>
> > Signed-off-by: Liran Alon <liran.alon@oracle.com>
> > ---
> >  arch/x86/kvm/vmx/nested.c | 2 ++
> >  1 file changed, 2 insertions(+)
> >
> > diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c
> > index 18efb338ed8a..e01e1b6b8167 100644
> > --- a/arch/x86/kvm/vmx/nested.c
> > +++ b/arch/x86/kvm/vmx/nested.c
> > @@ -4068,6 +4068,8 @@ int get_vmx_mem_address(struct kvm_vcpu *vcpu, unsigned long exit_qualification,
> >  		 * mode, e.g. a 32-bit address size can yield a 64-bit virtual
> >  		 * address when using FS/GS with a non-zero base.
> >  		 */
> > +		if ((seg_reg != VCPU_SREG_FS) && (seg_reg != VCPU_SREG_GS))

I'm pretty sure the internal parantheses are unnecessary.

> > +			s.base = 0;
> 
> (personal preference)
>  
>  I'd rather write this as
> 
>     /* In long mode only FS and GS bases are considered */
>     if (seg_reg == VCPU_SREG_FS || seg_reg == VCPU_SREG_GS)
>        *ret = s.base + off;
>     else 
>        *ret = off;
> 
> >  		*ret = s.base + off;
> >  
> >  		/* Long mode: #GP(0)/#SS(0) if the memory address is in a
> 
> As-is or rewritten with my suggestion,

Likewise,

Reviewed-by: Sean Christopherson <sean.j.christopherson@intel.com>

> 
> Reviewed-by: Vitaly Kuznetsov <vkuznets@redhat.com>
> 
> -- 
> Vitaly

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] KVM: nVMX: Ignore segment base for VMX memory operand when segment not FS or GS
  2019-07-15 17:21   ` Sean Christopherson
@ 2019-07-15 18:28     ` Paolo Bonzini
  2019-07-15 18:30       ` Liran Alon
  0 siblings, 1 reply; 6+ messages in thread
From: Paolo Bonzini @ 2019-07-15 18:28 UTC (permalink / raw)
  To: Sean Christopherson, Vitaly Kuznetsov
  Cc: Liran Alon, max, Joao Martins, rkrcmar, kvm

On 15/07/19 19:21, Sean Christopherson wrote:
>>> +		if ((seg_reg != VCPU_SREG_FS) && (seg_reg != VCPU_SREG_GS))
> I'm pretty sure the internal parantheses are unnecessary.
> 

Indeed, that's so Pascal! :)  I'll apply Vitaly's suggestion and queue it.

Paolo

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] KVM: nVMX: Ignore segment base for VMX memory operand when segment not FS or GS
  2019-07-15 18:28     ` Paolo Bonzini
@ 2019-07-15 18:30       ` Liran Alon
  2019-07-15 18:44         ` Sean Christopherson
  0 siblings, 1 reply; 6+ messages in thread
From: Liran Alon @ 2019-07-15 18:30 UTC (permalink / raw)
  To: Paolo Bonzini
  Cc: Sean Christopherson, Vitaly Kuznetsov, max, Joao Martins, rkrcmar, kvm



> On 15 Jul 2019, at 21:28, Paolo Bonzini <pbonzini@redhat.com> wrote:
> 
> On 15/07/19 19:21, Sean Christopherson wrote:
>>>> +		if ((seg_reg != VCPU_SREG_FS) && (seg_reg != VCPU_SREG_GS))
>> I'm pretty sure the internal parantheses are unnecessary.
>> 
> 
> Indeed, that's so Pascal! :)  I'll apply Vitaly's suggestion and queue it.
> 
> Paolo

I like parentheses as it makes ordering of expression a no-brainer. But that’s just a matter of taste I guess.
I don’t mind you will change it according to given suggestions. :)

-Liran

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] KVM: nVMX: Ignore segment base for VMX memory operand when segment not FS or GS
  2019-07-15 18:30       ` Liran Alon
@ 2019-07-15 18:44         ` Sean Christopherson
  0 siblings, 0 replies; 6+ messages in thread
From: Sean Christopherson @ 2019-07-15 18:44 UTC (permalink / raw)
  To: Liran Alon
  Cc: Paolo Bonzini, Vitaly Kuznetsov, max, Joao Martins, rkrcmar, kvm

On Mon, Jul 15, 2019 at 09:30:48PM +0300, Liran Alon wrote:
> I like parentheses as it makes ordering of expression a no-brainer.

Matching parantheses is not my forte :-)

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, back to index

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-07-15 15:47 [PATCH] KVM: nVMX: Ignore segment base for VMX memory operand when segment not FS or GS Liran Alon
2019-07-15 16:22 ` Vitaly Kuznetsov
2019-07-15 17:21   ` Sean Christopherson
2019-07-15 18:28     ` Paolo Bonzini
2019-07-15 18:30       ` Liran Alon
2019-07-15 18:44         ` Sean Christopherson

KVM Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/kvm/0 kvm/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 kvm kvm/ https://lore.kernel.org/kvm \
		kvm@vger.kernel.org kvm@archiver.kernel.org
	public-inbox-index kvm


Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.kvm


AGPL code for this site: git clone https://public-inbox.org/ public-inbox