mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-01 08:04:22 +08:00
kvm: nVMX: Set VM instruction error for VMPTRLD of unbacked page
It is never correct for a VMX instruction to fail with "invalid VMCS"
if there is, in fact, a current VMCS. Reads from unbacked addresses
return all 1's, which means that an unbacked VMCS will not have the
correct VMCS revision ID (i.e. VMCS12_REVISION).
Fixes: 63846663ea
("KVM: nVMX: Implement VMPTRLD")
Signed-off-by: Jim Mattson <jmattson@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
14aa61d0a9
commit
fca91f6d60
@ -9318,9 +9318,17 @@ static int handle_vmptrld(struct kvm_vcpu *vcpu)
|
||||
struct vmcs12 *new_vmcs12;
|
||||
struct page *page;
|
||||
page = kvm_vcpu_gpa_to_page(vcpu, vmptr);
|
||||
if (is_error_page(page))
|
||||
return nested_vmx_failInvalid(vcpu);
|
||||
|
||||
if (is_error_page(page)) {
|
||||
/*
|
||||
* Reads from an unbacked page return all 1s,
|
||||
* which means that the 32 bits located at the
|
||||
* given physical address won't match the required
|
||||
* VMCS12_REVISION identifier.
|
||||
*/
|
||||
nested_vmx_failValid(vcpu,
|
||||
VMXERR_VMPTRLD_INCORRECT_VMCS_REVISION_ID);
|
||||
return kvm_skip_emulated_instruction(vcpu);
|
||||
}
|
||||
new_vmcs12 = kmap(page);
|
||||
if (new_vmcs12->hdr.revision_id != VMCS12_REVISION ||
|
||||
(new_vmcs12->hdr.shadow_vmcs &&
|
||||
|
Loading…
Reference in New Issue
Block a user