diff mbox

target-arm: Fix multi-pass virt CPU feature parsing

Message ID 1425409336-26671-1-git-send-email-greg.bellows@linaro.org
State New
Headers show

Commit Message

Greg Bellows March 3, 2015, 7:02 p.m. UTC
Fixes issue when combining CPU features and smp. The issue is caused by
parse_feature's use of strtok which modifies the input feature string that is
needed for each smp CPU pass. This patch restores the feature string for each
pass.

Signed-off-by: Greg Bellows <greg.bellows@linaro.org>
---
 hw/arm/virt.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

Comments

Greg Bellows March 3, 2015, 7:27 p.m. UTC | #1
Just saw that Ard sent out a similar fix.  Disregard this patch if we
decide to go with his (<
1425402380-10488-1-git-send-email-ard.biesheuvel@linaro.org>).

Greg

On Tue, Mar 3, 2015 at 1:02 PM, Greg Bellows <greg.bellows@linaro.org>
wrote:

> Fixes issue when combining CPU features and smp. The issue is caused by
> parse_feature's use of strtok which modifies the input feature string that
> is
> needed for each smp CPU pass. This patch restores the feature string for
> each
> pass.
>
> Signed-off-by: Greg Bellows <greg.bellows@linaro.org>
> ---
>  hw/arm/virt.c | 14 ++++++++++++--
>  1 file changed, 12 insertions(+), 2 deletions(-)
>
> diff --git a/hw/arm/virt.c b/hw/arm/virt.c
> index 69f51ac..a64eedd 100644
> --- a/hw/arm/virt.c
> +++ b/hw/arm/virt.c
> @@ -728,7 +728,7 @@ static void machvirt_init(MachineState *machine)
>      const char *cpu_model = machine->cpu_model;
>      VirtBoardInfo *vbi;
>      uint32_t gic_phandle;
> -    char **cpustr;
> +    char **cpustr, *featurestr;
>
>      if (!cpu_model) {
>          cpu_model = "cortex-a15";
> @@ -753,6 +753,12 @@ static void machvirt_init(MachineState *machine)
>
>      create_fdt(vbi);
>
> +    /* Parsing modifies the feature string and we need it for each CPU
> pass, so
> +     * make a copy to refresh from.  Duplicate is used to allocate the
> +     * appropriate storage size.
> +     */
> +    featurestr = g_strdup(cpustr[1]);
> +
>      for (n = 0; n < smp_cpus; n++) {
>          ObjectClass *oc = cpu_class_by_name(TYPE_ARM_CPU, cpustr[0]);
>          CPUClass *cc = CPU_CLASS(oc);
> @@ -766,11 +772,14 @@ static void machvirt_init(MachineState *machine)
>          cpuobj = object_new(object_class_get_name(oc));
>
>          /* Handle any CPU options specified by the user */
> -        cc->parse_features(CPU(cpuobj), cpustr[1], &err);
> +        cc->parse_features(CPU(cpuobj), featurestr, &err);
>          if (err) {
>              error_report("%s", error_get_pretty(err));
>              exit(1);
>          }
> +        /* Refresh the feature string as parse modified the pointer.  */
> +        g_stpcpy(featurestr, cpustr[1]);
> +
>
>          if (!vms->secure) {
>              object_property_set_bool(cpuobj, false, "has_el3", NULL);
> @@ -791,6 +800,7 @@ static void machvirt_init(MachineState *machine)
>
>          object_property_set_bool(cpuobj, true, "realized", NULL);
>      }
> +    g_free(featurestr);
>      g_strfreev(cpustr);
>      fdt_add_timer_nodes(vbi);
>      fdt_add_cpu_nodes(vbi);
> --
> 1.8.3.2
>
>
diff mbox

Patch

diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index 69f51ac..a64eedd 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -728,7 +728,7 @@  static void machvirt_init(MachineState *machine)
     const char *cpu_model = machine->cpu_model;
     VirtBoardInfo *vbi;
     uint32_t gic_phandle;
-    char **cpustr;
+    char **cpustr, *featurestr;
 
     if (!cpu_model) {
         cpu_model = "cortex-a15";
@@ -753,6 +753,12 @@  static void machvirt_init(MachineState *machine)
 
     create_fdt(vbi);
 
+    /* Parsing modifies the feature string and we need it for each CPU pass, so
+     * make a copy to refresh from.  Duplicate is used to allocate the
+     * appropriate storage size.
+     */
+    featurestr = g_strdup(cpustr[1]);
+
     for (n = 0; n < smp_cpus; n++) {
         ObjectClass *oc = cpu_class_by_name(TYPE_ARM_CPU, cpustr[0]);
         CPUClass *cc = CPU_CLASS(oc);
@@ -766,11 +772,14 @@  static void machvirt_init(MachineState *machine)
         cpuobj = object_new(object_class_get_name(oc));
 
         /* Handle any CPU options specified by the user */
-        cc->parse_features(CPU(cpuobj), cpustr[1], &err);
+        cc->parse_features(CPU(cpuobj), featurestr, &err);
         if (err) {
             error_report("%s", error_get_pretty(err));
             exit(1);
         }
+        /* Refresh the feature string as parse modified the pointer.  */
+        g_stpcpy(featurestr, cpustr[1]);
+
 
         if (!vms->secure) {
             object_property_set_bool(cpuobj, false, "has_el3", NULL);
@@ -791,6 +800,7 @@  static void machvirt_init(MachineState *machine)
 
         object_property_set_bool(cpuobj, true, "realized", NULL);
     }
+    g_free(featurestr);
     g_strfreev(cpustr);
     fdt_add_timer_nodes(vbi);
     fdt_add_cpu_nodes(vbi);