Files
android_kernel_xiaomi_sm8450/arch/x86/include/asm
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
..
2018-11-09 08:16:55 +01:00
2019-01-04 13:13:46 -08:00
2018-12-03 10:49:13 +01:00
2018-03-20 10:01:57 +01:00
2018-08-15 13:44:10 -07:00
2017-12-22 20:13:04 +01:00
2018-10-31 08:54:12 -07:00
2017-12-22 20:13:01 +01:00
2017-07-26 13:18:20 +02:00
2018-05-07 07:15:41 +02:00
2018-10-14 11:11:22 +02:00
2018-07-20 01:11:45 +02:00
2018-11-04 00:54:34 +01:00
2017-11-15 18:21:05 -08:00
2018-03-20 10:01:57 +01:00
2017-11-15 18:21:04 -08:00