]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
KVM: VMX: Flush shadow VMCS on emergency reboot
authorChao Gao <chao.gao@intel.com>
Thu, 24 Jul 2025 18:11:34 +0000 (14:11 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 28 Aug 2025 14:24:32 +0000 (16:24 +0200)
[ Upstream commit a0ee1d5faff135e28810f29e0f06328c66f89852 ]

Ensure the shadow VMCS cache is evicted during an emergency reboot to
prevent potential memory corruption if the cache is evicted after reboot.

This issue was identified through code inspection, as __loaded_vmcs_clear()
flushes both the normal VMCS and the shadow VMCS.

Avoid checking the "launched" state during an emergency reboot, unlike the
behavior in __loaded_vmcs_clear(). This is important because reboot NMIs
can interfere with operations like copy_shadow_to_vmcs12(), where shadow
VMCSes are loaded directly using VMPTRLD. In such cases, if NMIs occur
right after the VMCS load, the shadow VMCSes will be active but the
"launched" state may not be set.

Fixes: 16f5b9034b69 ("KVM: nVMX: Copy processor-specific shadow-vmcs to VMCS12")
Cc: stable@vger.kernel.org
Signed-off-by: Chao Gao <chao.gao@intel.com>
Reviewed-by: Kai Huang <kai.huang@intel.com>
Link: https://lore.kernel.org/r/20250324140849.2099723-1-chao.gao@intel.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
[ adjusted context ]
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/x86/kvm/vmx/vmx.c

index b0553e002e0a1086881d5c2cdd593f79c6f7aebb..ab3098ea4ebde9718e6916ff5d031ef0a953d837 100644 (file)
@@ -681,8 +681,11 @@ static void crash_vmclear_local_loaded_vmcss(void)
        struct loaded_vmcs *v;
 
        list_for_each_entry(v, &per_cpu(loaded_vmcss_on_cpu, cpu),
-                           loaded_vmcss_on_cpu_link)
+                           loaded_vmcss_on_cpu_link) {
                vmcs_clear(v->vmcs);
+               if (v->shadow_vmcs)
+                       vmcs_clear(v->shadow_vmcs);
+       }
 }
 #endif /* CONFIG_KEXEC_CORE */