Message ID | 20140602172811.13457.57010.stgit@bling.home (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Alex Williamson <alex.williamson@redhat.com> writes: > The latest Nvidia driver (337.88) specifically checks for KVM as the > hypervisor and reports Code 43 for the driver in a Windows guest when > found. Removing or changing the KVM signature is sufficient for the > driver to load and work. This patch adds an option to easily allow > the KVM hypervisor signature to be hidden using '-cpu kvm=off'. We > continue to expose KVM via the cpuid value by default. The state of > this option does not supercede or replace -enable-kvm or the accel=kvm > machine option. This only changes the visibility of KVM to the guest > and paravirtual features specifically tied to the KVM cpuid. > > Signed-off-by: Alex Williamson <alex.williamson@redhat.com> > --- > target-i386/cpu-qom.h | 1 + > target-i386/cpu.c | 1 + > target-i386/kvm.c | 28 +++++++++++++++------------- > 3 files changed, 17 insertions(+), 13 deletions(-) > > diff --git a/target-i386/cpu-qom.h b/target-i386/cpu-qom.h > index e9b3d57..0808cfc 100644 > --- a/target-i386/cpu-qom.h > +++ b/target-i386/cpu-qom.h > @@ -87,6 +87,7 @@ typedef struct X86CPU { > bool hyperv_time; > bool check_cpuid; > bool enforce_cpuid; > + bool expose_kvm; > > /* if true the CPUID code directly forward host cache leaves to the guest */ > bool cache_info_passthrough; > diff --git a/target-i386/cpu.c b/target-i386/cpu.c > index 042a48d..cbf1d97 100644 > --- a/target-i386/cpu.c > +++ b/target-i386/cpu.c > @@ -2792,6 +2792,7 @@ static Property x86_cpu_properties[] = { > DEFINE_PROP_BOOL("hv-time", X86CPU, hyperv_time, false), > DEFINE_PROP_BOOL("check", X86CPU, check_cpuid, false), > DEFINE_PROP_BOOL("enforce", X86CPU, enforce_cpuid, false), > + DEFINE_PROP_BOOL("kvm", X86CPU, expose_kvm, true), > DEFINE_PROP_END_OF_LIST() > }; > > diff --git a/target-i386/kvm.c b/target-i386/kvm.c > index 0d894ef..b2295d2 100644 > --- a/target-i386/kvm.c > +++ b/target-i386/kvm.c > @@ -528,23 +528,25 @@ int kvm_arch_init_vcpu(CPUState *cs) > has_msr_hv_hypercall = true; > } > > - memcpy(signature, "KVMKVMKVM\0\0\0", 12); > - c = &cpuid_data.entries[cpuid_i++]; > - c->function = KVM_CPUID_SIGNATURE | kvm_base; > - c->eax = 0; > - c->ebx = signature[0]; > - c->ecx = signature[1]; > - c->edx = signature[2]; > + if (cpu->expose_kvm) { > + memcpy(signature, "KVMKVMKVM\0\0\0", 12); > + c = &cpuid_data.entries[cpuid_i++]; > + c->function = KVM_CPUID_SIGNATURE | kvm_base; > + c->eax = 0; > + c->ebx = signature[0]; > + c->ecx = signature[1]; > + c->edx = signature[2]; > > - c = &cpuid_data.entries[cpuid_i++]; > - c->function = KVM_CPUID_FEATURES | kvm_base; > - c->eax = env->features[FEAT_KVM]; > + c = &cpuid_data.entries[cpuid_i++]; > + c->function = KVM_CPUID_FEATURES | kvm_base; > + c->eax = env->features[FEAT_KVM]; > > - has_msr_async_pf_en = c->eax & (1 << KVM_FEATURE_ASYNC_PF); > + has_msr_async_pf_en = c->eax & (1 << KVM_FEATURE_ASYNC_PF); > > - has_msr_pv_eoi_en = c->eax & (1 << KVM_FEATURE_PV_EOI); > + has_msr_pv_eoi_en = c->eax & (1 << KVM_FEATURE_PV_EOI); > > - has_msr_kvm_steal_time = c->eax & (1 << KVM_FEATURE_STEAL_TIME); > + has_msr_kvm_steal_time = c->eax & (1 << KVM_FEATURE_STEAL_TIME); Does this mean that we don't expose these features if kvm=off is specified ? > + } > > cpu_x86_cpuid(env, 0, 0, &limit, &unused, &unused, &unused); > -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Mon, 2014-06-02 at 15:09 -0400, Bandan Das wrote: > Alex Williamson <alex.williamson@redhat.com> writes: > > > The latest Nvidia driver (337.88) specifically checks for KVM as the > > hypervisor and reports Code 43 for the driver in a Windows guest when > > found. Removing or changing the KVM signature is sufficient for the > > driver to load and work. This patch adds an option to easily allow > > the KVM hypervisor signature to be hidden using '-cpu kvm=off'. We > > continue to expose KVM via the cpuid value by default. The state of > > this option does not supercede or replace -enable-kvm or the accel=kvm > > machine option. This only changes the visibility of KVM to the guest > > and paravirtual features specifically tied to the KVM cpuid. > > > > Signed-off-by: Alex Williamson <alex.williamson@redhat.com> > > --- > > target-i386/cpu-qom.h | 1 + > > target-i386/cpu.c | 1 + > > target-i386/kvm.c | 28 +++++++++++++++------------- > > 3 files changed, 17 insertions(+), 13 deletions(-) > > > > diff --git a/target-i386/cpu-qom.h b/target-i386/cpu-qom.h > > index e9b3d57..0808cfc 100644 > > --- a/target-i386/cpu-qom.h > > +++ b/target-i386/cpu-qom.h > > @@ -87,6 +87,7 @@ typedef struct X86CPU { > > bool hyperv_time; > > bool check_cpuid; > > bool enforce_cpuid; > > + bool expose_kvm; > > > > /* if true the CPUID code directly forward host cache leaves to the guest */ > > bool cache_info_passthrough; > > diff --git a/target-i386/cpu.c b/target-i386/cpu.c > > index 042a48d..cbf1d97 100644 > > --- a/target-i386/cpu.c > > +++ b/target-i386/cpu.c > > @@ -2792,6 +2792,7 @@ static Property x86_cpu_properties[] = { > > DEFINE_PROP_BOOL("hv-time", X86CPU, hyperv_time, false), > > DEFINE_PROP_BOOL("check", X86CPU, check_cpuid, false), > > DEFINE_PROP_BOOL("enforce", X86CPU, enforce_cpuid, false), > > + DEFINE_PROP_BOOL("kvm", X86CPU, expose_kvm, true), > > DEFINE_PROP_END_OF_LIST() > > }; > > > > diff --git a/target-i386/kvm.c b/target-i386/kvm.c > > index 0d894ef..b2295d2 100644 > > --- a/target-i386/kvm.c > > +++ b/target-i386/kvm.c > > @@ -528,23 +528,25 @@ int kvm_arch_init_vcpu(CPUState *cs) > > has_msr_hv_hypercall = true; > > } > > > > - memcpy(signature, "KVMKVMKVM\0\0\0", 12); > > - c = &cpuid_data.entries[cpuid_i++]; > > - c->function = KVM_CPUID_SIGNATURE | kvm_base; > > - c->eax = 0; > > - c->ebx = signature[0]; > > - c->ecx = signature[1]; > > - c->edx = signature[2]; > > + if (cpu->expose_kvm) { > > + memcpy(signature, "KVMKVMKVM\0\0\0", 12); > > + c = &cpuid_data.entries[cpuid_i++]; > > + c->function = KVM_CPUID_SIGNATURE | kvm_base; > > + c->eax = 0; > > + c->ebx = signature[0]; > > + c->ecx = signature[1]; > > + c->edx = signature[2]; > > > > - c = &cpuid_data.entries[cpuid_i++]; > > - c->function = KVM_CPUID_FEATURES | kvm_base; > > - c->eax = env->features[FEAT_KVM]; > > + c = &cpuid_data.entries[cpuid_i++]; > > + c->function = KVM_CPUID_FEATURES | kvm_base; > > + c->eax = env->features[FEAT_KVM]; > > > > - has_msr_async_pf_en = c->eax & (1 << KVM_FEATURE_ASYNC_PF); > > + has_msr_async_pf_en = c->eax & (1 << KVM_FEATURE_ASYNC_PF); > > > > - has_msr_pv_eoi_en = c->eax & (1 << KVM_FEATURE_PV_EOI); > > + has_msr_pv_eoi_en = c->eax & (1 << KVM_FEATURE_PV_EOI); > > > > - has_msr_kvm_steal_time = c->eax & (1 << KVM_FEATURE_STEAL_TIME); > > + has_msr_kvm_steal_time = c->eax & (1 << KVM_FEATURE_STEAL_TIME); > Does this mean that we don't expose these features if kvm=off is > specified ? Correct, the guest would only learn about them via the bits in this cpuid return value, so it should not be making use of them when kvm=off. Thanks, Alex > > > + } > > > > cpu_x86_cpuid(env, 0, 0, &limit, &unused, &unused, &unused); > > -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Il 02/06/2014 19:28, Alex Williamson ha scritto: > The latest Nvidia driver (337.88) specifically checks for KVM as the > hypervisor and reports Code 43 for the driver in a Windows guest when > found. Removing or changing the KVM signature is sufficient for the > driver to load and work. This patch adds an option to easily allow > the KVM hypervisor signature to be hidden using '-cpu kvm=off'. We > continue to expose KVM via the cpuid value by default. The state of > this option does not supercede or replace -enable-kvm or the accel=kvm > machine option. This only changes the visibility of KVM to the guest > and paravirtual features specifically tied to the KVM cpuid. > > Signed-off-by: Alex Williamson <alex.williamson@redhat.com> > --- > target-i386/cpu-qom.h | 1 + > target-i386/cpu.c | 1 + > target-i386/kvm.c | 28 +++++++++++++++------------- > 3 files changed, 17 insertions(+), 13 deletions(-) > > diff --git a/target-i386/cpu-qom.h b/target-i386/cpu-qom.h > index e9b3d57..0808cfc 100644 > --- a/target-i386/cpu-qom.h > +++ b/target-i386/cpu-qom.h > @@ -87,6 +87,7 @@ typedef struct X86CPU { > bool hyperv_time; > bool check_cpuid; > bool enforce_cpuid; > + bool expose_kvm; > > /* if true the CPUID code directly forward host cache leaves to the guest */ > bool cache_info_passthrough; > diff --git a/target-i386/cpu.c b/target-i386/cpu.c > index 042a48d..cbf1d97 100644 > --- a/target-i386/cpu.c > +++ b/target-i386/cpu.c > @@ -2792,6 +2792,7 @@ static Property x86_cpu_properties[] = { > DEFINE_PROP_BOOL("hv-time", X86CPU, hyperv_time, false), > DEFINE_PROP_BOOL("check", X86CPU, check_cpuid, false), > DEFINE_PROP_BOOL("enforce", X86CPU, enforce_cpuid, false), > + DEFINE_PROP_BOOL("kvm", X86CPU, expose_kvm, true), > DEFINE_PROP_END_OF_LIST() > }; > > diff --git a/target-i386/kvm.c b/target-i386/kvm.c > index 0d894ef..b2295d2 100644 > --- a/target-i386/kvm.c > +++ b/target-i386/kvm.c > @@ -528,23 +528,25 @@ int kvm_arch_init_vcpu(CPUState *cs) > has_msr_hv_hypercall = true; > } > > - memcpy(signature, "KVMKVMKVM\0\0\0", 12); > - c = &cpuid_data.entries[cpuid_i++]; > - c->function = KVM_CPUID_SIGNATURE | kvm_base; > - c->eax = 0; > - c->ebx = signature[0]; > - c->ecx = signature[1]; > - c->edx = signature[2]; > + if (cpu->expose_kvm) { > + memcpy(signature, "KVMKVMKVM\0\0\0", 12); > + c = &cpuid_data.entries[cpuid_i++]; > + c->function = KVM_CPUID_SIGNATURE | kvm_base; > + c->eax = 0; > + c->ebx = signature[0]; > + c->ecx = signature[1]; > + c->edx = signature[2]; > > - c = &cpuid_data.entries[cpuid_i++]; > - c->function = KVM_CPUID_FEATURES | kvm_base; > - c->eax = env->features[FEAT_KVM]; > + c = &cpuid_data.entries[cpuid_i++]; > + c->function = KVM_CPUID_FEATURES | kvm_base; > + c->eax = env->features[FEAT_KVM]; > > - has_msr_async_pf_en = c->eax & (1 << KVM_FEATURE_ASYNC_PF); > + has_msr_async_pf_en = c->eax & (1 << KVM_FEATURE_ASYNC_PF); > > - has_msr_pv_eoi_en = c->eax & (1 << KVM_FEATURE_PV_EOI); > + has_msr_pv_eoi_en = c->eax & (1 << KVM_FEATURE_PV_EOI); > > - has_msr_kvm_steal_time = c->eax & (1 << KVM_FEATURE_STEAL_TIME); > + has_msr_kvm_steal_time = c->eax & (1 << KVM_FEATURE_STEAL_TIME); > + } > > cpu_x86_cpuid(env, 0, 0, &limit, &unused, &unused, &unused); > > Applying to uq/master, thanks. Paolo -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/target-i386/cpu-qom.h b/target-i386/cpu-qom.h index e9b3d57..0808cfc 100644 --- a/target-i386/cpu-qom.h +++ b/target-i386/cpu-qom.h @@ -87,6 +87,7 @@ typedef struct X86CPU { bool hyperv_time; bool check_cpuid; bool enforce_cpuid; + bool expose_kvm; /* if true the CPUID code directly forward host cache leaves to the guest */ bool cache_info_passthrough; diff --git a/target-i386/cpu.c b/target-i386/cpu.c index 042a48d..cbf1d97 100644 --- a/target-i386/cpu.c +++ b/target-i386/cpu.c @@ -2792,6 +2792,7 @@ static Property x86_cpu_properties[] = { DEFINE_PROP_BOOL("hv-time", X86CPU, hyperv_time, false), DEFINE_PROP_BOOL("check", X86CPU, check_cpuid, false), DEFINE_PROP_BOOL("enforce", X86CPU, enforce_cpuid, false), + DEFINE_PROP_BOOL("kvm", X86CPU, expose_kvm, true), DEFINE_PROP_END_OF_LIST() }; diff --git a/target-i386/kvm.c b/target-i386/kvm.c index 0d894ef..b2295d2 100644 --- a/target-i386/kvm.c +++ b/target-i386/kvm.c @@ -528,23 +528,25 @@ int kvm_arch_init_vcpu(CPUState *cs) has_msr_hv_hypercall = true; } - memcpy(signature, "KVMKVMKVM\0\0\0", 12); - c = &cpuid_data.entries[cpuid_i++]; - c->function = KVM_CPUID_SIGNATURE | kvm_base; - c->eax = 0; - c->ebx = signature[0]; - c->ecx = signature[1]; - c->edx = signature[2]; + if (cpu->expose_kvm) { + memcpy(signature, "KVMKVMKVM\0\0\0", 12); + c = &cpuid_data.entries[cpuid_i++]; + c->function = KVM_CPUID_SIGNATURE | kvm_base; + c->eax = 0; + c->ebx = signature[0]; + c->ecx = signature[1]; + c->edx = signature[2]; - c = &cpuid_data.entries[cpuid_i++]; - c->function = KVM_CPUID_FEATURES | kvm_base; - c->eax = env->features[FEAT_KVM]; + c = &cpuid_data.entries[cpuid_i++]; + c->function = KVM_CPUID_FEATURES | kvm_base; + c->eax = env->features[FEAT_KVM]; - has_msr_async_pf_en = c->eax & (1 << KVM_FEATURE_ASYNC_PF); + has_msr_async_pf_en = c->eax & (1 << KVM_FEATURE_ASYNC_PF); - has_msr_pv_eoi_en = c->eax & (1 << KVM_FEATURE_PV_EOI); + has_msr_pv_eoi_en = c->eax & (1 << KVM_FEATURE_PV_EOI); - has_msr_kvm_steal_time = c->eax & (1 << KVM_FEATURE_STEAL_TIME); + has_msr_kvm_steal_time = c->eax & (1 << KVM_FEATURE_STEAL_TIME); + } cpu_x86_cpuid(env, 0, 0, &limit, &unused, &unused, &unused);
The latest Nvidia driver (337.88) specifically checks for KVM as the hypervisor and reports Code 43 for the driver in a Windows guest when found. Removing or changing the KVM signature is sufficient for the driver to load and work. This patch adds an option to easily allow the KVM hypervisor signature to be hidden using '-cpu kvm=off'. We continue to expose KVM via the cpuid value by default. The state of this option does not supercede or replace -enable-kvm or the accel=kvm machine option. This only changes the visibility of KVM to the guest and paravirtual features specifically tied to the KVM cpuid. Signed-off-by: Alex Williamson <alex.williamson@redhat.com> --- target-i386/cpu-qom.h | 1 + target-i386/cpu.c | 1 + target-i386/kvm.c | 28 +++++++++++++++------------- 3 files changed, 17 insertions(+), 13 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html