Commit 5140bc7d authored by Jim Mattson's avatar Jim Mattson Committed by Paolo Bonzini

KVM: VMX: Skip #PF(RSVD) intercepts when emulating smaller maxphyaddr

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: default avatarJim Mattson <jmattson@google.com>
Message-Id: <20210618235941.1041604-1-jmattson@google.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent 0485cf8d
...@@ -747,16 +747,21 @@ void vmx_update_exception_bitmap(struct kvm_vcpu *vcpu) ...@@ -747,16 +747,21 @@ void vmx_update_exception_bitmap(struct kvm_vcpu *vcpu)
if (is_guest_mode(vcpu)) if (is_guest_mode(vcpu))
eb |= get_vmcs12(vcpu)->exception_bitmap; eb |= get_vmcs12(vcpu)->exception_bitmap;
else { else {
int mask = 0, match = 0;
if (enable_ept && (eb & (1u << PF_VECTOR))) {
/* /*
* If EPT is enabled, #PF is only trapped if MAXPHYADDR is mismatched * If EPT is enabled, #PF is currently only intercepted
* between guest and host. In that case we only care about present * if MAXPHYADDR is smaller on the guest than on the
* faults. For vmcs02, however, PFEC_MASK and PFEC_MATCH are set in * host. In that case we only care about present,
* prepare_vmcs02_rare. * non-reserved 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)); mask = PFERR_PRESENT_MASK | PFERR_RSVD_MASK;
int mask = selective_pf_trap ? PFERR_PRESENT_MASK : 0; match = PFERR_PRESENT_MASK;
}
vmcs_write32(PAGE_FAULT_ERROR_CODE_MASK, 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); vmcs_write32(EXCEPTION_BITMAP, eb);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment