On Tue, 19 Feb 2013 16:03:04 -0300
Eduardo Habkost <ehabk...@redhat.com> wrote:

> On Mon, Feb 11, 2013 at 05:35:11PM +0100, Igor Mammedov wrote:
> >  * Define static properties for cpuid feature bits
> >     * property names of CPUID features are changed to have "f-" prefix,
> >       so that it would be easy to distinguish them from other properties.
> > 
> >  * Convert [+-]cpuid_features to a set(QDict) of key, value pairs, where
> >      +feat => (f-feat, on)
> >      -feat => (f-feat, off)
> >      [+-] unknown feat => (feat, on/off) - it's expected to be rejected
> >                                            by property setter later
> >    QDict is used as convinience sturcture to keep -foo semantic.
> >    Once all +-foo are parsed, collected features are applied to CPU 
> > instance.
> > 
> >  * Cleanup unused anymore:
> >      add_flagname_to_bitmaps(), lookup_feature(), altcmp(), sstrcmp(),
> > 
> >  * Rename lowlevel 'kvmclock' into 'f-kvmclock1' and introduce
> >    legacy composite property 'f-kvmclock' that sets both 'f-kvmclock1'
> >    and 'f-kvmclock2' feature bits to mantain legacy kvmclock behavior
> > 
> > Signed-off-by: Igor Mammedov <imamm...@redhat.com>
> > ---
> >  v4:
> >    - major patch reordering, rebasing on current qom-cpu-next
> >    - merged patches: "define static properties..." and "set [+-]feature..."
> >    - merge in "make 'f-kvmclock' compatible..." to aviod behavior breakage
> >    - use register name in feature macros, so that if we rename cpuid_* 
> > fields,
> >      it wouldn't involve mass rename in features array.
> >    - when converting feature names into property names, replace '_' with 
> > '-',
> >        Requested-By: Don Slutz <d...@cloudswitch.com>,
> >          mgs-id: <5085d4aa.1060...@cloudswitch.com>
> > 
> >  v3:
> >    - new static properties after rebase:
> >       - add features "f-rdseed" & "f-adx"
> >       - add features added by c8acc380
> >       - add features f-kvm_steal_tm and f-kvmclock_stable
> >       - ext4 features f-xstore, f-xstore-en, f-xcrypt, f-xcrypt-en,
> >         f-ace2, f-ace2-en, f-phe, f-phe-en, f-pmm, f-pmm-en
> > 
> >    - f-hypervisor set default to false as for the rest of features
> >    - define helper FEAT for declaring CPUID feature properties to
> >      make shorter lines (<80 characters)
> > 
> >  v2:
> >    - use X86CPU as a type to count of offset correctly, because env field
> >      isn't starting at CPUstate beginning, but located after it.
> > ---
> >  target-i386/cpu.c |  348 
> > +++++++++++++++++++++++++++++++++++++----------------
> >  1 files changed, 242 insertions(+), 106 deletions(-)
> > 
> > diff --git a/target-i386/cpu.c b/target-i386/cpu.c
> > index fcfe8ec..2a5a5b5 100644
> > --- a/target-i386/cpu.c
> > +++ b/target-i386/cpu.c
> > @@ -656,6 +656,65 @@ PropertyInfo qdev_prop_enforce = {
> >      .defval = _defval                                                      
> >     \
> >  }
> >  
> > +static void x86_cpu_get_kvmclock(Object *obj, Visitor *v, void *opaque,
> > +                                 const char *name, Error **errp)
> > +{
> > +    X86CPU *cpu = X86_CPU(obj);
> > +    bool value = cpu->env.cpuid_kvm_features;
> > +    value = (value & KVM_FEATURE_CLOCKSOURCE) &&
> > +            (value & KVM_FEATURE_CLOCKSOURCE2);
> > +    visit_type_bool(v, &value, name, errp);
> > +}
> > +
> > +static void x86_cpu_set_kvmclock(Object *obj, Visitor *v, void *opaque,
> > +                                 const char *name, Error **errp)
> > +{
> > +    X86CPU *cpu = X86_CPU(obj);
> > +    bool value;
> > +    visit_type_bool(v, &value, name, errp);
> > +    if (value == true) {
> > +        cpu->env.cpuid_kvm_features |= KVM_FEATURE_CLOCKSOURCE |
> > +                                      KVM_FEATURE_CLOCKSOURCE2;
> > +    } else {
> > +        cpu->env.cpuid_kvm_features &= ~(KVM_FEATURE_CLOCKSOURCE |
> > +                                       KVM_FEATURE_CLOCKSOURCE2);
> > +    }
> > +}
> > +
> > +PropertyInfo qdev_prop_kvmclock = {
> > +    .name  = "boolean",
> > +    .get   = x86_cpu_get_kvmclock,
> > +    .set   = x86_cpu_set_kvmclock,
> > +};
> > +#define DEFINE_PROP_KVMCLOCK(_n) {                                         
> >     \
> > +    .name  = _n,                                                           
> >     \
> > +    .info  = &qdev_prop_kvmclock                                           
> >     \
> > +}
> 
> Instead of the complexity of a new PropertyInfo struct, I would rather
> have a "enable_both_kvmclock_bits" field in X86CPU, that would be
> handled on x86_cpu_realize() and set the other feature bits. Then we
> could have a plain struct-field property with no special PropertyInfo
> struct.
No extra fields pls, unless we have to.

> 
> Or, maybe we shouldn't even add a "kvmclock" property at all, and
> translate the legacy "kvmclock" flag to kvmclock1|kvmclock2 inside
> parse_featurestr()?
That's what I was proposing a while back. Lets do it this way.

> 
> Except for that, patch looks good overall, but I still need to review
> the feature name list to make sure it matches exactly what have in the
> feature name arrays (I plan to review that later).
> 
> -- 
> Eduardo


-- 
Regards,
  Igor

Reply via email to