All the mail mirrored from lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 0/7] machine registration: Use QOM, eliminate QEMUMachine
@ 2015-08-18 19:08 Eduardo Habkost
  2015-08-18 19:08 ` [Qemu-devel] [PATCH 1/7] exynos4: Use EXYNOS4210_NCPUS instead of max_cpus on error message Eduardo Habkost
                   ` (6 more replies)
  0 siblings, 7 replies; 15+ messages in thread
From: Eduardo Habkost @ 2015-08-18 19:08 UTC (permalink / raw
  To: qemu-devel
  Cc: Peter Maydell, Evgeny Voevodin, Michael S. Tsirkin,
	Mark Cave-Ayland, Blue Swirl, Max Filippov, Edgar E. Iglesias,
	Guan Xuetao, Rob Herring, Jia Liu, Alexander Graf,
	Andreas Färber, Hervé Poussineau, Antony Pavlov,
	Maksim Kozlov, Leon Alrae, Marcel Apfelbaum, Li Guang,
	Fabien Chouteau, Peter Chubb, Paolo Bonzini, Scott Wood,
	Richard Henderson, Peter Crosthwaite, Igor Mitsyanko,
	Michael Walle, qemu-ppc, Dmitry Solodkiy, Bastian Koppelmann,
	Jan Kiszka, Aurelien Jarno

This converts all code using QEMUMachine to register a QOM class directly,
using a new macro: DEFINE_MACHINE.

Python script used to convert all machines automatically can be seen at:
  https://gist.github.com/ehabkost/582fe4969205975febb2#file-qemumachine-eliminate-py

Cc: Richard Henderson <rth@twiddle.net>
Cc: Peter Maydell <peter.maydell@linaro.org>
Cc: Li Guang <lig.fnst@cn.fujitsu.com>
Cc: Antony Pavlov <antonynpavlov@gmail.com>
Cc: Evgeny Voevodin <e.voevodin@samsung.com>
Cc: Maksim Kozlov <m.kozlov@samsung.com>
Cc: Igor Mitsyanko <i.mitsyanko@gmail.com>
Cc: Dmitry Solodkiy <d.solodkiy@samsung.com>
Cc: Rob Herring <robh@kernel.org>
Cc: Peter Chubb <peter.chubb@nicta.com.au>
Cc: Jan Kiszka <jan.kiszka@web.de>
Cc: Andrzej Zaborowski <balrogg@gmail.com>
Cc: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
Cc: "Edgar E. Iglesias" <edgar.iglesias@gmail.com>
Cc: Michael Walle <michael@walle.cc>
Cc: Aurelien Jarno <aurelien@aurel32.net>
Cc: Leon Alrae <leon.alrae@imgtec.com>
Cc: "Hervé Poussineau" <hpoussin@reactos.org>
Cc: Jia Liu <proljc@gmail.com>
Cc: Alexander Graf <agraf@suse.de>
Cc: Scott Wood <scottwood@freescale.com>
Cc: "Andreas Färber" <andreas.faerber@web.de>
Cc: Magnus Damm <magnus.damm@gmail.com>
Cc: Fabien Chouteau <chouteau@adacore.com>
Cc: Blue Swirl <blauwirbel@gmail.com>
Cc: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Cc: Bastian Koppelmann <kbastian@mail.uni-paderborn.de>
Cc: Guan Xuetao <gxt@mprc.pku.edu.cn>
Cc: Max Filippov <jcmvbkbc@gmail.com>
Cc: "Michael S. Tsirkin" <mst@redhat.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: qemu-devel@nongnu.org
Cc: qemu-ppc@nongnu.org

Eduardo Habkost (7):
  exynos4: Use EXYNOS4210_NCPUS instead of max_cpus on error message
  exynos4: Use MachineClass instead of exynos4_machines array
  exynos4: Declare each QEMUMachine as a separate variable
  machine: DEFINE_MACHINE macro
  pc: Use DEFINE_MACHINE to implement DEFINE_PC_MACHINE
  [RFC] Use DEFINE_MACHINE to register all machines
  machine: Eliminate QEMUMachine and qemu_register_machine()

 hw/acpi/piix4.c                          |   2 +-
 hw/alpha/dp264.c                         |  18 ++--
 hw/arm/collie.c                          |  14 +--
 hw/arm/cubieboard.c                      |  16 ++-
 hw/arm/digic_boards.c                    |  14 +--
 hw/arm/exynos4_boards.c                  |  39 ++++---
 hw/arm/gumstix.c                         |  29 +++---
 hw/arm/highbank.c                        |  33 +++---
 hw/arm/integratorcp.c                    |  14 +--
 hw/arm/kzm.c                             |  14 +--
 hw/arm/mainstone.c                       |  14 +--
 hw/arm/musicpal.c                        |  14 +--
 hw/arm/netduino2.c                       |  14 +--
 hw/arm/nseries.c                         |  29 +++---
 hw/arm/omap_sx1.c                        |  25 ++---
 hw/arm/palm.c                            |  14 +--
 hw/arm/realview.c                        |  61 ++++++-----
 hw/arm/spitz.c                           |  51 +++++-----
 hw/arm/stellaris.c                       |  25 ++---
 hw/arm/tosa.c                            |  14 +--
 hw/arm/versatilepb.c                     |  29 +++---
 hw/arm/xilinx_zynq.c                     |  20 ++--
 hw/arm/xlnx-ep108.c                      |  14 +--
 hw/arm/z2.c                              |  14 +--
 hw/core/null-machine.c                   |  16 ++-
 hw/cris/axis_dev88.c                     |  16 ++-
 hw/lm32/lm32_boards.c                    |  33 +++---
 hw/lm32/milkymist.c                      |  16 ++-
 hw/m68k/an5206.c                         |  14 +--
 hw/m68k/dummy_m68k.c                     |  14 +--
 hw/m68k/mcf5208.c                        |  16 ++-
 hw/microblaze/petalogix_ml605_mmu.c      |  16 ++-
 hw/microblaze/petalogix_s3adsp1800_mmu.c |  16 ++-
 hw/mips/mips_fulong2e.c                  |  14 +--
 hw/mips/mips_jazz.c                      |  29 +++---
 hw/mips/mips_malta.c                     |  24 ++---
 hw/mips/mips_mipssim.c                   |  14 +--
 hw/mips/mips_r4k.c                       |  14 +--
 hw/moxie/moxiesim.c                      |  16 ++-
 hw/openrisc/openrisc_sim.c               |  18 ++--
 hw/ppc/e500plat.c                        |  18 ++--
 hw/ppc/mac_oldworld.c                    |  24 ++---
 hw/ppc/mpc8544ds.c                       |  16 ++-
 hw/ppc/ppc405_boards.c                   |  27 +++--
 hw/ppc/ppc440_bamboo.c                   |  14 +--
 hw/ppc/prep.c                            |  18 ++--
 hw/ppc/virtex_ml507.c                    |  14 +--
 hw/sh4/r2d.c                             |  14 +--
 hw/sh4/shix.c                            |  16 ++-
 hw/sparc/leon3.c                         |  14 +--
 hw/sparc/sun4m.c                         | 170 ++++++++++++++++---------------
 hw/sparc64/sun4u.c                       |  76 +++++++-------
 hw/tricore/tricore_testboard.c           |  16 ++-
 hw/unicore32/puv3.c                      |  16 ++-
 hw/xenpv/xen_machine_pv.c                |  18 ++--
 hw/xtensa/sim.c                          |  18 ++--
 hw/xtensa/xtfpga.c                       |  59 ++++++-----
 include/hw/boards.h                      |  45 ++++----
 include/hw/i386/pc.h                     |  15 +--
 include/qemu/typedefs.h                  |   1 -
 include/sysemu/blockdev.h                |   2 +-
 include/sysemu/sysemu.h                  |   2 +-
 vl.c                                     |  37 -------
 63 files changed, 606 insertions(+), 861 deletions(-)

-- 
2.1.0

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [Qemu-devel] [PATCH 1/7] exynos4: Use EXYNOS4210_NCPUS instead of max_cpus on error message
  2015-08-18 19:08 [Qemu-devel] [PATCH 0/7] machine registration: Use QOM, eliminate QEMUMachine Eduardo Habkost
@ 2015-08-18 19:08 ` Eduardo Habkost
  2015-08-18 19:08 ` [Qemu-devel] [PATCH 2/7] exynos4: Use MachineClass instead of exynos4_machines array Eduardo Habkost
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 15+ messages in thread
From: Eduardo Habkost @ 2015-08-18 19:08 UTC (permalink / raw
  To: qemu-devel
  Cc: Peter Maydell, Evgeny Voevodin, Marcel Apfelbaum, Igor Mitsyanko,
	Michael S. Tsirkin, Dmitry Solodkiy, Maksim Kozlov

The code is checking smp_cpus against EXYNOS4210_NCPUS, not against
max_cpus, so use EXYNOS4210_NCPUS in the error message for consistency.

Cc: Peter Maydell <peter.maydell@linaro.org>
Cc: Evgeny Voevodin <e.voevodin@samsung.com>
Cc: Maksim Kozlov <m.kozlov@samsung.com>
Cc: Igor Mitsyanko <i.mitsyanko@gmail.com>
Cc: Dmitry Solodkiy <d.solodkiy@samsung.com>
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 hw/arm/exynos4_boards.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/hw/arm/exynos4_boards.c b/hw/arm/exynos4_boards.c
index d644db1..3f88c4a 100644
--- a/hw/arm/exynos4_boards.c
+++ b/hw/arm/exynos4_boards.c
@@ -100,8 +100,7 @@ static Exynos4210State *exynos4_boards_init_common(MachineState *machine,
     if (smp_cpus != EXYNOS4210_NCPUS && !qtest_enabled()) {
         fprintf(stderr, "%s board supports only %d CPU cores. Ignoring smp_cpus"
                 " value.\n",
-                exynos4_machines[board_type].name,
-                exynos4_machines[board_type].max_cpus);
+                exynos4_machines[board_type].name, EXYNOS4210_NCPUS);
     }
 
     exynos4_board_binfo.ram_size = exynos4_board_ram_size[board_type];
-- 
2.1.0

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [Qemu-devel] [PATCH 2/7] exynos4: Use MachineClass instead of exynos4_machines array
  2015-08-18 19:08 [Qemu-devel] [PATCH 0/7] machine registration: Use QOM, eliminate QEMUMachine Eduardo Habkost
  2015-08-18 19:08 ` [Qemu-devel] [PATCH 1/7] exynos4: Use EXYNOS4210_NCPUS instead of max_cpus on error message Eduardo Habkost
@ 2015-08-18 19:08 ` Eduardo Habkost
  2015-08-18 19:08 ` [Qemu-devel] [PATCH 3/7] exynos4: Declare each QEMUMachine as a separate variable Eduardo Habkost
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 15+ messages in thread
From: Eduardo Habkost @ 2015-08-18 19:08 UTC (permalink / raw
  To: qemu-devel
  Cc: Peter Maydell, Evgeny Voevodin, Marcel Apfelbaum, Igor Mitsyanko,
	Michael S. Tsirkin, Dmitry Solodkiy, Maksim Kozlov

We don't need a QEMUMachine array to query max_cpus, if we can get the
corresponding MachineClass.

Cc: Peter Maydell <peter.maydell@linaro.org>
Cc: Evgeny Voevodin <e.voevodin@samsung.com>
Cc: Maksim Kozlov <m.kozlov@samsung.com>
Cc: Igor Mitsyanko <i.mitsyanko@gmail.com>
Cc: Dmitry Solodkiy <d.solodkiy@samsung.com>
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 hw/arm/exynos4_boards.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/hw/arm/exynos4_boards.c b/hw/arm/exynos4_boards.c
index 3f88c4a..312a014 100644
--- a/hw/arm/exynos4_boards.c
+++ b/hw/arm/exynos4_boards.c
@@ -97,10 +97,12 @@ static void lan9215_init(uint32_t base, qemu_irq irq)
 static Exynos4210State *exynos4_boards_init_common(MachineState *machine,
                                                    Exynos4BoardType board_type)
 {
+    MachineClass *mc = MACHINE_GET_CLASS(machine);
+
     if (smp_cpus != EXYNOS4210_NCPUS && !qtest_enabled()) {
         fprintf(stderr, "%s board supports only %d CPU cores. Ignoring smp_cpus"
                 " value.\n",
-                exynos4_machines[board_type].name, EXYNOS4210_NCPUS);
+                mc->name, EXYNOS4210_NCPUS);
     }
 
     exynos4_board_binfo.ram_size = exynos4_board_ram_size[board_type];
-- 
2.1.0

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [Qemu-devel] [PATCH 3/7] exynos4: Declare each QEMUMachine as a separate variable
  2015-08-18 19:08 [Qemu-devel] [PATCH 0/7] machine registration: Use QOM, eliminate QEMUMachine Eduardo Habkost
  2015-08-18 19:08 ` [Qemu-devel] [PATCH 1/7] exynos4: Use EXYNOS4210_NCPUS instead of max_cpus on error message Eduardo Habkost
  2015-08-18 19:08 ` [Qemu-devel] [PATCH 2/7] exynos4: Use MachineClass instead of exynos4_machines array Eduardo Habkost
@ 2015-08-18 19:08 ` Eduardo Habkost
  2015-08-18 19:08 ` [Qemu-devel] [PATCH 4/7] machine: DEFINE_MACHINE macro Eduardo Habkost
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 15+ messages in thread
From: Eduardo Habkost @ 2015-08-18 19:08 UTC (permalink / raw
  To: qemu-devel
  Cc: Peter Maydell, Evgeny Voevodin, Marcel Apfelbaum, Igor Mitsyanko,
	Michael S. Tsirkin, Dmitry Solodkiy, Maksim Kozlov

This will make the code follow the same pattern used for other machines,
and will make it easier to automatically convert the code to be
QOM-based.

Cc: Peter Maydell <peter.maydell@linaro.org>
Cc: Evgeny Voevodin <e.voevodin@samsung.com>
Cc: Maksim Kozlov <m.kozlov@samsung.com>
Cc: Igor Mitsyanko <i.mitsyanko@gmail.com>
Cc: Dmitry Solodkiy <d.solodkiy@samsung.com>
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 hw/arm/exynos4_boards.c | 31 ++++++++++++++-----------------
 1 file changed, 14 insertions(+), 17 deletions(-)

diff --git a/hw/arm/exynos4_boards.c b/hw/arm/exynos4_boards.c
index 312a014..35fc7c4 100644
--- a/hw/arm/exynos4_boards.c
+++ b/hw/arm/exynos4_boards.c
@@ -74,8 +74,6 @@ static struct arm_boot_info exynos4_board_binfo = {
     .write_secondary_boot = exynos4210_write_secondary,
 };
 
-static QEMUMachine exynos4_machines[EXYNOS4_NUM_OF_BOARDS];
-
 static void lan9215_init(uint32_t base, qemu_irq irq)
 {
     DeviceState *dev;
@@ -146,25 +144,24 @@ static void smdkc210_init(MachineState *machine)
     arm_load_kernel(ARM_CPU(first_cpu), &exynos4_board_binfo);
 }
 
-static QEMUMachine exynos4_machines[EXYNOS4_NUM_OF_BOARDS] = {
-    [EXYNOS4_BOARD_NURI] = {
-        .name = "nuri",
-        .desc = "Samsung NURI board (Exynos4210)",
-        .init = nuri_init,
-        .max_cpus = EXYNOS4210_NCPUS,
-    },
-    [EXYNOS4_BOARD_SMDKC210] = {
-        .name = "smdkc210",
-        .desc = "Samsung SMDKC210 board (Exynos4210)",
-        .init = smdkc210_init,
-        .max_cpus = EXYNOS4210_NCPUS,
-    },
+static QEMUMachine exynos4_machine_nuri = {
+    .name = "nuri",
+    .desc = "Samsung NURI board (Exynos4210)",
+    .init = nuri_init,
+    .max_cpus = EXYNOS4210_NCPUS,
+};
+
+static QEMUMachine exynos4_machine_smdkc210 = {
+    .name = "smdkc210",
+    .desc = "Samsung SMDKC210 board (Exynos4210)",
+    .init = smdkc210_init,
+    .max_cpus = EXYNOS4210_NCPUS,
 };
 
 static void exynos4_machine_init(void)
 {
-    qemu_register_machine(&exynos4_machines[EXYNOS4_BOARD_NURI]);
-    qemu_register_machine(&exynos4_machines[EXYNOS4_BOARD_SMDKC210]);
+    qemu_register_machine(&exynos4_machine_nuri);
+    qemu_register_machine(&exynos4_machine_smdkc210);
 }
 
 machine_init(exynos4_machine_init);
-- 
2.1.0

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [Qemu-devel] [PATCH 4/7] machine: DEFINE_MACHINE macro
  2015-08-18 19:08 [Qemu-devel] [PATCH 0/7] machine registration: Use QOM, eliminate QEMUMachine Eduardo Habkost
                   ` (2 preceding siblings ...)
  2015-08-18 19:08 ` [Qemu-devel] [PATCH 3/7] exynos4: Declare each QEMUMachine as a separate variable Eduardo Habkost
@ 2015-08-18 19:08 ` Eduardo Habkost
  2015-08-20 21:14   ` Eduardo Habkost
  2015-08-18 19:08 ` [Qemu-devel] [PATCH 5/7] pc: Use DEFINE_MACHINE to implement DEFINE_PC_MACHINE Eduardo Habkost
                   ` (2 subsequent siblings)
  6 siblings, 1 reply; 15+ messages in thread
From: Eduardo Habkost @ 2015-08-18 19:08 UTC (permalink / raw
  To: qemu-devel; +Cc: Marcel Apfelbaum, Michael S. Tsirkin

The macro will allow easy registration of a TYPE_MACHINE subclass, using
only the machine name and a MachineClass initialization function as
parameter.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 include/hw/boards.h | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/include/hw/boards.h b/include/hw/boards.h
index 3f84afd..95bcecd 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -152,4 +152,22 @@ struct MachineState {
     AccelState *accelerator;
 };
 
+#define DEFINE_MACHINE(namestr, machine_initfn) \
+    static void machine_initfn##_class_init(ObjectClass *oc, void *data) \
+    { \
+        MachineClass *mc = MACHINE_CLASS(oc); \
+        mc->name = namestr; \
+        machine_initfn(mc); \
+    } \
+    static const TypeInfo machine_initfn##_typeinfo = { \
+        .name       = namestr TYPE_MACHINE_SUFFIX, \
+        .parent     = TYPE_MACHINE, \
+        .class_init = machine_initfn##_class_init, \
+    }; \
+    static void machine_initfn##_register_types(void) \
+    { \
+        type_register_static(&machine_initfn##_typeinfo); \
+    } \
+    machine_init(machine_initfn##_register_types)
+
 #endif
-- 
2.1.0

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [Qemu-devel] [PATCH 5/7] pc: Use DEFINE_MACHINE to implement DEFINE_PC_MACHINE
  2015-08-18 19:08 [Qemu-devel] [PATCH 0/7] machine registration: Use QOM, eliminate QEMUMachine Eduardo Habkost
                   ` (3 preceding siblings ...)
  2015-08-18 19:08 ` [Qemu-devel] [PATCH 4/7] machine: DEFINE_MACHINE macro Eduardo Habkost
@ 2015-08-18 19:08 ` Eduardo Habkost
  2015-08-19 23:28   ` Eduardo Habkost
  2015-08-18 19:08 ` [Qemu-devel] [PATCH 6/7] [RFC] Use DEFINE_MACHINE to register all machines Eduardo Habkost
  2015-08-18 19:08 ` [Qemu-devel] [PATCH 7/7] machine: Eliminate QEMUMachine and qemu_register_machine() Eduardo Habkost
  6 siblings, 1 reply; 15+ messages in thread
From: Eduardo Habkost @ 2015-08-18 19:08 UTC (permalink / raw
  To: qemu-devel; +Cc: Marcel Apfelbaum, Michael S. Tsirkin

DEFINE_PC_MACHINE should be eventually replaced by DEFINE_MACHINE, we
just need to eliminate the pc_compat_*() functions first.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 include/hw/i386/pc.h | 15 ++-------------
 1 file changed, 2 insertions(+), 13 deletions(-)

diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index d0cad87..dc22608 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -694,23 +694,12 @@ bool e820_get_entry(int, uint32_t, uint64_t *, uint64_t *);
         },
 
 #define DEFINE_PC_MACHINE(suffix, namestr, initfn, optsfn) \
-    static void pc_machine_##suffix##_class_init(ObjectClass *oc, void *data) \
+    static void pc_machine_##suffix##_class_init(MachineClass *mc) \
     { \
-        MachineClass *mc = MACHINE_CLASS(oc); \
         optsfn(mc); \
-        mc->name = namestr; \
         mc->init = initfn; \
     } \
-    static const TypeInfo pc_machine_type_##suffix = { \
-        .name       = namestr TYPE_MACHINE_SUFFIX, \
-        .parent     = TYPE_PC_MACHINE, \
-        .class_init = pc_machine_##suffix##_class_init, \
-    }; \
-    static void pc_machine_init_##suffix(void) \
-    { \
-        type_register(&pc_machine_type_##suffix); \
-    } \
-    machine_init(pc_machine_init_##suffix)
+    DEFINE_MACHINE(namestr, pc_machine_##suffix##_class_init)
 
 #define SET_MACHINE_COMPAT(m, COMPAT) do { \
     static GlobalProperty props[] = { \
-- 
2.1.0

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [Qemu-devel] [PATCH 6/7] [RFC] Use DEFINE_MACHINE to register all machines
  2015-08-18 19:08 [Qemu-devel] [PATCH 0/7] machine registration: Use QOM, eliminate QEMUMachine Eduardo Habkost
                   ` (4 preceding siblings ...)
  2015-08-18 19:08 ` [Qemu-devel] [PATCH 5/7] pc: Use DEFINE_MACHINE to implement DEFINE_PC_MACHINE Eduardo Habkost
@ 2015-08-18 19:08 ` Eduardo Habkost
  2015-08-18 19:54   ` Eduardo Habkost
  2015-08-18 20:06   ` Eduardo Habkost
  2015-08-18 19:08 ` [Qemu-devel] [PATCH 7/7] machine: Eliminate QEMUMachine and qemu_register_machine() Eduardo Habkost
  6 siblings, 2 replies; 15+ messages in thread
From: Eduardo Habkost @ 2015-08-18 19:08 UTC (permalink / raw
  To: qemu-devel
  Cc: Peter Maydell, Evgeny Voevodin, Michael S. Tsirkin,
	Mark Cave-Ayland, Blue Swirl, Max Filippov, Edgar E. Iglesias,
	Guan Xuetao, Rob Herring, Jia Liu, Alexander Graf,
	Andreas Färber, Hervé Poussineau, Antony Pavlov,
	Maksim Kozlov, Leon Alrae, Marcel Apfelbaum, Li Guang,
	Fabien Chouteau, Peter Chubb, Scott Wood, Richard Henderson,
	Peter Crosthwaite, Igor Mitsyanko, Michael Walle, qemu-ppc,
	Dmitry Solodkiy, Bastian Koppelmann, Jan Kiszka, Aurelien Jarno

I am sending a single patch for all machines to get some feedback, but
in the final patch series I will separate them by architecture.

Cc: Richard Henderson <rth@twiddle.net>
Cc: Peter Maydell <peter.maydell@linaro.org>
Cc: Li Guang <lig.fnst@cn.fujitsu.com>
Cc: Antony Pavlov <antonynpavlov@gmail.com>
Cc: Evgeny Voevodin <e.voevodin@samsung.com>
Cc: Maksim Kozlov <m.kozlov@samsung.com>
Cc: Igor Mitsyanko <i.mitsyanko@gmail.com>
Cc: Dmitry Solodkiy <d.solodkiy@samsung.com>
Cc: Rob Herring <robh@kernel.org>
Cc: Peter Chubb <peter.chubb@nicta.com.au>
Cc: Jan Kiszka <jan.kiszka@web.de>
Cc: Andrzej Zaborowski <balrogg@gmail.com>
Cc: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
Cc: "Edgar E. Iglesias" <edgar.iglesias@gmail.com>
Cc: Michael Walle <michael@walle.cc>
Cc: Aurelien Jarno <aurelien@aurel32.net>
Cc: Leon Alrae <leon.alrae@imgtec.com>
Cc: "Hervé Poussineau" <hpoussin@reactos.org>
Cc: Jia Liu <proljc@gmail.com>
Cc: Alexander Graf <agraf@suse.de>
Cc: Scott Wood <scottwood@freescale.com>
Cc: "Andreas Färber" <andreas.faerber@web.de>
Cc: Magnus Damm <magnus.damm@gmail.com>
Cc: Fabien Chouteau <chouteau@adacore.com>
Cc: Blue Swirl <blauwirbel@gmail.com>
Cc: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Cc: Bastian Koppelmann <kbastian@mail.uni-paderborn.de>
Cc: Guan Xuetao <gxt@mprc.pku.edu.cn>
Cc: Max Filippov <jcmvbkbc@gmail.com>
Cc: qemu-ppc@nongnu.org
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 hw/acpi/piix4.c                          |   2 +-
 hw/alpha/dp264.c                         |  18 ++--
 hw/arm/collie.c                          |  14 +--
 hw/arm/cubieboard.c                      |  16 ++-
 hw/arm/digic_boards.c                    |  14 +--
 hw/arm/exynos4_boards.c                  |  29 +++---
 hw/arm/gumstix.c                         |  29 +++---
 hw/arm/highbank.c                        |  33 +++---
 hw/arm/integratorcp.c                    |  14 +--
 hw/arm/kzm.c                             |  14 +--
 hw/arm/mainstone.c                       |  14 +--
 hw/arm/musicpal.c                        |  14 +--
 hw/arm/netduino2.c                       |  14 +--
 hw/arm/nseries.c                         |  29 +++---
 hw/arm/omap_sx1.c                        |  25 ++---
 hw/arm/palm.c                            |  14 +--
 hw/arm/realview.c                        |  61 ++++++-----
 hw/arm/spitz.c                           |  51 +++++-----
 hw/arm/stellaris.c                       |  25 ++---
 hw/arm/tosa.c                            |  14 +--
 hw/arm/versatilepb.c                     |  29 +++---
 hw/arm/xilinx_zynq.c                     |  20 ++--
 hw/arm/xlnx-ep108.c                      |  14 +--
 hw/arm/z2.c                              |  14 +--
 hw/core/null-machine.c                   |  16 ++-
 hw/cris/axis_dev88.c                     |  16 ++-
 hw/lm32/lm32_boards.c                    |  33 +++---
 hw/lm32/milkymist.c                      |  16 ++-
 hw/m68k/an5206.c                         |  14 +--
 hw/m68k/dummy_m68k.c                     |  14 +--
 hw/m68k/mcf5208.c                        |  16 ++-
 hw/microblaze/petalogix_ml605_mmu.c      |  16 ++-
 hw/microblaze/petalogix_s3adsp1800_mmu.c |  16 ++-
 hw/mips/mips_fulong2e.c                  |  14 +--
 hw/mips/mips_jazz.c                      |  29 +++---
 hw/mips/mips_malta.c                     |  24 ++---
 hw/mips/mips_mipssim.c                   |  14 +--
 hw/mips/mips_r4k.c                       |  14 +--
 hw/moxie/moxiesim.c                      |  16 ++-
 hw/openrisc/openrisc_sim.c               |  18 ++--
 hw/ppc/e500plat.c                        |  18 ++--
 hw/ppc/mac_oldworld.c                    |  24 ++---
 hw/ppc/mpc8544ds.c                       |  16 ++-
 hw/ppc/ppc405_boards.c                   |  27 +++--
 hw/ppc/ppc440_bamboo.c                   |  14 +--
 hw/ppc/prep.c                            |  18 ++--
 hw/ppc/virtex_ml507.c                    |  14 +--
 hw/sh4/r2d.c                             |  14 +--
 hw/sh4/shix.c                            |  16 ++-
 hw/sparc/leon3.c                         |  14 +--
 hw/sparc/sun4m.c                         | 170 ++++++++++++++++---------------
 hw/sparc64/sun4u.c                       |  76 +++++++-------
 hw/tricore/tricore_testboard.c           |  16 ++-
 hw/unicore32/puv3.c                      |  16 ++-
 hw/xenpv/xen_machine_pv.c                |  18 ++--
 hw/xtensa/sim.c                          |  18 ++--
 hw/xtensa/xtfpga.c                       |  59 ++++++-----
 57 files changed, 580 insertions(+), 775 deletions(-)

diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c
index 2cd2fee..f2e31dc 100644
--- a/hw/acpi/piix4.c
+++ b/hw/acpi/piix4.c
@@ -448,7 +448,7 @@ static void piix4_pm_realize(PCIDevice *dev, Error **errp)
     pci_conf[0x06] = 0x80;
     pci_conf[0x07] = 0x02;
     pci_conf[0x09] = 0x00;
-    pci_conf[0x3d] = 0x01; // interrupt pin 1
+    pci_conf[0x3d] = 0x01; /* interrupt pin 1 */
 
     /* APM */
     apm_init(dev, &s->apm, apm_ctrl_changed, s);
diff --git a/hw/alpha/dp264.c b/hw/alpha/dp264.c
index f86e7bb..af4b91b 100644
--- a/hw/alpha/dp264.c
+++ b/hw/alpha/dp264.c
@@ -168,17 +168,13 @@ static void clipper_init(MachineState *machine)
     }
 }
 
-static QEMUMachine clipper_machine = {
-    .name = "clipper",
-    .desc = "Alpha DP264/CLIPPER",
-    .init = clipper_init,
-    .max_cpus = 4,
-    .is_default = 1,
-};
-
-static void clipper_machine_init(void)
+static void clipper_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&clipper_machine);
+    mc->desc = "Alpha DP264/CLIPPER";
+    mc->init = clipper_init;
+    mc->max_cpus = 4;
+    mc->is_default = 1;
 }
 
-machine_init(clipper_machine_init);
+DEFINE_MACHINE("clipper", clipper_machine_machine_init);
+
diff --git a/hw/arm/collie.c b/hw/arm/collie.c
index 6c9b82f..5c895a6 100644
--- a/hw/arm/collie.c
+++ b/hw/arm/collie.c
@@ -58,15 +58,11 @@ static void collie_init(MachineState *machine)
     arm_load_kernel(s->cpu, &collie_binfo);
 }
 
-static QEMUMachine collie_machine = {
-    .name = "collie",
-    .desc = "Collie PDA (SA-1110)",
-    .init = collie_init,
-};
-
-static void collie_machine_init(void)
+static void collie_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&collie_machine);
+    mc->desc = "Collie PDA (SA-1110)";
+    mc->init = collie_init;
 }
 
-machine_init(collie_machine_init)
+DEFINE_MACHINE("collie", collie_machine_machine_init);
+
diff --git a/hw/arm/cubieboard.c b/hw/arm/cubieboard.c
index 1582250..af174ab 100644
--- a/hw/arm/cubieboard.c
+++ b/hw/arm/cubieboard.c
@@ -74,16 +74,12 @@ static void cubieboard_init(MachineState *machine)
     arm_load_kernel(&s->a10->cpu, &cubieboard_binfo);
 }
 
-static QEMUMachine cubieboard_machine = {
-    .name = "cubieboard",
-    .desc = "cubietech cubieboard",
-    .init = cubieboard_init,
-};
-
-
-static void cubieboard_machine_init(void)
+static void cubieboard_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&cubieboard_machine);
+    mc->desc = "cubietech cubieboard";
+    mc->init = cubieboard_init;
 }
 
-machine_init(cubieboard_machine_init)
+DEFINE_MACHINE("cubieboard", cubieboard_machine_machine_init);
+
+
diff --git a/hw/arm/digic_boards.c b/hw/arm/digic_boards.c
index f8ba9e5..3a6364c 100644
--- a/hw/arm/digic_boards.c
+++ b/hw/arm/digic_boards.c
@@ -148,15 +148,11 @@ static void canon_a1100_init(MachineState *machine)
     digic4_board_init(&digic4_board_canon_a1100);
 }
 
-static QEMUMachine canon_a1100 = {
-    .name = "canon-a1100",
-    .desc = "Canon PowerShot A1100 IS",
-    .init = &canon_a1100_init,
-};
-
-static void digic_register_machines(void)
+static void canon_a1100_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&canon_a1100);
+    mc->desc = "Canon PowerShot A1100 IS";
+    mc->init = &canon_a1100_init;
 }
 
-machine_init(digic_register_machines)
+DEFINE_MACHINE("canon-a1100", canon_a1100_machine_init);
+
diff --git a/hw/arm/exynos4_boards.c b/hw/arm/exynos4_boards.c
index 35fc7c4..7c75acc 100644
--- a/hw/arm/exynos4_boards.c
+++ b/hw/arm/exynos4_boards.c
@@ -144,24 +144,21 @@ static void smdkc210_init(MachineState *machine)
     arm_load_kernel(ARM_CPU(first_cpu), &exynos4_board_binfo);
 }
 
-static QEMUMachine exynos4_machine_nuri = {
-    .name = "nuri",
-    .desc = "Samsung NURI board (Exynos4210)",
-    .init = nuri_init,
-    .max_cpus = EXYNOS4210_NCPUS,
-};
+static void exynos4_machine_nuri_machine_init(MachineClass *mc)
+{
+    mc->desc = "Samsung NURI board (Exynos4210)";
+    mc->init = nuri_init;
+    mc->max_cpus = EXYNOS4210_NCPUS;
+}
 
-static QEMUMachine exynos4_machine_smdkc210 = {
-    .name = "smdkc210",
-    .desc = "Samsung SMDKC210 board (Exynos4210)",
-    .init = smdkc210_init,
-    .max_cpus = EXYNOS4210_NCPUS,
-};
+DEFINE_MACHINE("nuri", exynos4_machine_nuri_machine_init);
 
-static void exynos4_machine_init(void)
+static void exynos4_machine_smdkc210_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&exynos4_machine_nuri);
-    qemu_register_machine(&exynos4_machine_smdkc210);
+    mc->desc = "Samsung SMDKC210 board (Exynos4210)";
+    mc->init = smdkc210_init;
+    mc->max_cpus = EXYNOS4210_NCPUS;
 }
 
-machine_init(exynos4_machine_init);
+DEFINE_MACHINE("smdkc210", exynos4_machine_smdkc210_machine_init);
+
diff --git a/hw/arm/gumstix.c b/hw/arm/gumstix.c
index 8103278..e4e2f7c 100644
--- a/hw/arm/gumstix.c
+++ b/hw/arm/gumstix.c
@@ -121,22 +121,19 @@ static void verdex_init(MachineState *machine)
                     qdev_get_gpio_in(cpu->gpio, 99));
 }
 
-static QEMUMachine connex_machine = {
-    .name = "connex",
-    .desc = "Gumstix Connex (PXA255)",
-    .init = connex_init,
-};
-
-static QEMUMachine verdex_machine = {
-    .name = "verdex",
-    .desc = "Gumstix Verdex (PXA270)",
-    .init = verdex_init,
-};
-
-static void gumstix_machine_init(void)
+static void connex_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&connex_machine);
-    qemu_register_machine(&verdex_machine);
+    mc->desc = "Gumstix Connex (PXA255)";
+    mc->init = connex_init;
 }
 
-machine_init(gumstix_machine_init);
+DEFINE_MACHINE("connex", connex_machine_machine_init);
+
+static void verdex_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Gumstix Verdex (PXA270)";
+    mc->init = verdex_init;
+}
+
+DEFINE_MACHINE("verdex", verdex_machine_machine_init);
+
diff --git a/hw/arm/highbank.c b/hw/arm/highbank.c
index f8353a7..e58b7ea 100644
--- a/hw/arm/highbank.c
+++ b/hw/arm/highbank.c
@@ -391,26 +391,23 @@ static void midway_init(MachineState *machine)
     calxeda_init(machine, CALXEDA_MIDWAY);
 }
 
-static QEMUMachine highbank_machine = {
-    .name = "highbank",
-    .desc = "Calxeda Highbank (ECX-1000)",
-    .init = highbank_init,
-    .block_default_type = IF_SCSI,
-    .max_cpus = 4,
-};
+static void highbank_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Calxeda Highbank (ECX-1000)";
+    mc->init = highbank_init;
+    mc->block_default_type = IF_SCSI;
+    mc->max_cpus = 4;
+}
 
-static QEMUMachine midway_machine = {
-    .name = "midway",
-    .desc = "Calxeda Midway (ECX-2000)",
-    .init = midway_init,
-    .block_default_type = IF_SCSI,
-    .max_cpus = 4,
-};
+DEFINE_MACHINE("highbank", highbank_machine_machine_init);
 
-static void calxeda_machines_init(void)
+static void midway_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&highbank_machine);
-    qemu_register_machine(&midway_machine);
+    mc->desc = "Calxeda Midway (ECX-2000)";
+    mc->init = midway_init;
+    mc->block_default_type = IF_SCSI;
+    mc->max_cpus = 4;
 }
 
-machine_init(calxeda_machines_init);
+DEFINE_MACHINE("midway", midway_machine_machine_init);
+
diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c
index 0fbbf99..929cc05 100644
--- a/hw/arm/integratorcp.c
+++ b/hw/arm/integratorcp.c
@@ -619,18 +619,14 @@ static void integratorcp_init(MachineState *machine)
     arm_load_kernel(cpu, &integrator_binfo);
 }
 
-static QEMUMachine integratorcp_machine = {
-    .name = "integratorcp",
-    .desc = "ARM Integrator/CP (ARM926EJ-S)",
-    .init = integratorcp_init,
-};
-
-static void integratorcp_machine_init(void)
+static void integratorcp_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&integratorcp_machine);
+    mc->desc = "ARM Integrator/CP (ARM926EJ-S)";
+    mc->init = integratorcp_init;
 }
 
-machine_init(integratorcp_machine_init);
+DEFINE_MACHINE("integratorcp", integratorcp_machine_machine_init);
+
 
 static Property core_properties[] = {
     DEFINE_PROP_UINT32("memsz", IntegratorCMState, memsz, 0),
diff --git a/hw/arm/kzm.c b/hw/arm/kzm.c
index d7af230..bbd4ac2 100644
--- a/hw/arm/kzm.c
+++ b/hw/arm/kzm.c
@@ -140,15 +140,11 @@ static void kzm_init(MachineState *machine)
     arm_load_kernel(cpu, &kzm_binfo);
 }
 
-static QEMUMachine kzm_machine = {
-    .name = "kzm",
-    .desc = "ARM KZM Emulation Baseboard (ARM1136)",
-    .init = kzm_init,
-};
-
-static void kzm_machine_init(void)
+static void kzm_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&kzm_machine);
+    mc->desc = "ARM KZM Emulation Baseboard (ARM1136)";
+    mc->init = kzm_init;
 }
 
-machine_init(kzm_machine_init)
+DEFINE_MACHINE("kzm", kzm_machine_machine_init);
+
diff --git a/hw/arm/mainstone.c b/hw/arm/mainstone.c
index 0da02a6..7f06051 100644
--- a/hw/arm/mainstone.c
+++ b/hw/arm/mainstone.c
@@ -188,15 +188,11 @@ static void mainstone_init(MachineState *machine)
     mainstone_common_init(get_system_memory(), machine, mainstone, 0x196);
 }
 
-static QEMUMachine mainstone2_machine = {
-    .name = "mainstone",
-    .desc = "Mainstone II (PXA27x)",
-    .init = mainstone_init,
-};
-
-static void mainstone_machine_init(void)
+static void mainstone2_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&mainstone2_machine);
+    mc->desc = "Mainstone II (PXA27x)";
+    mc->init = mainstone_init;
 }
 
-machine_init(mainstone_machine_init);
+DEFINE_MACHINE("mainstone", mainstone2_machine_machine_init);
+
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
index 42f66b3..0d8d073 100644
--- a/hw/arm/musicpal.c
+++ b/hw/arm/musicpal.c
@@ -1709,18 +1709,14 @@ static void musicpal_init(MachineState *machine)
     arm_load_kernel(cpu, &musicpal_binfo);
 }
 
-static QEMUMachine musicpal_machine = {
-    .name = "musicpal",
-    .desc = "Marvell 88w8618 / MusicPal (ARM926EJ-S)",
-    .init = musicpal_init,
-};
-
-static void musicpal_machine_init(void)
+static void musicpal_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&musicpal_machine);
+    mc->desc = "Marvell 88w8618 / MusicPal (ARM926EJ-S)";
+    mc->init = musicpal_init;
 }
 
-machine_init(musicpal_machine_init);
+DEFINE_MACHINE("musicpal", musicpal_machine_machine_init);
+
 
 static void mv88w8618_wlan_class_init(ObjectClass *klass, void *data)
 {
diff --git a/hw/arm/netduino2.c b/hw/arm/netduino2.c
index 8f26780..7b1bec6 100644
--- a/hw/arm/netduino2.c
+++ b/hw/arm/netduino2.c
@@ -43,15 +43,11 @@ static void netduino2_init(MachineState *machine)
     }
 }
 
-static QEMUMachine netduino2_machine = {
-    .name = "netduino2",
-    .desc = "Netduino 2 Machine",
-    .init = netduino2_init,
-};
-
-static void netduino2_machine_init(void)
+static void netduino2_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&netduino2_machine);
+    mc->desc = "Netduino 2 Machine";
+    mc->init = netduino2_init;
 }
 
-machine_init(netduino2_machine_init);
+DEFINE_MACHINE("netduino2", netduino2_machine_machine_init);
+
diff --git a/hw/arm/nseries.c b/hw/arm/nseries.c
index a659e85..95f25cc 100644
--- a/hw/arm/nseries.c
+++ b/hw/arm/nseries.c
@@ -1413,24 +1413,21 @@ static void n810_init(MachineState *machine)
     n8x0_init(machine, &n810_binfo, 810);
 }
 
-static QEMUMachine n800_machine = {
-    .name = "n800",
-    .desc = "Nokia N800 tablet aka. RX-34 (OMAP2420)",
-    .init = n800_init,
-    .default_boot_order = "",
-};
+static void n800_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Nokia N800 tablet aka. RX-34 (OMAP2420)";
+    mc->init = n800_init;
+    mc->default_boot_order = "";
+}
 
-static QEMUMachine n810_machine = {
-    .name = "n810",
-    .desc = "Nokia N810 tablet aka. RX-44 (OMAP2420)",
-    .init = n810_init,
-    .default_boot_order = "",
-};
+DEFINE_MACHINE("n800", n800_machine_machine_init);
 
-static void nseries_machine_init(void)
+static void n810_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&n800_machine);
-    qemu_register_machine(&n810_machine);
+    mc->desc = "Nokia N810 tablet aka. RX-44 (OMAP2420)";
+    mc->init = n810_init;
+    mc->default_boot_order = "";
 }
 
-machine_init(nseries_machine_init);
+DEFINE_MACHINE("n810", n810_machine_machine_init);
+
diff --git a/hw/arm/omap_sx1.c b/hw/arm/omap_sx1.c
index 4b0f7f9..4e18c63 100644
--- a/hw/arm/omap_sx1.c
+++ b/hw/arm/omap_sx1.c
@@ -217,22 +217,19 @@ static void sx1_init_v2(MachineState *machine)
     sx1_init(machine, 2);
 }
 
-static QEMUMachine sx1_machine_v2 = {
-    .name = "sx1",
-    .desc = "Siemens SX1 (OMAP310) V2",
-    .init = sx1_init_v2,
-};
+static void sx1_machine_v2_machine_init(MachineClass *mc)
+{
+    mc->desc = "Siemens SX1 (OMAP310) V2";
+    mc->init = sx1_init_v2;
+}
 
-static QEMUMachine sx1_machine_v1 = {
-    .name = "sx1-v1",
-    .desc = "Siemens SX1 (OMAP310) V1",
-    .init = sx1_init_v1,
-};
+DEFINE_MACHINE("sx1", sx1_machine_v2_machine_init);
 
-static void sx1_machine_init(void)
+static void sx1_machine_v1_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&sx1_machine_v2);
-    qemu_register_machine(&sx1_machine_v1);
+    mc->desc = "Siemens SX1 (OMAP310) V1";
+    mc->init = sx1_init_v1;
 }
 
-machine_init(sx1_machine_init);
+DEFINE_MACHINE("sx1-v1", sx1_machine_v1_machine_init);
+
diff --git a/hw/arm/palm.c b/hw/arm/palm.c
index 7f1cfb8..c2b2409 100644
--- a/hw/arm/palm.c
+++ b/hw/arm/palm.c
@@ -269,15 +269,11 @@ static void palmte_init(MachineState *machine)
     arm_load_kernel(mpu->cpu, &palmte_binfo);
 }
 
-static QEMUMachine palmte_machine = {
-    .name = "cheetah",
-    .desc = "Palm Tungsten|E aka. Cheetah PDA (OMAP310)",
-    .init = palmte_init,
-};
-
-static void palmte_machine_init(void)
+static void palmte_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&palmte_machine);
+    mc->desc = "Palm Tungsten|E aka. Cheetah PDA (OMAP310)";
+    mc->init = palmte_init;
 }
 
-machine_init(palmte_machine_init);
+DEFINE_MACHINE("cheetah", palmte_machine_machine_init);
+
diff --git a/hw/arm/realview.c b/hw/arm/realview.c
index ef2788d..43ed958 100644
--- a/hw/arm/realview.c
+++ b/hw/arm/realview.c
@@ -399,41 +399,40 @@ static void realview_pbx_a9_init(MachineState *machine)
     realview_init(machine, BOARD_PBX_A9);
 }
 
-static QEMUMachine realview_eb_machine = {
-    .name = "realview-eb",
-    .desc = "ARM RealView Emulation Baseboard (ARM926EJ-S)",
-    .init = realview_eb_init,
-    .block_default_type = IF_SCSI,
-};
+static void realview_eb_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "ARM RealView Emulation Baseboard (ARM926EJ-S)";
+    mc->init = realview_eb_init;
+    mc->block_default_type = IF_SCSI;
+}
 
-static QEMUMachine realview_eb_mpcore_machine = {
-    .name = "realview-eb-mpcore",
-    .desc = "ARM RealView Emulation Baseboard (ARM11MPCore)",
-    .init = realview_eb_mpcore_init,
-    .block_default_type = IF_SCSI,
-    .max_cpus = 4,
-};
+DEFINE_MACHINE("realview-eb", realview_eb_machine_machine_init);
 
-static QEMUMachine realview_pb_a8_machine = {
-    .name = "realview-pb-a8",
-    .desc = "ARM RealView Platform Baseboard for Cortex-A8",
-    .init = realview_pb_a8_init,
-};
+static void realview_eb_mpcore_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "ARM RealView Emulation Baseboard (ARM11MPCore)";
+    mc->init = realview_eb_mpcore_init;
+    mc->block_default_type = IF_SCSI;
+    mc->max_cpus = 4;
+}
 
-static QEMUMachine realview_pbx_a9_machine = {
-    .name = "realview-pbx-a9",
-    .desc = "ARM RealView Platform Baseboard Explore for Cortex-A9",
-    .init = realview_pbx_a9_init,
-    .block_default_type = IF_SCSI,
-    .max_cpus = 4,
-};
+DEFINE_MACHINE("realview-eb-mpcore", realview_eb_mpcore_machine_machine_init);
+
+static void realview_pb_a8_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "ARM RealView Platform Baseboard for Cortex-A8";
+    mc->init = realview_pb_a8_init;
+}
+
+DEFINE_MACHINE("realview-pb-a8", realview_pb_a8_machine_machine_init);
 
-static void realview_machine_init(void)
+static void realview_pbx_a9_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&realview_eb_machine);
-    qemu_register_machine(&realview_eb_mpcore_machine);
-    qemu_register_machine(&realview_pb_a8_machine);
-    qemu_register_machine(&realview_pbx_a9_machine);
+    mc->desc = "ARM RealView Platform Baseboard Explore for Cortex-A9";
+    mc->init = realview_pbx_a9_init;
+    mc->block_default_type = IF_SCSI;
+    mc->max_cpus = 4;
 }
 
-machine_init(realview_machine_init);
+DEFINE_MACHINE("realview-pbx-a9", realview_pbx_a9_machine_machine_init);
+
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
index 5bf032a..080c036 100644
--- a/hw/arm/spitz.c
+++ b/hw/arm/spitz.c
@@ -972,39 +972,38 @@ static void terrier_init(MachineState *machine)
     spitz_common_init(machine, terrier, 0x33f);
 }
 
-static QEMUMachine akitapda_machine = {
-    .name = "akita",
-    .desc = "Akita PDA (PXA270)",
-    .init = akita_init,
-};
+static void akitapda_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Akita PDA (PXA270)";
+    mc->init = akita_init;
+}
 
-static QEMUMachine spitzpda_machine = {
-    .name = "spitz",
-    .desc = "Spitz PDA (PXA270)",
-    .init = spitz_init,
-};
+DEFINE_MACHINE("akita", akitapda_machine_machine_init);
 
-static QEMUMachine borzoipda_machine = {
-    .name = "borzoi",
-    .desc = "Borzoi PDA (PXA270)",
-    .init = borzoi_init,
-};
+static void spitzpda_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Spitz PDA (PXA270)";
+    mc->init = spitz_init;
+}
 
-static QEMUMachine terrierpda_machine = {
-    .name = "terrier",
-    .desc = "Terrier PDA (PXA270)",
-    .init = terrier_init,
-};
+DEFINE_MACHINE("spitz", spitzpda_machine_machine_init);
+
+static void borzoipda_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Borzoi PDA (PXA270)";
+    mc->init = borzoi_init;
+}
+
+DEFINE_MACHINE("borzoi", borzoipda_machine_machine_init);
 
-static void spitz_machine_init(void)
+static void terrierpda_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&akitapda_machine);
-    qemu_register_machine(&spitzpda_machine);
-    qemu_register_machine(&borzoipda_machine);
-    qemu_register_machine(&terrierpda_machine);
+    mc->desc = "Terrier PDA (PXA270)";
+    mc->init = terrier_init;
 }
 
-machine_init(spitz_machine_init);
+DEFINE_MACHINE("terrier", terrierpda_machine_machine_init);
+
 
 static bool is_version_0(void *opaque, int version_id)
 {
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
index cb515ec..ac0e19a 100644
--- a/hw/arm/stellaris.c
+++ b/hw/arm/stellaris.c
@@ -1366,25 +1366,22 @@ static void lm3s6965evb_init(MachineState *machine)
     stellaris_init(kernel_filename, cpu_model, &stellaris_boards[1]);
 }
 
-static QEMUMachine lm3s811evb_machine = {
-    .name = "lm3s811evb",
-    .desc = "Stellaris LM3S811EVB",
-    .init = lm3s811evb_init,
-};
+static void lm3s811evb_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Stellaris LM3S811EVB";
+    mc->init = lm3s811evb_init;
+}
 
-static QEMUMachine lm3s6965evb_machine = {
-    .name = "lm3s6965evb",
-    .desc = "Stellaris LM3S6965EVB",
-    .init = lm3s6965evb_init,
-};
+DEFINE_MACHINE("lm3s811evb", lm3s811evb_machine_machine_init);
 
-static void stellaris_machine_init(void)
+static void lm3s6965evb_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&lm3s811evb_machine);
-    qemu_register_machine(&lm3s6965evb_machine);
+    mc->desc = "Stellaris LM3S6965EVB";
+    mc->init = lm3s6965evb_init;
 }
 
-machine_init(stellaris_machine_init);
+DEFINE_MACHINE("lm3s6965evb", lm3s6965evb_machine_machine_init);
+
 
 static void stellaris_i2c_class_init(ObjectClass *klass, void *data)
 {
diff --git a/hw/arm/tosa.c b/hw/arm/tosa.c
index 73572eb..573b903 100644
--- a/hw/arm/tosa.c
+++ b/hw/arm/tosa.c
@@ -252,18 +252,14 @@ static void tosa_init(MachineState *machine)
     sl_bootparam_write(SL_PXA_PARAM_BASE);
 }
 
-static QEMUMachine tosapda_machine = {
-    .name = "tosa",
-    .desc = "Tosa PDA (PXA255)",
-    .init = tosa_init,
-};
-
-static void tosapda_machine_init(void)
+static void tosapda_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&tosapda_machine);
+    mc->desc = "Tosa PDA (PXA255)";
+    mc->init = tosa_init;
 }
 
-machine_init(tosapda_machine_init);
+DEFINE_MACHINE("tosa", tosapda_machine_machine_init);
+
 
 static void tosa_dac_class_init(ObjectClass *klass, void *data)
 {
diff --git a/hw/arm/versatilepb.c b/hw/arm/versatilepb.c
index 6c69f4e..c737e61 100644
--- a/hw/arm/versatilepb.c
+++ b/hw/arm/versatilepb.c
@@ -391,27 +391,24 @@ static void vab_init(MachineState *machine)
     versatile_init(machine, 0x25e);
 }
 
-static QEMUMachine versatilepb_machine = {
-    .name = "versatilepb",
-    .desc = "ARM Versatile/PB (ARM926EJ-S)",
-    .init = vpb_init,
-    .block_default_type = IF_SCSI,
-};
+static void versatilepb_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "ARM Versatile/PB (ARM926EJ-S)";
+    mc->init = vpb_init;
+    mc->block_default_type = IF_SCSI;
+}
 
-static QEMUMachine versatileab_machine = {
-    .name = "versatileab",
-    .desc = "ARM Versatile/AB (ARM926EJ-S)",
-    .init = vab_init,
-    .block_default_type = IF_SCSI,
-};
+DEFINE_MACHINE("versatilepb", versatilepb_machine_machine_init);
 
-static void versatile_machine_init(void)
+static void versatileab_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&versatilepb_machine);
-    qemu_register_machine(&versatileab_machine);
+    mc->desc = "ARM Versatile/AB (ARM926EJ-S)";
+    mc->init = vab_init;
+    mc->block_default_type = IF_SCSI;
 }
 
-machine_init(versatile_machine_init);
+DEFINE_MACHINE("versatileab", versatileab_machine_machine_init);
+
 
 static void vpb_sic_class_init(ObjectClass *klass, void *data)
 {
diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
index a4e7b5c..4a0a891 100644
--- a/hw/arm/xilinx_zynq.c
+++ b/hw/arm/xilinx_zynq.c
@@ -255,18 +255,14 @@ static void zynq_init(MachineState *machine)
     arm_load_kernel(ARM_CPU(first_cpu), &zynq_binfo);
 }
 
-static QEMUMachine zynq_machine = {
-    .name = "xilinx-zynq-a9",
-    .desc = "Xilinx Zynq Platform Baseboard for Cortex-A9",
-    .init = zynq_init,
-    .block_default_type = IF_SCSI,
-    .max_cpus = 1,
-    .no_sdcard = 1,
-};
-
-static void zynq_machine_init(void)
+static void zynq_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&zynq_machine);
+    mc->desc = "Xilinx Zynq Platform Baseboard for Cortex-A9";
+    mc->init = zynq_init;
+    mc->block_default_type = IF_SCSI;
+    mc->max_cpus = 1;
+    mc->no_sdcard = 1;
 }
 
-machine_init(zynq_machine_init);
+DEFINE_MACHINE("xilinx-zynq-a9", zynq_machine_machine_init);
+
diff --git a/hw/arm/xlnx-ep108.c b/hw/arm/xlnx-ep108.c
index f94da86..0feb9b5 100644
--- a/hw/arm/xlnx-ep108.c
+++ b/hw/arm/xlnx-ep108.c
@@ -68,15 +68,11 @@ static void xlnx_ep108_init(MachineState *machine)
     arm_load_kernel(s->soc.boot_cpu_ptr, &xlnx_ep108_binfo);
 }
 
-static QEMUMachine xlnx_ep108_machine = {
-    .name = "xlnx-ep108",
-    .desc = "Xilinx ZynqMP EP108 board",
-    .init = xlnx_ep108_init,
-};
-
-static void xlnx_ep108_machine_init(void)
+static void xlnx_ep108_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&xlnx_ep108_machine);
+    mc->desc = "Xilinx ZynqMP EP108 board";
+    mc->init = xlnx_ep108_init;
 }
 
-machine_init(xlnx_ep108_machine_init);
+DEFINE_MACHINE("xlnx-ep108", xlnx_ep108_machine_machine_init);
+
diff --git a/hw/arm/z2.c b/hw/arm/z2.c
index 1735547..0b6806e 100644
--- a/hw/arm/z2.c
+++ b/hw/arm/z2.c
@@ -372,15 +372,11 @@ static void z2_init(MachineState *machine)
     arm_load_kernel(mpu->cpu, &z2_binfo);
 }
 
-static QEMUMachine z2_machine = {
-    .name = "z2",
-    .desc = "Zipit Z2 (PXA27x)",
-    .init = z2_init,
-};
-
-static void z2_machine_init(void)
+static void z2_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&z2_machine);
+    mc->desc = "Zipit Z2 (PXA27x)";
+    mc->init = z2_init;
 }
 
-machine_init(z2_machine_init);
+DEFINE_MACHINE("z2", z2_machine_machine_init);
+
diff --git a/hw/core/null-machine.c b/hw/core/null-machine.c
index 1ec7c3b..3157529 100644
--- a/hw/core/null-machine.c
+++ b/hw/core/null-machine.c
@@ -19,17 +19,13 @@ static void machine_none_init(MachineState *machine)
 {
 }
 
-static QEMUMachine machine_none = {
-    .name = "none",
-    .desc = "empty machine",
-    .init = machine_none_init,
-    .max_cpus = 0,
-};
-
-static void register_machines(void)
+static void machine_none_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&machine_none);
+    mc->desc = "empty machine";
+    mc->init = machine_none_init;
+    mc->max_cpus = 0;
 }
 
-machine_init(register_machines);
+DEFINE_MACHINE("none", machine_none_machine_init);
+
 
diff --git a/hw/cris/axis_dev88.c b/hw/cris/axis_dev88.c
index 3cae480..e3d1630 100644
--- a/hw/cris/axis_dev88.c
+++ b/hw/cris/axis_dev88.c
@@ -351,16 +351,12 @@ void axisdev88_init(MachineState *machine)
     }
 }
 
-static QEMUMachine axisdev88_machine = {
-    .name = "axis-dev88",
-    .desc = "AXIS devboard 88",
-    .init = axisdev88_init,
-    .is_default = 1,
-};
-
-static void axisdev88_machine_init(void)
+static void axisdev88_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&axisdev88_machine);
+    mc->desc = "AXIS devboard 88";
+    mc->init = axisdev88_init;
+    mc->is_default = 1;
 }
 
-machine_init(axisdev88_machine_init);
+DEFINE_MACHINE("axis-dev88", axisdev88_machine_machine_init);
+
diff --git a/hw/lm32/lm32_boards.c b/hw/lm32/lm32_boards.c
index 70f48d3..385c25d 100644
--- a/hw/lm32/lm32_boards.c
+++ b/hw/lm32/lm32_boards.c
@@ -292,24 +292,21 @@ static void lm32_uclinux_init(MachineState *machine)
     qemu_register_reset(main_cpu_reset, reset_info);
 }
 
-static QEMUMachine lm32_evr_machine = {
-    .name = "lm32-evr",
-    .desc = "LatticeMico32 EVR32 eval system",
-    .init = lm32_evr_init,
-    .is_default = 1,
-};
-
-static QEMUMachine lm32_uclinux_machine = {
-    .name = "lm32-uclinux",
-    .desc = "lm32 platform for uClinux and u-boot by Theobroma Systems",
-    .init = lm32_uclinux_init,
-    .is_default = 0,
-};
-
-static void lm32_machine_init(void)
+static void lm32_evr_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&lm32_uclinux_machine);
-    qemu_register_machine(&lm32_evr_machine);
+    mc->desc = "LatticeMico32 EVR32 eval system";
+    mc->init = lm32_evr_init;
+    mc->is_default = 1;
 }
 
-machine_init(lm32_machine_init);
+DEFINE_MACHINE("lm32-evr", lm32_evr_machine_machine_init);
+
+static void lm32_uclinux_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "lm32 platform for uClinux and u-boot by Theobroma Systems";
+    mc->init = lm32_uclinux_init;
+    mc->is_default = 0;
+}
+
+DEFINE_MACHINE("lm32-uclinux", lm32_uclinux_machine_machine_init);
+
diff --git a/hw/lm32/milkymist.c b/hw/lm32/milkymist.c
index e755f5b..a891fb5 100644
--- a/hw/lm32/milkymist.c
+++ b/hw/lm32/milkymist.c
@@ -209,16 +209,12 @@ milkymist_init(MachineState *machine)
     qemu_register_reset(main_cpu_reset, reset_info);
 }
 
-static QEMUMachine milkymist_machine = {
-    .name = "milkymist",
-    .desc = "Milkymist One",
-    .init = milkymist_init,
-    .is_default = 0,
-};
-
-static void milkymist_machine_init(void)
+static void milkymist_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&milkymist_machine);
+    mc->desc = "Milkymist One";
+    mc->init = milkymist_init;
+    mc->is_default = 0;
 }
 
-machine_init(milkymist_machine_init);
+DEFINE_MACHINE("milkymist", milkymist_machine_machine_init);
+
diff --git a/hw/m68k/an5206.c b/hw/m68k/an5206.c
index f63ab2b..08b5506 100644
--- a/hw/m68k/an5206.c
+++ b/hw/m68k/an5206.c
@@ -89,15 +89,11 @@ static void an5206_init(MachineState *machine)
     env->pc = entry;
 }
 
-static QEMUMachine an5206_machine = {
-    .name = "an5206",
-    .desc = "Arnewsh 5206",
-    .init = an5206_init,
-};
-
-static void an5206_machine_init(void)
+static void an5206_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&an5206_machine);
+    mc->desc = "Arnewsh 5206";
+    mc->init = an5206_init;
 }
 
-machine_init(an5206_machine_init);
+DEFINE_MACHINE("an5206", an5206_machine_machine_init);
+
diff --git a/hw/m68k/dummy_m68k.c b/hw/m68k/dummy_m68k.c
index 5b77d93..4a21f69 100644
--- a/hw/m68k/dummy_m68k.c
+++ b/hw/m68k/dummy_m68k.c
@@ -72,15 +72,11 @@ static void dummy_m68k_init(MachineState *machine)
     env->pc = entry;
 }
 
-static QEMUMachine dummy_m68k_machine = {
-    .name = "dummy",
-    .desc = "Dummy board",
-    .init = dummy_m68k_init,
-};
-
-static void dummy_m68k_machine_init(void)
+static void dummy_m68k_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&dummy_m68k_machine);
+    mc->desc = "Dummy board";
+    mc->init = dummy_m68k_init;
 }
 
-machine_init(dummy_m68k_machine_init);
+DEFINE_MACHINE("dummy", dummy_m68k_machine_machine_init);
+
diff --git a/hw/m68k/mcf5208.c b/hw/m68k/mcf5208.c
index 326a42d..89fd73a 100644
--- a/hw/m68k/mcf5208.c
+++ b/hw/m68k/mcf5208.c
@@ -294,16 +294,12 @@ static void mcf5208evb_init(MachineState *machine)
     env->pc = entry;
 }
 
-static QEMUMachine mcf5208evb_machine = {
-    .name = "mcf5208evb",
-    .desc = "MCF5206EVB",
-    .init = mcf5208evb_init,
-    .is_default = 1,
-};
-
-static void mcf5208evb_machine_init(void)
+static void mcf5208evb_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&mcf5208evb_machine);
+    mc->desc = "MCF5206EVB";
+    mc->init = mcf5208evb_init;
+    mc->is_default = 1;
 }
 
-machine_init(mcf5208evb_machine_init);
+DEFINE_MACHINE("mcf5208evb", mcf5208evb_machine_machine_init);
+
diff --git a/hw/microblaze/petalogix_ml605_mmu.c b/hw/microblaze/petalogix_ml605_mmu.c
index ed84a37..ca4ca07 100644
--- a/hw/microblaze/petalogix_ml605_mmu.c
+++ b/hw/microblaze/petalogix_ml605_mmu.c
@@ -206,16 +206,12 @@ petalogix_ml605_init(MachineState *machine)
 
 }
 
-static QEMUMachine petalogix_ml605_machine = {
-    .name = "petalogix-ml605",
-    .desc = "PetaLogix linux refdesign for xilinx ml605 little endian",
-    .init = petalogix_ml605_init,
-    .is_default = 0,
-};
-
-static void petalogix_ml605_machine_init(void)
+static void petalogix_ml605_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&petalogix_ml605_machine);
+    mc->desc = "PetaLogix linux refdesign for xilinx ml605 little endian";
+    mc->init = petalogix_ml605_init;
+    mc->is_default = 0;
 }
 
-machine_init(petalogix_ml605_machine_init);
+DEFINE_MACHINE("petalogix-ml605", petalogix_ml605_machine_machine_init);
+
diff --git a/hw/microblaze/petalogix_s3adsp1800_mmu.c b/hw/microblaze/petalogix_s3adsp1800_mmu.c
index 0c2140c..f351072 100644
--- a/hw/microblaze/petalogix_s3adsp1800_mmu.c
+++ b/hw/microblaze/petalogix_s3adsp1800_mmu.c
@@ -124,16 +124,12 @@ petalogix_s3adsp1800_init(MachineState *machine)
                            NULL);
 }
 
-static QEMUMachine petalogix_s3adsp1800_machine = {
-    .name = "petalogix-s3adsp1800",
-    .desc = "PetaLogix linux refdesign for xilinx Spartan 3ADSP1800",
-    .init = petalogix_s3adsp1800_init,
-    .is_default = 1,
-};
-
-static void petalogix_s3adsp1800_machine_init(void)
+static void petalogix_s3adsp1800_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&petalogix_s3adsp1800_machine);
+    mc->desc = "PetaLogix linux refdesign for xilinx Spartan 3ADSP1800";
+    mc->init = petalogix_s3adsp1800_init;
+    mc->is_default = 1;
 }
 
-machine_init(petalogix_s3adsp1800_machine_init);
+DEFINE_MACHINE("petalogix-s3adsp1800", petalogix_s3adsp1800_machine_machine_init);
+
diff --git a/hw/mips/mips_fulong2e.c b/hw/mips/mips_fulong2e.c
index dea941a..3ef75c7 100644
--- a/hw/mips/mips_fulong2e.c
+++ b/hw/mips/mips_fulong2e.c
@@ -392,15 +392,11 @@ static void mips_fulong2e_init(MachineState *machine)
     network_init(pci_bus);
 }
 
-static QEMUMachine mips_fulong2e_machine = {
-    .name = "fulong2e",
-    .desc = "Fulong 2e mini pc",
-    .init = mips_fulong2e_init,
-};
-
-static void mips_fulong2e_machine_init(void)
+static void mips_fulong2e_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&mips_fulong2e_machine);
+    mc->desc = "Fulong 2e mini pc";
+    mc->init = mips_fulong2e_init;
 }
 
-machine_init(mips_fulong2e_machine_init);
+DEFINE_MACHINE("fulong2e", mips_fulong2e_machine_machine_init);
+
diff --git a/hw/mips/mips_jazz.c b/hw/mips/mips_jazz.c
index 9d60633..d4d0d41 100644
--- a/hw/mips/mips_jazz.c
+++ b/hw/mips/mips_jazz.c
@@ -360,24 +360,21 @@ void mips_pica61_init(MachineState *machine)
     mips_jazz_init(machine, JAZZ_PICA61);
 }
 
-static QEMUMachine mips_magnum_machine = {
-    .name = "magnum",
-    .desc = "MIPS Magnum",
-    .init = mips_magnum_init,
-    .block_default_type = IF_SCSI,
-};
+static void mips_magnum_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "MIPS Magnum";
+    mc->init = mips_magnum_init;
+    mc->block_default_type = IF_SCSI;
+}
 
-static QEMUMachine mips_pica61_machine = {
-    .name = "pica61",
-    .desc = "Acer Pica 61",
-    .init = mips_pica61_init,
-    .block_default_type = IF_SCSI,
-};
+DEFINE_MACHINE("magnum", mips_magnum_machine_machine_init);
 
-static void mips_jazz_machine_init(void)
+static void mips_pica61_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&mips_magnum_machine);
-    qemu_register_machine(&mips_pica61_machine);
+    mc->desc = "Acer Pica 61";
+    mc->init = mips_pica61_init;
+    mc->block_default_type = IF_SCSI;
 }
 
-machine_init(mips_jazz_machine_init);
+DEFINE_MACHINE("pica61", mips_pica61_machine_machine_init);
+
diff --git a/hw/mips/mips_malta.c b/hw/mips/mips_malta.c
index 3082e75..01bca99 100644
--- a/hw/mips/mips_malta.c
+++ b/hw/mips/mips_malta.c
@@ -1216,23 +1216,19 @@ static const TypeInfo mips_malta_device = {
     .class_init    = mips_malta_class_init,
 };
 
-static QEMUMachine mips_malta_machine = {
-    .name = "malta",
-    .desc = "MIPS Malta Core LV",
-    .init = mips_malta_init,
-    .max_cpus = 16,
-    .is_default = 1,
-};
-
-static void mips_malta_register_types(void)
+static void mips_malta_machine_machine_init(MachineClass *mc)
 {
-    type_register_static(&mips_malta_device);
+    mc->desc = "MIPS Malta Core LV";
+    mc->init = mips_malta_init;
+    mc->max_cpus = 16;
+    mc->is_default = 1;
 }
 
-static void mips_malta_machine_init(void)
+DEFINE_MACHINE("malta", mips_malta_machine_machine_init);
+
+static void mips_malta_register_types(void)
 {
-    qemu_register_machine(&mips_malta_machine);
+    type_register_static(&mips_malta_device);
 }
 
-type_init(mips_malta_register_types)
-machine_init(mips_malta_machine_init);
+type_init(mips_malta_register_types)
\ No newline at end of file
diff --git a/hw/mips/mips_mipssim.c b/hw/mips/mips_mipssim.c
index 61f74a6..b634565 100644
--- a/hw/mips/mips_mipssim.c
+++ b/hw/mips/mips_mipssim.c
@@ -231,15 +231,11 @@ mips_mipssim_init(MachineState *machine)
         mipsnet_init(0x4200, env->irq[2], &nd_table[0]);
 }
 
-static QEMUMachine mips_mipssim_machine = {
-    .name = "mipssim",
-    .desc = "MIPS MIPSsim platform",
-    .init = mips_mipssim_init,
-};
-
-static void mips_mipssim_machine_init(void)
+static void mips_mipssim_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&mips_mipssim_machine);
+    mc->desc = "MIPS MIPSsim platform";
+    mc->init = mips_mipssim_init;
 }
 
-machine_init(mips_mipssim_machine_init);
+DEFINE_MACHINE("mipssim", mips_mipssim_machine_machine_init);
+
diff --git a/hw/mips/mips_r4k.c b/hw/mips/mips_r4k.c
index f4dcacd..eecd85f 100644
--- a/hw/mips/mips_r4k.c
+++ b/hw/mips/mips_r4k.c
@@ -300,15 +300,11 @@ void mips_r4k_init(MachineState *machine)
     isa_create_simple(isa_bus, "i8042");
 }
 
-static QEMUMachine mips_machine = {
-    .name = "mips",
-    .desc = "mips r4k platform",
-    .init = mips_r4k_init,
-};
-
-static void mips_machine_init(void)
+static void mips_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&mips_machine);
+    mc->desc = "mips r4k platform";
+    mc->init = mips_r4k_init;
 }
 
-machine_init(mips_machine_init);
+DEFINE_MACHINE("mips", mips_machine_machine_init);
+
diff --git a/hw/moxie/moxiesim.c b/hw/moxie/moxiesim.c
index 80bcc5b..eca92c9 100644
--- a/hw/moxie/moxiesim.c
+++ b/hw/moxie/moxiesim.c
@@ -146,16 +146,12 @@ static void moxiesim_init(MachineState *machine)
     }
 }
 
-static QEMUMachine moxiesim_machine = {
-    .name = "moxiesim",
-    .desc = "Moxie simulator platform",
-    .init = moxiesim_init,
-    .is_default = 1,
-};
-
-static void moxie_machine_init(void)
+static void moxiesim_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&moxiesim_machine);
+    mc->desc = "Moxie simulator platform";
+    mc->init = moxiesim_init;
+    mc->is_default = 1;
 }
 
-machine_init(moxie_machine_init)
+DEFINE_MACHINE("moxiesim", moxiesim_machine_machine_init);
+
diff --git a/hw/openrisc/openrisc_sim.c b/hw/openrisc/openrisc_sim.c
index 1da0657..961fac6 100644
--- a/hw/openrisc/openrisc_sim.c
+++ b/hw/openrisc/openrisc_sim.c
@@ -132,17 +132,13 @@ static void openrisc_sim_init(MachineState *machine)
     cpu_openrisc_load_kernel(ram_size, kernel_filename, cpu);
 }
 
-static QEMUMachine openrisc_sim_machine = {
-    .name = "or32-sim",
-    .desc = "or32 simulation",
-    .init = openrisc_sim_init,
-    .max_cpus = 1,
-    .is_default = 1,
-};
-
-static void openrisc_sim_machine_init(void)
+static void openrisc_sim_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&openrisc_sim_machine);
+    mc->desc = "or32 simulation";
+    mc->init = openrisc_sim_init;
+    mc->max_cpus = 1;
+    mc->is_default = 1;
 }
 
-machine_init(openrisc_sim_machine_init);
+DEFINE_MACHINE("or32-sim", openrisc_sim_machine_machine_init);
+
diff --git a/hw/ppc/e500plat.c b/hw/ppc/e500plat.c
index 14b14ea..2fc9028 100644
--- a/hw/ppc/e500plat.c
+++ b/hw/ppc/e500plat.c
@@ -57,17 +57,13 @@ static void e500plat_init(MachineState *machine)
     ppce500_init(machine, &params);
 }
 
-static QEMUMachine e500plat_machine = {
-    .name = "ppce500",
-    .desc = "generic paravirt e500 platform",
-    .init = e500plat_init,
-    .max_cpus = 32,
-    .has_dynamic_sysbus = true,
-};
-
-static void e500plat_machine_init(void)
+static void e500plat_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&e500plat_machine);
+    mc->desc = "generic paravirt e500 platform";
+    mc->init = e500plat_init;
+    mc->max_cpus = 32;
+    mc->has_dynamic_sysbus = true;
 }
 
-machine_init(e500plat_machine_init);
+DEFINE_MACHINE("ppce500", e500plat_machine_machine_init);
+
diff --git a/hw/ppc/mac_oldworld.c b/hw/ppc/mac_oldworld.c
index 06fdbaf..d279e84 100644
--- a/hw/ppc/mac_oldworld.c
+++ b/hw/ppc/mac_oldworld.c
@@ -357,21 +357,17 @@ static int heathrow_kvm_type(const char *arg)
     return 2;
 }
 
-static QEMUMachine heathrow_machine = {
-    .name = "g3beige",
-    .desc = "Heathrow based PowerMAC",
-    .init = ppc_heathrow_init,
-    .max_cpus = MAX_CPUS,
+static void heathrow_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Heathrow based PowerMAC";
+    mc->init = ppc_heathrow_init;
+    mc->max_cpus = MAX_CPUS; 
 #ifndef TARGET_PPC64
-    .is_default = 1,
+    mc->is_default = 1; 
 #endif
-    .default_boot_order = "cd", /* TOFIX "cad" when Mac floppy is implemented */
-    .kvm_type = heathrow_kvm_type,
-};
-
-static void heathrow_machine_init(void)
-{
-    qemu_register_machine(&heathrow_machine);
+    mc->default_boot_order = "cd"; /* TOFIX "cad" when Mac floppy is implemented */
+    mc->kvm_type = heathrow_kvm_type;
 }
 
-machine_init(heathrow_machine_init);
+DEFINE_MACHINE("g3beige", heathrow_machine_machine_init);
+
diff --git a/hw/ppc/mpc8544ds.c b/hw/ppc/mpc8544ds.c
index 3a3b141..b6491f8 100644
--- a/hw/ppc/mpc8544ds.c
+++ b/hw/ppc/mpc8544ds.c
@@ -50,16 +50,12 @@ static void mpc8544ds_init(MachineState *machine)
 }
 
 
-static QEMUMachine ppce500_machine = {
-    .name = "mpc8544ds",
-    .desc = "mpc8544ds",
-    .init = mpc8544ds_init,
-    .max_cpus = 15,
-};
-
-static void ppce500_machine_init(void)
+static void ppce500_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&ppce500_machine);
+    mc->desc = "mpc8544ds";
+    mc->init = mpc8544ds_init;
+    mc->max_cpus = 15;
 }
 
-machine_init(ppce500_machine_init);
+DEFINE_MACHINE("mpc8544ds", ppce500_machine_machine_init);
+
diff --git a/hw/ppc/ppc405_boards.c b/hw/ppc/ppc405_boards.c
index ec6c4cb..60a1092 100644
--- a/hw/ppc/ppc405_boards.c
+++ b/hw/ppc/ppc405_boards.c
@@ -368,11 +368,13 @@ static void ref405ep_init(MachineState *machine)
 #endif
 }
 
-static QEMUMachine ref405ep_machine = {
-    .name = "ref405ep",
-    .desc = "ref405ep",
-    .init = ref405ep_init,
-};
+static void ref405ep_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "ref405ep";
+    mc->init = ref405ep_init;
+}
+
+DEFINE_MACHINE("ref405ep", ref405ep_machine_machine_init);
 
 /*****************************************************************************/
 /* AMCC Taihu evaluation board */
@@ -664,16 +666,11 @@ static void taihu_405ep_init(MachineState *machine)
 #endif
 }
 
-static QEMUMachine taihu_machine = {
-    .name = "taihu",
-    .desc = "taihu",
-    .init = taihu_405ep_init,
-};
-
-static void ppc405_machine_init(void)
+static void taihu_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&ref405ep_machine);
-    qemu_register_machine(&taihu_machine);
+    mc->desc = "taihu";
+    mc->init = taihu_405ep_init;
 }
 
-machine_init(ppc405_machine_init);
+DEFINE_MACHINE("taihu", taihu_machine_machine_init);
+
diff --git a/hw/ppc/ppc440_bamboo.c b/hw/ppc/ppc440_bamboo.c
index 032fa80..6ed1728 100644
--- a/hw/ppc/ppc440_bamboo.c
+++ b/hw/ppc/ppc440_bamboo.c
@@ -293,15 +293,11 @@ static void bamboo_init(MachineState *machine)
         kvmppc_init();
 }
 
-static QEMUMachine bamboo_machine = {
-    .name = "bamboo",
-    .desc = "bamboo",
-    .init = bamboo_init,
-};
-
-static void bamboo_machine_init(void)
+static void bamboo_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&bamboo_machine);
+    mc->desc = "bamboo";
+    mc->init = bamboo_init;
 }
 
-machine_init(bamboo_machine_init);
+DEFINE_MACHINE("bamboo", bamboo_machine_machine_init);
+
diff --git a/hw/ppc/prep.c b/hw/ppc/prep.c
index 45b5f62..c88bee8 100644
--- a/hw/ppc/prep.c
+++ b/hw/ppc/prep.c
@@ -698,17 +698,13 @@ static void ppc_prep_init(MachineState *machine)
                          graphic_width, graphic_height, graphic_depth);
 }
 
-static QEMUMachine prep_machine = {
-    .name = "prep",
-    .desc = "PowerPC PREP platform",
-    .init = ppc_prep_init,
-    .max_cpus = MAX_CPUS,
-    .default_boot_order = "cad",
-};
-
-static void prep_machine_init(void)
+static void prep_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&prep_machine);
+    mc->desc = "PowerPC PREP platform";
+    mc->init = ppc_prep_init;
+    mc->max_cpus = MAX_CPUS;
+    mc->default_boot_order = "cad";
 }
 
-machine_init(prep_machine_init);
+DEFINE_MACHINE("prep", prep_machine_machine_init);
+
diff --git a/hw/ppc/virtex_ml507.c b/hw/ppc/virtex_ml507.c
index de86f7c..b760b40 100644
--- a/hw/ppc/virtex_ml507.c
+++ b/hw/ppc/virtex_ml507.c
@@ -297,15 +297,11 @@ static void virtex_init(MachineState *machine)
     env->load_info = &boot_info;
 }
 
-static QEMUMachine virtex_machine = {
-    .name = "virtex-ml507",
-    .desc = "Xilinx Virtex ML507 reference design",
-    .init = virtex_init,
-};
-
-static void virtex_machine_init(void)
+static void virtex_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&virtex_machine);
+    mc->desc = "Xilinx Virtex ML507 reference design";
+    mc->init = virtex_init;
 }
 
-machine_init(virtex_machine_init);
+DEFINE_MACHINE("virtex-ml507", virtex_machine_machine_init);
+
diff --git a/hw/sh4/r2d.c b/hw/sh4/r2d.c
index 5e22ed7..a5b0dcd 100644
--- a/hw/sh4/r2d.c
+++ b/hw/sh4/r2d.c
@@ -354,15 +354,11 @@ static void r2d_init(MachineState *machine)
                        SDRAM_BASE + BOOT_PARAMS_OFFSET);
 }
 
-static QEMUMachine r2d_machine = {
-    .name = "r2d",
-    .desc = "r2d-plus board",
-    .init = r2d_init,
-};
-
-static void r2d_machine_init(void)
+static void r2d_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&r2d_machine);
+    mc->desc = "r2d-plus board";
+    mc->init = r2d_init;
 }
 
-machine_init(r2d_machine_init);
+DEFINE_MACHINE("r2d", r2d_machine_machine_init);
+
diff --git a/hw/sh4/shix.c b/hw/sh4/shix.c
index f93f98e..43025fa 100644
--- a/hw/sh4/shix.c
+++ b/hw/sh4/shix.c
@@ -87,16 +87,12 @@ static void shix_init(MachineState *machine)
     tc58128_init(s, "shix_linux_nand.bin", NULL);
 }
 
-static QEMUMachine shix_machine = {
-    .name = "shix",
-    .desc = "shix card",
-    .init = shix_init,
-    .is_default = 1,
-};
-
-static void shix_machine_init(void)
+static void shix_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&shix_machine);
+    mc->desc = "shix card";
+    mc->init = shix_init;
+    mc->is_default = 1;
 }
 
-machine_init(shix_machine_init);
+DEFINE_MACHINE("shix", shix_machine_machine_init);
+
diff --git a/hw/sparc/leon3.c b/hw/sparc/leon3.c
index 7f5dcd6..faac11e 100644
--- a/hw/sparc/leon3.c
+++ b/hw/sparc/leon3.c
@@ -216,15 +216,11 @@ static void leon3_generic_hw_init(MachineState *machine)
     }
 }
 
-static QEMUMachine leon3_generic_machine = {
-    .name     = "leon3_generic",
-    .desc     = "Leon-3 generic",
-    .init     = leon3_generic_hw_init,
-};
-
-static void leon3_machine_init(void)
+static void leon3_generic_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&leon3_generic_machine);
+    mc->desc = "Leon-3 generic";
+    mc->init = leon3_generic_hw_init;
 }
 
-machine_init(leon3_machine_init);
+DEFINE_MACHINE("leon3_generic", leon3_generic_machine_machine_init);
+
diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c
index 68ac4d8..5d322e6 100644
--- a/hw/sparc/sun4m.c
+++ b/hw/sparc/sun4m.c
@@ -1104,7 +1104,7 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef,
         fw_cfg_add_i32(fw_cfg, FW_CFG_CMDLINE_SIZE, 0);
     }
     fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_ADDR, INITRD_LOAD_ADDR);
-    fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_SIZE, 0); // not used
+    fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_SIZE, 0); /* not used */
     fw_cfg_add_i16(fw_cfg, FW_CFG_BOOT_DEVICE, machine->boot_order[0]);
     qemu_register_boot_set(fw_cfg_boot_set, fw_cfg);
 }
@@ -1420,81 +1420,99 @@ static void sbook_init(MachineState *machine)
     sun4m_hw_init(&sun4m_hwdefs[8], machine);
 }
 
-static QEMUMachine ss5_machine = {
-    .name = "SS-5",
-    .desc = "Sun4m platform, SPARCstation 5",
-    .init = ss5_init,
-    .block_default_type = IF_SCSI,
-    .is_default = 1,
-    .default_boot_order = "c",
-};
+static void ss5_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Sun4m platform, SPARCstation 5";
+    mc->init = ss5_init;
+    mc->block_default_type = IF_SCSI;
+    mc->is_default = 1;
+    mc->default_boot_order = "c";
+}
 
-static QEMUMachine ss10_machine = {
-    .name = "SS-10",
-    .desc = "Sun4m platform, SPARCstation 10",
-    .init = ss10_init,
-    .block_default_type = IF_SCSI,
-    .max_cpus = 4,
-    .default_boot_order = "c",
-};
+DEFINE_MACHINE("SS-5", ss5_machine_machine_init);
 
-static QEMUMachine ss600mp_machine = {
-    .name = "SS-600MP",
-    .desc = "Sun4m platform, SPARCserver 600MP",
-    .init = ss600mp_init,
-    .block_default_type = IF_SCSI,
-    .max_cpus = 4,
-    .default_boot_order = "c",
-};
+static void ss10_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Sun4m platform, SPARCstation 10";
+    mc->init = ss10_init;
+    mc->block_default_type = IF_SCSI;
+    mc->max_cpus = 4;
+    mc->default_boot_order = "c";
+}
 
-static QEMUMachine ss20_machine = {
-    .name = "SS-20",
-    .desc = "Sun4m platform, SPARCstation 20",
-    .init = ss20_init,
-    .block_default_type = IF_SCSI,
-    .max_cpus = 4,
-    .default_boot_order = "c",
-};
+DEFINE_MACHINE("SS-10", ss10_machine_machine_init);
 
-static QEMUMachine voyager_machine = {
-    .name = "Voyager",
-    .desc = "Sun4m platform, SPARCstation Voyager",
-    .init = vger_init,
-    .block_default_type = IF_SCSI,
-    .default_boot_order = "c",
-};
+static void ss600mp_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Sun4m platform, SPARCserver 600MP";
+    mc->init = ss600mp_init;
+    mc->block_default_type = IF_SCSI;
+    mc->max_cpus = 4;
+    mc->default_boot_order = "c";
+}
 
-static QEMUMachine ss_lx_machine = {
-    .name = "LX",
-    .desc = "Sun4m platform, SPARCstation LX",
-    .init = ss_lx_init,
-    .block_default_type = IF_SCSI,
-    .default_boot_order = "c",
-};
+DEFINE_MACHINE("SS-600MP", ss600mp_machine_machine_init);
 
-static QEMUMachine ss4_machine = {
-    .name = "SS-4",
-    .desc = "Sun4m platform, SPARCstation 4",
-    .init = ss4_init,
-    .block_default_type = IF_SCSI,
-    .default_boot_order = "c",
-};
+static void ss20_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Sun4m platform, SPARCstation 20";
+    mc->init = ss20_init;
+    mc->block_default_type = IF_SCSI;
+    mc->max_cpus = 4;
+    mc->default_boot_order = "c";
+}
 
-static QEMUMachine scls_machine = {
-    .name = "SPARCClassic",
-    .desc = "Sun4m platform, SPARCClassic",
-    .init = scls_init,
-    .block_default_type = IF_SCSI,
-    .default_boot_order = "c",
-};
+DEFINE_MACHINE("SS-20", ss20_machine_machine_init);
 
-static QEMUMachine sbook_machine = {
-    .name = "SPARCbook",
-    .desc = "Sun4m platform, SPARCbook",
-    .init = sbook_init,
-    .block_default_type = IF_SCSI,
-    .default_boot_order = "c",
-};
+static void voyager_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Sun4m platform, SPARCstation Voyager";
+    mc->init = vger_init;
+    mc->block_default_type = IF_SCSI;
+    mc->default_boot_order = "c";
+}
+
+DEFINE_MACHINE("Voyager", voyager_machine_machine_init);
+
+static void ss_lx_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Sun4m platform, SPARCstation LX";
+    mc->init = ss_lx_init;
+    mc->block_default_type = IF_SCSI;
+    mc->default_boot_order = "c";
+}
+
+DEFINE_MACHINE("LX", ss_lx_machine_machine_init);
+
+static void ss4_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Sun4m platform, SPARCstation 4";
+    mc->init = ss4_init;
+    mc->block_default_type = IF_SCSI;
+    mc->default_boot_order = "c";
+}
+
+DEFINE_MACHINE("SS-4", ss4_machine_machine_init);
+
+static void scls_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Sun4m platform, SPARCClassic";
+    mc->init = scls_init;
+    mc->block_default_type = IF_SCSI;
+    mc->default_boot_order = "c";
+}
+
+DEFINE_MACHINE("SPARCClassic", scls_machine_machine_init);
+
+static void sbook_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Sun4m platform, SPARCbook";
+    mc->init = sbook_init;
+    mc->block_default_type = IF_SCSI;
+    mc->default_boot_order = "c";
+}
+
+DEFINE_MACHINE("SPARCbook", sbook_machine_machine_init);
 
 static void sun4m_register_types(void)
 {
@@ -1504,18 +1522,4 @@ static void sun4m_register_types(void)
     type_register_static(&ram_info);
 }
 
-static void sun4m_machine_init(void)
-{
-    qemu_register_machine(&ss5_machine);
-    qemu_register_machine(&ss10_machine);
-    qemu_register_machine(&ss600mp_machine);
-    qemu_register_machine(&ss20_machine);
-    qemu_register_machine(&voyager_machine);
-    qemu_register_machine(&ss_lx_machine);
-    qemu_register_machine(&ss4_machine);
-    qemu_register_machine(&scls_machine);
-    qemu_register_machine(&sbook_machine);
-}
-
-type_init(sun4m_register_types)
-machine_init(sun4m_machine_init);
+type_init(sun4m_register_types)
\ No newline at end of file
diff --git a/hw/sparc64/sun4u.c b/hw/sparc64/sun4u.c
index 30cfa0e..c5034d8 100644
--- a/hw/sparc64/sun4u.c
+++ b/hw/sparc64/sun4u.c
@@ -416,9 +416,9 @@ static void main_cpu_reset(void *opaque)
     cpu_timer_reset(env->stick);
     cpu_timer_reset(env->hstick);
 
-    env->gregs[1] = 0; // Memory start
-    env->gregs[2] = ram_size; // Memory size
-    env->gregs[3] = 0; // Machine description XXX
+    env->gregs[1] = 0; /* Memory start */
+    env->gregs[2] = ram_size; /* Memory size */
+    env->gregs[3] = 0; /* Machine description XXX */
     if (nr_resets++ == 0) {
         /* Power on reset */
         env->pc = s->prom_addr + 0x20ULL;
@@ -601,12 +601,12 @@ pci_ebus_init1(PCIDevice *pci_dev)
     isa_bus_new(DEVICE(pci_dev), get_system_memory(),
                 pci_address_space_io(pci_dev));
 
-    pci_dev->config[0x04] = 0x06; // command = bus master, pci mem
+    pci_dev->config[0x04] = 0x06; /* command = bus master, pci mem */
     pci_dev->config[0x05] = 0x00;
-    pci_dev->config[0x06] = 0xa0; // status = fast back-to-back, 66MHz, no error
-    pci_dev->config[0x07] = 0x03; // status = medium devsel
-    pci_dev->config[0x09] = 0x00; // programming i/f
-    pci_dev->config[0x0D] = 0x0a; // latency_timer
+    pci_dev->config[0x06] = 0xa0; /* status = fast back-to-back, 66MHz, no error */
+    pci_dev->config[0x07] = 0x03; /* status = medium devsel */
+    pci_dev->config[0x09] = 0x00; /* programming i/f */
+    pci_dev->config[0x0D] = 0x0a; /* latency_timer */
 
     memory_region_init_alias(&s->bar0, OBJECT(s), "bar0", get_system_io(),
                              0, 0x1000000);
@@ -965,30 +965,36 @@ static void niagara_init(MachineState *machine)
     sun4uv_init(get_system_memory(), machine, &hwdefs[2]);
 }
 
-static QEMUMachine sun4u_machine = {
-    .name = "sun4u",
-    .desc = "Sun4u platform",
-    .init = sun4u_init,
-    .max_cpus = 1, // XXX for now
-    .is_default = 1,
-    .default_boot_order = "c",
-};
+static void sun4u_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Sun4u platform";
+    mc->init = sun4u_init;
+    mc->max_cpus = 1; /* XXX for now */
+    mc->is_default = 1;
+    mc->default_boot_order = "c";
+}
 
-static QEMUMachine sun4v_machine = {
-    .name = "sun4v",
-    .desc = "Sun4v platform",
-    .init = sun4v_init,
-    .max_cpus = 1, // XXX for now
-    .default_boot_order = "c",
-};
+DEFINE_MACHINE("sun4u", sun4u_machine_machine_init);
 
-static QEMUMachine niagara_machine = {
-    .name = "Niagara",
-    .desc = "Sun4v platform, Niagara",
-    .init = niagara_init,
-    .max_cpus = 1, // XXX for now
-    .default_boot_order = "c",
-};
+static void sun4v_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Sun4v platform";
+    mc->init = sun4v_init;
+    mc->max_cpus = 1; /* XXX for now */
+    mc->default_boot_order = "c";
+}
+
+DEFINE_MACHINE("sun4v", sun4v_machine_machine_init);
+
+static void niagara_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Sun4v platform, Niagara";
+    mc->init = niagara_init;
+    mc->max_cpus = 1; /* XXX for now */
+    mc->default_boot_order = "c";
+}
+
+DEFINE_MACHINE("Niagara", niagara_machine_machine_init);
 
 static void sun4u_register_types(void)
 {
@@ -997,12 +1003,4 @@ static void sun4u_register_types(void)
     type_register_static(&ram_info);
 }
 
-static void sun4u_machine_init(void)
-{
-    qemu_register_machine(&sun4u_machine);
-    qemu_register_machine(&sun4v_machine);
-    qemu_register_machine(&niagara_machine);
-}
-
-type_init(sun4u_register_types)
-machine_init(sun4u_machine_init);
+type_init(sun4u_register_types)
\ No newline at end of file
diff --git a/hw/tricore/tricore_testboard.c b/hw/tricore/tricore_testboard.c
index a059a20..bb3b016 100644
--- a/hw/tricore/tricore_testboard.c
+++ b/hw/tricore/tricore_testboard.c
@@ -109,16 +109,12 @@ static void tricoreboard_init(MachineState *machine)
     tricore_testboard_init(machine, 0x183);
 }
 
-static QEMUMachine ttb_machine = {
-    .name = "tricore_testboard",
-    .desc = "a minimal TriCore board",
-    .init = tricoreboard_init,
-    .is_default = 0,
-};
-
-static void tricore_testboard_machine_init(void)
+static void ttb_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&ttb_machine);
+    mc->desc = "a minimal TriCore board";
+    mc->init = tricoreboard_init;
+    mc->is_default = 0;
 }
 
-machine_init(tricore_testboard_machine_init);
+DEFINE_MACHINE("tricore_testboard", ttb_machine_machine_init);
+
diff --git a/hw/unicore32/puv3.c b/hw/unicore32/puv3.c
index 703e29d..34f1be0 100644
--- a/hw/unicore32/puv3.c
+++ b/hw/unicore32/puv3.c
@@ -130,16 +130,12 @@ static void puv3_init(MachineState *machine)
     puv3_load_kernel(kernel_filename);
 }
 
-static QEMUMachine puv3_machine = {
-    .name = "puv3",
-    .desc = "PKUnity Version-3 based on UniCore32",
-    .init = puv3_init,
-    .is_default = 1,
-};
-
-static void puv3_machine_init(void)
+static void puv3_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&puv3_machine);
+    mc->desc = "PKUnity Version-3 based on UniCore32";
+    mc->init = puv3_init;
+    mc->is_default = 1;
 }
 
-machine_init(puv3_machine_init)
+DEFINE_MACHINE("puv3", puv3_machine_machine_init);
+
diff --git a/hw/xenpv/xen_machine_pv.c b/hw/xenpv/xen_machine_pv.c
index 2e545d2..d72ef2d 100644
--- a/hw/xenpv/xen_machine_pv.c
+++ b/hw/xenpv/xen_machine_pv.c
@@ -93,17 +93,13 @@ static void xen_init_pv(MachineState *machine)
     xen_init_display(xen_domid);
 }
 
-static QEMUMachine xenpv_machine = {
-    .name = "xenpv",
-    .desc = "Xen Para-virtualized PC",
-    .init = xen_init_pv,
-    .max_cpus = 1,
-    .default_machine_opts = "accel=xen",
-};
-
-static void xenpv_machine_init(void)
+static void xenpv_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&xenpv_machine);
+    mc->desc = "Xen Para-virtualized PC";
+    mc->init = xen_init_pv;
+    mc->max_cpus = 1;
+    mc->default_machine_opts = "accel=xen";
 }
 
-machine_init(xenpv_machine_init);
+DEFINE_MACHINE("xenpv", xenpv_machine_machine_init);
+
diff --git a/hw/xtensa/sim.c b/hw/xtensa/sim.c
index 328d209..4881783 100644
--- a/hw/xtensa/sim.c
+++ b/hw/xtensa/sim.c
@@ -104,17 +104,13 @@ static void xtensa_sim_init(MachineState *machine)
     }
 }
 
-static QEMUMachine xtensa_sim_machine = {
-    .name = "sim",
-    .desc = "sim machine (" XTENSA_DEFAULT_CPU_MODEL ")",
-    .is_default = true,
-    .init = xtensa_sim_init,
-    .max_cpus = 4,
-};
-
-static void xtensa_sim_machine_init(void)
+static void xtensa_sim_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&xtensa_sim_machine);
+    mc->desc = "sim machine (" XTENSA_DEFAULT_CPU_MODEL ")";
+    mc->is_default = true;
+    mc->init = xtensa_sim_init;
+    mc->max_cpus = 4;
 }
 
-machine_init(xtensa_sim_machine_init);
+DEFINE_MACHINE("sim", xtensa_sim_machine_machine_init);
+
diff --git a/hw/xtensa/xtfpga.c b/hw/xtensa/xtfpga.c
index ab4d0e4..d0c4a8b 100644
--- a/hw/xtensa/xtfpga.c
+++ b/hw/xtensa/xtfpga.c
@@ -427,40 +427,39 @@ static void xtensa_kc705_init(MachineState *machine)
     lx_init(&kc705_board, machine);
 }
 
-static QEMUMachine xtensa_lx60_machine = {
-    .name = "lx60",
-    .desc = "lx60 EVB (" XTENSA_DEFAULT_CPU_MODEL ")",
-    .init = xtensa_lx60_init,
-    .max_cpus = 4,
-};
+static void xtensa_lx60_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "lx60 EVB (" XTENSA_DEFAULT_CPU_MODEL ")";
+    mc->init = xtensa_lx60_init;
+    mc->max_cpus = 4;
+}
 
-static QEMUMachine xtensa_lx200_machine = {
-    .name = "lx200",
-    .desc = "lx200 EVB (" XTENSA_DEFAULT_CPU_MODEL ")",
-    .init = xtensa_lx200_init,
-    .max_cpus = 4,
-};
+DEFINE_MACHINE("lx60", xtensa_lx60_machine_machine_init);
 
-static QEMUMachine xtensa_ml605_machine = {
-    .name = "ml605",
-    .desc = "ml605 EVB (" XTENSA_DEFAULT_CPU_MODEL ")",
-    .init = xtensa_ml605_init,
-    .max_cpus = 4,
-};
+static void xtensa_lx200_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "lx200 EVB (" XTENSA_DEFAULT_CPU_MODEL ")";
+    mc->init = xtensa_lx200_init;
+    mc->max_cpus = 4;
+}
 
-static QEMUMachine xtensa_kc705_machine = {
-    .name = "kc705",
-    .desc = "kc705 EVB (" XTENSA_DEFAULT_CPU_MODEL ")",
-    .init = xtensa_kc705_init,
-    .max_cpus = 4,
-};
+DEFINE_MACHINE("lx200", xtensa_lx200_machine_machine_init);
+
+static void xtensa_ml605_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "ml605 EVB (" XTENSA_DEFAULT_CPU_MODEL ")";
+    mc->init = xtensa_ml605_init;
+    mc->max_cpus = 4;
+}
+
+DEFINE_MACHINE("ml605", xtensa_ml605_machine_machine_init);
 
-static void xtensa_lx_machines_init(void)
+static void xtensa_kc705_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&xtensa_lx60_machine);
-    qemu_register_machine(&xtensa_lx200_machine);
-    qemu_register_machine(&xtensa_ml605_machine);
-    qemu_register_machine(&xtensa_kc705_machine);
+    mc->desc = "kc705 EVB (" XTENSA_DEFAULT_CPU_MODEL ")";
+    mc->init = xtensa_kc705_init;
+    mc->max_cpus = 4;
 }
 
-machine_init(xtensa_lx_machines_init);
+DEFINE_MACHINE("kc705", xtensa_kc705_machine_machine_init);
+
-- 
2.1.0

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [Qemu-devel] [PATCH 7/7] machine: Eliminate QEMUMachine and qemu_register_machine()
  2015-08-18 19:08 [Qemu-devel] [PATCH 0/7] machine registration: Use QOM, eliminate QEMUMachine Eduardo Habkost
                   ` (5 preceding siblings ...)
  2015-08-18 19:08 ` [Qemu-devel] [PATCH 6/7] [RFC] Use DEFINE_MACHINE to register all machines Eduardo Habkost
@ 2015-08-18 19:08 ` Eduardo Habkost
  6 siblings, 0 replies; 15+ messages in thread
From: Eduardo Habkost @ 2015-08-18 19:08 UTC (permalink / raw
  To: qemu-devel; +Cc: Marcel Apfelbaum, Michael S. Tsirkin

The struct is not used anymore and can be eliminated.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 include/hw/boards.h       | 27 ---------------------------
 include/qemu/typedefs.h   |  1 -
 include/sysemu/blockdev.h |  2 +-
 include/sysemu/sysemu.h   |  2 +-
 vl.c                      | 37 -------------------------------------
 5 files changed, 2 insertions(+), 67 deletions(-)

diff --git a/include/hw/boards.h b/include/hw/boards.h
index 95bcecd..2342a88 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -9,36 +9,10 @@
 #include "hw/qdev.h"
 #include "qom/object.h"
 
-
-typedef void QEMUMachineInitFunc(MachineState *ms);
-
-typedef void QEMUMachineResetFunc(void);
-
-typedef void QEMUMachineHotAddCPUFunc(const int64_t id, Error **errp);
-
-typedef int QEMUMachineGetKvmtypeFunc(const char *arg);
-
-struct QEMUMachine {
-    const char *name;
-    const char *desc;
-    QEMUMachineInitFunc *init;
-    QEMUMachineGetKvmtypeFunc *kvm_type;
-    BlockInterfaceType block_default_type;
-    int max_cpus;
-    unsigned int
-        no_sdcard:1,
-        has_dynamic_sysbus:1;
-    int is_default;
-    const char *default_machine_opts;
-    const char *default_boot_order;
-};
-
 void memory_region_allocate_system_memory(MemoryRegion *mr, Object *owner,
                                           const char *name,
                                           uint64_t ram_size);
 
-int qemu_register_machine(QEMUMachine *m);
-
 #define TYPE_MACHINE_SUFFIX "-machine"
 #define TYPE_MACHINE "machine"
 #undef MACHINE  /* BSD defines it and QEMU does not use it */
@@ -63,7 +37,6 @@ bool machine_mem_merge(MachineState *machine);
 
 /**
  * MachineClass:
- * @qemu_machine: #QEMUMachine
  * @get_hotplug_handler: this function is called during bus-less
  *    device hotplug. If defined it returns pointer to an instance
  *    of HotplugHandler object, which handles hotplug operation
diff --git a/include/qemu/typedefs.h b/include/qemu/typedefs.h
index f8a9dd6..aea4aa8 100644
--- a/include/qemu/typedefs.h
+++ b/include/qemu/typedefs.h
@@ -67,7 +67,6 @@ typedef struct Property Property;
 typedef struct QEMUBH QEMUBH;
 typedef struct QemuConsole QemuConsole;
 typedef struct QEMUFile QEMUFile;
-typedef struct QEMUMachine QEMUMachine;
 typedef struct QEMUSGList QEMUSGList;
 typedef struct QEMUSizedBuffer QEMUSizedBuffer;
 typedef struct QEMUTimerListGroup QEMUTimerListGroup;
diff --git a/include/sysemu/blockdev.h b/include/sysemu/blockdev.h
index 3104150..a00be94 100644
--- a/include/sysemu/blockdev.h
+++ b/include/sysemu/blockdev.h
@@ -20,7 +20,7 @@ void blockdev_auto_del(BlockBackend *blk);
 typedef enum {
     IF_DEFAULT = -1,            /* for use with drive_add() only */
     /*
-     * IF_IDE must be zero, because we want QEMUMachine member
+     * IF_IDE must be zero, because we want MachineClass member
      * block_default_type to default-initialize to IF_IDE
      */
     IF_IDE = 0,
diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
index 44570d1..c148283 100644
--- a/include/sysemu/sysemu.h
+++ b/include/sysemu/sysemu.h
@@ -194,7 +194,7 @@ void device_add_bootindex_property(Object *obj, int32_t *bootindex,
 void restore_boot_order(void *opaque);
 void validate_bootdevices(const char *devices, Error **errp);
 
-/* handler to set the boot_device order for a specific type of QEMUMachine */
+/* handler to set the boot_device order for a specific type of MachineClass */
 typedef void QEMUBootSetHandler(void *opaque, const char *boot_order,
                                 Error **errp);
 void qemu_register_boot_set(QEMUBootSetHandler *func, void *opaque);
diff --git a/vl.c b/vl.c
index 584ca88..0d535e1 100644
--- a/vl.c
+++ b/vl.c
@@ -1424,43 +1424,6 @@ void hmp_usb_del(Monitor *mon, const QDict *qdict)
 
 MachineState *current_machine;
 
-/*
- * Transitional class registration/init used for converting from
- * legacy QEMUMachine to MachineClass.
- */
-static void qemu_machine_class_init(ObjectClass *oc, void *data)
-{
-    MachineClass *mc = MACHINE_CLASS(oc);
-    QEMUMachine *qm = data;
-    mc->name = qm->name;
-    mc->desc = qm->desc;
-    mc->init = qm->init;
-    mc->kvm_type = qm->kvm_type;
-    mc->block_default_type = qm->block_default_type;
-    mc->max_cpus = qm->max_cpus;
-    mc->no_sdcard = qm->no_sdcard;
-    mc->has_dynamic_sysbus = qm->has_dynamic_sysbus;
-    mc->is_default = qm->is_default;
-    mc->default_machine_opts = qm->default_machine_opts;
-    mc->default_boot_order = qm->default_boot_order;
-}
-
-int qemu_register_machine(QEMUMachine *m)
-{
-    char *name = g_strconcat(m->name, TYPE_MACHINE_SUFFIX, NULL);
-    TypeInfo ti = {
-        .name       = name,
-        .parent     = TYPE_MACHINE,
-        .class_init = qemu_machine_class_init,
-        .class_data = (void *)m,
-    };
-
-    type_register(&ti);
-    g_free(name);
-
-    return 0;
-}
-
 static MachineClass *find_machine(const char *name)
 {
     GSList *el, *machines = object_class_get_list(TYPE_MACHINE, false);
-- 
2.1.0

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [Qemu-devel] [PATCH 6/7] [RFC] Use DEFINE_MACHINE to register all machines
  2015-08-18 19:08 ` [Qemu-devel] [PATCH 6/7] [RFC] Use DEFINE_MACHINE to register all machines Eduardo Habkost
@ 2015-08-18 19:54   ` Eduardo Habkost
  2015-08-18 20:06   ` Eduardo Habkost
  1 sibling, 0 replies; 15+ messages in thread
From: Eduardo Habkost @ 2015-08-18 19:54 UTC (permalink / raw
  To: qemu-devel
  Cc: Peter Maydell, Evgeny Voevodin, Michael S. Tsirkin,
	Mark Cave-Ayland, Blue Swirl, Max Filippov, Edgar E. Iglesias,
	Guan Xuetao, Rob Herring, Jia Liu, Alexander Graf,
	Andreas Färber, Hervé Poussineau, Antony Pavlov,
	Maksim Kozlov, Leon Alrae, Marcel Apfelbaum, Li Guang,
	Fabien Chouteau, Peter Chubb, Scott Wood, Richard Henderson,
	Peter Crosthwaite, Igor Mitsyanko, Michael Walle, qemu-ppc,
	Dmitry Solodkiy, Bastian Koppelmann, Jan Kiszka, Aurelien Jarno

On Tue, Aug 18, 2015 at 12:08:53PM -0700, Eduardo Habkost wrote:
> I am sending a single patch for all machines to get some feedback, but
> in the final patch series I will separate them by architecture.

There are some checkpatch.pl issues introduced by this (long lines and
trailing spaces), I will fix them in the conversion script before
sending the final version.

-- 
Eduardo

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Qemu-devel] [PATCH 6/7] [RFC] Use DEFINE_MACHINE to register all machines
  2015-08-18 19:08 ` [Qemu-devel] [PATCH 6/7] [RFC] Use DEFINE_MACHINE to register all machines Eduardo Habkost
  2015-08-18 19:54   ` Eduardo Habkost
@ 2015-08-18 20:06   ` Eduardo Habkost
  2015-08-18 21:43     ` [Qemu-devel] [PATCH v2 " Eduardo Habkost
  1 sibling, 1 reply; 15+ messages in thread
From: Eduardo Habkost @ 2015-08-18 20:06 UTC (permalink / raw
  To: qemu-devel
  Cc: Peter Maydell, Evgeny Voevodin, Michael S. Tsirkin,
	Mark Cave-Ayland, Blue Swirl, Max Filippov, Edgar E. Iglesias,
	Guan Xuetao, Rob Herring, Jia Liu, Alexander Graf,
	Andreas Färber, Hervé Poussineau, Antony Pavlov,
	Maksim Kozlov, Leon Alrae, Marcel Apfelbaum, Li Guang,
	Fabien Chouteau, Peter Chubb, Scott Wood, Richard Henderson,
	Peter Crosthwaite, Igor Mitsyanko, Michael Walle, qemu-ppc,
	Dmitry Solodkiy, Bastian Koppelmann, Jan Kiszka, Aurelien Jarno

On Tue, Aug 18, 2015 at 12:08:53PM -0700, Eduardo Habkost wrote:
[...]
> -    env->gregs[1] = 0; // Memory start
> -    env->gregs[2] = ram_size; // Memory size
> -    env->gregs[3] = 0; // Machine description XXX
> +    env->gregs[1] = 0; /* Memory start */
> +    env->gregs[2] = ram_size; /* Memory size */
> +    env->gregs[3] = 0; /* Machine description XXX */
[...]
> -    pci_dev->config[0x04] = 0x06; // command = bus master, pci mem
> +    pci_dev->config[0x04] = 0x06; /* command = bus master, pci mem */
>      pci_dev->config[0x05] = 0x00;
> -    pci_dev->config[0x06] = 0xa0; // status = fast back-to-back, 66MHz, no error
> -    pci_dev->config[0x07] = 0x03; // status = medium devsel
> -    pci_dev->config[0x09] = 0x00; // programming i/f
> -    pci_dev->config[0x0D] = 0x0a; // latency_timer
> +    pci_dev->config[0x06] = 0xa0; /* status = fast back-to-back, 66MHz, no error */
> +    pci_dev->config[0x07] = 0x03; /* status = medium devsel */
> +    pci_dev->config[0x09] = 0x00; /* programming i/f */
> +    pci_dev->config[0x0D] = 0x0a; /* latency_timer */

The script was not supposed to touch those lines. I will fix it in the
next version.

-- 
Eduardo

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [Qemu-devel] [PATCH v2 6/7] [RFC] Use DEFINE_MACHINE to register all machines
  2015-08-18 20:06   ` Eduardo Habkost
@ 2015-08-18 21:43     ` Eduardo Habkost
  2015-08-19  8:25       ` Michael Walle
  0 siblings, 1 reply; 15+ messages in thread
From: Eduardo Habkost @ 2015-08-18 21:43 UTC (permalink / raw
  To: qemu-devel
  Cc: Peter Maydell, Evgeny Voevodin, Michael S. Tsirkin,
	Mark Cave-Ayland, Blue Swirl, Max Filippov, Edgar E. Iglesias,
	Guan Xuetao, Rob Herring, Jia Liu, Alexander Graf,
	Andreas Färber, Hervé Poussineau, Antony Pavlov,
	Maksim Kozlov, Leon Alrae, Marcel Apfelbaum, Li Guang,
	Fabien Chouteau, Peter Chubb, Scott Wood, Richard Henderson,
	Peter Crosthwaite, Igor Mitsyanko, Michael Walle, qemu-ppc,
	Dmitry Solodkiy, Bastian Koppelmann, Jan Kiszka, Aurelien Jarno

I am sending a single patch for all machines to get some feedback, but
in the final patch series I will separate them by architecture.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
(Sending v2 of just patch 6/7 to avoid resending the whole series)

Changes v1 -> v2:
* Fix trailing spaces and newlines
* Don't touch "//" comments on lines that we are not changing
* Break long lines manually
---
 hw/alpha/dp264.c                         |  18 ++--
 hw/arm/collie.c                          |  14 +--
 hw/arm/cubieboard.c                      |  16 ++-
 hw/arm/digic_boards.c                    |  14 +--
 hw/arm/exynos4_boards.c                  |  29 +++---
 hw/arm/gumstix.c                         |  29 +++---
 hw/arm/highbank.c                        |  33 +++----
 hw/arm/integratorcp.c                    |  14 +--
 hw/arm/kzm.c                             |  14 +--
 hw/arm/mainstone.c                       |  14 +--
 hw/arm/musicpal.c                        |  14 +--
 hw/arm/netduino2.c                       |  14 +--
 hw/arm/nseries.c                         |  29 +++---
 hw/arm/omap_sx1.c                        |  25 +++--
 hw/arm/palm.c                            |  14 +--
 hw/arm/realview.c                        |  61 ++++++------
 hw/arm/spitz.c                           |  51 +++++-----
 hw/arm/stellaris.c                       |  25 +++--
 hw/arm/tosa.c                            |  14 +--
 hw/arm/versatilepb.c                     |  29 +++---
 hw/arm/xilinx_zynq.c                     |  20 ++--
 hw/arm/xlnx-ep108.c                      |  14 +--
 hw/arm/z2.c                              |  14 +--
 hw/core/null-machine.c                   |  16 ++-
 hw/cris/axis_dev88.c                     |  16 ++-
 hw/lm32/lm32_boards.c                    |  33 +++----
 hw/lm32/milkymist.c                      |  16 ++-
 hw/m68k/an5206.c                         |  14 +--
 hw/m68k/dummy_m68k.c                     |  14 +--
 hw/m68k/mcf5208.c                        |  16 ++-
 hw/microblaze/petalogix_ml605_mmu.c      |  16 ++-
 hw/microblaze/petalogix_s3adsp1800_mmu.c |  16 ++-
 hw/mips/mips_fulong2e.c                  |  14 +--
 hw/mips/mips_jazz.c                      |  29 +++---
 hw/mips/mips_malta.c                     |  17 ++--
 hw/mips/mips_mipssim.c                   |  14 +--
 hw/mips/mips_r4k.c                       |  14 +--
 hw/moxie/moxiesim.c                      |  16 ++-
 hw/openrisc/openrisc_sim.c               |  18 ++--
 hw/ppc/e500plat.c                        |  18 ++--
 hw/ppc/mac_oldworld.c                    |  24 ++---
 hw/ppc/mpc8544ds.c                       |  16 ++-
 hw/ppc/ppc405_boards.c                   |  27 +++---
 hw/ppc/ppc440_bamboo.c                   |  14 +--
 hw/ppc/prep.c                            |  18 ++--
 hw/ppc/virtex_ml507.c                    |  14 +--
 hw/sh4/r2d.c                             |  14 +--
 hw/sh4/shix.c                            |  16 ++-
 hw/sparc/leon3.c                         |  14 +--
 hw/sparc/sun4m.c                         | 161 ++++++++++++++++---------------
 hw/sparc64/sun4u.c                       |  53 +++++-----
 hw/tricore/tricore_testboard.c           |  16 ++-
 hw/unicore32/puv3.c                      |  16 ++-
 hw/xenpv/xen_machine_pv.c                |  18 ++--
 hw/xtensa/sim.c                          |  18 ++--
 hw/xtensa/xtfpga.c                       |  59 ++++++-----
 56 files changed, 567 insertions(+), 747 deletions(-)

diff --git a/hw/alpha/dp264.c b/hw/alpha/dp264.c
index f86e7bb..af4b91b 100644
--- a/hw/alpha/dp264.c
+++ b/hw/alpha/dp264.c
@@ -168,17 +168,13 @@ static void clipper_init(MachineState *machine)
     }
 }
 
-static QEMUMachine clipper_machine = {
-    .name = "clipper",
-    .desc = "Alpha DP264/CLIPPER",
-    .init = clipper_init,
-    .max_cpus = 4,
-    .is_default = 1,
-};
-
-static void clipper_machine_init(void)
+static void clipper_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&clipper_machine);
+    mc->desc = "Alpha DP264/CLIPPER";
+    mc->init = clipper_init;
+    mc->max_cpus = 4;
+    mc->is_default = 1;
 }
 
-machine_init(clipper_machine_init);
+DEFINE_MACHINE("clipper", clipper_machine_machine_init);
+
diff --git a/hw/arm/collie.c b/hw/arm/collie.c
index 6c9b82f..5c895a6 100644
--- a/hw/arm/collie.c
+++ b/hw/arm/collie.c
@@ -58,15 +58,11 @@ static void collie_init(MachineState *machine)
     arm_load_kernel(s->cpu, &collie_binfo);
 }
 
-static QEMUMachine collie_machine = {
-    .name = "collie",
-    .desc = "Collie PDA (SA-1110)",
-    .init = collie_init,
-};
-
-static void collie_machine_init(void)
+static void collie_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&collie_machine);
+    mc->desc = "Collie PDA (SA-1110)";
+    mc->init = collie_init;
 }
 
