i386: split hyperv_handle_properties() into hyperv_expand_features()/hyperv_fill_cpuids()
The intention is to call hyperv_expand_features() early, before vCPUs are created and use the acquired data later when we set guest visible CPUID data. Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com> Reviewed-by: Eduardo Habkost <ehabkost@redhat.com> Message-Id: <20210422161130.652779-10-vkuznets@redhat.com> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
This commit is contained in:
parent
a8439be6b7
commit
f6e01ab563
@ -1187,16 +1187,15 @@ static uint32_t hv_build_cpuid_leaf(CPUState *cs, uint32_t func, int reg)
|
||||
}
|
||||
|
||||
/*
|
||||
* Fill in Hyper-V CPUIDs. Returns the number of entries filled in cpuid_ent in
|
||||
* case of success, errno < 0 in case of failure and 0 when no Hyper-V
|
||||
* extentions are enabled.
|
||||
* Expand Hyper-V CPU features. In partucular, check that all the requested
|
||||
* features are supported by the host and the sanity of the configuration
|
||||
* (that all the required dependencies are included). Also, this takes care
|
||||
* of 'hv_passthrough' mode and fills the environment with all supported
|
||||
* Hyper-V features.
|
||||
*/
|
||||
static int hyperv_handle_properties(CPUState *cs,
|
||||
struct kvm_cpuid_entry2 *cpuid_ent)
|
||||
static int hyperv_expand_features(CPUState *cs)
|
||||
{
|
||||
X86CPU *cpu = X86_CPU(cs);
|
||||
struct kvm_cpuid_entry2 *c;
|
||||
uint32_t cpuid_i = 0;
|
||||
int r;
|
||||
|
||||
if (!hyperv_enabled(cpu))
|
||||
@ -1295,6 +1294,19 @@ static int hyperv_handle_properties(CPUState *cs,
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Fill in Hyper-V CPUIDs. Returns the number of entries filled in cpuid_ent.
|
||||
*/
|
||||
static int hyperv_fill_cpuids(CPUState *cs,
|
||||
struct kvm_cpuid_entry2 *cpuid_ent)
|
||||
{
|
||||
X86CPU *cpu = X86_CPU(cs);
|
||||
struct kvm_cpuid_entry2 *c;
|
||||
uint32_t cpuid_i = 0;
|
||||
|
||||
c = &cpuid_ent[cpuid_i++];
|
||||
c->function = HV_CPUID_VENDOR_AND_MAX_FUNCTIONS;
|
||||
c->eax = hyperv_feat_enabled(cpu, HYPERV_FEAT_EVMCS) ?
|
||||
@ -1502,11 +1514,13 @@ int kvm_arch_init_vcpu(CPUState *cs)
|
||||
env->apic_bus_freq = KVM_APIC_BUS_FREQUENCY;
|
||||
|
||||
/* Paravirtualization CPUIDs */
|
||||
r = hyperv_handle_properties(cs, cpuid_data.entries);
|
||||
r = hyperv_expand_features(cs);
|
||||
if (r < 0) {
|
||||
return r;
|
||||
} else if (r > 0) {
|
||||
cpuid_i = r;
|
||||
}
|
||||
|
||||
if (hyperv_enabled(cpu)) {
|
||||
cpuid_i = hyperv_fill_cpuids(cs, cpuid_data.entries);
|
||||
kvm_base = KVM_CPUID_SIGNATURE_NEXT;
|
||||
has_msr_hv_hypercall = true;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user