Re: [PATCH v3 07/16] KVM: SVM: Move core EFER.SVME enablement to kernel

From: Chao Gao

Date: Thu Feb 26 2026 - 02:41:36 EST


>-static inline void kvm_cpu_svm_disable(void)
>-{
>- uint64_t efer;
>-
>- wrmsrq(MSR_VM_HSAVE_PA, 0);
>- rdmsrq(MSR_EFER, efer);
>- if (efer & EFER_SVME) {
>- /*
>- * Force GIF=1 prior to disabling SVM, e.g. to ensure INIT and
>- * NMI aren't blocked.
>- */
>- stgi();
>- wrmsrq(MSR_EFER, efer & ~EFER_SVME);
>- }
>-}
>-
> static void svm_emergency_disable_virtualization_cpu(void)
> {
>- virt_rebooting = true;
>-
>- kvm_cpu_svm_disable();
>+ wrmsrq(MSR_VM_HSAVE_PA, 0);
> }
>
> static void svm_disable_virtualization_cpu(void)
>@@ -507,7 +489,7 @@ static void svm_disable_virtualization_cpu(void)
> if (tsc_scaling)
> __svm_write_tsc_multiplier(SVM_TSC_RATIO_DEFAULT);
>
>- kvm_cpu_svm_disable();
>+ x86_svm_disable_virtualization_cpu();

There's a functional change here. The new x86_svm_disable_virtualization_cpu()
doesn't reset MSR_VM_HSAVE_PA, but the old kvm_cpu_svm_disable() does.


>+int x86_svm_disable_virtualization_cpu(void)
>+{
>+ int r = -EIO;
>+ u64 efer;
>+
>+ /*
>+ * Force GIF=1 prior to disabling SVM, e.g. to ensure INIT and
>+ * NMI aren't blocked.
>+ */
>+ asm goto("1: stgi\n\t"
>+ _ASM_EXTABLE(1b, %l[fault])
>+ ::: "memory" : fault);
>+ r = 0;
>+
>+fault:
>+ rdmsrq(MSR_EFER, efer);
>+ wrmsrq(MSR_EFER, efer & ~EFER_SVME);
>+ return r;
>+}
>+EXPORT_SYMBOL_FOR_KVM(x86_svm_disable_virtualization_cpu);