diff mbox

[RFC,v2,11/23] ppc: Create sockets and cores for CPUs

Message ID 1427117764-23008-12-git-send-email-bharata@linux.vnet.ibm.com
State New
Headers show

Commit Message

Bharata B Rao March 23, 2015, 1:35 p.m. UTC
ppc machine init functions create individual CPU threads. Change this
for sPAPR by switching to socket creation. CPUs are created recursively
by socket and core instance init routines.

TODO: Switching to socket level CPU creation is done only for sPAPR
target now.

Signed-off-by: Bharata B Rao <bharata@linux.vnet.ibm.com>
---
 hw/ppc/cpu-core.c           | 17 +++++++++++++++++
 hw/ppc/cpu-socket.c         | 15 +++++++++++++++
 hw/ppc/spapr.c              | 15 ++++++++-------
 target-ppc/cpu.h            |  1 +
 target-ppc/translate_init.c | 46 +++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 87 insertions(+), 7 deletions(-)

Comments

David Gibson March 25, 2015, 2:39 a.m. UTC | #1
On Mon, Mar 23, 2015 at 07:05:52PM +0530, Bharata B Rao wrote:
> ppc machine init functions create individual CPU threads. Change this
> for sPAPR by switching to socket creation. CPUs are created recursively
> by socket and core instance init routines.
> 
> TODO: Switching to socket level CPU creation is done only for sPAPR
> target now.
> 
> Signed-off-by: Bharata B Rao <bharata@linux.vnet.ibm.com>
> ---
>  hw/ppc/cpu-core.c           | 17 +++++++++++++++++
>  hw/ppc/cpu-socket.c         | 15 +++++++++++++++
>  hw/ppc/spapr.c              | 15 ++++++++-------
>  target-ppc/cpu.h            |  1 +
>  target-ppc/translate_init.c | 46 +++++++++++++++++++++++++++++++++++++++++++++
>  5 files changed, 87 insertions(+), 7 deletions(-)
> 
> diff --git a/hw/ppc/cpu-core.c b/hw/ppc/cpu-core.c
> index ed0481f..f60646d 100644
> --- a/hw/ppc/cpu-core.c
> +++ b/hw/ppc/cpu-core.c
> @@ -7,6 +7,8 @@
>  
>  #include "hw/qdev.h"
>  #include "hw/ppc/cpu-core.h"
> +#include "hw/boards.h"
> +#include <sysemu/cpus.h>
>  
>  static int ppc_cpu_core_realize_child(Object *child, void *opaque)
>  {
> @@ -32,10 +34,25 @@ static void ppc_cpu_core_class_init(ObjectClass *oc, void *data)
>      dc->realize = ppc_cpu_core_realize;
>  }
>  
> +static void ppc_cpu_core_instance_init(Object *obj)
> +{
> +    int i;
> +    PowerPCCPU *cpu = NULL;
> +    MachineState *machine = MACHINE(qdev_get_machine());
> +
> +    for (i = 0; i < smp_threads; i++) {
> +        cpu = POWERPC_CPU(cpu_ppc_create(TYPE_POWERPC_CPU, machine->cpu_model));
> +        object_property_add_child(obj, "thread[*]", OBJECT(cpu), &error_abort);
> +        object_unref(OBJECT(cpu));
> +    }
> +}
> +
>  static const TypeInfo ppc_cpu_core_type_info = {
>      .name = TYPE_POWERPC_CPU_CORE,
>      .parent = TYPE_DEVICE,
>      .class_init = ppc_cpu_core_class_init,
> +    .instance_init = ppc_cpu_core_instance_init,
> +    .instance_size = sizeof(PowerPCCPUCore),

The PowerPCCPUCore structure isn't defined in this patch (I assume it
already existed), which suggests that setting the instance_size should
have already been in an earlier patch.

>  };
>  
>  static void ppc_cpu_core_register_types(void)
> diff --git a/hw/ppc/cpu-socket.c b/hw/ppc/cpu-socket.c
> index 602a060..f901336 100644
> --- a/hw/ppc/cpu-socket.c
> +++ b/hw/ppc/cpu-socket.c
> @@ -8,6 +8,7 @@
>  #include "hw/qdev.h"
>  #include "hw/ppc/cpu-socket.h"
>  #include "sysemu/cpus.h"
> +#include "cpu.h"
>  
>  static int ppc_cpu_socket_realize_child(Object *child, void *opaque)
>  {
> @@ -33,10 +34,24 @@ static void ppc_cpu_socket_class_init(ObjectClass *oc, void *data)
>      dc->realize = ppc_cpu_socket_realize;
>  }
>  
> +static void ppc_cpu_socket_instance_init(Object *obj)
> +{
> +    int i;
> +    Object *core;
> +
> +    for (i = 0; i < smp_cores; i++) {
> +        core = object_new(TYPE_POWERPC_CPU_CORE);
> +        object_property_add_child(obj, "core[*]", core, &error_abort);
> +        object_unref(core);
> +    }
> +}
> +
>  static const TypeInfo ppc_cpu_socket_type_info = {
>      .name = TYPE_POWERPC_CPU_SOCKET,
>      .parent = TYPE_CPU_SOCKET,
>      .class_init = ppc_cpu_socket_class_init,
> +    .instance_init = ppc_cpu_socket_instance_init,
> +    .instance_size = sizeof(PowerPCCPUSocket),

Likewise for PowerPCCPUSocket.
>  
> +/*
> + * This is essentially same as cpu_generic_init() but without a set
> + * realize call.
> + */

In which case it would probably make more sense to have this be a
generic function, and implement cpu_generic_init() in terms of it.

> +CPUState *cpu_ppc_create(const char *typename, const char *cpu_model)
> +{
> +    char *str, *name, *featurestr;
> +    CPUState *cpu;
> +    ObjectClass *oc;
> +    CPUClass *cc;
> +    Error *err = NULL;
> +
> +    str = g_strdup(cpu_model);
> +    name = strtok(str, ",");
> +
> +    oc = cpu_class_by_name(typename, name);
> +    if (oc == NULL) {
> +        g_free(str);
> +        return NULL;
> +    }
> +
> +    cpu = CPU(object_new(object_class_get_name(oc)));
> +    cc = CPU_GET_CLASS(cpu);
> +
> +    featurestr = strtok(NULL, ",");
> +    cc->parse_features(cpu, featurestr, &err);
> +    g_free(str);
> +    if (err != NULL) {
> +        goto out;
> +    }
> +
> +out:
> +    if (err != NULL) {
> +        error_report("%s", error_get_pretty(err));
> +        error_free(err);
> +        object_unref(OBJECT(cpu));
> +        return NULL;
> +    }
> +
> +    return cpu;
> +}
> +
> +/*
> + * TODO: This can be removed when all powerpc targets are converted to
> + * socket level CPU realization.
> + */
>  PowerPCCPU *cpu_ppc_init(const char *cpu_model)
>  {
>      return POWERPC_CPU(cpu_generic_init(TYPE_POWERPC_CPU, cpu_model));
Bharata B Rao March 25, 2015, 8:33 a.m. UTC | #2
On Wed, Mar 25, 2015 at 01:39:02PM +1100, David Gibson wrote:
> On Mon, Mar 23, 2015 at 07:05:52PM +0530, Bharata B Rao wrote:
> > ppc machine init functions create individual CPU threads. Change this
> > for sPAPR by switching to socket creation. CPUs are created recursively
> > by socket and core instance init routines.
> > 
> > TODO: Switching to socket level CPU creation is done only for sPAPR
> > target now.
> > 
> > Signed-off-by: Bharata B Rao <bharata@linux.vnet.ibm.com>
> > ---
> >  hw/ppc/cpu-core.c           | 17 +++++++++++++++++
> >  hw/ppc/cpu-socket.c         | 15 +++++++++++++++
> >  hw/ppc/spapr.c              | 15 ++++++++-------
> >  target-ppc/cpu.h            |  1 +
> >  target-ppc/translate_init.c | 46 +++++++++++++++++++++++++++++++++++++++++++++
> >  5 files changed, 87 insertions(+), 7 deletions(-)
> > 
> > diff --git a/hw/ppc/cpu-core.c b/hw/ppc/cpu-core.c
> > index ed0481f..f60646d 100644
> > --- a/hw/ppc/cpu-core.c
> > +++ b/hw/ppc/cpu-core.c
> > @@ -7,6 +7,8 @@
> >  
> >  #include "hw/qdev.h"
> >  #include "hw/ppc/cpu-core.h"
> > +#include "hw/boards.h"
> > +#include <sysemu/cpus.h>
> >  
> >  static int ppc_cpu_core_realize_child(Object *child, void *opaque)
> >  {
> > @@ -32,10 +34,25 @@ static void ppc_cpu_core_class_init(ObjectClass *oc, void *data)
> >      dc->realize = ppc_cpu_core_realize;
> >  }
> >  
> > +static void ppc_cpu_core_instance_init(Object *obj)
> > +{
> > +    int i;
> > +    PowerPCCPU *cpu = NULL;
> > +    MachineState *machine = MACHINE(qdev_get_machine());
> > +
> > +    for (i = 0; i < smp_threads; i++) {
> > +        cpu = POWERPC_CPU(cpu_ppc_create(TYPE_POWERPC_CPU, machine->cpu_model));
> > +        object_property_add_child(obj, "thread[*]", OBJECT(cpu), &error_abort);
> > +        object_unref(OBJECT(cpu));
> > +    }
> > +}
> > +
> >  static const TypeInfo ppc_cpu_core_type_info = {
> >      .name = TYPE_POWERPC_CPU_CORE,
> >      .parent = TYPE_DEVICE,
> >      .class_init = ppc_cpu_core_class_init,
> > +    .instance_init = ppc_cpu_core_instance_init,
> > +    .instance_size = sizeof(PowerPCCPUCore),
> 
> The PowerPCCPUCore structure isn't defined in this patch (I assume it
> already existed), which suggests that setting the instance_size should
> have already been in an earlier patch.

PowerPCCPUCore is already defined, but I put the instance_size here
since I needed instance_init only here. I thought it is better to
have instance_init and instance_size populated together.

> 
> >  };
> >  
> >  static void ppc_cpu_core_register_types(void)
> > diff --git a/hw/ppc/cpu-socket.c b/hw/ppc/cpu-socket.c
> > index 602a060..f901336 100644
> > --- a/hw/ppc/cpu-socket.c
> > +++ b/hw/ppc/cpu-socket.c
> > @@ -8,6 +8,7 @@
> >  #include "hw/qdev.h"
> >  #include "hw/ppc/cpu-socket.h"
> >  #include "sysemu/cpus.h"
> > +#include "cpu.h"
> >  
> >  static int ppc_cpu_socket_realize_child(Object *child, void *opaque)
> >  {
> > @@ -33,10 +34,24 @@ static void ppc_cpu_socket_class_init(ObjectClass *oc, void *data)
> >      dc->realize = ppc_cpu_socket_realize;
> >  }
> >  
> > +static void ppc_cpu_socket_instance_init(Object *obj)
> > +{
> > +    int i;
> > +    Object *core;
> > +
> > +    for (i = 0; i < smp_cores; i++) {
> > +        core = object_new(TYPE_POWERPC_CPU_CORE);
> > +        object_property_add_child(obj, "core[*]", core, &error_abort);
> > +        object_unref(core);
> > +    }
> > +}
> > +
> >  static const TypeInfo ppc_cpu_socket_type_info = {
> >      .name = TYPE_POWERPC_CPU_SOCKET,
> >      .parent = TYPE_CPU_SOCKET,
> >      .class_init = ppc_cpu_socket_class_init,
> > +    .instance_init = ppc_cpu_socket_instance_init,
> > +    .instance_size = sizeof(PowerPCCPUSocket),
> 
> Likewise for PowerPCCPUSocket.
> >  
> > +/*
> > + * This is essentially same as cpu_generic_init() but without a set
> > + * realize call.
> > + */
> 
> In which case it would probably make more sense to have this be a
> generic function, and implement cpu_generic_init() in terms of it.

Actually multiple people are touching that part of the code, I so I
figured it will be a bit easier for now to contain the changes within ppc.
But yes, eventually we should do what you are suggesting.
David Gibson March 26, 2015, 1:54 a.m. UTC | #3
On Wed, Mar 25, 2015 at 02:03:10PM +0530, Bharata B Rao wrote:
> On Wed, Mar 25, 2015 at 01:39:02PM +1100, David Gibson wrote:
> > On Mon, Mar 23, 2015 at 07:05:52PM +0530, Bharata B Rao wrote:
> > > ppc machine init functions create individual CPU threads. Change this
> > > for sPAPR by switching to socket creation. CPUs are created recursively
> > > by socket and core instance init routines.
> > > 
> > > TODO: Switching to socket level CPU creation is done only for sPAPR
> > > target now.
> > > 
> > > Signed-off-by: Bharata B Rao <bharata@linux.vnet.ibm.com>
> > > ---
> > >  hw/ppc/cpu-core.c           | 17 +++++++++++++++++
> > >  hw/ppc/cpu-socket.c         | 15 +++++++++++++++
> > >  hw/ppc/spapr.c              | 15 ++++++++-------
> > >  target-ppc/cpu.h            |  1 +
> > >  target-ppc/translate_init.c | 46 +++++++++++++++++++++++++++++++++++++++++++++
> > >  5 files changed, 87 insertions(+), 7 deletions(-)
> > > 
> > > diff --git a/hw/ppc/cpu-core.c b/hw/ppc/cpu-core.c
> > > index ed0481f..f60646d 100644
> > > --- a/hw/ppc/cpu-core.c
> > > +++ b/hw/ppc/cpu-core.c
> > > @@ -7,6 +7,8 @@
> > >  
> > >  #include "hw/qdev.h"
> > >  #include "hw/ppc/cpu-core.h"
> > > +#include "hw/boards.h"
> > > +#include <sysemu/cpus.h>
> > >  
> > >  static int ppc_cpu_core_realize_child(Object *child, void *opaque)
> > >  {
> > > @@ -32,10 +34,25 @@ static void ppc_cpu_core_class_init(ObjectClass *oc, void *data)
> > >      dc->realize = ppc_cpu_core_realize;
> > >  }
> > >  
> > > +static void ppc_cpu_core_instance_init(Object *obj)
> > > +{
> > > +    int i;
> > > +    PowerPCCPU *cpu = NULL;
> > > +    MachineState *machine = MACHINE(qdev_get_machine());
> > > +
> > > +    for (i = 0; i < smp_threads; i++) {
> > > +        cpu = POWERPC_CPU(cpu_ppc_create(TYPE_POWERPC_CPU, machine->cpu_model));
> > > +        object_property_add_child(obj, "thread[*]", OBJECT(cpu), &error_abort);
> > > +        object_unref(OBJECT(cpu));
> > > +    }
> > > +}
> > > +
> > >  static const TypeInfo ppc_cpu_core_type_info = {
> > >      .name = TYPE_POWERPC_CPU_CORE,
> > >      .parent = TYPE_DEVICE,
> > >      .class_init = ppc_cpu_core_class_init,
> > > +    .instance_init = ppc_cpu_core_instance_init,
> > > +    .instance_size = sizeof(PowerPCCPUCore),
> > 
> > The PowerPCCPUCore structure isn't defined in this patch (I assume it
> > already existed), which suggests that setting the instance_size should
> > have already been in an earlier patch.
> 
> PowerPCCPUCore is already defined, but I put the instance_size here
> since I needed instance_init only here. I thought it is better to
> have instance_init and instance_size populated together.

Hm, yes, it does make sense to declare instance_init and instance_size
together.  It also makes sense to declare instance_size and the
associated type together.

Maybe folding this together with patch 8/23 would make sense?

> > >  };
> > >  
> > >  static void ppc_cpu_core_register_types(void)
> > > diff --git a/hw/ppc/cpu-socket.c b/hw/ppc/cpu-socket.c
> > > index 602a060..f901336 100644
> > > --- a/hw/ppc/cpu-socket.c
> > > +++ b/hw/ppc/cpu-socket.c
> > > @@ -8,6 +8,7 @@
> > >  #include "hw/qdev.h"
> > >  #include "hw/ppc/cpu-socket.h"
> > >  #include "sysemu/cpus.h"
> > > +#include "cpu.h"
> > >  
> > >  static int ppc_cpu_socket_realize_child(Object *child, void *opaque)
> > >  {
> > > @@ -33,10 +34,24 @@ static void ppc_cpu_socket_class_init(ObjectClass *oc, void *data)
> > >      dc->realize = ppc_cpu_socket_realize;
> > >  }
> > >  
> > > +static void ppc_cpu_socket_instance_init(Object *obj)
> > > +{
> > > +    int i;
> > > +    Object *core;
> > > +
> > > +    for (i = 0; i < smp_cores; i++) {
> > > +        core = object_new(TYPE_POWERPC_CPU_CORE);
> > > +        object_property_add_child(obj, "core[*]", core, &error_abort);
> > > +        object_unref(core);
> > > +    }
> > > +}
> > > +
> > >  static const TypeInfo ppc_cpu_socket_type_info = {
> > >      .name = TYPE_POWERPC_CPU_SOCKET,
> > >      .parent = TYPE_CPU_SOCKET,
> > >      .class_init = ppc_cpu_socket_class_init,
> > > +    .instance_init = ppc_cpu_socket_instance_init,
> > > +    .instance_size = sizeof(PowerPCCPUSocket),
> > 
> > Likewise for PowerPCCPUSocket.
> > >  
> > > +/*
> > > + * This is essentially same as cpu_generic_init() but without a set
> > > + * realize call.
> > > + */
> > 
> > In which case it would probably make more sense to have this be a
> > generic function, and implement cpu_generic_init() in terms of it.
> 
> Actually multiple people are touching that part of the code, I so I
> figured it will be a bit easier for now to contain the changes within ppc.
> But yes, eventually we should do what you are suggesting.

Ok.
diff mbox

Patch

diff --git a/hw/ppc/cpu-core.c b/hw/ppc/cpu-core.c
index ed0481f..f60646d 100644
--- a/hw/ppc/cpu-core.c
+++ b/hw/ppc/cpu-core.c
@@ -7,6 +7,8 @@ 
 
 #include "hw/qdev.h"
 #include "hw/ppc/cpu-core.h"
+#include "hw/boards.h"
+#include <sysemu/cpus.h>
 
 static int ppc_cpu_core_realize_child(Object *child, void *opaque)
 {
@@ -32,10 +34,25 @@  static void ppc_cpu_core_class_init(ObjectClass *oc, void *data)
     dc->realize = ppc_cpu_core_realize;
 }
 
+static void ppc_cpu_core_instance_init(Object *obj)
+{
+    int i;
+    PowerPCCPU *cpu = NULL;
+    MachineState *machine = MACHINE(qdev_get_machine());
+
+    for (i = 0; i < smp_threads; i++) {
+        cpu = POWERPC_CPU(cpu_ppc_create(TYPE_POWERPC_CPU, machine->cpu_model));
+        object_property_add_child(obj, "thread[*]", OBJECT(cpu), &error_abort);
+        object_unref(OBJECT(cpu));
+    }
+}
+
 static const TypeInfo ppc_cpu_core_type_info = {
     .name = TYPE_POWERPC_CPU_CORE,
     .parent = TYPE_DEVICE,
     .class_init = ppc_cpu_core_class_init,
+    .instance_init = ppc_cpu_core_instance_init,
+    .instance_size = sizeof(PowerPCCPUCore),
 };
 
 static void ppc_cpu_core_register_types(void)
diff --git a/hw/ppc/cpu-socket.c b/hw/ppc/cpu-socket.c
index 602a060..f901336 100644
--- a/hw/ppc/cpu-socket.c
+++ b/hw/ppc/cpu-socket.c
@@ -8,6 +8,7 @@ 
 #include "hw/qdev.h"
 #include "hw/ppc/cpu-socket.h"
 #include "sysemu/cpus.h"
+#include "cpu.h"
 
 static int ppc_cpu_socket_realize_child(Object *child, void *opaque)
 {
@@ -33,10 +34,24 @@  static void ppc_cpu_socket_class_init(ObjectClass *oc, void *data)
     dc->realize = ppc_cpu_socket_realize;
 }
 
+static void ppc_cpu_socket_instance_init(Object *obj)
+{
+    int i;
+    Object *core;
+
+    for (i = 0; i < smp_cores; i++) {
+        core = object_new(TYPE_POWERPC_CPU_CORE);
+        object_property_add_child(obj, "core[*]", core, &error_abort);
+        object_unref(core);
+    }
+}
+
 static const TypeInfo ppc_cpu_socket_type_info = {
     .name = TYPE_POWERPC_CPU_SOCKET,
     .parent = TYPE_CPU_SOCKET,
     .class_init = ppc_cpu_socket_class_init,
+    .instance_init = ppc_cpu_socket_instance_init,
+    .instance_size = sizeof(PowerPCCPUSocket),
 };
 
 static void ppc_cpu_socket_register_types(void)
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 16b67f4..f52d38f 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -37,6 +37,7 @@ 
 #include "mmu-hash64.h"
 #include "qom/cpu.h"
 
+#include "hw/ppc/cpu-socket.h"
 #include "hw/boards.h"
 #include "hw/ppc/ppc.h"
 #include "hw/loader.h"
@@ -1469,7 +1470,6 @@  static void ppc_spapr_init(MachineState *machine)
     const char *kernel_cmdline = machine->kernel_cmdline;
     const char *initrd_filename = machine->initrd_filename;
     const char *boot_device = machine->boot_order;
-    PowerPCCPU *cpu;
     PCIHostState *phb;
     int i;
     MemoryRegion *sysmem = get_system_memory();
@@ -1484,6 +1484,8 @@  static void ppc_spapr_init(MachineState *machine)
     bool kernel_le = false;
     char *filename;
     int smt = kvmppc_smt_threads();
+    Object *socket;
+    int sockets;
 
     msi_supported = true;
 
@@ -1548,12 +1550,11 @@  static void ppc_spapr_init(MachineState *machine)
     if (machine->cpu_model == NULL) {
         machine->cpu_model = kvm_enabled() ? "host" : "POWER7";
     }
-    for (i = 0; i < smp_cpus; i++) {
-        cpu = cpu_ppc_init(machine->cpu_model);
-        if (cpu == NULL) {
-            fprintf(stderr, "Unable to find PowerPC CPU definition\n");
-            exit(1);
-        }
+
+    sockets = smp_cpus / smp_cores / smp_threads;
+    for (i = 0; i < sockets; i++) {
+        socket = object_new(TYPE_POWERPC_CPU_SOCKET);
+        object_property_set_bool(socket, true, "realized", &error_abort);
     }
 
     /* allocate RAM */
diff --git a/target-ppc/cpu.h b/target-ppc/cpu.h
index abc3545..f15cc2c 100644
--- a/target-ppc/cpu.h
+++ b/target-ppc/cpu.h
@@ -1162,6 +1162,7 @@  do {                                            \
 
 /*****************************************************************************/
 PowerPCCPU *cpu_ppc_init(const char *cpu_model);
+CPUState *cpu_ppc_create(const char *typename, const char *cpu_model);
 void ppc_translate_init(void);
 void gen_update_current_nip(void *opaque);
 int cpu_ppc_exec (CPUPPCState *s);
diff --git a/target-ppc/translate_init.c b/target-ppc/translate_init.c
index d74f4f0..a8716cf 100644
--- a/target-ppc/translate_init.c
+++ b/target-ppc/translate_init.c
@@ -9365,6 +9365,52 @@  static ObjectClass *ppc_cpu_class_by_name(const char *name)
     return NULL;
 }
 
+/*
+ * This is essentially same as cpu_generic_init() but without a set
+ * realize call.
+ */
+CPUState *cpu_ppc_create(const char *typename, const char *cpu_model)
+{
+    char *str, *name, *featurestr;
+    CPUState *cpu;
+    ObjectClass *oc;
+    CPUClass *cc;
+    Error *err = NULL;
+
+    str = g_strdup(cpu_model);
+    name = strtok(str, ",");
+
+    oc = cpu_class_by_name(typename, name);
+    if (oc == NULL) {
+        g_free(str);
+        return NULL;
+    }
+
+    cpu = CPU(object_new(object_class_get_name(oc)));
+    cc = CPU_GET_CLASS(cpu);
+
+    featurestr = strtok(NULL, ",");
+    cc->parse_features(cpu, featurestr, &err);
+    g_free(str);
+    if (err != NULL) {
+        goto out;
+    }
+
+out:
+    if (err != NULL) {
+        error_report("%s", error_get_pretty(err));
+        error_free(err);
+        object_unref(OBJECT(cpu));
+        return NULL;
+    }
+
+    return cpu;
+}
+
+/*
+ * TODO: This can be removed when all powerpc targets are converted to
+ * socket level CPU realization.
+ */
 PowerPCCPU *cpu_ppc_init(const char *cpu_model)
 {
     return POWERPC_CPU(cpu_generic_init(TYPE_POWERPC_CPU, cpu_model));