All of lore.kernel.org
 help / color / mirror / Atom feed
From: Igor Mammedov <imammedo@redhat.com>
To: "Andreas Färber" <afaerber@suse.de>
Cc: Alexey Kardashevskiy <aik@ozlabs.ru>,
	qemu-devel@nongnu.org, Eduardo Habkost <ehabkost@redhat.com>
Subject: Re: [Qemu-devel] [PATCH qom-cpu 1/6] cpu: Introduce CPUClass::parse_features() hook
Date: Wed, 5 Mar 2014 16:04:21 +0100	[thread overview]
Message-ID: <20140305160421.4ce44afe@nial.usersys.redhat.com> (raw)
In-Reply-To: <1393901749-5944-2-git-send-email-afaerber@suse.de>

On Tue,  4 Mar 2014 03:55:44 +0100
Andreas Färber <afaerber@suse.de> wrote:

> Adapt the X86CPU implementation to suit the generic hook.
> This involves a cleanup of error handling to cope with NULL errp.
> 
> Signed-off-by: Andreas Färber <afaerber@suse.de>
> ---
>  include/qom/cpu.h |  3 +++
>  target-i386/cpu.c | 36 +++++++++++++++++++++---------------
>  2 files changed, 24 insertions(+), 15 deletions(-)
> 
> diff --git a/include/qom/cpu.h b/include/qom/cpu.h
> index 64ebfa5..43d253a 100644
> --- a/include/qom/cpu.h
> +++ b/include/qom/cpu.h
> @@ -67,6 +67,8 @@ struct TranslationBlock;
>   * CPUClass:
>   * @class_by_name: Callback to map -cpu command line model name to an
>   * instantiatable CPU type.
> + * @parse_features: Callback to parse command line arguments.
> + * The argument may be modified by the callback.
Could you specify which argument is expected to be modified?

