qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] target-arm: Fix multi-pass virt CPU feature par


From: Greg Bellows
Subject: Re: [Qemu-devel] [PATCH] target-arm: Fix multi-pass virt CPU feature parsing
Date: Tue, 3 Mar 2015 13:27:51 -0600

Just saw that Ard sent out a similar fix.  Disregard this patch if we decide to go with his (<address@hidden>).  

Greg

On Tue, Mar 3, 2015 at 1:02 PM, Greg Bellows <address@hidden> 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 <address@hidden>
---
 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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]