KVM: x86: Explicitly zero kvm_caps during vendor module load
authorSean Christopherson <seanjc@google.com>
Tue, 23 Apr 2024 16:53:28 +0000 (09:53 -0700)
committerPaolo Bonzini <pbonzini@redhat.com>
Tue, 7 May 2024 17:07:35 +0000 (13:07 -0400)
Zero out all of kvm_caps when loading a new vendor module to ensure that
KVM can't inadvertently rely on global initialization of a field, and add
a comment above the definition of kvm_caps to call out that all fields
needs to be explicitly computed during vendor module load.

Signed-off-by: Sean Christopherson <seanjc@google.com>
Reviewed-by: Xiaoyao Li <xiaoyao.li@intel.com>
Message-ID: <20240423165328.2853870-4-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/x86.c

index 44ce187bad89ff30d287045e53d60f644322b370..8f3979d5fc8058ba16d8bee6c89e096e6e249c36 100644 (file)
 #define MAX_IO_MSRS 256
 #define KVM_MAX_MCE_BANKS 32
 
+/*
+ * Note, kvm_caps fields should *never* have default values, all fields must be
+ * recomputed from scratch during vendor module load, e.g. to account for a
+ * vendor module being reloaded with different module parameters.
+ */
 struct kvm_caps kvm_caps __read_mostly;
 EXPORT_SYMBOL_GPL(kvm_caps);
 
@@ -9755,6 +9760,8 @@ int kvm_x86_vendor_init(struct kvm_x86_init_ops *ops)
                return -EIO;
        }
 
+       memset(&kvm_caps, 0, sizeof(kvm_caps));
+
        x86_emulator_cache = kvm_alloc_emulator_cache();
        if (!x86_emulator_cache) {
                pr_err("failed to allocate cache for x86 emulator\n");