* [PATCH v1 Resend] target/i386: set the CPUID level to 0x14 on old machine-type @ 2019-10-30 6:28 Luwei Kang 2019-11-05 21:13 ` Eduardo Habkost 0 siblings, 1 reply; 4+ messages in thread From: Luwei Kang @ 2019-10-30 6:28 UTC (permalink / raw) To: pbonzini, rth, ehabkost; +Cc: Luwei Kang, qemu-devel The CPUID level need to be set to 0x14 manually on old machine-type if Intel PT is enabled in guest. e.g. in Qemu 3.1 -machine pc-i440fx-3.1 -cpu qemu64,+intel-pt will be CPUID[0].EAX(level)=7 and CPUID[7].EBX[25](intel-pt)=1. Some Intel PT capabilities are exposed by leaf 0x14 and the missing capabilities will cause some MSRs access failed. This patch add a warning message to inform the user to extend the CPUID level. Suggested-by: Eduardo Habkost <ehabkost@redhat.com> Signed-off-by: Luwei Kang <luwei.kang@intel.com> --- target/i386/cpu.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/target/i386/cpu.c b/target/i386/cpu.c index a624163..f67c479 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -5440,8 +5440,12 @@ static void x86_cpu_expand_features(X86CPU *cpu, Error **errp) /* Intel Processor Trace requires CPUID[0x14] */ if ((env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) && - kvm_enabled() && cpu->intel_pt_auto_level) { - x86_cpu_adjust_level(cpu, &cpu->env.cpuid_min_level, 0x14); + kvm_enabled()) { + if (cpu->intel_pt_auto_level) + x86_cpu_adjust_level(cpu, &cpu->env.cpuid_min_level, 0x14); + else + warn_report("Intel PT need CPUID leaf 0x14, please set " + "by \"-cpu ...,+intel-pt,level=0x14\""); } /* CPU topology with multi-dies support requires CPUID[0x1F] */ -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v1 Resend] target/i386: set the CPUID level to 0x14 on old machine-type 2019-10-30 6:28 [PATCH v1 Resend] target/i386: set the CPUID level to 0x14 on old machine-type Luwei Kang @ 2019-11-05 21:13 ` Eduardo Habkost 2019-11-06 0:55 ` Kang, Luwei 0 siblings, 1 reply; 4+ messages in thread From: Eduardo Habkost @ 2019-11-05 21:13 UTC (permalink / raw) To: Luwei Kang; +Cc: pbonzini, qemu-devel, rth On Wed, Oct 30, 2019 at 02:28:02PM +0800, Luwei Kang wrote: > The CPUID level need to be set to 0x14 manually on old > machine-type if Intel PT is enabled in guest. e.g. in Qemu 3.1 > -machine pc-i440fx-3.1 -cpu qemu64,+intel-pt > will be CPUID[0].EAX(level)=7 and CPUID[7].EBX[25](intel-pt)=1. > > Some Intel PT capabilities are exposed by leaf 0x14 and the > missing capabilities will cause some MSRs access failed. > This patch add a warning message to inform the user to extend > the CPUID level. Note that a warning is not an acceptable fix for a QEMU crash. We still need to fix the QEMU crash reported at: https://lore.kernel.org/qemu-devel/20191024141536.GU6744@habkost.net/ > > Suggested-by: Eduardo Habkost <ehabkost@redhat.com> > Signed-off-by: Luwei Kang <luwei.kang@intel.com> The subject line says "v1", but this patch is different from the v1 you sent earlier. If you are sending a different patch, please indicate it is a new version. Please also indicate what changed between different patch versions, to help review. > --- > target/i386/cpu.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/target/i386/cpu.c b/target/i386/cpu.c > index a624163..f67c479 100644 > --- a/target/i386/cpu.c > +++ b/target/i386/cpu.c > @@ -5440,8 +5440,12 @@ static void x86_cpu_expand_features(X86CPU *cpu, Error **errp) > > /* Intel Processor Trace requires CPUID[0x14] */ > if ((env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) && > - kvm_enabled() && cpu->intel_pt_auto_level) { Not directly related to the warning: do you know why we have a kvm_enabled() check here? It seems unnecessary. We want CPUID level to be correct for all accelerators. > - x86_cpu_adjust_level(cpu, &cpu->env.cpuid_min_level, 0x14); > + kvm_enabled()) { > + if (cpu->intel_pt_auto_level) > + x86_cpu_adjust_level(cpu, &cpu->env.cpuid_min_level, 0x14); > + else > + warn_report("Intel PT need CPUID leaf 0x14, please set " > + "by \"-cpu ...,+intel-pt,level=0x14\""); The warning shouldn't be triggered if level is already >= 0x14. It is probably a good idea to mention that this happens only on pc-*-3.1 and older, as updating the machine-type is a better solution to the problem than manually setting the "level" property. This will print the warning multiple times if there are multiple VCPUs. You can use warn_report_once() to avoid that. > } > > /* CPU topology with multi-dies support requires CPUID[0x1F] */ > -- > 1.8.3.1 > -- Eduardo ^ permalink raw reply [flat|nested] 4+ messages in thread
* RE: [PATCH v1 Resend] target/i386: set the CPUID level to 0x14 on old machine-type 2019-11-05 21:13 ` Eduardo Habkost @ 2019-11-06 0:55 ` Kang, Luwei 2019-11-07 19:16 ` Eduardo Habkost 0 siblings, 1 reply; 4+ messages in thread From: Kang, Luwei @ 2019-11-06 0:55 UTC (permalink / raw) To: Eduardo Habkost Cc: pbonzini@redhat.com, qemu-devel@nongnu.org, rth@twiddle.net > > The CPUID level need to be set to 0x14 manually on old machine-type if > > Intel PT is enabled in guest. e.g. in Qemu 3.1 -machine pc-i440fx-3.1 > > -cpu qemu64,+intel-pt will be CPUID[0].EAX(level)=7 and > > CPUID[7].EBX[25](intel-pt)=1. > > > > Some Intel PT capabilities are exposed by leaf 0x14 and the missing > > capabilities will cause some MSRs access failed. > > This patch add a warning message to inform the user to extend the > > CPUID level. > > Note that a warning is not an acceptable fix for a QEMU crash. > We still need to fix the QEMU crash reported at: > https://lore.kernel.org/qemu-devel/20191024141536.GU6744@habkost.net/ > > > > > > Suggested-by: Eduardo Habkost <ehabkost@redhat.com> > > Signed-off-by: Luwei Kang <luwei.kang@intel.com> > > The subject line says "v1", but this patch is different from the > v1 you sent earlier. > > If you are sending a different patch, please indicate it is a new version. Please also > indicate what changed between different patch versions, to help review. Got it. I fix a code style problem in resending patch (remove the '\n'). ERROR: Error messages should not contain newlines #36: FILE: target/i386/cpu.c:5448: + "by \"-cpu ...,+intel-pt,level=0x14\"\n"); total: 1 errors, 0 warnings, 14 lines checked > > > --- > > target/i386/cpu.c | 8 ++++++-- > > 1 file changed, 6 insertions(+), 2 deletions(-) > > > > diff --git a/target/i386/cpu.c b/target/i386/cpu.c index > > a624163..f67c479 100644 > > --- a/target/i386/cpu.c > > +++ b/target/i386/cpu.c > > @@ -5440,8 +5440,12 @@ static void x86_cpu_expand_features(X86CPU > > *cpu, Error **errp) > > > > /* Intel Processor Trace requires CPUID[0x14] */ > > if ((env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) && > > - kvm_enabled() && cpu->intel_pt_auto_level) { > > Not directly related to the warning: do you know why we have a > kvm_enabled() check here? It seems unnecessary. We want CPUID level to be correct > for all accelerators. Intel PT virtualization enabling in KVM guest need some hardware enhancement and EPT must be enabled in KVM. I think it can't work for e.g. tcg pure simulation accelerator. > > > - x86_cpu_adjust_level(cpu, &cpu->env.cpuid_min_level, 0x14); > > + kvm_enabled()) { > > + if (cpu->intel_pt_auto_level) > > + x86_cpu_adjust_level(cpu, &cpu->env.cpuid_min_level, 0x14); > > + else > > + warn_report("Intel PT need CPUID leaf 0x14, please set " > > + "by \"-cpu ...,+intel-pt,level=0x14\""); > > The warning shouldn't be triggered if level is already >= 0x14. > > It is probably a good idea to mention that this happens only on > pc-*-3.1 and older, as updating the machine-type is a better solution to the problem > than manually setting the "level" > property. > > This will print the warning multiple times if there are multiple VCPUs. You can use > warn_report_once() to avoid that. Got it. Will fix. As you mentioned in this email " a warning is not an acceptable fix for a QEMU crash." We can't change the configuration of the old machine type because it may break the ABI compatibility. May I add more check on Intel PT, if CPUID[7].EBX[25] (intel-pt) = 1 and level is <0x14, mask off this feature? Or do you have any other suggestions? Thanks, Luwei Kang > > > } > > > > /* CPU topology with multi-dies support requires CPUID[0x1F] > > */ > > -- > > 1.8.3.1 > > > > -- > Eduardo ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v1 Resend] target/i386: set the CPUID level to 0x14 on old machine-type 2019-11-06 0:55 ` Kang, Luwei @ 2019-11-07 19:16 ` Eduardo Habkost 0 siblings, 0 replies; 4+ messages in thread From: Eduardo Habkost @ 2019-11-07 19:16 UTC (permalink / raw) To: Kang, Luwei; +Cc: pbonzini@redhat.com, qemu-devel@nongnu.org, rth@twiddle.net On Wed, Nov 06, 2019 at 12:55:32AM +0000, Kang, Luwei wrote: > > > The CPUID level need to be set to 0x14 manually on old machine-type if > > > Intel PT is enabled in guest. e.g. in Qemu 3.1 -machine pc-i440fx-3.1 > > > -cpu qemu64,+intel-pt will be CPUID[0].EAX(level)=7 and > > > CPUID[7].EBX[25](intel-pt)=1. > > > > > > Some Intel PT capabilities are exposed by leaf 0x14 and the missing > > > capabilities will cause some MSRs access failed. > > > This patch add a warning message to inform the user to extend the > > > CPUID level. > > > > Note that a warning is not an acceptable fix for a QEMU crash. > > We still need to fix the QEMU crash reported at: > > https://lore.kernel.org/qemu-devel/20191024141536.GU6744@habkost.net/ > > > > > > > > > > Suggested-by: Eduardo Habkost <ehabkost@redhat.com> > > > Signed-off-by: Luwei Kang <luwei.kang@intel.com> > > > > The subject line says "v1", but this patch is different from the > > v1 you sent earlier. > > > > If you are sending a different patch, please indicate it is a new version. Please also > > indicate what changed between different patch versions, to help review. > > Got it. I fix a code style problem in resending patch (remove the '\n'). > > ERROR: Error messages should not contain newlines > #36: FILE: target/i386/cpu.c:5448: > + "by \"-cpu ...,+intel-pt,level=0x14\"\n"); > total: 1 errors, 0 warnings, 14 lines checked > > > > > > --- > > > target/i386/cpu.c | 8 ++++++-- > > > 1 file changed, 6 insertions(+), 2 deletions(-) > > > > > > diff --git a/target/i386/cpu.c b/target/i386/cpu.c index > > > a624163..f67c479 100644 > > > --- a/target/i386/cpu.c > > > +++ b/target/i386/cpu.c > > > @@ -5440,8 +5440,12 @@ static void x86_cpu_expand_features(X86CPU > > > *cpu, Error **errp) > > > > > > /* Intel Processor Trace requires CPUID[0x14] */ > > > if ((env->features[FEAT_7_0_EBX] & CPUID_7_0_EBX_INTEL_PT) && > > > - kvm_enabled() && cpu->intel_pt_auto_level) { > > > > Not directly related to the warning: do you know why we have a > > kvm_enabled() check here? It seems unnecessary. We want CPUID level to be correct > > for all accelerators. > > Intel PT virtualization enabling in KVM guest need some hardware enhancement and > EPT must be enabled in KVM. I think it can't work for e.g. tcg pure simulation accelerator. I don't get it. If what you are saying is true, checking for kvm_enabled() here is completely unnecessary. If it is not, checking for kvm_enabled() here is incorrect. > > > > > > - x86_cpu_adjust_level(cpu, &cpu->env.cpuid_min_level, 0x14); > > > + kvm_enabled()) { > > > + if (cpu->intel_pt_auto_level) > > > + x86_cpu_adjust_level(cpu, &cpu->env.cpuid_min_level, 0x14); > > > + else > > > + warn_report("Intel PT need CPUID leaf 0x14, please set " > > > + "by \"-cpu ...,+intel-pt,level=0x14\""); > > > > The warning shouldn't be triggered if level is already >= 0x14. > > > > It is probably a good idea to mention that this happens only on > > pc-*-3.1 and older, as updating the machine-type is a better solution to the problem > > than manually setting the "level" > > property. > > > > This will print the warning multiple times if there are multiple VCPUs. You can use > > warn_report_once() to avoid that. > > Got it. Will fix. > > As you mentioned in this email " a warning is not an acceptable fix for a QEMU crash." > We can't change the configuration of the old machine type because it may break the > ABI compatibility. May I add more check on Intel PT, if CPUID[7].EBX[25] (intel-pt) = 1 > and level is <0x14, mask off this feature? Or do you have any other suggestions? Masking off the feature if level is < 0x14 would possibly work if we are 100% sure that existing kernel+QEMU versions crashed when (intel-pt=on && level < 0x14) so there's no ABI compatibility with working configurations to worry about. But it would be even better to make kvm_put_msrs() less fragile. Unexpected CPUID data shouldn't make the function crash. -- Eduardo ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2019-11-07 19:18 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2019-10-30 6:28 [PATCH v1 Resend] target/i386: set the CPUID level to 0x14 on old machine-type Luwei Kang 2019-11-05 21:13 ` Eduardo Habkost 2019-11-06 0:55 ` Kang, Luwei 2019-11-07 19:16 ` Eduardo Habkost
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).