return 0;
 }
 
-static void kvm_update_kvm_cpuid_base(struct kvm_vcpu *vcpu)
+static struct kvm_hypervisor_cpuid kvm_get_hypervisor_cpuid(struct kvm_vcpu *vcpu,
+                                                           const char *sig)
 {
-       u32 function;
+       struct kvm_hypervisor_cpuid cpuid = {};
        struct kvm_cpuid_entry2 *entry;
+       u32 base;
 
-       vcpu->arch.kvm_cpuid_base = 0;
-
-       for_each_possible_hypervisor_cpuid_base(function) {
-               entry = kvm_find_cpuid_entry(vcpu, function);
+       for_each_possible_hypervisor_cpuid_base(base) {
+               entry = kvm_find_cpuid_entry(vcpu, base);
 
                if (entry) {
                        u32 signature[3];
                        signature[1] = entry->ecx;
                        signature[2] = entry->edx;
 
-                       BUILD_BUG_ON(sizeof(signature) > sizeof(KVM_SIGNATURE));
-                       if (!memcmp(signature, KVM_SIGNATURE, sizeof(signature))) {
-                               vcpu->arch.kvm_cpuid_base = function;
+                       if (!memcmp(signature, sig, sizeof(signature))) {
+                               cpuid.base = base;
+                               cpuid.limit = entry->eax;
                                break;
                        }
                }
        }
+
+       return cpuid;
 }
 
 static struct kvm_cpuid_entry2 *__kvm_find_kvm_cpuid_features(struct kvm_vcpu *vcpu,
                                              struct kvm_cpuid_entry2 *entries, int nent)
 {
-       u32 base = vcpu->arch.kvm_cpuid_base;
+       u32 base = vcpu->arch.kvm_cpuid.base;
 
        if (!base)
                return NULL;
        vcpu->arch.cpuid_entries = e2;
        vcpu->arch.cpuid_nent = nent;
 
-       kvm_update_kvm_cpuid_base(vcpu);
+       vcpu->arch.kvm_cpuid = kvm_get_hypervisor_cpuid(vcpu, KVM_SIGNATURE);
        kvm_vcpu_after_set_cpuid(vcpu);
 
        return 0;