All of lore.kernel.org
 help / color / mirror / Atom feed
From: Igor Mammedov <imammedo@redhat.com>
To: Eduardo Habkost <ehabkost@redhat.com>
Cc: aliguori@us.ibm.com, stefanha@linux.vnet.ibm.com,
	gleb@redhat.com, vijaymohan.pandarathil@hp.com,
	jan.kiszka@siemens.com, mtosatti@redhat.com,
	qemu-devel@nongnu.org, mdroth@linux.vnet.ibm.com,
	blauwirbel@gmail.com, avi@redhat.com, pbonzini@redhat.com,
	akong@redhat.com, lersek@redhat.com, afaerber@suse.de
Subject: Re: [Qemu-devel] [PATCH 07/21] target-i386: convert cpuid features into properties
Date: Mon, 20 Aug 2012 14:16:26 +0200	[thread overview]
Message-ID: <20120820141626.183ee13a@thinkpad.mammed.net> (raw)
In-Reply-To: <20120816181050.GC17695@otherpad.lan.raisama.net>

On Thu, 16 Aug 2012 15:10:50 -0300
Eduardo Habkost <ehabkost@redhat.com> wrote:

> On Wed, Aug 15, 2012 at 06:13:27PM +0200, Igor Mammedov wrote:
> > Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> > --
> > v2:
> >   * replaced mask/ffs tricks by plain 'for (bit = 0; bit < 32; bit++)'
> >     as suggested by Eduardo Habkost
> > ---
> >  target-i386/cpu.c | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 101 insertions(+)
> > 
> > diff --git a/target-i386/cpu.c b/target-i386/cpu.c
> > index 37ba5ef..440e724 100644
> > --- a/target-i386/cpu.c
> > +++ b/target-i386/cpu.c
> > @@ -606,6 +606,101 @@ static int check_features_against_host(x86_def_t *guest_def)
> >      return rv;
> >  }
> >  
> > +static bool is_feature_set(const char *name, const uint32_t featbitmap,
> > +                                  const char **featureset)
> > +{
> > +    uint32_t bit;
> > +
> > +    for (bit = 0; bit < 32; ++bit) {
> > +        if (featureset[bit] && !altcmp(name, NULL, featureset[bit])) {
> > +            if (featbitmap & (1 << bit)) {
> > +                return true;
> > +            }
> > +        }
> > +    }
> > +    return false;
> > +}
> > +
> > +static void x86_cpuid_get_feature(Object *obj, Visitor *v, void *opaque,
> > +                                         const char *name, Error **errp)
> > +{
> > +    X86CPU *cpu = X86_CPU(obj);
> > +    CPUX86State *env = &cpu->env;
> > +    bool value = true;
> > +
> > +    if (!is_feature_set(name, env->cpuid_features, feature_name) &&
> > +       !is_feature_set(name, env->cpuid_ext_features, ext_feature_name) &&
> > +       !is_feature_set(name, env->cpuid_ext2_features, ext2_feature_name) &&
> > +       !is_feature_set(name, env->cpuid_ext3_features, ext3_feature_name) &&
> > +       !is_feature_set(name, env->cpuid_kvm_features, kvm_feature_name) &&
> > +       !is_feature_set(name, env->cpuid_svm_features, svm_feature_name)) {
> > +        value = false;
> > +    }
> > +
> > +    visit_type_bool(v, &value, name, errp);
> > +}
> > +
> > +static void x86_cpuid_set_feature(Object *obj, Visitor *v, void *opaque,
> > +                                         const char *name, Error **errp)
> > +{
> > +    X86CPU *cpu = X86_CPU(obj);
> > +    CPUX86State *env = &cpu->env;
> > +    uint32_t mask = 0;
> > +    uint32_t *dst_features;
> > +    bool value;
> > +
> > +    visit_type_bool(v, &value, name, errp);
> > +    if (error_is_set(errp)) {
> > +        return;
> > +    }
> > +
> > +    if (lookup_feature(&mask, name, NULL, feature_name)) {
> > +        dst_features = &env->cpuid_features;
> > +    } else if (lookup_feature(&mask, name, NULL, ext_feature_name)) {
> > +        dst_features = &env->cpuid_ext_features;
> > +    } else if (lookup_feature(&mask, name, NULL, ext2_feature_name)) {
> > +        dst_features = &env->cpuid_ext2_features;
> > +    } else if (lookup_feature(&mask, name, NULL, ext3_feature_name)) {
> > +        dst_features = &env->cpuid_ext3_features;
> > +    } else if (lookup_feature(&mask, name, NULL, kvm_feature_name)) {
> > +        dst_features = &env->cpuid_kvm_features;
> > +    } else if (lookup_feature(&mask, name, NULL, svm_feature_name)) {
> > +        dst_features = &env->cpuid_svm_features;
> > +    } else {
> > +        error_set(errp, QERR_PROPERTY_NOT_FOUND, "", name);
> > +        return;
> > +    }
> 
> Some feature names are duplicated on feature_names and
> ext_feature_names. On AMD CPU models, we have to set both, on Intel
> models we need to set the bits only on cpuid_features.
> 
> Maybe it's better to:
> 
> 1) eliminate the duplication and set the names only on feature_name
>    array;
> 2) At the end of CPU initialization, set the features on
>    cpuid_ext2_features as copies of the corresponding cpuid_features
>    bits if CPU vendor == AMD (or, maybe, if some boolean
>    "ext2_features_aliases" flag is set, to make it not
>    vendor-dependent).

