All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] KVM: VMX: Skip #PF(RSVD) intercepts when emulating smaller maxphyaddr
@ 2021-06-18 23:59 Jim Mattson
  2021-06-21 16:39 ` Paolo Bonzini
  0 siblings, 1 reply; 2+ messages in thread
From: Jim Mattson @ 2021-06-18 23:59 UTC (permalink / raw)
  To: kvm, pbonzini; +Cc: Jim Mattson

As part of smaller maxphyaddr emulation, kvm needs to intercept
present page faults to see if it needs to add the RSVD flag (bit 3) to
the error code. However, there is no need to intercept page faults
that already have the RSVD flag set. When setting up the page fault
intercept, add the RSVD flag into the #PF error code mask field (but
not the #PF error code match field) to skip the intercept when the
RSVD flag is already set.

Signed-off-by: Jim Mattson <jmattson@google.com>
---
 arch/x86/kvm/vmx/vmx.c | 23 ++++++++++++++---------
 1 file changed, 14 insertions(+), 9 deletions(-)

diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
index 68a72c80bd3f..1fc28d8b72c7 100644
--- a/arch/x86/kvm/vmx/vmx.c
+++ b/arch/x86/kvm/vmx/vmx.c
@@ -747,16 +747,21 @@ void vmx_update_exception_bitmap(struct kvm_vcpu *vcpu)
 	if (is_guest_mode(vcpu))
 		eb |= get_vmcs12(vcpu)->exception_bitmap;
         else {
-		/*
-		 * If EPT is enabled, #PF is only trapped if MAXPHYADDR is mismatched
-		 * between guest and host.  In that case we only care about present
-		 * faults.  For vmcs02, however, PFEC_MASK and PFEC_MATCH are set in
-		 * prepare_vmcs02_rare.
-		 */
-		bool selective_pf_trap = enable_ept && (eb & (1u << PF_VECTOR));
-		int mask = selective_pf_trap ? PFERR_PRESENT_MASK : 0;
+		int mask = 0, match = 0;
+
+		if (enable_ept && (eb & (1u << PF_VECTOR))) {
+			/*
+			 * If EPT is enabled, #PF is currently only intercepted
+			 * if MAXPHYADDR is smaller on the guest than on the
+			 * host.  In that case we only care about present,
+			 * non-reserved faults.  For vmcs02, however, PFEC_MASK
+			 * and PFEC_MATCH are set in prepare_vmcs02_rare.
+			 */
+			mask = PFERR_PRESENT_MASK | PFERR_RSVD_MASK;
+			match = PFERR_PRESENT_MASK;
+		}
 		vmcs_write32(PAGE_FAULT_ERROR_CODE_MASK, mask);
-		vmcs_write32(PAGE_FAULT_ERROR_CODE_MATCH, mask);
+		vmcs_write32(PAGE_FAULT_ERROR_CODE_MATCH, match);
 	}
 
 	vmcs_write32(EXCEPTION_BITMAP, eb);
-- 
2.32.0.288.g62a8d224e6-goog


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

* Re: [PATCH] KVM: VMX: Skip #PF(RSVD) intercepts when emulating smaller maxphyaddr
  2021-06-18 23:59 [PATCH] KVM: VMX: Skip #PF(RSVD) intercepts when emulating smaller maxphyaddr Jim Mattson
@ 2021-06-21 16:39 ` Paolo Bonzini
  0 siblings, 0 replies; 2+ messages in thread
From: Paolo Bonzini @ 2021-06-21 16:39 UTC (permalink / raw)
  To: Jim Mattson, kvm

On 19/06/21 01:59, Jim Mattson wrote:
> As part of smaller maxphyaddr emulation, kvm needs to intercept
> present page faults to see if it needs to add the RSVD flag (bit 3) to
> the error code. However, there is no need to intercept page faults
> that already have the RSVD flag set. When setting up the page fault
> intercept, add the RSVD flag into the #PF error code mask field (but
> not the #PF error code match field) to skip the intercept when the
> RSVD flag is already set.
> 
> Signed-off-by: Jim Mattson <jmattson@google.com>
> ---
>   arch/x86/kvm/vmx/vmx.c | 23 ++++++++++++++---------
>   1 file changed, 14 insertions(+), 9 deletions(-)
> 
> diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
> index 68a72c80bd3f..1fc28d8b72c7 100644
> --- a/arch/x86/kvm/vmx/vmx.c
> +++ b/arch/x86/kvm/vmx/vmx.c
> @@ -747,16 +747,21 @@ void vmx_update_exception_bitmap(struct kvm_vcpu *vcpu)
>   	if (is_guest_mode(vcpu))
>   		eb |= get_vmcs12(vcpu)->exception_bitmap;
>           else {
> -		/*
> -		 * If EPT is enabled, #PF is only trapped if MAXPHYADDR is mismatched
> -		 * between guest and host.  In that case we only care about present
> -		 * faults.  For vmcs02, however, PFEC_MASK and PFEC_MATCH are set in
> -		 * prepare_vmcs02_rare.
> -		 */
> -		bool selective_pf_trap = enable_ept && (eb & (1u << PF_VECTOR));
> -		int mask = selective_pf_trap ? PFERR_PRESENT_MASK : 0;
> +		int mask = 0, match = 0;
> +
> +		if (enable_ept && (eb & (1u << PF_VECTOR))) {
> +			/*
> +			 * If EPT is enabled, #PF is currently only intercepted
> +			 * if MAXPHYADDR is smaller on the guest than on the
> +			 * host.  In that case we only care about present,
> +			 * non-reserved faults.  For vmcs02, however, PFEC_MASK
> +			 * and PFEC_MATCH are set in prepare_vmcs02_rare.
> +			 */
> +			mask = PFERR_PRESENT_MASK | PFERR_RSVD_MASK;
> +			match = PFERR_PRESENT_MASK;
> +		}
>   		vmcs_write32(PAGE_FAULT_ERROR_CODE_MASK, mask);
> -		vmcs_write32(PAGE_FAULT_ERROR_CODE_MATCH, mask);
> +		vmcs_write32(PAGE_FAULT_ERROR_CODE_MATCH, match);
>   	}
>   
>   	vmcs_write32(EXCEPTION_BITMAP, eb);
> 

Queued, thanks.

Paolo


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

end of thread, other threads:[~2021-06-21 16:43 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-18 23:59 [PATCH] KVM: VMX: Skip #PF(RSVD) intercepts when emulating smaller maxphyaddr Jim Mattson
2021-06-21 16:39 ` Paolo Bonzini

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.