target/i386: Fix conditional CONFIG_SYNDBG enablement
Putting HYPERV_FEAT_SYNDBG entry under "#ifdef CONFIG_SYNDBG" in 'kvm_hyperv_properties' array is wrong: as HYPERV_FEAT_SYNDBG is not the highest feature number, the result is an empty (zeroed) entry in the array (and not a skipped entry!). hyperv_feature_supported() is designed to check that all CPUID bits are set but for a zeroed feature in 'kvm_hyperv_properties' it returns 'true' so QEMU considers HYPERV_FEAT_SYNDBG as always supported, regardless of whether KVM host actually supports it. To fix the issue, leave HYPERV_FEAT_SYNDBG's definition in 'kvm_hyperv_properties' array, there's nothing wrong in having it defined even when 'CONFIG_SYNDBG' is not set. Instead, put "hv-syndbg" CPU property under '#ifdef CONFIG_SYNDBG' to alter the existing behavior when the flag is silently skipped in !CONFIG_SYNDBG builds. Leave an 'assert' sentinel in hyperv_feature_supported() making sure there are no 'holes' or improperly defined features in 'kvm_hyperv_properties'. Fixes: d8701185f40c ("hw: hyperv: Initial commit for Synthetic Debugging device") Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com> Link: https://lore.kernel.org/r/20240917160051.2637594-2-vkuznets@redhat.com Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
b5151ace58
commit
bbf3810f2c
@ -8299,8 +8299,10 @@ static Property x86_cpu_properties[] = {
|
||||
HYPERV_FEAT_TLBFLUSH_DIRECT, 0),
|
||||
DEFINE_PROP_ON_OFF_AUTO("hv-no-nonarch-coresharing", X86CPU,
|
||||
hyperv_no_nonarch_cs, ON_OFF_AUTO_OFF),
|
||||
#ifdef CONFIG_SYNDBG
|
||||
DEFINE_PROP_BIT64("hv-syndbg", X86CPU, hyperv_features,
|
||||
HYPERV_FEAT_SYNDBG, 0),
|
||||
#endif
|
||||
DEFINE_PROP_BOOL("hv-passthrough", X86CPU, hyperv_passthrough, false),
|
||||
DEFINE_PROP_BOOL("hv-enforce-cpuid", X86CPU, hyperv_enforce_cpuid, false),
|
||||
|
||||
|
@ -1056,7 +1056,6 @@ static struct {
|
||||
.bits = HV_DEPRECATING_AEOI_RECOMMENDED}
|
||||
}
|
||||
},
|
||||
#ifdef CONFIG_SYNDBG
|
||||
[HYPERV_FEAT_SYNDBG] = {
|
||||
.desc = "Enable synthetic kernel debugger channel (hv-syndbg)",
|
||||
.flags = {
|
||||
@ -1065,7 +1064,6 @@ static struct {
|
||||
},
|
||||
.dependencies = BIT(HYPERV_FEAT_SYNIC) | BIT(HYPERV_FEAT_RELAXED)
|
||||
},
|
||||
#endif
|
||||
[HYPERV_FEAT_MSR_BITMAP] = {
|
||||
.desc = "enlightened MSR-Bitmap (hv-emsr-bitmap)",
|
||||
.flags = {
|
||||
@ -1317,6 +1315,13 @@ static bool hyperv_feature_supported(CPUState *cs, int feature)
|
||||
uint32_t func, bits;
|
||||
int i, reg;
|
||||
|
||||
/*
|
||||
* kvm_hyperv_properties needs to define at least one CPUID flag which
|
||||
* must be used to detect the feature, it's hard to say whether it is
|
||||
* supported or not otherwise.
|
||||
*/
|
||||
assert(kvm_hyperv_properties[feature].flags[0].func);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(kvm_hyperv_properties[feature].flags); i++) {
|
||||
|
||||
func = kvm_hyperv_properties[feature].flags[i].func;
|
||||
@ -4025,13 +4030,11 @@ static int kvm_put_msrs(X86CPU *cpu, int level)
|
||||
kvm_msr_entry_add(cpu, HV_X64_MSR_TSC_EMULATION_STATUS,
|
||||
env->msr_hv_tsc_emulation_status);
|
||||
}
|
||||
#ifdef CONFIG_SYNDBG
|
||||
if (hyperv_feat_enabled(cpu, HYPERV_FEAT_SYNDBG) &&
|
||||
has_msr_hv_syndbg_options) {
|
||||
kvm_msr_entry_add(cpu, HV_X64_MSR_SYNDBG_OPTIONS,
|
||||
hyperv_syndbg_query_options());
|
||||
}
|
||||
#endif
|
||||
}
|
||||
if (hyperv_feat_enabled(cpu, HYPERV_FEAT_VAPIC)) {
|
||||
kvm_msr_entry_add(cpu, HV_X64_MSR_APIC_ASSIST_PAGE,
|
||||
|
Loading…
x
Reference in New Issue
Block a user