-machine_init(collie_machine_init)
+DEFINE_MACHINE("collie", collie_machine_machine_init);
+
diff --git a/hw/arm/cubieboard.c b/hw/arm/cubieboard.c
index 1582250..af174ab 100644
--- a/hw/arm/cubieboard.c
+++ b/hw/arm/cubieboard.c
@@ -74,16 +74,12 @@ static void cubieboard_init(MachineState *machine)
     arm_load_kernel(&s->a10->cpu, &cubieboard_binfo);
 }
 
-static QEMUMachine cubieboard_machine = {
-    .name = "cubieboard",
-    .desc = "cubietech cubieboard",
-    .init = cubieboard_init,
-};
-
-
-static void cubieboard_machine_init(void)
+static void cubieboard_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&cubieboard_machine);
+    mc->desc = "cubietech cubieboard";
+    mc->init = cubieboard_init;
 }
 
-machine_init(cubieboard_machine_init)
+DEFINE_MACHINE("cubieboard", cubieboard_machine_machine_init);
+
+
diff --git a/hw/arm/digic_boards.c b/hw/arm/digic_boards.c
index f8ba9e5..3a6364c 100644
--- a/hw/arm/digic_boards.c
+++ b/hw/arm/digic_boards.c
@@ -148,15 +148,11 @@ static void canon_a1100_init(MachineState *machine)
     digic4_board_init(&digic4_board_canon_a1100);
 }
 
