All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eduardo Habkost <ehabkost@redhat.com>
To: "Radim Krčmář" <rkrcmar@redhat.com>
Cc: qemu-devel@nongnu.org, "Richard Henderson" <rth@twiddle.net>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Andreas Färber" <afaerber@suse.de>
Subject: Re: [Qemu-devel] [PATCH] target-i386: add AMD CPUID.1:edx aliases to x86_cpu_get_migratable_flags
Date: Fri, 15 Apr 2016 13:54:27 -0300	[thread overview]
Message-ID: <20160415165427.GI11931@thinpad.lan.raisama.net> (raw)
In-Reply-To: <1460667307-14819-1-git-send-email-rkrcmar@redhat.com>

On Thu, Apr 14, 2016 at 10:55:07PM +0200, Radim Krčmář wrote:
> QEMU complains about -cpu host on an AMD machine:
>   warning: host doesn't support requested feature: CPUID.80000001H:EDX [bit 0]
> For bits 0,1,3,4,5,6,7,8,9,12,13,14,15,16,17,23,24.
> 
> Host does support them, but x86_cpu_get_migratable_flags filters unnamed
> features and drops these bits without realizing that they are aliases to
> CPUID.1H:EDX and have their names there.
> 
> See https://bugzilla.redhat.com/show_bug.cgi?id=1326721 for details.
> 
> Signed-off-by: Radim Krčmář <rkrcmar@redhat.com>
> ---
>  target-i386/cpu.c | 40 ++++++++++++++++++++++------------------
>  1 file changed, 22 insertions(+), 18 deletions(-)
> 
> diff --git a/target-i386/cpu.c b/target-i386/cpu.c
> index ddae932ee1b4..66bd9d0c4039 100644
> --- a/target-i386/cpu.c
> +++ b/target-i386/cpu.c
> @@ -506,7 +506,7 @@ const char *get_register_name_32(unsigned int reg)
>   * Returns the set of feature flags that are supported and migratable by
>   * QEMU, for a given FeatureWord.
>   */
> -static uint32_t x86_cpu_get_migratable_flags(FeatureWord w)
> +static uint32_t x86_cpu_get_migratable_flags(FeatureWord w, bool is_amd)
>  {
>      FeatureWordInfo *wi = &feature_word_info[w];
>      uint32_t r = 0;
> @@ -514,12 +514,18 @@ static uint32_t x86_cpu_get_migratable_flags(FeatureWord w)
>  
>      for (i = 0; i < 32; i++) {
>          uint32_t f = 1U << i;
> +        FeatureWordInfo *effective_wi = wi;
> +
> +        if (is_amd && w == FEAT_8000_0001_EDX && f & CPUID_EXT2_AMD_ALIASES) {
> +            effective_wi = &feature_word_info[FEAT_1_EDX];
> +        }
> +
>          /* If the feature name is unknown, it is not supported by QEMU yet */
> -        if (!wi->feat_names[i]) {
> +        if (!effective_wi->feat_names[i]) {
>              continue;
>          }
>          /* Skip features known to QEMU, but explicitly marked as unmigratable */
> -        if (wi->unmigratable_flags & f) {
> +        if (effective_wi->unmigratable_flags & f) {
>              continue;
>          }
>          r |= f;

I don't think we need that complexity to fix the problem. We even
have a similar hack in kvm_arch_get_supported_cpuid() to make
sure it handles the alias bits properly. Instead of hacking those
functions to copy CPUID[1] data, it's much easier to simply copy
the alias bits in realizefn after we call
x86_cpu_filter_features(), not before.

The following (untested) fix should be sufficient:

diff --git a/target-i386/cpu.c b/target-i386/cpu.c
index ddae932..d0b5b69 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -2897,6 +2897,14 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
         env->cpuid_level = 7;
     }
 
+    if (x86_cpu_filter_features(cpu) && cpu->enforce_cpuid) {
+        error_setg(&local_err,
+                   kvm_enabled() ?
+                       "Host doesn't support requested features" :
+                       "TCG doesn't support requested features");
+        goto out;
+    }
+
     /* On AMD CPUs, some CPUID[8000_0001].EDX bits must match the bits on
      * CPUID[1].EDX.
      */
@@ -2907,14 +2915,6 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
     }
 
 
-    if (x86_cpu_filter_features(cpu) && cpu->enforce_cpuid) {
-        error_setg(&local_err,
-                   kvm_enabled() ?
-                       "Host doesn't support requested features" :
-                       "TCG doesn't support requested features");
-        goto out;
-    }
-
 #ifndef CONFIG_USER_ONLY
     qemu_register_reset(x86_cpu_machine_reset_cb, cpu);
 


-- 
Eduardo

  reply	other threads:[~2016-04-15 16:54 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-04-14 20:55 [Qemu-devel] [PATCH] target-i386: add AMD CPUID.1:edx aliases to x86_cpu_get_migratable_flags Radim Krčmář
2016-04-15 16:54 ` Eduardo Habkost [this message]
2016-04-15 17:27   ` Radim Krčmář

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160415165427.GI11931@thinpad.lan.raisama.net \
    --to=ehabkost@redhat.com \
    --cc=afaerber@suse.de \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=rkrcmar@redhat.com \
    --cc=rth@twiddle.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.