diff mbox

spapr: fix check of cpu alias name in spapr_get_cpu_core_type()

Message ID 147549680021.17386.17361379735084290696.stgit@bahia
State New
Headers show

Commit Message

Greg Kurz Oct. 3, 2016, 12:13 p.m. UTC
If the user passes an alias name and a property to -cpu, QEMU fails to
find the CPU definition and exits.

$ qemu-system-ppc64 -cpu POWER8E,compat=power7
qemu-system-ppc64: Unable to find sPAPR CPU Core definition

This happens because spapr_get_cpu_core_type() passes the full string from
the command line (i.e. "POWER8E,compat=power7") to ppc_cpu_lookup_alias(),
instead of the alias name piece only (i.e. "POWER8E").

The fix is to pass model_pieces[0] to ppc_cpu_lookup_alias().

Signed-off-by: Greg Kurz <groug@kaod.org>
---
 hw/ppc/spapr_cpu_core.c |    8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

Comments

Bharata B Rao Oct. 3, 2016, 3:14 p.m. UTC | #1
On Mon, Oct 03, 2016 at 02:13:20PM +0200, Greg Kurz wrote:
> If the user passes an alias name and a property to -cpu, QEMU fails to
> find the CPU definition and exits.
> 
> $ qemu-system-ppc64 -cpu POWER8E,compat=power7
> qemu-system-ppc64: Unable to find sPAPR CPU Core definition
> 
> This happens because spapr_get_cpu_core_type() passes the full string from
> the command line (i.e. "POWER8E,compat=power7") to ppc_cpu_lookup_alias(),
> instead of the alias name piece only (i.e. "POWER8E").
> 
> The fix is to pass model_pieces[0] to ppc_cpu_lookup_alias().
> 
> Signed-off-by: Greg Kurz <groug@kaod.org>

Reviewed-by: Bharata B Rao <bharata@linux.vnet.ibm.com>

> ---
>  hw/ppc/spapr_cpu_core.c |    8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
> index 6f0533c34259..35d1873b9ff3 100644
> --- a/hw/ppc/spapr_cpu_core.c
> +++ b/hw/ppc/spapr_cpu_core.c
> @@ -92,20 +92,20 @@ char *spapr_get_cpu_core_type(const char *model)
>      gchar **model_pieces = g_strsplit(model, ",", 2);
> 
>      core_type = g_strdup_printf("%s-%s", model_pieces[0], TYPE_SPAPR_CPU_CORE);
> -    g_strfreev(model_pieces);
> 
>      /* Check whether it exists or whether we have to look up an alias name */
>      if (!object_class_by_name(core_type)) {
>          const char *realmodel;
> 
>          g_free(core_type);
> -        realmodel = ppc_cpu_lookup_alias(model);
> +        core_type = NULL;
> +        realmodel = ppc_cpu_lookup_alias(model_pieces[0]);
>          if (realmodel) {
> -            return spapr_get_cpu_core_type(realmodel);
> +            core_type = spapr_get_cpu_core_type(realmodel);
>          }
> -        return NULL;
>      }
> 
> +    g_strfreev(model_pieces);
>      return core_type;
>  }
>
David Gibson Oct. 4, 2016, 12:20 a.m. UTC | #2
On Mon, Oct 03, 2016 at 08:44:22PM +0530, Bharata B Rao wrote:
> On Mon, Oct 03, 2016 at 02:13:20PM +0200, Greg Kurz wrote:
> > If the user passes an alias name and a property to -cpu, QEMU fails to
> > find the CPU definition and exits.
> > 
> > $ qemu-system-ppc64 -cpu POWER8E,compat=power7
> > qemu-system-ppc64: Unable to find sPAPR CPU Core definition
> > 
> > This happens because spapr_get_cpu_core_type() passes the full string from
> > the command line (i.e. "POWER8E,compat=power7") to ppc_cpu_lookup_alias(),
> > instead of the alias name piece only (i.e. "POWER8E").
> > 
> > The fix is to pass model_pieces[0] to ppc_cpu_lookup_alias().
> > 
> > Signed-off-by: Greg Kurz <groug@kaod.org>
> 
> Reviewed-by: Bharata B Rao <bharata@linux.vnet.ibm.com>

Applied to ppc-for-2.8, thanks.

> 
> > ---
> >  hw/ppc/spapr_cpu_core.c |    8 ++++----
> >  1 file changed, 4 insertions(+), 4 deletions(-)
> > 
> > diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
> > index 6f0533c34259..35d1873b9ff3 100644
> > --- a/hw/ppc/spapr_cpu_core.c
> > +++ b/hw/ppc/spapr_cpu_core.c
> > @@ -92,20 +92,20 @@ char *spapr_get_cpu_core_type(const char *model)
> >      gchar **model_pieces = g_strsplit(model, ",", 2);
> > 
> >      core_type = g_strdup_printf("%s-%s", model_pieces[0], TYPE_SPAPR_CPU_CORE);
> > -    g_strfreev(model_pieces);
> > 
> >      /* Check whether it exists or whether we have to look up an alias name */
> >      if (!object_class_by_name(core_type)) {
> >          const char *realmodel;
> > 
> >          g_free(core_type);
> > -        realmodel = ppc_cpu_lookup_alias(model);
> > +        core_type = NULL;
> > +        realmodel = ppc_cpu_lookup_alias(model_pieces[0]);
> >          if (realmodel) {
> > -            return spapr_get_cpu_core_type(realmodel);
> > +            core_type = spapr_get_cpu_core_type(realmodel);
> >          }
> > -        return NULL;
> >      }
> > 
> > +    g_strfreev(model_pieces);
> >      return core_type;
> >  }
> > 
>
diff mbox

Patch

diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
index 6f0533c34259..35d1873b9ff3 100644
--- a/hw/ppc/spapr_cpu_core.c
+++ b/hw/ppc/spapr_cpu_core.c
@@ -92,20 +92,20 @@  char *spapr_get_cpu_core_type(const char *model)
     gchar **model_pieces = g_strsplit(model, ",", 2);
 
     core_type = g_strdup_printf("%s-%s", model_pieces[0], TYPE_SPAPR_CPU_CORE);
-    g_strfreev(model_pieces);
 
     /* Check whether it exists or whether we have to look up an alias name */
     if (!object_class_by_name(core_type)) {
         const char *realmodel;
 
         g_free(core_type);
-        realmodel = ppc_cpu_lookup_alias(model);
+        core_type = NULL;
+        realmodel = ppc_cpu_lookup_alias(model_pieces[0]);
         if (realmodel) {
-            return spapr_get_cpu_core_type(realmodel);
+            core_type = spapr_get_cpu_core_type(realmodel);
         }
-        return NULL;
     }
 
+    g_strfreev(model_pieces);
     return core_type;
 }