Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1260989 > unrolled thread

[PATCH] KVM: VMX: fix SMEP and SMAP without EPT

Started byRadim Krčmář <rkrcmar@redhat.com>
First post2015-11-02 22:30 +0100
Last post2015-11-03 10:50 +0100
Articles 2 — 2 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH] KVM: VMX: fix SMEP and SMAP without EPT Radim Krčmář <rkrcmar@redhat.com> - 2015-11-02 22:30 +0100
    Re: [PATCH] KVM: VMX: fix SMEP and SMAP without EPT Paolo Bonzini <pbonzini@redhat.com> - 2015-11-03 10:50 +0100

#1260989 — [PATCH] KVM: VMX: fix SMEP and SMAP without EPT

FromRadim Krčmář <rkrcmar@redhat.com>
Date2015-11-02 22:30 +0100
Subject[PATCH] KVM: VMX: fix SMEP and SMAP without EPT
Message-ID<qquPV-21L-19@gated-at.bofh.it>
The comment in code had it mostly right, but we enable paging for
emulated real mode regardless of EPT.

Without EPT (which implies emulated real mode), secondary VCPUs won't
start unless we disable SM[AE]P when the guest doesn't use paging.

Signed-off-by: Radim Krčmář <rkrcmar@redhat.com>
---
 arch/x86/kvm/vmx.c | 19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)

diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index b680c2e0e8a3..ab598558a7a4 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -3788,20 +3788,21 @@ static int vmx_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)
 		if (!is_paging(vcpu)) {
 			hw_cr4 &= ~X86_CR4_PAE;
 			hw_cr4 |= X86_CR4_PSE;
-			/*
-			 * SMEP/SMAP is disabled if CPU is in non-paging mode
-			 * in hardware. However KVM always uses paging mode to
-			 * emulate guest non-paging mode with TDP.
-			 * To emulate this behavior, SMEP/SMAP needs to be
-			 * manually disabled when guest switches to non-paging
-			 * mode.
-			 */
-			hw_cr4 &= ~(X86_CR4_SMEP | X86_CR4_SMAP);
 		} else if (!(cr4 & X86_CR4_PAE)) {
 			hw_cr4 &= ~X86_CR4_PAE;
 		}
 	}
 
+	if (!enable_unrestricted_guest && !is_paging(vcpu))
+		/*
+		 * SMEP/SMAP is disabled if CPU is in non-paging mode in
+		 * hardware.  However KVM always uses paging mode without
+		 * unrestricted guest.
+		 * To emulate this behavior, SMEP/SMAP needs to be manually
+		 * disabled when guest switches to non-paging mode.
+		 */
+		hw_cr4 &= ~(X86_CR4_SMEP | X86_CR4_SMAP);
+
 	vmcs_writel(CR4_READ_SHADOW, cr4);
 	vmcs_writel(GUEST_CR4, hw_cr4);
 	return 0;
-- 
2.5.3

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [next] | [standalone]


#1261338

FromPaolo Bonzini <pbonzini@redhat.com>
Date2015-11-03 10:50 +0100
Message-ID<qqGo2-WT-7@gated-at.bofh.it>
In reply to#1260989

On 02/11/2015 22:20, Radim Krčmář wrote:
> The comment in code had it mostly right, but we enable paging for
> emulated real mode regardless of EPT.
> 
> Without EPT (which implies emulated real mode), secondary VCPUs won't
> start unless we disable SM[AE]P when the guest doesn't use paging.
> 
> Signed-off-by: Radim Krčmář <rkrcmar@redhat.com>
> ---
>  arch/x86/kvm/vmx.c | 19 ++++++++++---------
>  1 file changed, 10 insertions(+), 9 deletions(-)
> 
> diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
> index b680c2e0e8a3..ab598558a7a4 100644
> --- a/arch/x86/kvm/vmx.c
> +++ b/arch/x86/kvm/vmx.c
> @@ -3788,20 +3788,21 @@ static int vmx_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)
>  		if (!is_paging(vcpu)) {
>  			hw_cr4 &= ~X86_CR4_PAE;
>  			hw_cr4 |= X86_CR4_PSE;
> -			/*
> -			 * SMEP/SMAP is disabled if CPU is in non-paging mode
> -			 * in hardware. However KVM always uses paging mode to
> -			 * emulate guest non-paging mode with TDP.
> -			 * To emulate this behavior, SMEP/SMAP needs to be
> -			 * manually disabled when guest switches to non-paging
> -			 * mode.
> -			 */
> -			hw_cr4 &= ~(X86_CR4_SMEP | X86_CR4_SMAP);
>  		} else if (!(cr4 & X86_CR4_PAE)) {
>  			hw_cr4 &= ~X86_CR4_PAE;
>  		}
>  	}
>  
> +	if (!enable_unrestricted_guest && !is_paging(vcpu))
> +		/*
> +		 * SMEP/SMAP is disabled if CPU is in non-paging mode in
> +		 * hardware.  However KVM always uses paging mode without
> +		 * unrestricted guest.
> +		 * To emulate this behavior, SMEP/SMAP needs to be manually
> +		 * disabled when guest switches to non-paging mode.
> +		 */
> +		hw_cr4 &= ~(X86_CR4_SMEP | X86_CR4_SMAP);
> +
>  	vmcs_writel(CR4_READ_SHADOW, cr4);
>  	vmcs_writel(GUEST_CR4, hw_cr4);
>  	return 0;
> 

Applied with Cc: stable@vger.kernel.org.

Paolo
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web