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
|
* Expand Hyper-V CPU features. In partucular, check that all the requested
|
||||||
* case of success, errno < 0 in case of failure and 0 when no Hyper-V
|
* features are supported by the host and the sanity of the configuration
|
||||||
* extentions are enabled.
|
* (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,
|
static int hyperv_expand_features(CPUState *cs)
|
||||||
struct kvm_cpuid_entry2 *cpuid_ent)
|
|
||||||
{
|
{
|
||||||
X86CPU *cpu = X86_CPU(cs);
|
X86CPU *cpu = X86_CPU(cs);
|
||||||
struct kvm_cpuid_entry2 *c;
|
|
||||||
uint32_t cpuid_i = 0;
|
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
if (!hyperv_enabled(cpu))
|
if (!hyperv_enabled(cpu))
|
||||||
|
@ -1295,6 +1294,19 @@ static int hyperv_handle_properties(CPUState *cs,
|
||||||
return -ENOSYS;
|
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 = &cpuid_ent[cpuid_i++];
|
||||||
c->function = HV_CPUID_VENDOR_AND_MAX_FUNCTIONS;
|
c->function = HV_CPUID_VENDOR_AND_MAX_FUNCTIONS;
|
||||||
c->eax = hyperv_feat_enabled(cpu, HYPERV_FEAT_EVMCS) ?
|
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;
|
env->apic_bus_freq = KVM_APIC_BUS_FREQUENCY;
|
||||||
|
|
||||||
/* Paravirtualization CPUIDs */
|
/* Paravirtualization CPUIDs */
|
||||||
r = hyperv_handle_properties(cs, cpuid_data.entries);
|
r = hyperv_expand_features(cs);
|
||||||
if (r < 0) {
|
if (r < 0) {
|
||||||
return r;
|
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;
|
kvm_base = KVM_CPUID_SIGNATURE_NEXT;
|
||||||
has_msr_hv_hypercall = true;
|
has_msr_hv_hypercall = true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue