linux/arch/x86/kvm
Vitaly Kuznetsov ad7dc69aeb x86/kvm/mmu: fix switch between root and guest MMUs
Commit 14c07ad89f ("x86/kvm/mmu: introduce guest_mmu") brought one subtle
change: previously, when switching back from L2 to L1, we were resetting
MMU hooks (like mmu->get_cr3()) in kvm_init_mmu() called from
nested_vmx_load_cr3() and now we do that in nested_ept_uninit_mmu_context()
when we re-target vcpu->arch.mmu pointer.
The change itself looks logical: if nested_ept_init_mmu_context() changes
something than nested_ept_uninit_mmu_context() restores it back. There is,
however, one thing: the following call chain:

 nested_vmx_load_cr3()
  kvm_mmu_new_cr3()
    __kvm_mmu_new_cr3()
      fast_cr3_switch()
        cached_root_available()

now happens with MMU hooks pointing to the new MMU (root MMU in our case)
while previously it was happening with the old one. cached_root_available()
tries to stash current root but it is incorrect to read current CR3 with
mmu->get_cr3(), we need to use old_mmu->get_cr3() which in case we're
switching from L2 to L1 is guest_mmu. (BTW, in shadow page tables case this
is a non-issue because we don't switch MMU).

While we could've tried to guess that we're switching between MMUs and call
the right ->get_cr3() from cached_root_available() this seems to be overly
complicated. Instead, just stash the corresponding CR3 when setting
root_hpa and make cached_root_available() use the stashed value.

Fixes: 14c07ad89f ("x86/kvm/mmu: introduce guest_mmu")
Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Cc: stable@vger.kernel.org
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2019-02-22 19:24:48 +01:00
..
vmx kvm: vmx: Fix entry number check for add_atomic_switch_msr() 2019-02-14 16:22:20 +01:00
cpuid.c KVM: x86: Add CPUID support for new instruction WBNOINVD 2018-12-21 14:26:32 +01:00
cpuid.h KVM/x86: Update the reverse_cpuid list to include CPUID_7_EDX 2018-02-03 23:06:51 +01:00
debugfs.c
emulate.c jump_label: move 'asm goto' support test to Kconfig 2019-01-06 09:46:51 +09:00
hyperv.c KVM: x86: Mark expected switch fall-throughs 2019-01-25 19:29:36 +01:00
hyperv.h x86/kvm/hyper-v: Introduce KVM_GET_SUPPORTED_HV_CPUID 2018-12-14 17:59:54 +01:00
i8254.c
i8254.h
i8259.c
ioapic.c
ioapic.h
irq.c KVM: x86: Rename interrupt.pending to interrupt.injected 2018-03-28 22:47:06 +02:00
irq.h
irq_comm.c
Kconfig treewide: surround Kconfig file paths with double quotes 2018-12-22 00:25:54 +09:00
kvm_cache_regs.h KVM: x86: Add requisite includes to kvm_cache_regs.h 2018-12-14 12:34:22 +01:00
lapic.c KVM: x86: Mark expected switch fall-throughs 2019-01-25 19:29:36 +01:00
lapic.h KVM: hyperv: define VP assist page helpers 2018-10-17 00:30:13 +02:00
Makefile KVM: x86: fix TRACE_INCLUDE_PATH and remove -I. header search paths 2019-01-25 19:12:37 +01:00
mmu.c x86/kvm/mmu: fix switch between root and guest MMUs 2019-02-22 19:24:48 +01:00
mmu.h x86/kvm/mmu: make vcpu->mmu a pointer to the current MMU 2018-10-17 00:30:02 +02:00
mmu_audit.c x86/kvm/mmu: make vcpu->mmu a pointer to the current MMU 2018-10-17 00:30:02 +02:00
mmutrace.h
mtrr.c
page_track.c treewide: kvzalloc() -> kvcalloc() 2018-06-12 16:19:22 -07:00
paging_tmpl.h KVM: Replace old tlb flush function with new one to flush a specified range. 2018-12-21 11:28:41 +01:00
pmu.c KVM: x86: Add support for VMware backdoor Pseudo-PMCs 2018-03-16 22:02:01 +01:00
pmu.h KVM: x86: Add support for VMware backdoor Pseudo-PMCs 2018-03-16 22:02:01 +01:00
pmu_amd.c KVM: x86: Add support for AMD Core Perf Extension in guest 2018-03-16 22:01:28 +01:00
svm.c KVM: x86: Mark expected switch fall-throughs 2019-01-25 19:29:36 +01:00
trace.h KVM: x86: fix TRACE_INCLUDE_PATH and remove -I. header search paths 2019-01-25 19:12:37 +01:00
tss.h
x86.c KVM: x86: Recompute PID.ON when clearing PID.SN 2019-02-14 16:20:31 +01:00
x86.h kvm: x86: Defer setting of CR2 until #PF delivery 2018-10-17 19:07:43 +02:00