All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eduardo Habkost <ehabkost@redhat.com>
To: Igor Mammedov <imammedo@redhat.com>
Cc: qemu-devel@nongnu.org,
	Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>,
	Artyom Tarasenko <atar4qemu@gmail.com>
Subject: Re: [Qemu-devel] [PATCH for-2.11 03/27] sparc: convert cpu features to qdev properties
Date: Wed, 23 Aug 2017 10:07:14 -0300	[thread overview]
Message-ID: <20170823130714.GK19998@localhost.localdomain> (raw)
In-Reply-To: <20170821130307.3cd85653@nial.brq.redhat.com>

On Mon, Aug 21, 2017 at 01:03:07PM +0200, Igor Mammedov wrote:
> On Fri, 18 Aug 2017 15:24:04 -0300
> Eduardo Habkost <ehabkost@redhat.com> wrote:
> 
> > On Fri, Aug 18, 2017 at 12:08:35PM +0200, Igor Mammedov wrote:
> > > SPARC is the last target that uses legacy way of parsing
> > > and initializing cpu features, drop legacy approach and
> > > convert features to properties so that SPARC could as minimum
> > > benefit from generic cpu_generic_init(), common with
> > > x86 +-feat parser
> > > 
> > > PS:
> > > the main purpose is to remove legacy way of cpu creation as
> > > a blocker for unifying cpu creation code across targets.
> > > 
> > > Signed-off-by: Igor Mammedov <imammedo@redhat.com>  
> > [...]
> > > ---
> > > CC: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> > > CC: Artyom Tarasenko <atar4qemu@gmail.com>
> > > CC: Eduardo Habkost <ehabkost@redhat.com>
> > > ---
> > >  target/sparc/cpu.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
> > >  1 file changed, 66 insertions(+)
> > > 
> > > diff --git a/target/sparc/cpu.c b/target/sparc/cpu.c
> > > index f4e7343..e735d73 100644
> > > --- a/target/sparc/cpu.c
> > > +++ b/target/sparc/cpu.c
> > > @@ -22,6 +22,8 @@
> > >  #include "cpu.h"
> > >  #include "qemu/error-report.h"
> > >  #include "exec/exec-all.h"
> > > +#include "hw/qdev-properties.h"
> > > +#include "qapi/visitor.h"
> > >  
> > >  //#define DEBUG_FEATURES
> > >  
> > > @@ -853,6 +855,69 @@ static void sparc_cpu_initfn(Object *obj)
> > >      }
> > >  }
> > >  
> > > +static void sparc_get_nwindows(Object *obj, Visitor *v, const char *name,
> > > +                               void *opaque, Error **errp)
> > > +{
> > > +    SPARCCPU *cpu = SPARC_CPU(obj);
> > > +    int64_t value = cpu->env.def.nwindows;
> > > +
> > > +    visit_type_int(v, name, &value, errp);
> > > +}
> > > +
> > > +static void sparc_set_nwindows(Object *obj, Visitor *v, const char *name,
> > > +                               void *opaque, Error **errp)
> > > +{
> > > +    const int64_t min = MIN_NWINDOWS;
> > > +    const int64_t max = MAX_NWINDOWS;
> > > +    SPARCCPU *cpu = SPARC_CPU(obj);
> > > +    Error *err = NULL;
> > > +    int64_t value;
> > > +
> > > +    visit_type_int(v, name, &value, &err);
> > > +    if (err) {
> > > +        error_propagate(errp, err);
> > > +        return;
> > > +    }
> > > +
> > > +    if (value < min || value > max) {
> > > +        error_setg(errp, "Property %s.%s doesn't take value %" PRId64
> > > +                   " (minimum: %" PRId64 ", maximum: %" PRId64 ")",
> > > +                   object_get_typename(obj), name ? name : "null",
> > > +                   value, min, max);
> > > +        return;
> > > +    }
> > > +    cpu->env.def.nwindows = value;  
> > 
> > I think it would be much simpler to just validate nwindows at
> > realize time and use DEFINE_PROP_UINT32 below, but I won't mind
> > if you really prefer the custom setter.
> Indeed it would shave off ~12LOC if check is done at realize time,
> but I prefer to throw error at the place where it's set.
> I'd go for realize approach only if check couldn't be done
> at property setting time.

I would prefer to avoid custom getters/setters when possible, but
I agree it is better to validate the value as soon as possible
(on the setter instead of realize).  If we want to avoid custom
setters, we need to improve the DEFINE_PROP_* interface.

> 
> 
> > But I have another question:
> > 
> > > +}
> > > +
> > > +static PropertyInfo qdev_prop_nwindows = {
> > > +    .name  = "int",
> > > +    .get   = sparc_get_nwindows,
> > > +    .set   = sparc_set_nwindows,
> > > +};
> > > +
> > > +static Property sparc_cpu_properties[] = {
> > > +    DEFINE_PROP_BIT("float",    SPARCCPU, env.def.features, 0, false),
> > > +    DEFINE_PROP_BIT("float128", SPARCCPU, env.def.features, 1, false),
> > > +    DEFINE_PROP_BIT("swap",     SPARCCPU, env.def.features, 2, false),
> > > +    DEFINE_PROP_BIT("mul",      SPARCCPU, env.def.features, 3, false),
> > > +    DEFINE_PROP_BIT("div",      SPARCCPU, env.def.features, 4, false),
> > > +    DEFINE_PROP_BIT("flush",    SPARCCPU, env.def.features, 5, false),
> > > +    DEFINE_PROP_BIT("fsqrt",    SPARCCPU, env.def.features, 6, false),
> > > +    DEFINE_PROP_BIT("fmul",     SPARCCPU, env.def.features, 7, false),
> > > +    DEFINE_PROP_BIT("vis1",     SPARCCPU, env.def.features, 8, false),
> > > +    DEFINE_PROP_BIT("vis2",     SPARCCPU, env.def.features, 9, false),
> > > +    DEFINE_PROP_BIT("fsmuld",   SPARCCPU, env.def.features, 10, false),
> > > +    DEFINE_PROP_BIT("hypv",     SPARCCPU, env.def.features, 11, false),
> > > +    DEFINE_PROP_BIT("cmt",      SPARCCPU, env.def.features, 12, false),
> > > +    DEFINE_PROP_BIT("gl",       SPARCCPU, env.def.features, 13, false),
> > > +    DEFINE_PROP_UNSIGNED("iu-version", SPARCCPU, env.def.iu_version, 0,
> > > +                         qdev_prop_uint64, target_ulong),
> > > +    DEFINE_PROP_UINT32("fpu-version", SPARCCPU, env.def.fpu_version, 0),
> > > +    DEFINE_PROP_UINT32("mmu-version", SPARCCPU, env.def.mmu_version, 0),
> > > +    { .name  = "nwindows", .info  = &qdev_prop_nwindows },  
> > 
> > What's the advantage of using a custom PropertyInfo struct if you
> > can just call object_class_property_add() at
> > sparc_cpu_class_init()?
> consistentcy with the rest of properties added above
> and instead of a zoo of ways to add property within the patch/featureset

Well, both options (custom PropertyInfo and manual
object_class_property_add() call) look bad to me.  But improving
the property API to not require a custom setter is out of context
of this series, so:

Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>

> 
> > 
> > > +    DEFINE_PROP_END_OF_LIST()
> > > +};
> > > +
> > >  static void sparc_cpu_class_init(ObjectClass *oc, void *data)
> > >  {
> > >      SPARCCPUClass *scc = SPARC_CPU_CLASS(oc);
> > > @@ -861,6 +926,7 @@ static void sparc_cpu_class_init(ObjectClass *oc, void *data)
> > >  
> > >      scc->parent_realize = dc->realize;
> > >      dc->realize = sparc_cpu_realizefn;
> > > +    dc->props = sparc_cpu_properties;
> > >  
> > >      scc->parent_reset = cc->reset;
> > >      cc->reset = sparc_cpu_reset;
> > > -- 
> > > 2.7.4
> > > 
> > >   
> > 
> 

-- 
Eduardo

  reply	other threads:[~2017-08-23 13:07 UTC|newest]

Thread overview: 56+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-08-18 10:08 [Qemu-devel] [PATCH for-2.11 00/27] complete cpu QOMification and remove cpu_FOO_init() helpers Igor Mammedov
2017-08-18 10:08 ` [Qemu-devel] [PATCH for-2.11 01/27] sparc: convert cpu models to SPARC cpu subclasses Igor Mammedov
2017-08-18 19:00   ` Philippe Mathieu-Daudé
2017-08-21 10:55     ` Igor Mammedov
2017-08-23  1:12       ` Philippe Mathieu-Daudé
2017-08-24  2:40         ` Philippe Mathieu-Daudé
2017-08-18 10:08 ` [Qemu-devel] [PATCH for-2.11 02/27] sparc: embed sparc_def_t into CPUSPARCState Igor Mammedov
2017-08-24  2:45   ` Philippe Mathieu-Daudé
2017-08-18 10:08 ` [Qemu-devel] [PATCH for-2.11 03/27] sparc: convert cpu features to qdev properties Igor Mammedov
2017-08-18 18:24   ` Eduardo Habkost
2017-08-21 11:03     ` Igor Mammedov
2017-08-23 13:07       ` Eduardo Habkost [this message]
2017-08-23 14:17         ` Igor Mammedov
2017-08-24 13:32   ` Philippe Mathieu-Daudé
2017-08-18 10:08 ` [Qemu-devel] [PATCH for-2.11 04/27] sparc: move adhoc CPUSPARCState initialization to realize time Igor Mammedov
2017-08-24  2:47   ` Philippe Mathieu-Daudé
2017-08-18 10:08 ` [Qemu-devel] [PATCH for-2.11 05/27] target-i386: cpu: convert plus/minus properties to global properties Igor Mammedov
2017-08-18 10:08 ` [Qemu-devel] [PATCH for-2.11 06/27] x86: extract legacy cpu features format parser Igor Mammedov
2017-08-18 18:08   ` Eduardo Habkost
2017-08-21 11:06     ` Igor Mammedov
2017-08-23 14:34   ` Eduardo Habkost
2017-08-23 16:29     ` Igor Mammedov
2017-08-23 16:46       ` Eduardo Habkost
2017-08-23 17:37         ` Igor Mammedov
2017-08-23 17:58           ` Eduardo Habkost
2017-08-24  9:18             ` Igor Mammedov
2017-08-24 13:43               ` Igor Mammedov
2017-08-24 13:45               ` Eduardo Habkost
2017-08-18 10:08 ` [Qemu-devel] [PATCH for-2.11 07/27] sparc: replace custom cpu feature parsing with cpu_legacy_parse_featurestr() Igor Mammedov
2017-08-24 13:27   ` Philippe Mathieu-Daudé
2017-08-18 10:08 ` [Qemu-devel] [PATCH for-2.11 08/27] sparc: replace cpu_sparc_init() with cpu_generic_init() Igor Mammedov
2017-08-18 19:57   ` Philippe Mathieu-Daudé
2017-08-21 11:11     ` Igor Mammedov
2017-08-24  2:51       ` Philippe Mathieu-Daudé
2017-08-24  2:49   ` Philippe Mathieu-Daudé
2017-08-18 10:08 ` [Qemu-devel] [PATCH for-2.11 09/27] s390x: replace cpu_s390x_init() " Igor Mammedov
2017-08-18 10:08 ` [Qemu-devel] [PATCH for-2.11 10/27] alpha: replace cpu_alpha_init() " Igor Mammedov
2017-08-18 10:08 ` [Qemu-devel] [PATCH for-2.11 11/27] hppa: replace cpu_hppa_init() " Igor Mammedov
2017-08-18 10:08 ` [Qemu-devel] [PATCH for-2.11 12/27] m68k: replace cpu_m68k_init() " Igor Mammedov
2017-08-18 10:08 ` [Qemu-devel] [PATCH for-2.11 13/27] microblaze: replace cpu_mb_init() " Igor Mammedov
2017-08-18 10:08 ` [Qemu-devel] [PATCH for-2.11 14/27] nios2: replace cpu_nios2_init() " Igor Mammedov
2017-08-18 10:08 ` [Qemu-devel] [PATCH for-2.11 15/27] tilegx: replace cpu_tilegx_init() " Igor Mammedov
2017-08-18 10:08 ` [Qemu-devel] [PATCH for-2.11 16/27] xtensa: replace cpu_xtensa_init() " Igor Mammedov
2017-08-24 13:21   ` Philippe Mathieu-Daudé
2017-08-18 10:08 ` [Qemu-devel] [PATCH for-2.11 17/27] tricore: replace cpu_tricore_init() " Igor Mammedov
2017-08-18 10:08 ` [Qemu-devel] [PATCH for-2.11 18/27] sh4: replace cpu_sh4_init() " Igor Mammedov
2017-08-18 10:08 ` [Qemu-devel] [PATCH for-2.11 19/27] arm: replace cpu_arm_init() " Igor Mammedov
2017-08-24 13:26   ` Philippe Mathieu-Daudé
2017-08-18 10:08 ` [Qemu-devel] [PATCH for-2.11 20/27] cris: replace cpu_cris_init() " Igor Mammedov
2017-08-18 10:08 ` [Qemu-devel] [PATCH for-2.11 21/27] x86: replace cpu_x86_init() " Igor Mammedov
2017-08-18 10:08 ` [Qemu-devel] [PATCH for-2.11 22/27] lm32: replace cpu_lm32_init() " Igor Mammedov
2017-08-18 10:08 ` [Qemu-devel] [PATCH for-2.11 23/27] moxie: replace cpu_moxie_init() " Igor Mammedov
2017-08-18 10:08 ` [Qemu-devel] [PATCH for-2.11 24/27] openrisc: replace cpu_openrisc_init() " Igor Mammedov
2017-08-18 10:08 ` [Qemu-devel] [PATCH for-2.11 25/27] unicore32: replace uc32_cpu_init() " Igor Mammedov
2017-08-18 10:08 ` [Qemu-devel] [PATCH for-2.11 26/27] ppc: replace cpu_ppc_init() " Igor Mammedov
2017-08-18 10:08 ` [Qemu-devel] [PATCH for-2.11 27/27] fix build failure in nbd_read_reply_entry() Igor Mammedov

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=20170823130714.GK19998@localhost.localdomain \
    --to=ehabkost@redhat.com \
    --cc=atar4qemu@gmail.com \
    --cc=imammedo@redhat.com \
    --cc=mark.cave-ayland@ilande.co.uk \
    --cc=qemu-devel@nongnu.org \
    /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.