i386: Use hv_build_cpuid_leaf() for HV_CPUID_NESTED_FEATURES
Previously, HV_CPUID_NESTED_FEATURES.EAX CPUID leaf was handled differently as it was only used to encode the supported eVMCS version range. In fact, there are also feature (e.g. Enlightened MSR-Bitmap) bits there. In preparation to adding these features, move HV_CPUID_NESTED_FEATURES leaf handling to hv_build_cpuid_leaf() and drop now-unneeded 'hyperv_nested'. No functional change intended. Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com> Message-Id: <20220525115949.1294004-2-vkuznets@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
758c925ee0
commit
7110fe56c1
@ -1804,7 +1804,6 @@ struct ArchCPU {
|
|||||||
uint32_t hyperv_vendor_id[3];
|
uint32_t hyperv_vendor_id[3];
|
||||||
uint32_t hyperv_interface_id[4];
|
uint32_t hyperv_interface_id[4];
|
||||||
uint32_t hyperv_limits[3];
|
uint32_t hyperv_limits[3];
|
||||||
uint32_t hyperv_nested[4];
|
|
||||||
bool hyperv_enforce_cpuid;
|
bool hyperv_enforce_cpuid;
|
||||||
uint32_t hyperv_ver_id_build;
|
uint32_t hyperv_ver_id_build;
|
||||||
uint16_t hyperv_ver_id_major;
|
uint16_t hyperv_ver_id_major;
|
||||||
|
@ -831,6 +831,8 @@ static bool tsc_is_stable_and_known(CPUX86State *env)
|
|||||||
|| env->user_tsc_khz;
|
|| env->user_tsc_khz;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define DEFAULT_EVMCS_VERSION ((1 << 8) | 1)
|
||||||
|
|
||||||
static struct {
|
static struct {
|
||||||
const char *desc;
|
const char *desc;
|
||||||
struct {
|
struct {
|
||||||
@ -1254,6 +1256,13 @@ static uint32_t hv_build_cpuid_leaf(CPUState *cs, uint32_t func, int reg)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* HV_CPUID_NESTED_FEATURES.EAX also encodes the supported eVMCS range */
|
||||||
|
if (func == HV_CPUID_NESTED_FEATURES && reg == R_EAX) {
|
||||||
|
if (hyperv_feat_enabled(cpu, HYPERV_FEAT_EVMCS)) {
|
||||||
|
r |= DEFAULT_EVMCS_VERSION;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1384,11 +1393,11 @@ static int hyperv_fill_cpuids(CPUState *cs,
|
|||||||
struct kvm_cpuid_entry2 *c;
|
struct kvm_cpuid_entry2 *c;
|
||||||
uint32_t signature[3];
|
uint32_t signature[3];
|
||||||
uint32_t cpuid_i = 0, max_cpuid_leaf = 0;
|
uint32_t cpuid_i = 0, max_cpuid_leaf = 0;
|
||||||
|
uint32_t nested_eax =
|
||||||
|
hv_build_cpuid_leaf(cs, HV_CPUID_NESTED_FEATURES, R_EAX);
|
||||||
|
|
||||||
max_cpuid_leaf = HV_CPUID_IMPLEMENT_LIMITS;
|
max_cpuid_leaf = nested_eax ? HV_CPUID_NESTED_FEATURES :
|
||||||
if (hyperv_feat_enabled(cpu, HYPERV_FEAT_EVMCS)) {
|
HV_CPUID_IMPLEMENT_LIMITS;
|
||||||
max_cpuid_leaf = MAX(max_cpuid_leaf, HV_CPUID_NESTED_FEATURES);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hyperv_feat_enabled(cpu, HYPERV_FEAT_SYNDBG)) {
|
if (hyperv_feat_enabled(cpu, HYPERV_FEAT_SYNDBG)) {
|
||||||
max_cpuid_leaf =
|
max_cpuid_leaf =
|
||||||
@ -1461,7 +1470,7 @@ static int hyperv_fill_cpuids(CPUState *cs,
|
|||||||
c->ecx = cpu->hyperv_limits[1];
|
c->ecx = cpu->hyperv_limits[1];
|
||||||
c->edx = cpu->hyperv_limits[2];
|
c->edx = cpu->hyperv_limits[2];
|
||||||
|
|
||||||
if (hyperv_feat_enabled(cpu, HYPERV_FEAT_EVMCS)) {
|
if (nested_eax) {
|
||||||
uint32_t function;
|
uint32_t function;
|
||||||
|
|
||||||
/* Create zeroed 0x40000006..0x40000009 leaves */
|
/* Create zeroed 0x40000006..0x40000009 leaves */
|
||||||
@ -1473,7 +1482,7 @@ static int hyperv_fill_cpuids(CPUState *cs,
|
|||||||
|
|
||||||
c = &cpuid_ent[cpuid_i++];
|
c = &cpuid_ent[cpuid_i++];
|
||||||
c->function = HV_CPUID_NESTED_FEATURES;
|
c->function = HV_CPUID_NESTED_FEATURES;
|
||||||
c->eax = cpu->hyperv_nested[0];
|
c->eax = nested_eax;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hyperv_feat_enabled(cpu, HYPERV_FEAT_SYNDBG)) {
|
if (hyperv_feat_enabled(cpu, HYPERV_FEAT_SYNDBG)) {
|
||||||
@ -1522,8 +1531,6 @@ static bool evmcs_version_supported(uint16_t evmcs_version,
|
|||||||
(max_version <= max_supported_version);
|
(max_version <= max_supported_version);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define DEFAULT_EVMCS_VERSION ((1 << 8) | 1)
|
|
||||||
|
|
||||||
static int hyperv_init_vcpu(X86CPU *cpu)
|
static int hyperv_init_vcpu(X86CPU *cpu)
|
||||||
{
|
{
|
||||||
CPUState *cs = CPU(cpu);
|
CPUState *cs = CPU(cpu);
|
||||||
@ -1620,8 +1627,6 @@ static int hyperv_init_vcpu(X86CPU *cpu)
|
|||||||
supported_evmcs_version >> 8);
|
supported_evmcs_version >> 8);
|
||||||
return -ENOTSUP;
|
return -ENOTSUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
cpu->hyperv_nested[0] = evmcs_version;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cpu->hyperv_enforce_cpuid) {
|
if (cpu->hyperv_enforce_cpuid) {
|
||||||
|
Loading…
Reference in New Issue
Block a user