>   * @reset: Callback to reset the #CPUState to its initial state.
>   * @reset_dump_flags: #CPUDumpFlags to use for reset logging.
>   * @has_work: Callback for checking if there is work to do.
> @@ -96,6 +98,7 @@ typedef struct CPUClass {
>      /*< public >*/
>  
>      ObjectClass *(*class_by_name)(const char *cpu_model);
> +    void (*parse_features)(CPUState *cpu, char *str, Error **errp);
>  
>      void (*reset)(CPUState *cpu);
>      int reset_dump_flags;
> diff --git a/target-i386/cpu.c b/target-i386/cpu.c
> index cbc8cd6..653840a 100644
> --- a/target-i386/cpu.c
> +++ b/target-i386/cpu.c
> @@ -1626,8 +1626,10 @@ static inline void feat2prop(char *s)
>  
>  /* Parse "+feature,-feature,feature=foo" CPU feature string
>   */
> -static void cpu_x86_parse_featurestr(X86CPU *cpu, char *features, Error **errp)
> +static void x86_cpu_parse_featurestr(CPUState *cs, char *features,
> +                                     Error **errp)
>  {
> +    X86CPU *cpu = X86_CPU(cs);
>      char *featurestr; /* Single 'key=value" string being parsed */
>      /* Features to be added */
>      FeatureWordArray plus_features = { 0 };
> @@ -1635,6 +1637,7 @@ static void cpu_x86_parse_featurestr(X86CPU *cpu, char *features, Error **errp)
>      FeatureWordArray minus_features = { 0 };
>      uint32_t numvalue;
>      CPUX86State *env = &cpu->env;
> +    Error *local_err = NULL;
>  
>      featurestr = features ? strtok(features, ",") : NULL;
>  
> @@ -1653,16 +1656,16 @@ static void cpu_x86_parse_featurestr(X86CPU *cpu, char *features, Error **errp)
>  
>                  numvalue = strtoul(val, &err, 0);
>                  if (!*val || *err) {
> -                    error_setg(errp, "bad numerical value %s", val);
> +                    error_setg(&local_err, "bad numerical value %s", val);
>                      goto out;
>                  }
>                  if (numvalue < 0x80000000) {
> -                    fprintf(stderr, "xlevel value shall always be >= 0x80000000"
> -                            ", fixup will be removed in future versions\n");
> +                    error_report("xlevel value shall always be >= 0x80000000"
> +                                 ", fixup will be removed in future versions");
>                      numvalue += 0x80000000;
>                  }
>                  snprintf(num, sizeof(num), "%" PRIu32, numvalue);
> -                object_property_parse(OBJECT(cpu), num, featurestr, errp);
> +                object_property_parse(OBJECT(cpu), num, featurestr, &local_err);
>              } else if (!strcmp(featurestr, "tsc-freq")) {
>                  int64_t tsc_freq;
>                  char *err;
> @@ -1671,36 +1674,38 @@ static void cpu_x86_parse_featurestr(X86CPU *cpu, char *features, Error **errp)
>                  tsc_freq = strtosz_suffix_unit(val, &err,
>                                                 STRTOSZ_DEFSUFFIX_B, 1000);
>                  if (tsc_freq < 0 || *err) {
> -                    error_setg(errp, "bad numerical value %s", val);
> +                    error_setg(&local_err, "bad numerical value %s", val);
>                      goto out;
>                  }
>                  snprintf(num, sizeof(num), "%" PRId64, tsc_freq);
> -                object_property_parse(OBJECT(cpu), num, "tsc-frequency", errp);
> +                object_property_parse(OBJECT(cpu), num, "tsc-frequency",
> +                                      &local_err);
>              } else if (!strcmp(featurestr, "hv-spinlocks")) {
>                  char *err;
>                  const int min = 0xFFF;
>                  char num[32];
>                  numvalue = strtoul(val, &err, 0);
>                  if (!*val || *err) {
> -                    error_setg(errp, "bad numerical value %s", val);
> +                    error_setg(&local_err, "bad numerical value %s", val);
>                      goto out;
>                  }
>                  if (numvalue < min) {
> -                    fprintf(stderr, "hv-spinlocks value shall always be >= 0x%x"
> -                            ", fixup will be removed in future versions\n",
> +                    error_report("hv-spinlocks value shall always be >= 0x%x"
> +                            ", fixup will be removed in future versions",
>                              min);
>                      numvalue = min;
>                  }
>                  snprintf(num, sizeof(num), "%" PRId32, numvalue);
> -                object_property_parse(OBJECT(cpu), num, featurestr, errp);
> +                object_property_parse(OBJECT(cpu), num, featurestr, &local_err);
>              } else {
> -                object_property_parse(OBJECT(cpu), val, featurestr, errp);
> +                object_property_parse(OBJECT(cpu), val, featurestr, &local_err);
>              }
>          } else {
>              feat2prop(featurestr);
> -            object_property_parse(OBJECT(cpu), "on", featurestr, errp);
> +            object_property_parse(OBJECT(cpu), "on", featurestr, &local_err);
>          }
> -        if (error_is_set(errp)) {
> +        if (local_err) {
> +            error_propagate(errp, local_err);
>              goto out;
>          }
>          featurestr = strtok(NULL, ",");
> @@ -1926,7 +1931,7 @@ X86CPU *cpu_x86_create(const char *cpu_model, DeviceState *icc_bridge,
>          goto out;
>      }
>  
> -    cpu_x86_parse_featurestr(cpu, features, &error);
> +    x86_cpu_parse_featurestr(CPU(cpu), features, &error);
>      if (error) {
>          goto out;
>      }
> @@ -2748,6 +2753,7 @@ static void x86_cpu_common_class_init(ObjectClass *oc, void *data)
>      cc->reset = x86_cpu_reset;
>      cc->reset_dump_flags = CPU_DUMP_FPU | CPU_DUMP_CCOP;
>  
> +    cc->parse_features = x86_cpu_parse_featurestr;
>      cc->has_work = x86_cpu_has_work;
>      cc->do_interrupt = x86_cpu_do_interrupt;
>      cc->dump_state = x86_cpu_dump_state;

  reply	other threads:[~2014-03-05 15:04 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-03-04  2:55 [Qemu-devel] [PATCH qom-cpu 0/6] cpu: Unifying features parsing Andreas Färber
2014-03-04  2:55 ` [Qemu-devel] [PATCH qom-cpu 1/6] cpu: Introduce CPUClass::parse_features() hook Andreas Färber
2014-03-05 15:04   ` Igor Mammedov [this message]
2014-03-05 16:06     ` Andreas Färber
2014-03-05 16:57       ` Igor Mammedov
2014-03-05 22:31         ` Eduardo Habkost
2014-03-09 15:55           ` Andreas Färber
2014-03-09 15:45   ` Andreas Färber
2014-03-10 11:25     ` Igor Mammedov
2014-03-04  2:55 ` [Qemu-devel] [PATCH qom-cpu 2/6] target-sparc: Use error_report() for CPU error reporting Andreas Färber
2014-03-04  2:55 ` [Qemu-devel] [PATCH qom-cpu 3/6] target-sparc: Implement CPUClass::parse_features() for SPARCCPU Andreas Färber
2014-03-04  2:55 ` [Qemu-devel] [PATCH qom-cpu 4/6] target-sparc: Defer SPARCCPU feature inference to QOM realize Andreas Färber
2014-03-04  2:55 ` [Qemu-devel] [PATCH qom-cpu 5/6] cpu: Implement CPUClass::parse_features() for the rest of CPUs Andreas Färber
2014-03-04  2:55 ` [Qemu-devel] [PATCH qom-cpu 6/6] cpu: Factor out cpu_generic_init() Andreas Färber
2014-03-04 20:32 ` [Qemu-devel] [PATCH qom-cpu 0/6] cpu: Unifying features parsing Andreas Färber
2014-03-08 20:50   ` Mark Cave-Ayland
2014-03-09 16:19     ` Andreas Färber
2014-03-05  2:50 ` Alexey Kardashevskiy
2014-03-05  8:30   ` Andreas Färber
2014-03-05 11:27     ` Alexey Kardashevskiy
2014-03-09 16:11       ` Andreas Färber

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=20140305160421.4ce44afe@nial.usersys.redhat.com \
    --to=imammedo@redhat.com \
    --cc=afaerber@suse.de \
    --cc=aik@ozlabs.ru \
    --cc=ehabkost@redhat.com \
    --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.