-static QEMUMachine canon_a1100 = {
-    .name = "canon-a1100",
-    .desc = "Canon PowerShot A1100 IS",
-    .init = &canon_a1100_init,
-};
-
-static void digic_register_machines(void)
+static void canon_a1100_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&canon_a1100);
+    mc->desc = "Canon PowerShot A1100 IS";
+    mc->init = &canon_a1100_init;
 }
 
-machine_init(digic_register_machines)
+DEFINE_MACHINE("canon-a1100", canon_a1100_machine_init);
+
diff --git a/hw/arm/exynos4_boards.c b/hw/arm/exynos4_boards.c
index 35fc7c4..7c75acc 100644
--- a/hw/arm/exynos4_boards.c
+++ b/hw/arm/exynos4_boards.c
@@ -144,24 +144,21 @@ static void smdkc210_init(MachineState *machine)
     arm_load_kernel(ARM_CPU(first_cpu), &exynos4_board_binfo);
 }
 
-static QEMUMachine exynos4_machine_nuri = {
-    .name = "nuri",
-    .desc = "Samsung NURI board (Exynos4210)",
-    .init = nuri_init,
-    .max_cpus = EXYNOS4210_NCPUS,
-};
+static void exynos4_machine_nuri_machine_init(MachineClass *mc)
+{
+    mc->desc = "Samsung NURI board (Exynos4210)";
+    mc->init = nuri_init;
+    mc->max_cpus = EXYNOS4210_NCPUS;
+}
 
