diff mbox

[7/8] cpu: add initialization helper without realize

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

Commit Message

Greg Kurz June 29, 2016, 8:51 p.m. UTC
This will allow PowerPC machines to compute the device-tree cpu id
between initialization and realization of the cpu.

Signed-off-by: Greg Kurz <groug@kaod.org>
---
 include/qom/cpu.h |   12 ++++++++++++
 qom/cpu.c         |   19 ++++++++++++++++---
 2 files changed, 28 insertions(+), 3 deletions(-)
diff mbox

Patch

diff --git a/include/qom/cpu.h b/include/qom/cpu.h
index 63e77607f644..8b3adbbff060 100644
--- a/include/qom/cpu.h
+++ b/include/qom/cpu.h
@@ -557,8 +557,20 @@  ObjectClass *cpu_class_by_name(const char *typename, const char *cpu_model);
  */
 CPUState *cpu_generic_init(const char *typename, const char *cpu_model);
 
 /**
+ * cpu_generic_init_no_realize:
+ * @typename: The CPU base type.
+ * @cpu_model: The model string including optional parameters.
+ *
+ * Instantiates a CPU, processes optional parameters.
+ *
+ * Returns: A #CPUState or %NULL if an error occurred.
+ */
+CPUState *cpu_generic_init_no_realize(const char *typename,
+                                      const char *cpu_model);
+
+/**
  * cpu_has_work:
  * @cpu: The vCPU to check.
  *
  * Checks whether the CPU has work to do.
diff --git a/qom/cpu.c b/qom/cpu.c
index 751e992de882..dfe3289991ab 100644
--- a/qom/cpu.c
+++ b/qom/cpu.c
@@ -42,9 +42,10 @@  bool cpu_exists(int64_t id)
     }
     return false;
 }
 
-CPUState *cpu_generic_init(const char *typename, const char *cpu_model)
+static CPUState *cpu_generic_init_common(const char *typename,
+                                         const char *cpu_model, bool realize)
 {
     char *str, *name, *featurestr;
     CPUState *cpu;
     ObjectClass *oc;
@@ -69,10 +70,11 @@  CPUState *cpu_generic_init(const char *typename, const char *cpu_model)
     if (err != NULL) {
         goto out;
     }
 
-    object_property_set_bool(OBJECT(cpu), true, "realized", &err);
-
+    if (realize) {
+        object_property_set_bool(OBJECT(cpu), true, "realized", &err);
+    }
 out:
     if (err != NULL) {
         error_report_err(err);
         object_unref(OBJECT(cpu));
@@ -81,8 +83,19 @@  out:
 
     return cpu;
 }
 
+CPUState *cpu_generic_init(const char *typename, const char *cpu_model)
+{
+    return cpu_generic_init_common(typename, cpu_model, true);
+}
+
+CPUState *cpu_generic_init_no_realize(const char *typename,
+                                      const char *cpu_model)
+{
+    return cpu_generic_init_common(typename, cpu_model, false);
+}
+
 bool cpu_paging_enabled(const CPUState *cpu)
 {
     CPUClass *cc = CPU_GET_CLASS(cpu);