diff mbox

[v4,3/5] ppc: open code cpu creation for machine types

Message ID 146832558163.14159.8331407088811390712.stgit@bahia.lan (mailing list archive)
State New, archived
Headers show

Commit Message

Greg Kurz July 12, 2016, 12:13 p.m. UTC
If we want to generate cpu_dt_id in the machine code, this must occur
before the cpu gets realized. We must open code the cpu creation to be
able to do this.

This patch just does that.

Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Greg Kurz <groug@kaod.org>
---
v4: - fix potential access to uninitialized 'cpu' variable
    - added David's R-b tag
---
 hw/ppc/ppc.c |   34 +++++++++++++++++++++++++++++++++-
 1 file changed, 33 insertions(+), 1 deletion(-)
diff mbox

Patch

diff --git a/hw/ppc/ppc.c b/hw/ppc/ppc.c
index 313b3f0b9a51..f908772cd279 100644
--- a/hw/ppc/ppc.c
+++ b/hw/ppc/ppc.c
@@ -32,6 +32,7 @@ 
 #include "sysemu/cpus.h"
 #include "hw/timer/m48t59.h"
 #include "qemu/log.h"
+#include "qapi/error.h"
 #include "qemu/error-report.h"
 #include "qapi/error.h"
 #include "hw/loader.h"
@@ -1354,7 +1355,38 @@  PowerPCCPU *ppc_get_vcpu_by_dt_id(int cpu_dt_id)
 
 PowerPCCPU *ppc_cpu_init(const char *cpu_model)
 {
-    return POWERPC_CPU(cpu_generic_init(TYPE_POWERPC_CPU, cpu_model));
+    PowerPCCPU *cpu = NULL;
+    ObjectClass *oc;
+    gchar **model_pieces;
+    Error *err = NULL;
+
+    model_pieces = g_strsplit(cpu_model, ",", 2);
+    if (!model_pieces[0]) {
+        error_report("Invalid/empty CPU model name");
+        return NULL;
+    }
+
+    oc = cpu_class_by_name(TYPE_POWERPC_CPU, model_pieces[0]);
+    if (oc == NULL) {
+        error_report("Unable to find CPU definition: %s", model_pieces[0]);
+        goto out;
+    }
+
+    cpu = POWERPC_CPU(object_new(object_class_get_name(oc)));
+    object_property_set_bool(OBJECT(cpu), true, "realized", &err);
+
+out:
+    g_strfreev(model_pieces);
+
+    if (err != NULL) {
+        error_report_err(err);
+        if (cpu != NULL) {
+            object_unref(OBJECT(cpu));
+        }
+        return NULL;
+    }
+
+    return cpu;
 }
 
 void ppc_cpu_parse_features(const char *cpu_model)