-static QEMUMachine exynos4_machine_smdkc210 = {
-    .name = "smdkc210",
-    .desc = "Samsung SMDKC210 board (Exynos4210)",
-    .init = smdkc210_init,
-    .max_cpus = EXYNOS4210_NCPUS,
-};
+DEFINE_MACHINE("nuri", exynos4_machine_nuri_machine_init);
 
-static void exynos4_machine_init(void)
+static void exynos4_machine_smdkc210_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&exynos4_machine_nuri);
-    qemu_register_machine(&exynos4_machine_smdkc210);
+    mc->desc = "Samsung SMDKC210 board (Exynos4210)";
+    mc->init = smdkc210_init;
+    mc->max_cpus = EXYNOS4210_NCPUS;
 }
 
-machine_init(exynos4_machine_init);
+DEFINE_MACHINE("smdkc210", exynos4_machine_smdkc210_machine_init);
+
diff --git a/hw/arm/gumstix.c b/hw/arm/gumstix.c
index 8103278..e4e2f7c 100644
--- a/hw/arm/gumstix.c
+++ b/hw/arm/gumstix.c
@@ -121,22 +121,19 @@ static void verdex_init(MachineState *machine)
                     qdev_get_gpio_in(cpu->gpio, 99));
 }
 
-static QEMUMachine connex_machine = {
-    .name = "connex",
-    .desc = "Gumstix Connex (PXA255)",
-    .init = connex_init,
-};
-
-static QEMUMachine verdex_machine = {
-    .name = "verdex",
-    .desc = "Gumstix Verdex (PXA270)",
-    .init = verdex_init,
-};
-
-static void gumstix_machine_init(void)
+static void connex_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&connex_machine);
-    qemu_register_machine(&verdex_machine);
+    mc->desc = "Gumstix Connex (PXA255)";
+    mc->init = connex_init;
 }
 
-machine_init(gumstix_machine_init);
+DEFINE_MACHINE("connex", connex_machine_machine_init);
+
+static void verdex_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Gumstix Verdex (PXA270)";
+    mc->init = verdex_init;
+}
+
+DEFINE_MACHINE("verdex", verdex_machine_machine_init);
+
diff --git a/hw/arm/highbank.c b/hw/arm/highbank.c
index f8353a7..e58b7ea 100644
--- a/hw/arm/highbank.c
+++ b/hw/arm/highbank.c
@@ -391,26 +391,23 @@ static void midway_init(MachineState *machine)
     calxeda_init(machine, CALXEDA_MIDWAY);
 }
 
-static QEMUMachine highbank_machine = {
-    .name = "highbank",
-    .desc = "Calxeda Highbank (ECX-1000)",
-    .init = highbank_init,
-    .block_default_type = IF_SCSI,
-    .max_cpus = 4,
-};
+static void highbank_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Calxeda Highbank (ECX-1000)";
+    mc->init = highbank_init;
+    mc->block_default_type = IF_SCSI;
+    mc->max_cpus = 4;
+}
 
-static QEMUMachine midway_machine = {
-    .name = "midway",
-    .desc = "Calxeda Midway (ECX-2000)",
-    .init = midway_init,
-    .block_default_type = IF_SCSI,
-    .max_cpus = 4,
-};
+DEFINE_MACHINE("highbank", highbank_machine_machine_init);
 
-static void calxeda_machines_init(void)
+static void midway_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&highbank_machine);
-    qemu_register_machine(&midway_machine);
+    mc->desc = "Calxeda Midway (ECX-2000)";
+    mc->init = midway_init;
+    mc->block_default_type = IF_SCSI;
+    mc->max_cpus = 4;
 }
 
-machine_init(calxeda_machines_init);
+DEFINE_MACHINE("midway", midway_machine_machine_init);
+
diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c
index 0fbbf99..929cc05 100644
--- a/hw/arm/integratorcp.c
+++ b/hw/arm/integratorcp.c
@@ -619,18 +619,14 @@ static void integratorcp_init(MachineState *machine)
     arm_load_kernel(cpu, &integrator_binfo);
 }
 
-static QEMUMachine integratorcp_machine = {
-    .name = "integratorcp",
-    .desc = "ARM Integrator/CP (ARM926EJ-S)",
-    .init = integratorcp_init,
-};
-
-static void integratorcp_machine_init(void)
+static void integratorcp_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&integratorcp_machine);
+    mc->desc = "ARM Integrator/CP (ARM926EJ-S)";
+    mc->init = integratorcp_init;
 }
 
-machine_init(integratorcp_machine_init);
+DEFINE_MACHINE("integratorcp", integratorcp_machine_machine_init);
+
 
 static Property core_properties[] = {
     DEFINE_PROP_UINT32("memsz", IntegratorCMState, memsz, 0),
diff --git a/hw/arm/kzm.c b/hw/arm/kzm.c
index d7af230..bbd4ac2 100644
--- a/hw/arm/kzm.c
+++ b/hw/arm/kzm.c
@@ -140,15 +140,11 @@ static void kzm_init(MachineState *machine)
     arm_load_kernel(cpu, &kzm_binfo);
 }
 
-static QEMUMachine kzm_machine = {
-    .name = "kzm",
-    .desc = "ARM KZM Emulation Baseboard (ARM1136)",
-    .init = kzm_init,
-};
-
-static void kzm_machine_init(void)
+static void kzm_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&kzm_machine);
+    mc->desc = "ARM KZM Emulation Baseboard (ARM1136)";
+    mc->init = kzm_init;
 }
 
-machine_init(kzm_machine_init)
+DEFINE_MACHINE("kzm", kzm_machine_machine_init);
+
diff --git a/hw/arm/mainstone.c b/hw/arm/mainstone.c
index 0da02a6..7f06051 100644
--- a/hw/arm/mainstone.c
+++ b/hw/arm/mainstone.c
@@ -188,15 +188,11 @@ static void mainstone_init(MachineState *machine)
     mainstone_common_init(get_system_memory(), machine, mainstone, 0x196);
 }
 
-static QEMUMachine mainstone2_machine = {
-    .name = "mainstone",
-    .desc = "Mainstone II (PXA27x)",
-    .init = mainstone_init,
-};
-
-static void mainstone_machine_init(void)
+static void mainstone2_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&mainstone2_machine);
+    mc->desc = "Mainstone II (PXA27x)";
+    mc->init = mainstone_init;
 }
 
-machine_init(mainstone_machine_init);
+DEFINE_MACHINE("mainstone", mainstone2_machine_machine_init);
+
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
index 42f66b3..0d8d073 100644
--- a/hw/arm/musicpal.c
+++ b/hw/arm/musicpal.c
@@ -1709,18 +1709,14 @@ static void musicpal_init(MachineState *machine)
     arm_load_kernel(cpu, &musicpal_binfo);
 }
 
-static QEMUMachine musicpal_machine = {
-    .name = "musicpal",
-    .desc = "Marvell 88w8618 / MusicPal (ARM926EJ-S)",
-    .init = musicpal_init,
-};
-
-static void musicpal_machine_init(void)
+static void musicpal_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&musicpal_machine);
+    mc->desc = "Marvell 88w8618 / MusicPal (ARM926EJ-S)";
+    mc->init = musicpal_init;
 }
 
-machine_init(musicpal_machine_init);
+DEFINE_MACHINE("musicpal", musicpal_machine_machine_init);
+
 
 static void mv88w8618_wlan_class_init(ObjectClass *klass, void *data)
 {
diff --git a/hw/arm/netduino2.c b/hw/arm/netduino2.c
index 8f26780..7b1bec6 100644
--- a/hw/arm/netduino2.c
+++ b/hw/arm/netduino2.c
@@ -43,15 +43,11 @@ static void netduino2_init(MachineState *machine)
     }
 }
 
-static QEMUMachine netduino2_machine = {
-    .name = "netduino2",
-    .desc = "Netduino 2 Machine",
-    .init = netduino2_init,
-};
-
-static void netduino2_machine_init(void)
+static void netduino2_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&netduino2_machine);
+    mc->desc = "Netduino 2 Machine";
+    mc->init = netduino2_init;
 }
 
-machine_init(netduino2_machine_init);
+DEFINE_MACHINE("netduino2", netduino2_machine_machine_init);
+
diff --git a/hw/arm/nseries.c b/hw/arm/nseries.c
index a659e85..95f25cc 100644
--- a/hw/arm/nseries.c
+++ b/hw/arm/nseries.c
@@ -1413,24 +1413,21 @@ static void n810_init(MachineState *machine)
     n8x0_init(machine, &n810_binfo, 810);
 }
 
-static QEMUMachine n800_machine = {
-    .name = "n800",
-    .desc = "Nokia N800 tablet aka. RX-34 (OMAP2420)",
-    .init = n800_init,
-    .default_boot_order = "",
-};
+static void n800_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Nokia N800 tablet aka. RX-34 (OMAP2420)";
+    mc->init = n800_init;
+    mc->default_boot_order = "";
+}
 
-static QEMUMachine n810_machine = {
-    .name = "n810",
-    .desc = "Nokia N810 tablet aka. RX-44 (OMAP2420)",
-    .init = n810_init,
-    .default_boot_order = "",
-};
+DEFINE_MACHINE("n800", n800_machine_machine_init);
 
-static void nseries_machine_init(void)
+static void n810_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&n800_machine);
-    qemu_register_machine(&n810_machine);
+    mc->desc = "Nokia N810 tablet aka. RX-44 (OMAP2420)";
+    mc->init = n810_init;
+    mc->default_boot_order = "";
 }
 
-machine_init(nseries_machine_init);
+DEFINE_MACHINE("n810", n810_machine_machine_init);
+
diff --git a/hw/arm/omap_sx1.c b/hw/arm/omap_sx1.c
index 4b0f7f9..4e18c63 100644
--- a/hw/arm/omap_sx1.c
+++ b/hw/arm/omap_sx1.c
@@ -217,22 +217,19 @@ static void sx1_init_v2(MachineState *machine)
     sx1_init(machine, 2);
 }
 
-static QEMUMachine sx1_machine_v2 = {
-    .name = "sx1",
-    .desc = "Siemens SX1 (OMAP310) V2",
-    .init = sx1_init_v2,
-};
+static void sx1_machine_v2_machine_init(MachineClass *mc)
+{
+    mc->desc = "Siemens SX1 (OMAP310) V2";
+    mc->init = sx1_init_v2;
+}
 
-static QEMUMachine sx1_machine_v1 = {
-    .name = "sx1-v1",
-    .desc = "Siemens SX1 (OMAP310) V1",
-    .init = sx1_init_v1,
-};
+DEFINE_MACHINE("sx1", sx1_machine_v2_machine_init);
 
-static void sx1_machine_init(void)
+static void sx1_machine_v1_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&sx1_machine_v2);
-    qemu_register_machine(&sx1_machine_v1);
+    mc->desc = "Siemens SX1 (OMAP310) V1";
+    mc->init = sx1_init_v1;
 }
 
-machine_init(sx1_machine_init);
+DEFINE_MACHINE("sx1-v1", sx1_machine_v1_machine_init);
+
diff --git a/hw/arm/palm.c b/hw/arm/palm.c
index 7f1cfb8..c2b2409 100644
--- a/hw/arm/palm.c
+++ b/hw/arm/palm.c
@@ -269,15 +269,11 @@ static void palmte_init(MachineState *machine)
     arm_load_kernel(mpu->cpu, &palmte_binfo);
 }
 
-static QEMUMachine palmte_machine = {
-    .name = "cheetah",
-    .desc = "Palm Tungsten|E aka. Cheetah PDA (OMAP310)",
-    .init = palmte_init,
-};
-
-static void palmte_machine_init(void)
+static void palmte_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&palmte_machine);
+    mc->desc = "Palm Tungsten|E aka. Cheetah PDA (OMAP310)";
+    mc->init = palmte_init;
 }
 
-machine_init(palmte_machine_init);
+DEFINE_MACHINE("cheetah", palmte_machine_machine_init);
+
diff --git a/hw/arm/realview.c b/hw/arm/realview.c
index ef2788d..43ed958 100644
--- a/hw/arm/realview.c
+++ b/hw/arm/realview.c
@@ -399,41 +399,40 @@ static void realview_pbx_a9_init(MachineState *machine)
     realview_init(machine, BOARD_PBX_A9);
 }
 
-static QEMUMachine realview_eb_machine = {
-    .name = "realview-eb",
-    .desc = "ARM RealView Emulation Baseboard (ARM926EJ-S)",
-    .init = realview_eb_init,
-    .block_default_type = IF_SCSI,
-};
+static void realview_eb_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "ARM RealView Emulation Baseboard (ARM926EJ-S)";
+    mc->init = realview_eb_init;
+    mc->block_default_type = IF_SCSI;
+}
 
-static QEMUMachine realview_eb_mpcore_machine = {
-    .name = "realview-eb-mpcore",
-    .desc = "ARM RealView Emulation Baseboard (ARM11MPCore)",
-    .init = realview_eb_mpcore_init,
-    .block_default_type = IF_SCSI,
-    .max_cpus = 4,
-};
+DEFINE_MACHINE("realview-eb", realview_eb_machine_machine_init);
 
-static QEMUMachine realview_pb_a8_machine = {
-    .name = "realview-pb-a8",
-    .desc = "ARM RealView Platform Baseboard for Cortex-A8",
-    .init = realview_pb_a8_init,
-};
+static void realview_eb_mpcore_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "ARM RealView Emulation Baseboard (ARM11MPCore)";
+    mc->init = realview_eb_mpcore_init;
+    mc->block_default_type = IF_SCSI;
+    mc->max_cpus = 4;
+}
 
-static QEMUMachine realview_pbx_a9_machine = {
-    .name = "realview-pbx-a9",
-    .desc = "ARM RealView Platform Baseboard Explore for Cortex-A9",
-    .init = realview_pbx_a9_init,
-    .block_default_type = IF_SCSI,
-    .max_cpus = 4,
-};
+DEFINE_MACHINE("realview-eb-mpcore", realview_eb_mpcore_machine_machine_init);
+
+static void realview_pb_a8_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "ARM RealView Platform Baseboard for Cortex-A8";
+    mc->init = realview_pb_a8_init;
+}
+
+DEFINE_MACHINE("realview-pb-a8", realview_pb_a8_machine_machine_init);
 
-static void realview_machine_init(void)
+static void realview_pbx_a9_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&realview_eb_machine);
-    qemu_register_machine(&realview_eb_mpcore_machine);
-    qemu_register_machine(&realview_pb_a8_machine);
-    qemu_register_machine(&realview_pbx_a9_machine);
+    mc->desc = "ARM RealView Platform Baseboard Explore for Cortex-A9";
+    mc->init = realview_pbx_a9_init;
+    mc->block_default_type = IF_SCSI;
+    mc->max_cpus = 4;
 }
 
-machine_init(realview_machine_init);
+DEFINE_MACHINE("realview-pbx-a9", realview_pbx_a9_machine_machine_init);
+
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
index 5bf032a..080c036 100644
--- a/hw/arm/spitz.c
+++ b/hw/arm/spitz.c
@@ -972,39 +972,38 @@ static void terrier_init(MachineState *machine)
     spitz_common_init(machine, terrier, 0x33f);
 }
 
-static QEMUMachine akitapda_machine = {
-    .name = "akita",
-    .desc = "Akita PDA (PXA270)",
-    .init = akita_init,
-};
+static void akitapda_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Akita PDA (PXA270)";
+    mc->init = akita_init;
+}
 
-static QEMUMachine spitzpda_machine = {
-    .name = "spitz",
-    .desc = "Spitz PDA (PXA270)",
-    .init = spitz_init,
-};
+DEFINE_MACHINE("akita", akitapda_machine_machine_init);
 
-static QEMUMachine borzoipda_machine = {
-    .name = "borzoi",
-    .desc = "Borzoi PDA (PXA270)",
-    .init = borzoi_init,
-};
+static void spitzpda_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Spitz PDA (PXA270)";
+    mc->init = spitz_init;
+}
 
-static QEMUMachine terrierpda_machine = {
-    .name = "terrier",
-    .desc = "Terrier PDA (PXA270)",
-    .init = terrier_init,
-};
+DEFINE_MACHINE("spitz", spitzpda_machine_machine_init);
+
+static void borzoipda_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Borzoi PDA (PXA270)";
+    mc->init = borzoi_init;
+}
+
+DEFINE_MACHINE("borzoi", borzoipda_machine_machine_init);
 
-static void spitz_machine_init(void)
+static void terrierpda_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&akitapda_machine);
-    qemu_register_machine(&spitzpda_machine);
-    qemu_register_machine(&borzoipda_machine);
-    qemu_register_machine(&terrierpda_machine);
+    mc->desc = "Terrier PDA (PXA270)";
+    mc->init = terrier_init;
 }
 
-machine_init(spitz_machine_init);
+DEFINE_MACHINE("terrier", terrierpda_machine_machine_init);
+
 
 static bool is_version_0(void *opaque, int version_id)
 {
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
index cb515ec..ac0e19a 100644
--- a/hw/arm/stellaris.c
+++ b/hw/arm/stellaris.c
@@ -1366,25 +1366,22 @@ static void lm3s6965evb_init(MachineState *machine)
     stellaris_init(kernel_filename, cpu_model, &stellaris_boards[1]);
 }
 
-static QEMUMachine lm3s811evb_machine = {
-    .name = "lm3s811evb",
-    .desc = "Stellaris LM3S811EVB",
-    .init = lm3s811evb_init,
-};
+static void lm3s811evb_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Stellaris LM3S811EVB";
+    mc->init = lm3s811evb_init;
+}
 
-static QEMUMachine lm3s6965evb_machine = {
-    .name = "lm3s6965evb",
-    .desc = "Stellaris LM3S6965EVB",
-    .init = lm3s6965evb_init,
-};
+DEFINE_MACHINE("lm3s811evb", lm3s811evb_machine_machine_init);
 
-static void stellaris_machine_init(void)
+static void lm3s6965evb_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&lm3s811evb_machine);
-    qemu_register_machine(&lm3s6965evb_machine);
+    mc->desc = "Stellaris LM3S6965EVB";
+    mc->init = lm3s6965evb_init;
 }
 
-machine_init(stellaris_machine_init);
+DEFINE_MACHINE("lm3s6965evb", lm3s6965evb_machine_machine_init);
+
 
 static void stellaris_i2c_class_init(ObjectClass *klass, void *data)
 {
diff --git a/hw/arm/tosa.c b/hw/arm/tosa.c
index 73572eb..573b903 100644
--- a/hw/arm/tosa.c
+++ b/hw/arm/tosa.c
@@ -252,18 +252,14 @@ static void tosa_init(MachineState *machine)
     sl_bootparam_write(SL_PXA_PARAM_BASE);
 }
 
-static QEMUMachine tosapda_machine = {
-    .name = "tosa",
-    .desc = "Tosa PDA (PXA255)",
-    .init = tosa_init,
-};
-
-static void tosapda_machine_init(void)
+static void tosapda_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&tosapda_machine);
+    mc->desc = "Tosa PDA (PXA255)";
+    mc->init = tosa_init;
 }
 
-machine_init(tosapda_machine_init);
+DEFINE_MACHINE("tosa", tosapda_machine_machine_init);
+
 
 static void tosa_dac_class_init(ObjectClass *klass, void *data)
 {
diff --git a/hw/arm/versatilepb.c b/hw/arm/versatilepb.c
index 6c69f4e..c737e61 100644
--- a/hw/arm/versatilepb.c
+++ b/hw/arm/versatilepb.c
@@ -391,27 +391,24 @@ static void vab_init(MachineState *machine)
     versatile_init(machine, 0x25e);
 }
 
-static QEMUMachine versatilepb_machine = {
-    .name = "versatilepb",
-    .desc = "ARM Versatile/PB (ARM926EJ-S)",
-    .init = vpb_init,
-    .block_default_type = IF_SCSI,
-};
+static void versatilepb_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "ARM Versatile/PB (ARM926EJ-S)";
+    mc->init = vpb_init;
+    mc->block_default_type = IF_SCSI;
+}
 
-static QEMUMachine versatileab_machine = {
-    .name = "versatileab",
-    .desc = "ARM Versatile/AB (ARM926EJ-S)",
-    .init = vab_init,
-    .block_default_type = IF_SCSI,
-};
+DEFINE_MACHINE("versatilepb", versatilepb_machine_machine_init);
 
-static void versatile_machine_init(void)
+static void versatileab_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&versatilepb_machine);
-    qemu_register_machine(&versatileab_machine);
+    mc->desc = "ARM Versatile/AB (ARM926EJ-S)";
+    mc->init = vab_init;
+    mc->block_default_type = IF_SCSI;
 }
 
-machine_init(versatile_machine_init);
+DEFINE_MACHINE("versatileab", versatileab_machine_machine_init);
+
 
 static void vpb_sic_class_init(ObjectClass *klass, void *data)
 {
diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
index a4e7b5c..4a0a891 100644
--- a/hw/arm/xilinx_zynq.c
+++ b/hw/arm/xilinx_zynq.c
@@ -255,18 +255,14 @@ static void zynq_init(MachineState *machine)
     arm_load_kernel(ARM_CPU(first_cpu), &zynq_binfo);
 }
 
-static QEMUMachine zynq_machine = {
-    .name = "xilinx-zynq-a9",
-    .desc = "Xilinx Zynq Platform Baseboard for Cortex-A9",
-    .init = zynq_init,
-    .block_default_type = IF_SCSI,
-    .max_cpus = 1,
-    .no_sdcard = 1,
-};
-
-static void zynq_machine_init(void)
+static void zynq_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&zynq_machine);
+    mc->desc = "Xilinx Zynq Platform Baseboard for Cortex-A9";
+    mc->init = zynq_init;
+    mc->block_default_type = IF_SCSI;
+    mc->max_cpus = 1;
+    mc->no_sdcard = 1;
 }
 
-machine_init(zynq_machine_init);
+DEFINE_MACHINE("xilinx-zynq-a9", zynq_machine_machine_init);
+
diff --git a/hw/arm/xlnx-ep108.c b/hw/arm/xlnx-ep108.c
index f94da86..0feb9b5 100644
--- a/hw/arm/xlnx-ep108.c
+++ b/hw/arm/xlnx-ep108.c
@@ -68,15 +68,11 @@ static void xlnx_ep108_init(MachineState *machine)
     arm_load_kernel(s->soc.boot_cpu_ptr, &xlnx_ep108_binfo);
 }
 
-static QEMUMachine xlnx_ep108_machine = {
-    .name = "xlnx-ep108",
-    .desc = "Xilinx ZynqMP EP108 board",
-    .init = xlnx_ep108_init,
-};
-
-static void xlnx_ep108_machine_init(void)
+static void xlnx_ep108_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&xlnx_ep108_machine);
+    mc->desc = "Xilinx ZynqMP EP108 board";
+    mc->init = xlnx_ep108_init;
 }
 
-machine_init(xlnx_ep108_machine_init);
+DEFINE_MACHINE("xlnx-ep108", xlnx_ep108_machine_machine_init);
+
diff --git a/hw/arm/z2.c b/hw/arm/z2.c
index 1735547..0b6806e 100644
--- a/hw/arm/z2.c
+++ b/hw/arm/z2.c
@@ -372,15 +372,11 @@ static void z2_init(MachineState *machine)
     arm_load_kernel(mpu->cpu, &z2_binfo);
 }
 
-static QEMUMachine z2_machine = {
-    .name = "z2",
-    .desc = "Zipit Z2 (PXA27x)",
-    .init = z2_init,
-};
-
-static void z2_machine_init(void)
+static void z2_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&z2_machine);
+    mc->desc = "Zipit Z2 (PXA27x)";
+    mc->init = z2_init;
 }
 
-machine_init(z2_machine_init);
+DEFINE_MACHINE("z2", z2_machine_machine_init);
+
diff --git a/hw/core/null-machine.c b/hw/core/null-machine.c
index 1ec7c3b..3157529 100644
--- a/hw/core/null-machine.c
+++ b/hw/core/null-machine.c
@@ -19,17 +19,13 @@ static void machine_none_init(MachineState *machine)
 {
 }
 
-static QEMUMachine machine_none = {
-    .name = "none",
-    .desc = "empty machine",
-    .init = machine_none_init,
-    .max_cpus = 0,
-};
-
-static void register_machines(void)
+static void machine_none_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&machine_none);
+    mc->desc = "empty machine";
+    mc->init = machine_none_init;
+    mc->max_cpus = 0;
 }
 
-machine_init(register_machines);
+DEFINE_MACHINE("none", machine_none_machine_init);
+
 
diff --git a/hw/cris/axis_dev88.c b/hw/cris/axis_dev88.c
index 3cae480..e3d1630 100644
--- a/hw/cris/axis_dev88.c
+++ b/hw/cris/axis_dev88.c
@@ -351,16 +351,12 @@ void axisdev88_init(MachineState *machine)
     }
 }
 
-static QEMUMachine axisdev88_machine = {
-    .name = "axis-dev88",
-    .desc = "AXIS devboard 88",
-    .init = axisdev88_init,
-    .is_default = 1,
-};
-
-static void axisdev88_machine_init(void)
+static void axisdev88_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&axisdev88_machine);
+    mc->desc = "AXIS devboard 88";
+    mc->init = axisdev88_init;
+    mc->is_default = 1;
 }
 
-machine_init(axisdev88_machine_init);
+DEFINE_MACHINE("axis-dev88", axisdev88_machine_machine_init);
+
diff --git a/hw/lm32/lm32_boards.c b/hw/lm32/lm32_boards.c
index 70f48d3..385c25d 100644
--- a/hw/lm32/lm32_boards.c
+++ b/hw/lm32/lm32_boards.c
@@ -292,24 +292,21 @@ static void lm32_uclinux_init(MachineState *machine)
     qemu_register_reset(main_cpu_reset, reset_info);
 }
 
-static QEMUMachine lm32_evr_machine = {
-    .name = "lm32-evr",
-    .desc = "LatticeMico32 EVR32 eval system",
-    .init = lm32_evr_init,
-    .is_default = 1,
-};
-
-static QEMUMachine lm32_uclinux_machine = {
-    .name = "lm32-uclinux",
-    .desc = "lm32 platform for uClinux and u-boot by Theobroma Systems",
-    .init = lm32_uclinux_init,
-    .is_default = 0,
-};
-
-static void lm32_machine_init(void)
+static void lm32_evr_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&lm32_uclinux_machine);
-    qemu_register_machine(&lm32_evr_machine);
+    mc->desc = "LatticeMico32 EVR32 eval system";
+    mc->init = lm32_evr_init;
+    mc->is_default = 1;
 }
 
-machine_init(lm32_machine_init);
+DEFINE_MACHINE("lm32-evr", lm32_evr_machine_machine_init);
+
+static void lm32_uclinux_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "lm32 platform for uClinux and u-boot by Theobroma Systems";
+    mc->init = lm32_uclinux_init;
+    mc->is_default = 0;
+}
+
+DEFINE_MACHINE("lm32-uclinux", lm32_uclinux_machine_machine_init);
+
diff --git a/hw/lm32/milkymist.c b/hw/lm32/milkymist.c
index e755f5b..a891fb5 100644
--- a/hw/lm32/milkymist.c
+++ b/hw/lm32/milkymist.c
@@ -209,16 +209,12 @@ milkymist_init(MachineState *machine)
     qemu_register_reset(main_cpu_reset, reset_info);
 }
 
-static QEMUMachine milkymist_machine = {
-    .name = "milkymist",
-    .desc = "Milkymist One",
-    .init = milkymist_init,
-    .is_default = 0,
-};
-
-static void milkymist_machine_init(void)
+static void milkymist_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&milkymist_machine);
+    mc->desc = "Milkymist One";
+    mc->init = milkymist_init;
+    mc->is_default = 0;
 }
 
