KVM: nVMX: add missing checks for address bits beyond physical address width on VM-entry
PATCH 2/3 KVM: nVMX: add missing checks for address bits beyond physical address width on VM-entry
On each VM-entry CPU should check the following VMCS fields for zero bits beyond physical address width:
- APIC-access address - virtual-APIC address - posted-interrupt descriptor address
This patch adds these checks required by Intel SDM.
Signed-off-by Eugene Korenevsky <[email protected]>
--- arch/x86/kvm/vmx.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
arch/x86/kvm/vmx.c +7 -6
@@ -8616,10 +8616,11 @@ static bool nested_get_vmcs12_pages(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12) {struct vcpu_vmx *vmx =to_vmx (vcpu); +int maxphyaddr =cpuid_maxphyaddr (vcpu);if (nested_cpu_has2 (vmcs12,SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES )) { -/* TODO: Also verify bits beyond physical address width are 0 */ -if (!PAGE_ALIGNED (vmcs12->apic_access_addr)) +if (!PAGE_ALIGNED (vmcs12->apic_access_addr) || + vmcs12->apic_access_addr >> maxphyaddr)return false;/*
@@ -8635,8 +8636,8 @@ static bool nested_get_vmcs12_pages(struct kvm_vcpu *vcpu, }if (nested_cpu_has (vmcs12,CPU_BASED_TPR_SHADOW )) { -/* TODO: Also verify bits beyond physical address width are 0 */ -if (!PAGE_ALIGNED (vmcs12->virtual_apic_page_addr)) +if (!PAGE_ALIGNED (vmcs12->virtual_apic_page_addr) || + vmcs12->virtual_apic_page_addr >> maxphyaddr)return false;if (vmx->nested.virtual_apic_page)/* shouldn't happen */
@@ -8659,7 +8660,8 @@ static bool nested_get_vmcs12_pages(struct kvm_vcpu *vcpu, }if (nested_cpu_has_posted_intr (vmcs12)) { -if (!IS_ALIGNED (vmcs12->posted_intr_desc_addr,64 )) +if (!IS_ALIGNED (vmcs12->posted_intr_desc_addr,64 ) || + vmcs12->posted_intr_desc_addr >> maxphyaddr)return false;if (vmx->nested.pi_desc_page) {/* shouldn't happen */
@@ -9379,7 +9381,6 @@ static int nested_vmx_run(struct kvm_vcpu *vcpu, bool launch) }if (!nested_get_vmcs12_pages (vcpu, vmcs12)) { -/*TODO: Also verify bits beyond physical address width are 0*/ nested_vmx_failValid (vcpu,VMXERR_ENTRY_INVALID_CONTROL_FIELD );return 1 ; }
Signature · 1 line
2.0.5