So far I was trying to keep original behavior and keep scope of this series
only on moving CPU features into properties. I'll rebase this series on top
of what you proposed in a week when I'm back from vacation.
 
> 
> > +
> > +    if (value) {
> > +        *dst_features |= mask;
> > +    } else {
> > +        *dst_features &= ~mask;
> > +    }
> > +}
> > +
> > +static void x86_register_cpuid_properties(Object *obj, const char **featureset)
> > +{
> > +    uint32_t bit;
> > +
> > +    for (bit = 0; bit < 32; ++bit) {
> > +        if (featureset[bit]) {
> > +            char *feature_name, *save_ptr;
> > +            char buf[32];
> > +            if (strlen(featureset[bit]) > sizeof(buf) - 1) {
> > +                abort();
> > +            }
> > +            pstrcpy(buf, sizeof(buf), featureset[bit]);
> > +            feature_name = strtok_r(buf, "|", &save_ptr);
> > +            while (feature_name) {
> > +                object_property_add(obj, feature_name, "bool",
> > +                                x86_cpuid_get_feature,
> > +                                x86_cpuid_set_feature, NULL, NULL, NULL);
> > +                feature_name = strtok_r(NULL, "|", &save_ptr);
> 
> What happens when object_property_add() is called twice with the same
> feature name?
Just extra item in list (pure waste). Thanks for pointing out.
I've fixed it (not yet pushed) by checking if property already exists before
adding it.

> 
> > +            }
> > +        }
> > +    }
> > +}
> > +
> >  static void x86_cpuid_version_get_family(Object *obj, Visitor *v, void *opaque,
> >                                           const char *name, Error **errp)
> >  {
> > @@ -1824,6 +1919,12 @@ static void x86_cpu_initfn(Object *obj)
> >      object_property_add(obj, "tsc-frequency", "int",
> >                          x86_cpuid_get_tsc_freq,
> >                          x86_cpuid_set_tsc_freq, NULL, NULL, NULL);
> > +    x86_register_cpuid_properties(obj, feature_name);
> > +    x86_register_cpuid_properties(obj, ext_feature_name);
> > +    x86_register_cpuid_properties(obj, ext2_feature_name);
> > +    x86_register_cpuid_properties(obj, ext3_feature_name);
> > +    x86_register_cpuid_properties(obj, kvm_feature_name);
> > +    x86_register_cpuid_properties(obj, svm_feature_name);
> >  
> >      env->cpuid_apic_id = env->cpu_index;
> >  
> > -- 
> > 1.7.11.2
> > 
> > 
> 
> -- 
> Eduardo
> 


-- 
Regards,
  Igor

  parent reply	other threads:[~2012-08-20 12:16 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-08-15 16:13 [Qemu-devel] [PATCH 00/21] target-i386: convert CPU features into properties Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 01/21] target-i386: return Error from cpu_x86_find_by_name() Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 02/21] target-i386: cpu_x86_register(): report error from property setter Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 03/21] target-i386: if x86_cpu_realize() failed report error and do cleanup Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 04/21] target-i386: filter out not TCG features if running without kvm at realize time Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 05/21] target-i386: move out CPU features initialization in separate func Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 06/21] target-i386: xlevel should be more than 0x80000000, move fixup into setter Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 07/21] target-i386: convert cpuid features into properties Igor Mammedov
2012-08-16 18:10   ` Eduardo Habkost
2012-08-17 17:32     ` Eduardo Habkost
2012-08-20 12:16     ` Igor Mammedov [this message]
2012-08-20 12:34       ` Eduardo Habkost
2012-08-15 16:13 ` [Qemu-devel] [PATCH 08/21] target-i386: convert 'hv_spinlocks' feature into property Igor Mammedov
2012-08-15 20:43   ` Eduardo Habkost
2012-08-15 21:32     ` Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 09/21] target-i386: convert 'hv_relaxed' " Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 10/21] target-i386: convert 'hv_vapic' " Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 11/21] target-i386: convert 'check' and 'enforce' features into properties Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 12/21] add visitor for parsing hz[KMG] input string Igor Mammedov
2012-08-15 16:44   ` Andreas Färber
2012-08-15 17:08     ` Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 13/21] target-i386: use visit_type_hz to parse tsc_freq property value Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 14/21] target-i386: introduce vendor-override property Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 15/21] target-i386: use define for cpuid vendor string size Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 16/21] target-i386: replace uint32_t vendor fields by vendor string in x86_def_t Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 17/21] target-i386: parse cpu_model string into set of stringified properties Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 18/21] target-i386: use properties to set/unset user specified features on CPU Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 19/21] target-i386: move init of "hypervisor" feature into CPU initializer from cpudef Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 20/21] target-i386: move default init of cpuid_kvm_features bitmap " Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 21/21] target-i386: cleanup cpu_x86_find_by_name(), only fill x86_def_t in it Igor Mammedov
2012-08-16  3:02 ` [Qemu-devel] [PATCH 00/21] target-i386: convert CPU features into properties Eduardo Habkost

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=20120820141626.183ee13a@thinkpad.mammed.net \
    --to=imammedo@redhat.com \
    --cc=afaerber@suse.de \
    --cc=akong@redhat.com \
    --cc=aliguori@us.ibm.com \
    --cc=avi@redhat.com \
    --cc=blauwirbel@gmail.com \
    --cc=ehabkost@redhat.com \
    --cc=gleb@redhat.com \
    --cc=jan.kiszka@siemens.com \
    --cc=lersek@redhat.com \
    --cc=mdroth@linux.vnet.ibm.com \
    --cc=mtosatti@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@linux.vnet.ibm.com \
    --cc=vijaymohan.pandarathil@hp.com \
    /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.