-machine_init(milkymist_machine_init);
+DEFINE_MACHINE("milkymist", milkymist_machine_machine_init);
+
diff --git a/hw/m68k/an5206.c b/hw/m68k/an5206.c
index f63ab2b..08b5506 100644
--- a/hw/m68k/an5206.c
+++ b/hw/m68k/an5206.c
@@ -89,15 +89,11 @@ static void an5206_init(MachineState *machine)
     env->pc = entry;
 }
 
-static QEMUMachine an5206_machine = {
-    .name = "an5206",
-    .desc = "Arnewsh 5206",
-    .init = an5206_init,
-};
-
-static void an5206_machine_init(void)
+static void an5206_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&an5206_machine);
+    mc->desc = "Arnewsh 5206";
+    mc->init = an5206_init;
 }
 
-machine_init(an5206_machine_init);
+DEFINE_MACHINE("an5206", an5206_machine_machine_init);
+
diff --git a/hw/m68k/dummy_m68k.c b/hw/m68k/dummy_m68k.c
index 5b77d93..4a21f69 100644
--- a/hw/m68k/dummy_m68k.c
+++ b/hw/m68k/dummy_m68k.c
@@ -72,15 +72,11 @@ static void dummy_m68k_init(MachineState *machine)
     env->pc = entry;
 }
 
-static QEMUMachine dummy_m68k_machine = {
-    .name = "dummy",
-    .desc = "Dummy board",
-    .init = dummy_m68k_init,
-};
-
-static void dummy_m68k_machine_init(void)
+static void dummy_m68k_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&dummy_m68k_machine);
+    mc->desc = "Dummy board";
+    mc->init = dummy_m68k_init;
 }
 
-machine_init(dummy_m68k_machine_init);
+DEFINE_MACHINE("dummy", dummy_m68k_machine_machine_init);
+
diff --git a/hw/m68k/mcf5208.c b/hw/m68k/mcf5208.c
index 326a42d..89fd73a 100644
--- a/hw/m68k/mcf5208.c
+++ b/hw/m68k/mcf5208.c
@@ -294,16 +294,12 @@ static void mcf5208evb_init(MachineState *machine)
     env->pc = entry;
 }
 
-static QEMUMachine mcf5208evb_machine = {
-    .name = "mcf5208evb",
-    .desc = "MCF5206EVB",
-    .init = mcf5208evb_init,
-    .is_default = 1,
-};
-
-static void mcf5208evb_machine_init(void)
+static void mcf5208evb_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&mcf5208evb_machine);
+    mc->desc = "MCF5206EVB";
+    mc->init = mcf5208evb_init;
+    mc->is_default = 1;
 }
 
-machine_init(mcf5208evb_machine_init);
+DEFINE_MACHINE("mcf5208evb", mcf5208evb_machine_machine_init);
+
diff --git a/hw/microblaze/petalogix_ml605_mmu.c b/hw/microblaze/petalogix_ml605_mmu.c
index ed84a37..ca4ca07 100644
--- a/hw/microblaze/petalogix_ml605_mmu.c
+++ b/hw/microblaze/petalogix_ml605_mmu.c
@@ -206,16 +206,12 @@ petalogix_ml605_init(MachineState *machine)
 
 }
 
-static QEMUMachine petalogix_ml605_machine = {
-    .name = "petalogix-ml605",
-    .desc = "PetaLogix linux refdesign for xilinx ml605 little endian",
-    .init = petalogix_ml605_init,
-    .is_default = 0,
-};
-
-static void petalogix_ml605_machine_init(void)
+static void petalogix_ml605_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&petalogix_ml605_machine);
+    mc->desc = "PetaLogix linux refdesign for xilinx ml605 little endian";
+    mc->init = petalogix_ml605_init;
+    mc->is_default = 0;
 }
 
-machine_init(petalogix_ml605_machine_init);
+DEFINE_MACHINE("petalogix-ml605", petalogix_ml605_machine_machine_init);
+
diff --git a/hw/microblaze/petalogix_s3adsp1800_mmu.c b/hw/microblaze/petalogix_s3adsp1800_mmu.c
index 0c2140c..c32455f 100644
--- a/hw/microblaze/petalogix_s3adsp1800_mmu.c
+++ b/hw/microblaze/petalogix_s3adsp1800_mmu.c
@@ -124,16 +124,12 @@ petalogix_s3adsp1800_init(MachineState *machine)
                            NULL);
 }
 
-static QEMUMachine petalogix_s3adsp1800_machine = {
-    .name = "petalogix-s3adsp1800",
-    .desc = "PetaLogix linux refdesign for xilinx Spartan 3ADSP1800",
-    .init = petalogix_s3adsp1800_init,
-    .is_default = 1,
-};
-
-static void petalogix_s3adsp1800_machine_init(void)
+static void petalogix_s3adsp1800_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&petalogix_s3adsp1800_machine);
+    mc->desc = "PetaLogix linux refdesign for xilinx Spartan 3ADSP1800";
+    mc->init = petalogix_s3adsp1800_init;
+    mc->is_default = 1;
 }
 
-machine_init(petalogix_s3adsp1800_machine_init);
+DEFINE_MACHINE("petalogix-s3adsp1800",
+               petalogix_s3adsp1800_machine_machine_init);
diff --git a/hw/mips/mips_fulong2e.c b/hw/mips/mips_fulong2e.c
index dea941a..3ef75c7 100644
--- a/hw/mips/mips_fulong2e.c
+++ b/hw/mips/mips_fulong2e.c
@@ -392,15 +392,11 @@ static void mips_fulong2e_init(MachineState *machine)
     network_init(pci_bus);
 }
 
-static QEMUMachine mips_fulong2e_machine = {
-    .name = "fulong2e",
-    .desc = "Fulong 2e mini pc",
-    .init = mips_fulong2e_init,
-};
-
-static void mips_fulong2e_machine_init(void)
+static void mips_fulong2e_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&mips_fulong2e_machine);
+    mc->desc = "Fulong 2e mini pc";
+    mc->init = mips_fulong2e_init;
 }
 
-machine_init(mips_fulong2e_machine_init);
+DEFINE_MACHINE("fulong2e", mips_fulong2e_machine_machine_init);
+
diff --git a/hw/mips/mips_jazz.c b/hw/mips/mips_jazz.c
index 9d60633..d4d0d41 100644
--- a/hw/mips/mips_jazz.c
+++ b/hw/mips/mips_jazz.c
@@ -360,24 +360,21 @@ void mips_pica61_init(MachineState *machine)
     mips_jazz_init(machine, JAZZ_PICA61);
 }
 
-static QEMUMachine mips_magnum_machine = {
-    .name = "magnum",
-    .desc = "MIPS Magnum",
-    .init = mips_magnum_init,
-    .block_default_type = IF_SCSI,
-};
+static void mips_magnum_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "MIPS Magnum";
+    mc->init = mips_magnum_init;
+    mc->block_default_type = IF_SCSI;
+}
 
-static QEMUMachine mips_pica61_machine = {
-    .name = "pica61",
-    .desc = "Acer Pica 61",
-    .init = mips_pica61_init,
-    .block_default_type = IF_SCSI,
-};
+DEFINE_MACHINE("magnum", mips_magnum_machine_machine_init);
 
-static void mips_jazz_machine_init(void)
+static void mips_pica61_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&mips_magnum_machine);
-    qemu_register_machine(&mips_pica61_machine);
+    mc->desc = "Acer Pica 61";
+    mc->init = mips_pica61_init;
+    mc->block_default_type = IF_SCSI;
 }
 
-machine_init(mips_jazz_machine_init);
+DEFINE_MACHINE("pica61", mips_pica61_machine_machine_init);
+
diff --git a/hw/mips/mips_malta.c b/hw/mips/mips_malta.c
index 3082e75..a4d5684 100644
--- a/hw/mips/mips_malta.c
+++ b/hw/mips/mips_malta.c
@@ -1216,13 +1216,15 @@ static const TypeInfo mips_malta_device = {
     .class_init    = mips_malta_class_init,
 };
 
-static QEMUMachine mips_malta_machine = {
-    .name = "malta",
-    .desc = "MIPS Malta Core LV",
-    .init = mips_malta_init,
-    .max_cpus = 16,
-    .is_default = 1,
-};
+static void mips_malta_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "MIPS Malta Core LV";
+    mc->init = mips_malta_init;
+    mc->max_cpus = 16;
+    mc->is_default = 1;
+}
+
+DEFINE_MACHINE("malta", mips_malta_machine_machine_init);
 
 static void mips_malta_register_types(void)
 {
@@ -1231,7 +1233,6 @@ static void mips_malta_register_types(void)
 
 static void mips_malta_machine_init(void)
 {
-    qemu_register_machine(&mips_malta_machine);
 }
 
 type_init(mips_malta_register_types)
diff --git a/hw/mips/mips_mipssim.c b/hw/mips/mips_mipssim.c
index 61f74a6..b634565 100644
--- a/hw/mips/mips_mipssim.c
+++ b/hw/mips/mips_mipssim.c
@@ -231,15 +231,11 @@ mips_mipssim_init(MachineState *machine)
         mipsnet_init(0x4200, env->irq[2], &nd_table[0]);
 }
 
-static QEMUMachine mips_mipssim_machine = {
-    .name = "mipssim",
-    .desc = "MIPS MIPSsim platform",
-    .init = mips_mipssim_init,
-};
-
-static void mips_mipssim_machine_init(void)
+static void mips_mipssim_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&mips_mipssim_machine);
+    mc->desc = "MIPS MIPSsim platform";
+    mc->init = mips_mipssim_init;
 }
 
-machine_init(mips_mipssim_machine_init);
+DEFINE_MACHINE("mipssim", mips_mipssim_machine_machine_init);
+
diff --git a/hw/mips/mips_r4k.c b/hw/mips/mips_r4k.c
index f4dcacd..eecd85f 100644
--- a/hw/mips/mips_r4k.c
+++ b/hw/mips/mips_r4k.c
@@ -300,15 +300,11 @@ void mips_r4k_init(MachineState *machine)
     isa_create_simple(isa_bus, "i8042");
 }
 
-static QEMUMachine mips_machine = {
-    .name = "mips",
-    .desc = "mips r4k platform",
-    .init = mips_r4k_init,
-};
-
-static void mips_machine_init(void)
+static void mips_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&mips_machine);
+    mc->desc = "mips r4k platform";
+    mc->init = mips_r4k_init;
 }
 
-machine_init(mips_machine_init);
+DEFINE_MACHINE("mips", mips_machine_machine_init);
+
diff --git a/hw/moxie/moxiesim.c b/hw/moxie/moxiesim.c
index 80bcc5b..eca92c9 100644
--- a/hw/moxie/moxiesim.c
+++ b/hw/moxie/moxiesim.c
@@ -146,16 +146,12 @@ static void moxiesim_init(MachineState *machine)
     }
 }
 
-static QEMUMachine moxiesim_machine = {
-    .name = "moxiesim",
-    .desc = "Moxie simulator platform",
-    .init = moxiesim_init,
-    .is_default = 1,
-};
-
-static void moxie_machine_init(void)
+static void moxiesim_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&moxiesim_machine);
+    mc->desc = "Moxie simulator platform";
+    mc->init = moxiesim_init;
+    mc->is_default = 1;
 }
 
-machine_init(moxie_machine_init)
+DEFINE_MACHINE("moxiesim", moxiesim_machine_machine_init);
+
diff --git a/hw/openrisc/openrisc_sim.c b/hw/openrisc/openrisc_sim.c
index 1da0657..961fac6 100644
--- a/hw/openrisc/openrisc_sim.c
+++ b/hw/openrisc/openrisc_sim.c
@@ -132,17 +132,13 @@ static void openrisc_sim_init(MachineState *machine)
     cpu_openrisc_load_kernel(ram_size, kernel_filename, cpu);
 }
 
-static QEMUMachine openrisc_sim_machine = {
-    .name = "or32-sim",
-    .desc = "or32 simulation",
-    .init = openrisc_sim_init,
-    .max_cpus = 1,
-    .is_default = 1,
-};
-
-static void openrisc_sim_machine_init(void)
+static void openrisc_sim_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&openrisc_sim_machine);
+    mc->desc = "or32 simulation";
+    mc->init = openrisc_sim_init;
+    mc->max_cpus = 1;
+    mc->is_default = 1;
 }
 
-machine_init(openrisc_sim_machine_init);
+DEFINE_MACHINE("or32-sim", openrisc_sim_machine_machine_init);
+
diff --git a/hw/ppc/e500plat.c b/hw/ppc/e500plat.c
index 14b14ea..2fc9028 100644
--- a/hw/ppc/e500plat.c
+++ b/hw/ppc/e500plat.c
@@ -57,17 +57,13 @@ static void e500plat_init(MachineState *machine)
     ppce500_init(machine, &params);
 }
 
-static QEMUMachine e500plat_machine = {
-    .name = "ppce500",
-    .desc = "generic paravirt e500 platform",
-    .init = e500plat_init,
-    .max_cpus = 32,
-    .has_dynamic_sysbus = true,
-};
-
-static void e500plat_machine_init(void)
+static void e500plat_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&e500plat_machine);
+    mc->desc = "generic paravirt e500 platform";
+    mc->init = e500plat_init;
+    mc->max_cpus = 32;
+    mc->has_dynamic_sysbus = true;
 }
 
-machine_init(e500plat_machine_init);
+DEFINE_MACHINE("ppce500", e500plat_machine_machine_init);
+
diff --git a/hw/ppc/mac_oldworld.c b/hw/ppc/mac_oldworld.c
index b72d67d..d16e94f 100644
--- a/hw/ppc/mac_oldworld.c
+++ b/hw/ppc/mac_oldworld.c
@@ -357,22 +357,18 @@ static int heathrow_kvm_type(const char *arg)
     return 2;
 }
 
-static QEMUMachine heathrow_machine = {
-    .name = "g3beige",
-    .desc = "Heathrow based PowerMAC",
-    .init = ppc_heathrow_init,
-    .max_cpus = MAX_CPUS,
+static void heathrow_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Heathrow based PowerMAC";
+    mc->init = ppc_heathrow_init;
+    mc->max_cpus = MAX_CPUS;
 #ifndef TARGET_PPC64
-    .is_default = 1,
+    mc->is_default = 1;
 #endif
     /* TOFIX "cad" when Mac floppy is implemented */
-    .default_boot_order = "cd",
-    .kvm_type = heathrow_kvm_type,
-};
-
-static void heathrow_machine_init(void)
-{
-    qemu_register_machine(&heathrow_machine);
+    mc->default_boot_order = "cd";
+    mc->kvm_type = heathrow_kvm_type;
 }
 
-machine_init(heathrow_machine_init);
+DEFINE_MACHINE("g3beige", heathrow_machine_machine_init);
+
diff --git a/hw/ppc/mpc8544ds.c b/hw/ppc/mpc8544ds.c
index 3a3b141..b6491f8 100644
--- a/hw/ppc/mpc8544ds.c
+++ b/hw/ppc/mpc8544ds.c
@@ -50,16 +50,12 @@ static void mpc8544ds_init(MachineState *machine)
 }
 
 
-static QEMUMachine ppce500_machine = {
-    .name = "mpc8544ds",
-    .desc = "mpc8544ds",
-    .init = mpc8544ds_init,
-    .max_cpus = 15,
-};
-
-static void ppce500_machine_init(void)
+static void ppce500_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&ppce500_machine);
+    mc->desc = "mpc8544ds";
+    mc->init = mpc8544ds_init;
+    mc->max_cpus = 15;
 }
 
-machine_init(ppce500_machine_init);
+DEFINE_MACHINE("mpc8544ds", ppce500_machine_machine_init);
+
diff --git a/hw/ppc/ppc405_boards.c b/hw/ppc/ppc405_boards.c
index ec6c4cb..60a1092 100644
--- a/hw/ppc/ppc405_boards.c
+++ b/hw/ppc/ppc405_boards.c
@@ -368,11 +368,13 @@ static void ref405ep_init(MachineState *machine)
 #endif
 }
 
-static QEMUMachine ref405ep_machine = {
-    .name = "ref405ep",
-    .desc = "ref405ep",
-    .init = ref405ep_init,
-};
+static void ref405ep_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "ref405ep";
+    mc->init = ref405ep_init;
+}
+
+DEFINE_MACHINE("ref405ep", ref405ep_machine_machine_init);
 
 /*****************************************************************************/
 /* AMCC Taihu evaluation board */
@@ -664,16 +666,11 @@ static void taihu_405ep_init(MachineState *machine)
 #endif
 }
 
-static QEMUMachine taihu_machine = {
-    .name = "taihu",
-    .desc = "taihu",
-    .init = taihu_405ep_init,
-};
-
-static void ppc405_machine_init(void)
+static void taihu_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&ref405ep_machine);
-    qemu_register_machine(&taihu_machine);
+    mc->desc = "taihu";
+    mc->init = taihu_405ep_init;
 }
 
-machine_init(ppc405_machine_init);
+DEFINE_MACHINE("taihu", taihu_machine_machine_init);
+
diff --git a/hw/ppc/ppc440_bamboo.c b/hw/ppc/ppc440_bamboo.c
index 032fa80..6ed1728 100644
--- a/hw/ppc/ppc440_bamboo.c
+++ b/hw/ppc/ppc440_bamboo.c
@@ -293,15 +293,11 @@ static void bamboo_init(MachineState *machine)
         kvmppc_init();
 }
 
-static QEMUMachine bamboo_machine = {
-    .name = "bamboo",
-    .desc = "bamboo",
-    .init = bamboo_init,
-};
-
-static void bamboo_machine_init(void)
+static void bamboo_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&bamboo_machine);
+    mc->desc = "bamboo";
+    mc->init = bamboo_init;
 }
 
-machine_init(bamboo_machine_init);
+DEFINE_MACHINE("bamboo", bamboo_machine_machine_init);
+
diff --git a/hw/ppc/prep.c b/hw/ppc/prep.c
index 45b5f62..c88bee8 100644
--- a/hw/ppc/prep.c
+++ b/hw/ppc/prep.c
@@ -698,17 +698,13 @@ static void ppc_prep_init(MachineState *machine)
                          graphic_width, graphic_height, graphic_depth);
 }
 
-static QEMUMachine prep_machine = {
-    .name = "prep",
-    .desc = "PowerPC PREP platform",
-    .init = ppc_prep_init,
-    .max_cpus = MAX_CPUS,
-    .default_boot_order = "cad",
-};
-
-static void prep_machine_init(void)
+static void prep_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&prep_machine);
+    mc->desc = "PowerPC PREP platform";
+    mc->init = ppc_prep_init;
+    mc->max_cpus = MAX_CPUS;
+    mc->default_boot_order = "cad";
 }
 
-machine_init(prep_machine_init);
+DEFINE_MACHINE("prep", prep_machine_machine_init);
+
diff --git a/hw/ppc/virtex_ml507.c b/hw/ppc/virtex_ml507.c
index de86f7c..b760b40 100644
--- a/hw/ppc/virtex_ml507.c
+++ b/hw/ppc/virtex_ml507.c
@@ -297,15 +297,11 @@ static void virtex_init(MachineState *machine)
     env->load_info = &boot_info;
 }
 
-static QEMUMachine virtex_machine = {
-    .name = "virtex-ml507",
-    .desc = "Xilinx Virtex ML507 reference design",
-    .init = virtex_init,
-};
-
-static void virtex_machine_init(void)
+static void virtex_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&virtex_machine);
+    mc->desc = "Xilinx Virtex ML507 reference design";
+    mc->init = virtex_init;
 }
 
-machine_init(virtex_machine_init);
+DEFINE_MACHINE("virtex-ml507", virtex_machine_machine_init);
+
diff --git a/hw/sh4/r2d.c b/hw/sh4/r2d.c
index 5e22ed7..a5b0dcd 100644
--- a/hw/sh4/r2d.c
+++ b/hw/sh4/r2d.c
@@ -354,15 +354,11 @@ static void r2d_init(MachineState *machine)
                        SDRAM_BASE + BOOT_PARAMS_OFFSET);
 }
 
-static QEMUMachine r2d_machine = {
-    .name = "r2d",
-    .desc = "r2d-plus board",
-    .init = r2d_init,
-};
-
-static void r2d_machine_init(void)
+static void r2d_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&r2d_machine);
+    mc->desc = "r2d-plus board";
+    mc->init = r2d_init;
 }
 
-machine_init(r2d_machine_init);
+DEFINE_MACHINE("r2d", r2d_machine_machine_init);
+
diff --git a/hw/sh4/shix.c b/hw/sh4/shix.c
index f93f98e..43025fa 100644
--- a/hw/sh4/shix.c
+++ b/hw/sh4/shix.c
@@ -87,16 +87,12 @@ static void shix_init(MachineState *machine)
     tc58128_init(s, "shix_linux_nand.bin", NULL);
 }
 
-static QEMUMachine shix_machine = {
-    .name = "shix",
-    .desc = "shix card",
-    .init = shix_init,
-    .is_default = 1,
-};
-
-static void shix_machine_init(void)
+static void shix_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&shix_machine);
+    mc->desc = "shix card";
+    mc->init = shix_init;
+    mc->is_default = 1;
 }
 
-machine_init(shix_machine_init);
+DEFINE_MACHINE("shix", shix_machine_machine_init);
+
diff --git a/hw/sparc/leon3.c b/hw/sparc/leon3.c
index 7f5dcd6..faac11e 100644
--- a/hw/sparc/leon3.c
+++ b/hw/sparc/leon3.c
@@ -216,15 +216,11 @@ static void leon3_generic_hw_init(MachineState *machine)
     }
 }
 
-static QEMUMachine leon3_generic_machine = {
-    .name     = "leon3_generic",
-    .desc     = "Leon-3 generic",
-    .init     = leon3_generic_hw_init,
-};
-
-static void leon3_machine_init(void)
+static void leon3_generic_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&leon3_generic_machine);
+    mc->desc = "Leon-3 generic";
+    mc->init = leon3_generic_hw_init;
 }
 
-machine_init(leon3_machine_init);
+DEFINE_MACHINE("leon3_generic", leon3_generic_machine_machine_init);
+
diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c
index 68ac4d8..6f4b962 100644
--- a/hw/sparc/sun4m.c
+++ b/hw/sparc/sun4m.c
@@ -1420,81 +1420,99 @@ static void sbook_init(MachineState *machine)
     sun4m_hw_init(&sun4m_hwdefs[8], machine);
 }
 
-static QEMUMachine ss5_machine = {
-    .name = "SS-5",
-    .desc = "Sun4m platform, SPARCstation 5",
-    .init = ss5_init,
-    .block_default_type = IF_SCSI,
-    .is_default = 1,
-    .default_boot_order = "c",
-};
+static void ss5_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Sun4m platform, SPARCstation 5";
+    mc->init = ss5_init;
+    mc->block_default_type = IF_SCSI;
+    mc->is_default = 1;
+    mc->default_boot_order = "c";
+}
 
-static QEMUMachine ss10_machine = {
-    .name = "SS-10",
-    .desc = "Sun4m platform, SPARCstation 10",
-    .init = ss10_init,
-    .block_default_type = IF_SCSI,
-    .max_cpus = 4,
-    .default_boot_order = "c",
-};
+DEFINE_MACHINE("SS-5", ss5_machine_machine_init);
 
-static QEMUMachine ss600mp_machine = {
-    .name = "SS-600MP",
-    .desc = "Sun4m platform, SPARCserver 600MP",
-    .init = ss600mp_init,
-    .block_default_type = IF_SCSI,
-    .max_cpus = 4,
-    .default_boot_order = "c",
-};
+static void ss10_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Sun4m platform, SPARCstation 10";
+    mc->init = ss10_init;
+    mc->block_default_type = IF_SCSI;
+    mc->max_cpus = 4;
+    mc->default_boot_order = "c";
+}
 
-static QEMUMachine ss20_machine = {
-    .name = "SS-20",
-    .desc = "Sun4m platform, SPARCstation 20",
-    .init = ss20_init,
-    .block_default_type = IF_SCSI,
-    .max_cpus = 4,
-    .default_boot_order = "c",
-};
+DEFINE_MACHINE("SS-10", ss10_machine_machine_init);
 
-static QEMUMachine voyager_machine = {
-    .name = "Voyager",
-    .desc = "Sun4m platform, SPARCstation Voyager",
-    .init = vger_init,
-    .block_default_type = IF_SCSI,
-    .default_boot_order = "c",
-};
+static void ss600mp_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Sun4m platform, SPARCserver 600MP";
+    mc->init = ss600mp_init;
+    mc->block_default_type = IF_SCSI;
+    mc->max_cpus = 4;
+    mc->default_boot_order = "c";
+}
 
