linux/Documentation/virtual/kvm
Sean Christopherson 47c42e6b41 KVM: x86: fix handling of role.cr4_pae and rename it to 'gpte_size'
The cr4_pae flag is a bit of a misnomer, its purpose is really to track
whether the guest PTE that is being shadowed is a 4-byte entry or an
8-byte entry.  Prior to supporting nested EPT, the size of the gpte was
reflected purely by CR4.PAE.  KVM fudged things a bit for direct sptes,
but it was mostly harmless since the size of the gpte never mattered.
Now that a spte may be tracking an indirect EPT entry, relying on
CR4.PAE is wrong and ill-named.

For direct shadow pages, force the gpte_size to '1' as they are always
8-byte entries; EPT entries can only be 8-bytes and KVM always uses
8-byte entries for NPT and its identity map (when running with EPT but
not unrestricted guest).

Likewise, nested EPT entries are always 8-bytes.  Nested EPT presents a
unique scenario as the size of the entries are not dictated by CR4.PAE,
but neither is the shadow page a direct map.  To handle this scenario,
set cr0_wp=1 and smap_andnot_wp=1, an otherwise impossible combination,
to denote a nested EPT shadow page.  Use the information to avoid
incorrectly zapping an unsync'd indirect page in __kvm_sync_page().

Providing a consistent and accurate gpte_size fixes a bug reported by
Vitaly where fast_cr3_switch() always fails when switching from L2 to
L1 as kvm_mmu_get_page() would force role.cr4_pae=0 for direct pages,
whereas kvm_calc_mmu_role_common() would set it according to CR4.PAE.

Fixes: 7dcd575520 ("x86/kvm/mmu: check if tdp/shadow MMU reconfiguration is needed")
Reported-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Tested-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2019-03-28 17:27:03 +01:00
..
arm arm/arm64: KVM: Add PSCI version selection API 2018-04-20 16:32:23 +01:00
devices KVM: arm/arm64: vgic: Update documentation of the GIC devices wrt IIDR 2018-07-21 16:02:30 +01:00
amd-memory-encryption.rst Documentation/virtual/kvm: Update URL for AMD SEV API specification 2019-01-11 18:38:07 +01:00
api.txt KVM: doc: Document the life cycle of a VM and its resources 2019-03-15 19:24:33 +01:00
cpuid.txt KVM: X86: Implement "send IPI" hypercall 2018-08-06 17:59:20 +02:00
halt-polling.txt KVM: Expose the initial start value in grow_halt_poll_ns() as a module parameter 2019-02-20 22:48:50 +01:00
hypercalls.txt KVM: X86: Implement "send IPI" hypercall 2018-08-06 17:59:20 +02:00
locking.txt kvm: x86: mmu: Update documentation for fast page fault mechanism 2017-01-09 14:46:12 +01:00
mmu.txt KVM: x86: fix handling of role.cr4_pae and rename it to 'gpte_size' 2019-03-28 17:27:03 +01:00
msr.txt KVM: x86: fix backward migration with async_PF 2018-02-24 01:43:48 +01:00
nested-vmx.txt KVM: docs: nVMX: Remove known limitations as they do not exist now 2018-06-01 19:18:28 +02:00
ppc-pv.txt Doc:kvm: Fix typo in Doc/virtual/kvm 2015-10-11 15:35:23 -06:00
review-checklist.txt docs: fix locations of several documents that got moved 2016-10-24 08:12:35 -02:00
s390-diag.txt virtio-ccw: diag 500 may return a negative cookie 2019-03-06 11:19:33 -05:00
timekeeping.txt KVM: doc: Fix typo in doc/virtual/kvm 2013-12-31 17:24:54 -02:00
vcpu-requests.rst KVM: Add documentation for VCPU requests 2017-06-04 16:53:00 +02:00