-static QEMUMachine ss_lx_machine = {
-    .name = "LX",
-    .desc = "Sun4m platform, SPARCstation LX",
-    .init = ss_lx_init,
-    .block_default_type = IF_SCSI,
-    .default_boot_order = "c",
-};
+DEFINE_MACHINE("SS-600MP", ss600mp_machine_machine_init);
 
-static QEMUMachine ss4_machine = {
-    .name = "SS-4",
-    .desc = "Sun4m platform, SPARCstation 4",
-    .init = ss4_init,
-    .block_default_type = IF_SCSI,
-    .default_boot_order = "c",
-};
+static void ss20_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Sun4m platform, SPARCstation 20";
+    mc->init = ss20_init;
+    mc->block_default_type = IF_SCSI;
+    mc->max_cpus = 4;
+    mc->default_boot_order = "c";
+}
 
-static QEMUMachine scls_machine = {
-    .name = "SPARCClassic",
-    .desc = "Sun4m platform, SPARCClassic",
-    .init = scls_init,
-    .block_default_type = IF_SCSI,
-    .default_boot_order = "c",
-};
+DEFINE_MACHINE("SS-20", ss20_machine_machine_init);
 
-static QEMUMachine sbook_machine = {
-    .name = "SPARCbook",
-    .desc = "Sun4m platform, SPARCbook",
-    .init = sbook_init,
-    .block_default_type = IF_SCSI,
-    .default_boot_order = "c",
-};
+static void voyager_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Sun4m platform, SPARCstation Voyager";
+    mc->init = vger_init;
+    mc->block_default_type = IF_SCSI;
+    mc->default_boot_order = "c";
+}
+
+DEFINE_MACHINE("Voyager", voyager_machine_machine_init);
+
+static void ss_lx_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Sun4m platform, SPARCstation LX";
+    mc->init = ss_lx_init;
+    mc->block_default_type = IF_SCSI;
+    mc->default_boot_order = "c";
+}
+
+DEFINE_MACHINE("LX", ss_lx_machine_machine_init);
+
+static void ss4_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Sun4m platform, SPARCstation 4";
+    mc->init = ss4_init;
+    mc->block_default_type = IF_SCSI;
+    mc->default_boot_order = "c";
+}
+
+DEFINE_MACHINE("SS-4", ss4_machine_machine_init);
+
+static void scls_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Sun4m platform, SPARCClassic";
+    mc->init = scls_init;
+    mc->block_default_type = IF_SCSI;
+    mc->default_boot_order = "c";
+}
+
+DEFINE_MACHINE("SPARCClassic", scls_machine_machine_init);
+
+static void sbook_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Sun4m platform, SPARCbook";
+    mc->init = sbook_init;
+    mc->block_default_type = IF_SCSI;
+    mc->default_boot_order = "c";
+}
+
+DEFINE_MACHINE("SPARCbook", sbook_machine_machine_init);
 
 static void sun4m_register_types(void)
 {
@@ -1506,15 +1524,6 @@ static void sun4m_register_types(void)
 
 static void sun4m_machine_init(void)
 {
-    qemu_register_machine(&ss5_machine);
-    qemu_register_machine(&ss10_machine);
-    qemu_register_machine(&ss600mp_machine);
-    qemu_register_machine(&ss20_machine);
-    qemu_register_machine(&voyager_machine);
-    qemu_register_machine(&ss_lx_machine);
-    qemu_register_machine(&ss4_machine);
-    qemu_register_machine(&scls_machine);
-    qemu_register_machine(&sbook_machine);
 }
 
 type_init(sun4m_register_types)
diff --git a/hw/sparc64/sun4u.c b/hw/sparc64/sun4u.c
index 30cfa0e..aafeed1 100644
--- a/hw/sparc64/sun4u.c
+++ b/hw/sparc64/sun4u.c
@@ -965,30 +965,36 @@ static void niagara_init(MachineState *machine)
     sun4uv_init(get_system_memory(), machine, &hwdefs[2]);
 }
 
-static QEMUMachine sun4u_machine = {
-    .name = "sun4u",
-    .desc = "Sun4u platform",
-    .init = sun4u_init,
-    .max_cpus = 1, // XXX for now
-    .is_default = 1,
-    .default_boot_order = "c",
-};
+static void sun4u_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Sun4u platform";
+    mc->init = sun4u_init;
+    mc->max_cpus = 1; /* XXX for now */
+    mc->is_default = 1;
+    mc->default_boot_order = "c";
+}
 
-static QEMUMachine sun4v_machine = {
-    .name = "sun4v",
-    .desc = "Sun4v platform",
-    .init = sun4v_init,
-    .max_cpus = 1, // XXX for now
-    .default_boot_order = "c",
-};
+DEFINE_MACHINE("sun4u", sun4u_machine_machine_init);
 
-static QEMUMachine niagara_machine = {
-    .name = "Niagara",
-    .desc = "Sun4v platform, Niagara",
-    .init = niagara_init,
-    .max_cpus = 1, // XXX for now
-    .default_boot_order = "c",
-};
+static void sun4v_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Sun4v platform";
+    mc->init = sun4v_init;
+    mc->max_cpus = 1; /* XXX for now */
+    mc->default_boot_order = "c";
+}
+
+DEFINE_MACHINE("sun4v", sun4v_machine_machine_init);
+
+static void niagara_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "Sun4v platform, Niagara";
+    mc->init = niagara_init;
+    mc->max_cpus = 1; /* XXX for now */
+    mc->default_boot_order = "c";
+}
+
+DEFINE_MACHINE("Niagara", niagara_machine_machine_init);
 
 static void sun4u_register_types(void)
 {
@@ -999,9 +1005,6 @@ static void sun4u_register_types(void)
 
 static void sun4u_machine_init(void)
 {
-    qemu_register_machine(&sun4u_machine);
-    qemu_register_machine(&sun4v_machine);
-    qemu_register_machine(&niagara_machine);
 }
 
 type_init(sun4u_register_types)
diff --git a/hw/tricore/tricore_testboard.c b/hw/tricore/tricore_testboard.c
index a059a20..bb3b016 100644
--- a/hw/tricore/tricore_testboard.c
+++ b/hw/tricore/tricore_testboard.c
@@ -109,16 +109,12 @@ static void tricoreboard_init(MachineState *machine)
     tricore_testboard_init(machine, 0x183);
 }
 
-static QEMUMachine ttb_machine = {
-    .name = "tricore_testboard",
-    .desc = "a minimal TriCore board",
-    .init = tricoreboard_init,
-    .is_default = 0,
-};
-
-static void tricore_testboard_machine_init(void)
+static void ttb_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&ttb_machine);
+    mc->desc = "a minimal TriCore board";
+    mc->init = tricoreboard_init;
+    mc->is_default = 0;
 }
 
-machine_init(tricore_testboard_machine_init);
+DEFINE_MACHINE("tricore_testboard", ttb_machine_machine_init);
+
diff --git a/hw/unicore32/puv3.c b/hw/unicore32/puv3.c
index 703e29d..34f1be0 100644
--- a/hw/unicore32/puv3.c
+++ b/hw/unicore32/puv3.c
@@ -130,16 +130,12 @@ static void puv3_init(MachineState *machine)
     puv3_load_kernel(kernel_filename);
 }
 
-static QEMUMachine puv3_machine = {
-    .name = "puv3",
-    .desc = "PKUnity Version-3 based on UniCore32",
-    .init = puv3_init,
-    .is_default = 1,
-};
-
-static void puv3_machine_init(void)
+static void puv3_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&puv3_machine);
+    mc->desc = "PKUnity Version-3 based on UniCore32";
+    mc->init = puv3_init;
+    mc->is_default = 1;
 }
 
-machine_init(puv3_machine_init)
+DEFINE_MACHINE("puv3", puv3_machine_machine_init);
+
diff --git a/hw/xenpv/xen_machine_pv.c b/hw/xenpv/xen_machine_pv.c
index 2e545d2..d72ef2d 100644
--- a/hw/xenpv/xen_machine_pv.c
+++ b/hw/xenpv/xen_machine_pv.c
@@ -93,17 +93,13 @@ static void xen_init_pv(MachineState *machine)
     xen_init_display(xen_domid);
 }
 
-static QEMUMachine xenpv_machine = {
-    .name = "xenpv",
-    .desc = "Xen Para-virtualized PC",
-    .init = xen_init_pv,
-    .max_cpus = 1,
-    .default_machine_opts = "accel=xen",
-};
-
-static void xenpv_machine_init(void)
+static void xenpv_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&xenpv_machine);
+    mc->desc = "Xen Para-virtualized PC";
+    mc->init = xen_init_pv;
+    mc->max_cpus = 1;
+    mc->default_machine_opts = "accel=xen";
 }
 
-machine_init(xenpv_machine_init);
+DEFINE_MACHINE("xenpv", xenpv_machine_machine_init);
+
diff --git a/hw/xtensa/sim.c b/hw/xtensa/sim.c
index 328d209..4881783 100644
--- a/hw/xtensa/sim.c
+++ b/hw/xtensa/sim.c
@@ -104,17 +104,13 @@ static void xtensa_sim_init(MachineState *machine)
     }
 }
 
-static QEMUMachine xtensa_sim_machine = {
-    .name = "sim",
-    .desc = "sim machine (" XTENSA_DEFAULT_CPU_MODEL ")",
-    .is_default = true,
-    .init = xtensa_sim_init,
-    .max_cpus = 4,
-};
-
-static void xtensa_sim_machine_init(void)
+static void xtensa_sim_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&xtensa_sim_machine);
+    mc->desc = "sim machine (" XTENSA_DEFAULT_CPU_MODEL ")";
+    mc->is_default = true;
+    mc->init = xtensa_sim_init;
+    mc->max_cpus = 4;
 }
 
-machine_init(xtensa_sim_machine_init);
+DEFINE_MACHINE("sim", xtensa_sim_machine_machine_init);
+
diff --git a/hw/xtensa/xtfpga.c b/hw/xtensa/xtfpga.c
index ab4d0e4..d0c4a8b 100644
--- a/hw/xtensa/xtfpga.c
+++ b/hw/xtensa/xtfpga.c
@@ -427,40 +427,39 @@ static void xtensa_kc705_init(MachineState *machine)
     lx_init(&kc705_board, machine);
 }
 
-static QEMUMachine xtensa_lx60_machine = {
-    .name = "lx60",
-    .desc = "lx60 EVB (" XTENSA_DEFAULT_CPU_MODEL ")",
-    .init = xtensa_lx60_init,
-    .max_cpus = 4,
-};
+static void xtensa_lx60_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "lx60 EVB (" XTENSA_DEFAULT_CPU_MODEL ")";
+    mc->init = xtensa_lx60_init;
+    mc->max_cpus = 4;
+}
 
-static QEMUMachine xtensa_lx200_machine = {
-    .name = "lx200",
-    .desc = "lx200 EVB (" XTENSA_DEFAULT_CPU_MODEL ")",
-    .init = xtensa_lx200_init,
-    .max_cpus = 4,
-};
+DEFINE_MACHINE("lx60", xtensa_lx60_machine_machine_init);
 
-static QEMUMachine xtensa_ml605_machine = {
-    .name = "ml605",
-    .desc = "ml605 EVB (" XTENSA_DEFAULT_CPU_MODEL ")",
-    .init = xtensa_ml605_init,
-    .max_cpus = 4,
-};
+static void xtensa_lx200_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "lx200 EVB (" XTENSA_DEFAULT_CPU_MODEL ")";
+    mc->init = xtensa_lx200_init;
+    mc->max_cpus = 4;
+}
 
-static QEMUMachine xtensa_kc705_machine = {
-    .name = "kc705",
-    .desc = "kc705 EVB (" XTENSA_DEFAULT_CPU_MODEL ")",
-    .init = xtensa_kc705_init,
-    .max_cpus = 4,
-};
+DEFINE_MACHINE("lx200", xtensa_lx200_machine_machine_init);
+
+static void xtensa_ml605_machine_machine_init(MachineClass *mc)
+{
+    mc->desc = "ml605 EVB (" XTENSA_DEFAULT_CPU_MODEL ")";
+    mc->init = xtensa_ml605_init;
+    mc->max_cpus = 4;
+}
+
+DEFINE_MACHINE("ml605", xtensa_ml605_machine_machine_init);
 
-static void xtensa_lx_machines_init(void)
+static void xtensa_kc705_machine_machine_init(MachineClass *mc)
 {
-    qemu_register_machine(&xtensa_lx60_machine);
-    qemu_register_machine(&xtensa_lx200_machine);
-    qemu_register_machine(&xtensa_ml605_machine);
-    qemu_register_machine(&xtensa_kc705_machine);
+    mc->desc = "kc705 EVB (" XTENSA_DEFAULT_CPU_MODEL ")";
+    mc->init = xtensa_kc705_init;
+    mc->max_cpus = 4;
 }
 
-machine_init(xtensa_lx_machines_init);
+DEFINE_MACHINE("kc705", xtensa_kc705_machine_machine_init);
+
-- 
2.1.0

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [Qemu-devel] [PATCH v2 6/7] [RFC] Use DEFINE_MACHINE to register all machines
  2015-08-18 21:43     ` [Qemu-devel] [PATCH v2 " Eduardo Habkost
@ 2015-08-19  8:25       ` Michael Walle
  2015-08-21 22:43         ` Eduardo Habkost
  0 siblings, 1 reply; 15+ messages in thread
From: Michael Walle @ 2015-08-19  8:25 UTC (permalink / raw
  To: Eduardo Habkost
  Cc: Peter Maydell, Evgeny Voevodin, Michael S. Tsirkin,
	Mark Cave-Ayland, qemu-devel, Blue Swirl, Max Filippov,
	Edgar E. Iglesias, Guan Xuetao, Rob Herring, Jia Liu,
	Alexander Graf, Andreas Färber, Hervé Poussineau,
	Antony Pavlov, Maksim Kozlov, Leon Alrae, Marcel Apfelbaum,
	Li Guang, Fabien Chouteau, Peter Chubb, Scott Wood,
	Richard Henderson, Peter Crosthwaite, Igor Mitsyanko, qemu-ppc,
	Dmitry Solodkiy, Bastian Koppelmann, Jan Kiszka, Aurelien Jarno

Am 2015-08-18 23:43, schrieb Eduardo Habkost:
> I am sending a single patch for all machines to get some feedback, but
> in the final patch series I will separate them by architecture.
> 
> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
> ---
> (Sending v2 of just patch 6/7 to avoid resending the whole series)
> 
> Changes v1 -> v2:
> * Fix trailing spaces and newlines
> * Don't touch "//" comments on lines that we are not changing
> * Break long lines manually
> ---

> diff --git a/hw/lm32/lm32_boards.c b/hw/lm32/lm32_boards.c
> index 70f48d3..385c25d 100644
> --- a/hw/lm32/lm32_boards.c
> +++ b/hw/lm32/lm32_boards.c
> @@ -292,24 +292,21 @@ static void lm32_uclinux_init(MachineState 
> *machine)
>      qemu_register_reset(main_cpu_reset, reset_info);
>  }
> 
> -static QEMUMachine lm32_evr_machine = {
> -    .name = "lm32-evr",
> -    .desc = "LatticeMico32 EVR32 eval system",
> -    .init = lm32_evr_init,
> -    .is_default = 1,
> -};
> -
> -static QEMUMachine lm32_uclinux_machine = {
> -    .name = "lm32-uclinux",
> -    .desc = "lm32 platform for uClinux and u-boot by Theobroma 
> Systems",
> -    .init = lm32_uclinux_init,
> -    .is_default = 0,
> -};
> -
> -static void lm32_machine_init(void)
> +static void lm32_evr_machine_machine_init(MachineClass *mc)
>  {
> -    qemu_register_machine(&lm32_uclinux_machine);
> -    qemu_register_machine(&lm32_evr_machine);
> +    mc->desc = "LatticeMico32 EVR32 eval system";
> +    mc->init = lm32_evr_init;
> +    mc->is_default = 1;
>  }
> 
> -machine_init(lm32_machine_init);
> +DEFINE_MACHINE("lm32-evr", lm32_evr_machine_machine_init);

lm32_evr_machine_machine_init, should be lm32_evr_machine_init. Maybe 
you can enable your script to detect "machine_machine" and just use one 
"machine" then. Same below.


> +
> +static void lm32_uclinux_machine_machine_init(MachineClass *mc)
> +{
> +    mc->desc = "lm32 platform for uClinux and u-boot by Theobroma 
> Systems";
> +    mc->init = lm32_uclinux_init;
> +    mc->is_default = 0;
> +}
> +
> +DEFINE_MACHINE("lm32-uclinux", lm32_uclinux_machine_machine_init);
> +
> diff --git a/hw/lm32/milkymist.c b/hw/lm32/milkymist.c
> index e755f5b..a891fb5 100644
> --- a/hw/lm32/milkymist.c
> +++ b/hw/lm32/milkymist.c
> @@ -209,16 +209,12 @@ milkymist_init(MachineState *machine)
>      qemu_register_reset(main_cpu_reset, reset_info);
>  }
> 
> -static QEMUMachine milkymist_machine = {
> -    .name = "milkymist",
> -    .desc = "Milkymist One",
> -    .init = milkymist_init,
> -    .is_default = 0,
> -};
> -
> -static void milkymist_machine_init(void)
> +static void milkymist_machine_machine_init(MachineClass *mc)
>  {
> -    qemu_register_machine(&milkymist_machine);
> +    mc->desc = "Milkymist One";
> +    mc->init = milkymist_init;
> +    mc->is_default = 0;
>  }
> 
> -machine_init(milkymist_machine_init);
> +DEFINE_MACHINE("milkymist", milkymist_machine_machine_init);
> +

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Qemu-devel] [PATCH 5/7] pc: Use DEFINE_MACHINE to implement DEFINE_PC_MACHINE
  2015-08-18 19:08 ` [Qemu-devel] [PATCH 5/7] pc: Use DEFINE_MACHINE to implement DEFINE_PC_MACHINE Eduardo Habkost
@ 2015-08-19 23:28   ` Eduardo Habkost
  0 siblings, 0 replies; 15+ messages in thread
From: Eduardo Habkost @ 2015-08-19 23:28 UTC (permalink / raw
  To: qemu-devel; +Cc: Michael S. Tsirkin, Marcel Apfelbaum

On Tue, Aug 18, 2015 at 12:08:52PM -0700, Eduardo Habkost wrote:
> DEFINE_PC_MACHINE should be eventually replaced by DEFINE_MACHINE, we
> just need to eliminate the pc_compat_*() functions first.
> 
> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
> ---
>  include/hw/i386/pc.h | 15 ++-------------
>  1 file changed, 2 insertions(+), 13 deletions(-)
> 
> diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
> index d0cad87..dc22608 100644
> --- a/include/hw/i386/pc.h
> +++ b/include/hw/i386/pc.h
> @@ -694,23 +694,12 @@ bool e820_get_entry(int, uint32_t, uint64_t *, uint64_t *);
>          },
>  
>  #define DEFINE_PC_MACHINE(suffix, namestr, initfn, optsfn) \
> -    static void pc_machine_##suffix##_class_init(ObjectClass *oc, void *data) \
> +    static void pc_machine_##suffix##_class_init(MachineClass *mc) \
>      { \
> -        MachineClass *mc = MACHINE_CLASS(oc); \
>          optsfn(mc); \
> -        mc->name = namestr; \
>          mc->init = initfn; \
>      } \
> -    static const TypeInfo pc_machine_type_##suffix = { \
> -        .name       = namestr TYPE_MACHINE_SUFFIX, \
> -        .parent     = TYPE_PC_MACHINE, \
> -        .class_init = pc_machine_##suffix##_class_init, \
> -    }; \
> -    static void pc_machine_init_##suffix(void) \
> -    { \
> -        type_register(&pc_machine_type_##suffix); \
> -    } \
> -    machine_init(pc_machine_init_##suffix)
> +    DEFINE_MACHINE(namestr, pc_machine_##suffix##_class_init)

Please drop this patch, it is broken:

  $ ./x86_64-softmmu/qemu-system-x86_64 -machine '?'
  qemu/hw/i386/pc_piix.c:502:pc_i440fx_1_6_machine_options: Object 0x555563d0adb0 is not an instance of type generic-pc-machine
  Aborted (core dumped)

The parent class is being incorrectly changed from TYPE_PC_MACHINE to
TYPE_MACHINE.

-- 
Eduardo

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Qemu-devel] [PATCH 4/7] machine: DEFINE_MACHINE macro
  2015-08-18 19:08 ` [Qemu-devel] [PATCH 4/7] machine: DEFINE_MACHINE macro Eduardo Habkost
@ 2015-08-20 21:14   ` Eduardo Habkost
  0 siblings, 0 replies; 15+ messages in thread
From: Eduardo Habkost @ 2015-08-20 21:14 UTC (permalink / raw
  To: qemu-devel; +Cc: Michael S. Tsirkin, Marcel Apfelbaum

On Tue, Aug 18, 2015 at 12:08:51PM -0700, Eduardo Habkost wrote:
> The macro will allow easy registration of a TYPE_MACHINE subclass, using
> only the machine name and a MachineClass initialization function as
> parameter.
> 
> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>

I will need to redo this patch after some other fixes I will submit
soon, so patches 4-7/7 can be dropped, by now.

-- 
Eduardo

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Qemu-devel] [PATCH v2 6/7] [RFC] Use DEFINE_MACHINE to register all machines
  2015-08-19  8:25       ` Michael Walle
@ 2015-08-21 22:43         ` Eduardo Habkost
  0 siblings, 0 replies; 15+ messages in thread
From: Eduardo Habkost @ 2015-08-21 22:43 UTC (permalink / raw
  To: Michael Walle
  Cc: Peter Maydell, Evgeny Voevodin, Michael S. Tsirkin,
	Mark Cave-Ayland, qemu-devel, Blue Swirl, Max Filippov,
	Edgar E. Iglesias, Guan Xuetao, Rob Herring, Jia Liu,
	Alexander Graf, Andreas Färber, Hervé Poussineau,
	Antony Pavlov, Maksim Kozlov, Leon Alrae, Marcel Apfelbaum,
	Li Guang, Fabien Chouteau, Peter Chubb, Scott Wood,
	Richard Henderson, Peter Crosthwaite, Igor Mitsyanko, qemu-ppc,
	Dmitry Solodkiy, Bastian Koppelmann, Jan Kiszka, Aurelien Jarno

On Wed, Aug 19, 2015 at 10:25:34AM +0200, Michael Walle wrote:
[...]
> >-static void lm32_machine_init(void)
> >+static void lm32_evr_machine_machine_init(MachineClass *mc)
> > {
> >-    qemu_register_machine(&lm32_uclinux_machine);
> >-    qemu_register_machine(&lm32_evr_machine);
> >+    mc->desc = "LatticeMico32 EVR32 eval system";
> >+    mc->init = lm32_evr_init;
> >+    mc->is_default = 1;
> > }
> >
> >-machine_init(lm32_machine_init);
> >+DEFINE_MACHINE("lm32-evr", lm32_evr_machine_machine_init);
> 
> lm32_evr_machine_machine_init, should be lm32_evr_machine_init. Maybe you
> can enable your script to detect "machine_machine" and just use one
> "machine" then. Same below.

Thanks. I will fix it in the next version.

-- 
Eduardo

^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2015-08-21 22:44 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-08-18 19:08 [Qemu-devel] [PATCH 0/7] machine registration: Use QOM, eliminate QEMUMachine Eduardo Habkost
2015-08-18 19:08 ` [Qemu-devel] [PATCH 1/7] exynos4: Use EXYNOS4210_NCPUS instead of max_cpus on error message Eduardo Habkost
2015-08-18 19:08 ` [Qemu-devel] [PATCH 2/7] exynos4: Use MachineClass instead of exynos4_machines array Eduardo Habkost
2015-08-18 19:08 ` [Qemu-devel] [PATCH 3/7] exynos4: Declare each QEMUMachine as a separate variable Eduardo Habkost
2015-08-18 19:08 ` [Qemu-devel] [PATCH 4/7] machine: DEFINE_MACHINE macro Eduardo Habkost
2015-08-20 21:14   ` Eduardo Habkost
2015-08-18 19:08 ` [Qemu-devel] [PATCH 5/7] pc: Use DEFINE_MACHINE to implement DEFINE_PC_MACHINE Eduardo Habkost
2015-08-19 23:28   ` Eduardo Habkost
2015-08-18 19:08 ` [Qemu-devel] [PATCH 6/7] [RFC] Use DEFINE_MACHINE to register all machines Eduardo Habkost
2015-08-18 19:54   ` Eduardo Habkost
2015-08-18 20:06   ` Eduardo Habkost
2015-08-18 21:43     ` [Qemu-devel] [PATCH v2 " Eduardo Habkost
2015-08-19  8:25       ` Michael Walle
2015-08-21 22:43         ` Eduardo Habkost
2015-08-18 19:08 ` [Qemu-devel] [PATCH 7/7] machine: Eliminate QEMUMachine and qemu_register_machine() Eduardo Habkost

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.