Patchwork [QEMU] create struct for machine initialization arguments

login
register
mail settings
Submitter Eduardo Habkost
Date Oct. 5, 2012, 6:37 p.m.
Message ID <1349462220-13742-1-git-send-email-ehabkost@redhat.com>
Download mbox | patch
Permalink /patch/189564/
State New
Headers show

Comments

Eduardo Habkost - Oct. 5, 2012, 6:37 p.m.
This should help us to:
 - More easily add or remove machine initialization arguments without
   having to change every single machine init function;
 - More easily make mechanical changes involving the machine init
   functions in the future;
 - Let machine initialization forward the init arguments to other
   functions more easily.

This change was half-mechanical process: first the struct was added with
the local ram_size, boot_device, kernel_*, initrd_*, and cpu_model local
variable initialization to all functions. Then the compiler helped me
locate the local variables that are unused, so they could be removed.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 hw/alpha_dp264.c              |  12 ++--
 hw/an5206.c                   |   8 +--
 hw/axis_dev88.c               |   9 +--
 hw/boards.h                   |  16 +++--
 hw/collie.c                   |   9 +--
 hw/dummy_m68k.c               |   8 +--
 hw/exynos4_boards.c           |  16 ++---
 hw/gumstix.c                  |  11 +---
 hw/highbank.c                 |  10 ++--
 hw/integratorcp.c             |  10 ++--
 hw/kzm.c                      |  10 ++--
 hw/leon3.c                    |  10 ++--
 hw/lm32_boards.c              |  18 +++---
 hw/mainstone.c                |  10 ++--
 hw/mcf5208.c                  |   8 +--
 hw/milkymist.c                |  10 ++--
 hw/mips_fulong2e.c            |   9 ++-
 hw/mips_jazz.c                |  14 ++---
 hw/mips_malta.c               |  10 ++--
 hw/mips_mipssim.c             |  10 ++--
 hw/mips_r4k.c                 |  10 ++--
 hw/musicpal.c                 |   9 +--
 hw/nseries.c                  |  22 ++++---
 hw/null-machine.c             |   7 +--
 hw/omap_sx1.c                 |  22 ++++---
 hw/openrisc_sim.c             |  10 ++--
 hw/palm.c                     |   9 +--
 hw/pc_piix.c                  |  42 +++++++------
 hw/petalogix_ml605_mmu.c      |   8 +--
 hw/petalogix_s3adsp1800_mmu.c |   8 +--
 hw/ppc/e500plat.c             |  13 +++--
 hw/ppc/mpc8544ds.c            |  13 +++--
 hw/ppc405_boards.c            |  25 ++++----
 hw/ppc440_bamboo.c            |  12 ++--
 hw/ppc_newworld.c             |  13 +++--
 hw/ppc_oldworld.c             |  13 +++--
 hw/ppc_prep.c                 |  13 +++--
 hw/puv3.c                     |   8 ++-
 hw/r2d.c                      |   9 +--
 hw/realview.c                 |  44 +++++++++-----
 hw/s390-virtio.c              |  13 +++--
 hw/shix.c                     |   6 +-
 hw/spapr.c                    |  13 +++--
 hw/spitz.c                    |  40 ++++++++-----
 hw/stellaris.c                |  14 ++---
 hw/sun4m.c                    | 133 ++++++++++++++++++++++++++----------------
 hw/sun4u.c                    |  39 ++++++++-----
 hw/tosa.c                     |   9 +--
 hw/versatilepb.c              |  22 ++++---
 hw/vexpress.c                 |  26 +++++----
 hw/virtex_ml507.c             |  10 ++--
 hw/xen_machine_pv.c           |  13 +++--
 hw/xilinx_zynq.c              |   9 ++-
 hw/xtensa_lx60.c              |  22 ++++---
 hw/xtensa_sim.c               |  11 ++--
 hw/z2.c                       |   9 +--
 vl.c                          |   9 ++-
 57 files changed, 520 insertions(+), 406 deletions(-)
Alexander Graf - Oct. 5, 2012, 6:45 p.m.
On 05.10.2012, at 20:37, Eduardo Habkost <ehabkost@redhat.com> wrote:

> 
> This should help us to:
> - More easily add or remove machine initialization arguments without
>   having to change every single machine init function;
> - More easily make mechanical changes involving the machine init
>   functions in the future;
> - Let machine initialization forward the init arguments to other
>   functions more easily.
> 
> This change was half-mechanical process: first the struct was added with
> the local ram_size, boot_device, kernel_*, initrd_*, and cpu_model local
> variable initialization to all functions. Then the compiler helped me
> locate the local variables that are unused, so they could be removed.
> 
> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>

Very good idea :).

Alex

> ---
> hw/alpha_dp264.c              |  12 ++--
> hw/an5206.c                   |   8 +--
> hw/axis_dev88.c               |   9 +--
> hw/boards.h                   |  16 +++--
> hw/collie.c                   |   9 +--
> hw/dummy_m68k.c               |   8 +--
> hw/exynos4_boards.c           |  16 ++---
> hw/gumstix.c                  |  11 +---
> hw/highbank.c                 |  10 ++--
> hw/integratorcp.c             |  10 ++--
> hw/kzm.c                      |  10 ++--
> hw/leon3.c                    |  10 ++--
> hw/lm32_boards.c              |  18 +++---
> hw/mainstone.c                |  10 ++--
> hw/mcf5208.c                  |   8 +--
> hw/milkymist.c                |  10 ++--
> hw/mips_fulong2e.c            |   9 ++-
> hw/mips_jazz.c                |  14 ++---
> hw/mips_malta.c               |  10 ++--
> hw/mips_mipssim.c             |  10 ++--
> hw/mips_r4k.c                 |  10 ++--
> hw/musicpal.c                 |   9 +--
> hw/nseries.c                  |  22 ++++---
> hw/null-machine.c             |   7 +--
> hw/omap_sx1.c                 |  22 ++++---
> hw/openrisc_sim.c             |  10 ++--
> hw/palm.c                     |   9 +--
> hw/pc_piix.c                  |  42 +++++++------
> hw/petalogix_ml605_mmu.c      |   8 +--
> hw/petalogix_s3adsp1800_mmu.c |   8 +--
> hw/ppc/e500plat.c             |  13 +++--
> hw/ppc/mpc8544ds.c            |  13 +++--
> hw/ppc405_boards.c            |  25 ++++----
> hw/ppc440_bamboo.c            |  12 ++--
> hw/ppc_newworld.c             |  13 +++--
> hw/ppc_oldworld.c             |  13 +++--
> hw/ppc_prep.c                 |  13 +++--
> hw/puv3.c                     |   8 ++-
> hw/r2d.c                      |   9 +--
> hw/realview.c                 |  44 +++++++++-----
> hw/s390-virtio.c              |  13 +++--
> hw/shix.c                     |   6 +-
> hw/spapr.c                    |  13 +++--
> hw/spitz.c                    |  40 ++++++++-----
> hw/stellaris.c                |  14 ++---
> hw/sun4m.c                    | 133 ++++++++++++++++++++++++++----------------
> hw/sun4u.c                    |  39 ++++++++-----
> hw/tosa.c                     |   9 +--
> hw/versatilepb.c              |  22 ++++---
> hw/vexpress.c                 |  26 +++++----
> hw/virtex_ml507.c             |  10 ++--
> hw/xen_machine_pv.c           |  13 +++--
> hw/xilinx_zynq.c              |   9 ++-
> hw/xtensa_lx60.c              |  22 ++++---
> hw/xtensa_sim.c               |  11 ++--
> hw/z2.c                       |   9 +--
> vl.c                          |   9 ++-
> 57 files changed, 520 insertions(+), 406 deletions(-)
> 
> diff --git a/hw/alpha_dp264.c b/hw/alpha_dp264.c
> index 9eb939f..2c2e237 100644
> --- a/hw/alpha_dp264.c
> +++ b/hw/alpha_dp264.c
> @@ -42,13 +42,13 @@ static int clipper_pci_map_irq(PCIDevice *d, int irq_num)
>     return (slot + 1) * 4 + irq_num;
> }
> 
> -static void clipper_init(ram_addr_t ram_size,
> -                         const char *boot_device,
> -                         const char *kernel_filename,
> -                         const char *kernel_cmdline,
> -                         const char *initrd_filename,
> -                         const char *cpu_model)
> +static void clipper_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
>     CPUAlphaState *cpus[4];
>     PCIBus *pci_bus;
>     ISABus *isa_bus;
> diff --git a/hw/an5206.c b/hw/an5206.c
> index 25407c0..042c5fc 100644
> --- a/hw/an5206.c
> +++ b/hw/an5206.c
> @@ -19,11 +19,11 @@
> 
> /* Board init.  */
> 
> -static void an5206_init(ram_addr_t ram_size,
> -                     const char *boot_device,
> -                     const char *kernel_filename, const char *kernel_cmdline,
> -                     const char *initrd_filename, const char *cpu_model)
> +static void an5206_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
>     CPUM68KState *env;
>     int kernel_size;
>     uint64_t elf_entry;
> diff --git a/hw/axis_dev88.c b/hw/axis_dev88.c
> index eab6327..2fd7356 100644
> --- a/hw/axis_dev88.c
> +++ b/hw/axis_dev88.c
> @@ -242,11 +242,12 @@ static const MemoryRegionOps gpio_ops = {
> static struct cris_load_info li;
> 
> static
> -void axisdev88_init (ram_addr_t ram_size,
> -                     const char *boot_device,
> -                     const char *kernel_filename, const char *kernel_cmdline,
> -                     const char *initrd_filename, const char *cpu_model)
> +void axisdev88_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
>     CRISCPU *cpu;
>     CPUCRISState *env;
>     DeviceState *dev;
> diff --git a/hw/boards.h b/hw/boards.h
> index a2e0a54..813d0e5 100644
> --- a/hw/boards.h
> +++ b/hw/boards.h
> @@ -5,12 +5,16 @@
> 
> #include "qdev.h"
> 
> -typedef void QEMUMachineInitFunc(ram_addr_t ram_size,
> -                                 const char *boot_device,
> -                                 const char *kernel_filename,
> -                                 const char *kernel_cmdline,
> -                                 const char *initrd_filename,
> -                                 const char *cpu_model);
> +typedef struct QEMUMachineInitArgs {
> +    ram_addr_t ram_size;
> +    const char *boot_device;
> +    const char *kernel_filename;
> +    const char *kernel_cmdline;
> +    const char *initrd_filename;
> +    const char *cpu_model;
> +} QEMUMachineInitArgs;
> +
> +typedef void QEMUMachineInitFunc(QEMUMachineInitArgs *args);
> 
> typedef void QEMUMachineResetFunc(void);
> 
> diff --git a/hw/collie.c b/hw/collie.c
> index 56f89a9..695982a 100644
> --- a/hw/collie.c
> +++ b/hw/collie.c
> @@ -23,11 +23,12 @@ static struct arm_boot_info collie_binfo = {
>     .ram_size = 0x20000000,
> };
> 
> -static void collie_init(ram_addr_t ram_size,
> -                const char *boot_device,
> -                const char *kernel_filename, const char *kernel_cmdline,
> -                const char *initrd_filename, const char *cpu_model)
> +static void collie_init(QEMUMachineInitArgs *args)
> {
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
>     StrongARMState *s;
>     DriveInfo *dinfo;
>     MemoryRegion *sysmem = get_system_memory();
> diff --git a/hw/dummy_m68k.c b/hw/dummy_m68k.c
> index 7cc7a99..f436a0c 100644
> --- a/hw/dummy_m68k.c
> +++ b/hw/dummy_m68k.c
> @@ -16,11 +16,11 @@
> 
> /* Board init.  */
> 
> -static void dummy_m68k_init(ram_addr_t ram_size,
> -                     const char *boot_device,
> -                     const char *kernel_filename, const char *kernel_cmdline,
> -                     const char *initrd_filename, const char *cpu_model)
> +static void dummy_m68k_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
>     CPUM68KState *env;
>     MemoryRegion *address_space_mem =  get_system_memory();
>     MemoryRegion *ram = g_new(MemoryRegion, 1);
> diff --git a/hw/exynos4_boards.c b/hw/exynos4_boards.c
> index 4bb0a60..4951064 100644
> --- a/hw/exynos4_boards.c
> +++ b/hw/exynos4_boards.c
> @@ -130,22 +130,22 @@ static Exynos4210State *exynos4_boards_init_common(
>             exynos4_board_ram_size[board_type]);
> }
> 
> -static void nuri_init(ram_addr_t ram_size,
> -        const char *boot_device,
> -        const char *kernel_filename, const char *kernel_cmdline,
> -        const char *initrd_filename, const char *cpu_model)
> +static void nuri_init(QEMUMachineInitArgs *args)
> {
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
>     exynos4_boards_init_common(kernel_filename, kernel_cmdline,
>                 initrd_filename, EXYNOS4_BOARD_NURI);
> 
>     arm_load_kernel(arm_env_get_cpu(first_cpu), &exynos4_board_binfo);
> }
> 
> -static void smdkc210_init(ram_addr_t ram_size,
> -        const char *boot_device,
> -        const char *kernel_filename, const char *kernel_cmdline,
> -        const char *initrd_filename, const char *cpu_model)
> +static void smdkc210_init(QEMUMachineInitArgs *args)
> {
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
>     Exynos4210State *s = exynos4_boards_init_common(kernel_filename,
>             kernel_cmdline, initrd_filename, EXYNOS4_BOARD_SMDKC210);
> 
> diff --git a/hw/gumstix.c b/hw/gumstix.c
> index 13a36ea..4103a88 100644
> --- a/hw/gumstix.c
> +++ b/hw/gumstix.c
> @@ -45,10 +45,7 @@
> 
> static const int sector_len = 128 * 1024;
> 
> -static void connex_init(ram_addr_t ram_size,
> -                const char *boot_device,
> -                const char *kernel_filename, const char *kernel_cmdline,
> -                const char *initrd_filename, const char *cpu_model)
> +static void connex_init(QEMUMachineInitArgs *args)
> {
>     PXA2xxState *cpu;
>     DriveInfo *dinfo;
> @@ -84,11 +81,9 @@ static void connex_init(ram_addr_t ram_size,
>                     qdev_get_gpio_in(cpu->gpio, 36));
> }
> 
> -static void verdex_init(ram_addr_t ram_size,
> -                const char *boot_device,
> -                const char *kernel_filename, const char *kernel_cmdline,
> -                const char *initrd_filename, const char *cpu_model)
> +static void verdex_init(QEMUMachineInitArgs *args)
> {
> +    const char *cpu_model = args->cpu_model;
>     PXA2xxState *cpu;
>     DriveInfo *dinfo;
>     int be;
> diff --git a/hw/highbank.c b/hw/highbank.c
> index 11aa131..15036b6 100644
> --- a/hw/highbank.c
> +++ b/hw/highbank.c
> @@ -187,11 +187,13 @@ static struct arm_boot_info highbank_binfo;
>  * 32-bit host, set the reg value of memory to 0xf7ff00000 in the
>  * device tree and pass -m 2047 to QEMU.
>  */
> -static void highbank_init(ram_addr_t ram_size,
> -                     const char *boot_device,
> -                     const char *kernel_filename, const char *kernel_cmdline,
> -                     const char *initrd_filename, const char *cpu_model)
> +static void highbank_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
>     DeviceState *dev;
>     SysBusDevice *busdev;
>     qemu_irq *irqp;
> diff --git a/hw/integratorcp.c b/hw/integratorcp.c
> index d0e2e90..ac0ea83 100644
> --- a/hw/integratorcp.c
> +++ b/hw/integratorcp.c
> @@ -438,11 +438,13 @@ static struct arm_boot_info integrator_binfo = {
>     .board_id = 0x113,
> };
> 
> -static void integratorcp_init(ram_addr_t ram_size,
> -                     const char *boot_device,
> -                     const char *kernel_filename, const char *kernel_cmdline,
> -                     const char *initrd_filename, const char *cpu_model)
> +static void integratorcp_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
>     ARMCPU *cpu;
>     MemoryRegion *address_space_mem = get_system_memory();
>     MemoryRegion *ram = g_new(MemoryRegion, 1);
> diff --git a/hw/kzm.c b/hw/kzm.c
> index 68cd1b4..d1266d9 100644
> --- a/hw/kzm.c
> +++ b/hw/kzm.c
> @@ -70,11 +70,13 @@ static struct arm_boot_info kzm_binfo = {
>     .board_id = 1722,
> };
> 
> -static void kzm_init(ram_addr_t ram_size,
> -                     const char *boot_device,
> -                     const char *kernel_filename, const char *kernel_cmdline,
> -                     const char *initrd_filename, const char *cpu_model)
> +static void kzm_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
>     ARMCPU *cpu;
>     MemoryRegion *address_space_mem = get_system_memory();
>     MemoryRegion *ram = g_new(MemoryRegion, 1);
> diff --git a/hw/leon3.c b/hw/leon3.c
> index 878d3aa..6486b7b 100644
> --- a/hw/leon3.c
> +++ b/hw/leon3.c
> @@ -94,13 +94,11 @@ static void leon3_set_pil_in(void *opaque, uint32_t pil_in)
>     }
> }
> 
> -static void leon3_generic_hw_init(ram_addr_t  ram_size,
> -                                  const char *boot_device,
> -                                  const char *kernel_filename,
> -                                  const char *kernel_cmdline,
> -                                  const char *initrd_filename,
> -                                  const char *cpu_model)
> +static void leon3_generic_hw_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
>     SPARCCPU *cpu;
>     CPUSPARCState   *env;
>     MemoryRegion *address_space_mem = get_system_memory();
> diff --git a/hw/lm32_boards.c b/hw/lm32_boards.c
> index b76d800..c5a62c8 100644
> --- a/hw/lm32_boards.c
> +++ b/hw/lm32_boards.c
> @@ -69,12 +69,10 @@ static void main_cpu_reset(void *opaque)
>     env->deba = reset_info->flash_base;
> }
> 
> -static void lm32_evr_init(ram_addr_t ram_size_not_used,
> -                          const char *boot_device,
> -                          const char *kernel_filename,
> -                          const char *kernel_cmdline,
> -                          const char *initrd_filename, const char *cpu_model)
> +static void lm32_evr_init(QEMUMachineInitArgs *args)
> {
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
>     LM32CPU *cpu;
>     CPULM32State *env;
>     DriveInfo *dinfo;
> @@ -159,12 +157,12 @@ static void lm32_evr_init(ram_addr_t ram_size_not_used,
>     qemu_register_reset(main_cpu_reset, reset_info);
> }
> 
> -static void lm32_uclinux_init(ram_addr_t ram_size_not_used,
> -                          const char *boot_device,
> -                          const char *kernel_filename,
> -                          const char *kernel_cmdline,
> -                          const char *initrd_filename, const char *cpu_model)
> +static void lm32_uclinux_init(QEMUMachineInitArgs *args)
> {
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
>     LM32CPU *cpu;
>     CPULM32State *env;
>     DriveInfo *dinfo;
> diff --git a/hw/mainstone.c b/hw/mainstone.c
> index 97687b6..c0d6034 100644
> --- a/hw/mainstone.c
> +++ b/hw/mainstone.c
> @@ -171,11 +171,13 @@ static void mainstone_common_init(MemoryRegion *address_space_mem,
>     arm_load_kernel(mpu->cpu, &mainstone_binfo);
> }
> 
> -static void mainstone_init(ram_addr_t ram_size,
> -                const char *boot_device,
> -                const char *kernel_filename, const char *kernel_cmdline,
> -                const char *initrd_filename, const char *cpu_model)
> +static void mainstone_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
>     mainstone_common_init(get_system_memory(), ram_size, kernel_filename,
>                 kernel_cmdline, initrd_filename, cpu_model, mainstone, 0x196);
> }
> diff --git a/hw/mcf5208.c b/hw/mcf5208.c
> index ee25b1b..688bc3c 100644
> --- a/hw/mcf5208.c
> +++ b/hw/mcf5208.c
> @@ -187,11 +187,11 @@ static void mcf5208_sys_init(MemoryRegion *address_space, qemu_irq *pic)
>     }
> }
> 
> -static void mcf5208evb_init(ram_addr_t ram_size,
> -                     const char *boot_device,
> -                     const char *kernel_filename, const char *kernel_cmdline,
> -                     const char *initrd_filename, const char *cpu_model)
> +static void mcf5208evb_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
>     CPUM68KState *env;
>     int kernel_size;
>     uint64_t elf_entry;
> diff --git a/hw/milkymist.c b/hw/milkymist.c
> index 2e7235b..ca9ed43 100644
> --- a/hw/milkymist.c
> +++ b/hw/milkymist.c
> @@ -73,12 +73,12 @@ static void main_cpu_reset(void *opaque)
> }
> 
> static void
> -milkymist_init(ram_addr_t ram_size_not_used,
> -                          const char *boot_device,
> -                          const char *kernel_filename,
> -                          const char *kernel_cmdline,
> -                          const char *initrd_filename, const char *cpu_model)
> +milkymist_init(QEMUMachineInitArgs *args)
> {
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
>     LM32CPU *cpu;
>     CPULM32State *env;
>     int kernel_size;
> diff --git a/hw/mips_fulong2e.c b/hw/mips_fulong2e.c
> index 38e4b86..af7bb50 100644
> --- a/hw/mips_fulong2e.c
> +++ b/hw/mips_fulong2e.c
> @@ -256,10 +256,13 @@ static void cpu_request_exit(void *opaque, int irq, int level)
>     }
> }
> 
> -static void mips_fulong2e_init(ram_addr_t ram_size, const char *boot_device,
> -                        const char *kernel_filename, const char *kernel_cmdline,
> -                        const char *initrd_filename, const char *cpu_model)
> +static void mips_fulong2e_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
>     char *filename;
>     MemoryRegion *address_space_mem = get_system_memory();
>     MemoryRegion *ram = g_new(MemoryRegion, 1);
> diff --git a/hw/mips_jazz.c b/hw/mips_jazz.c
> index db927f1..14df4d7 100644
> --- a/hw/mips_jazz.c
> +++ b/hw/mips_jazz.c
> @@ -302,21 +302,19 @@ static void mips_jazz_init(MemoryRegion *address_space,
> }
> 
> static
> -void mips_magnum_init (ram_addr_t ram_size,
> -                       const char *boot_device,
> -                       const char *kernel_filename, const char *kernel_cmdline,
> -                       const char *initrd_filename, const char *cpu_model)
> +void mips_magnum_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
>         mips_jazz_init(get_system_memory(), get_system_io(),
>                        ram_size, cpu_model, JAZZ_MAGNUM);
> }
> 
> static
> -void mips_pica61_init (ram_addr_t ram_size,
> -                       const char *boot_device,
> -                       const char *kernel_filename, const char *kernel_cmdline,
> -                       const char *initrd_filename, const char *cpu_model)
> +void mips_pica61_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
>     mips_jazz_init(get_system_memory(), get_system_io(),
>                    ram_size, cpu_model, JAZZ_PICA61);
> }
> diff --git a/hw/mips_malta.c b/hw/mips_malta.c
> index ad23f26..14151f9 100644
> --- a/hw/mips_malta.c
> +++ b/hw/mips_malta.c
> @@ -777,11 +777,13 @@ static void cpu_request_exit(void *opaque, int irq, int level)
> }
> 
> static
> -void mips_malta_init (ram_addr_t ram_size,
> -                      const char *boot_device,
> -                      const char *kernel_filename, const char *kernel_cmdline,
> -                      const char *initrd_filename, const char *cpu_model)
> +void mips_malta_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
>     char *filename;
>     pflash_t *fl;
>     MemoryRegion *system_memory = get_system_memory();
> diff --git a/hw/mips_mipssim.c b/hw/mips_mipssim.c
> index 830f635..a1d3945 100644
> --- a/hw/mips_mipssim.c
> +++ b/hw/mips_mipssim.c
> @@ -131,11 +131,13 @@ static void mipsnet_init(int base, qemu_irq irq, NICInfo *nd)
> }
> 
> static void
> -mips_mipssim_init (ram_addr_t ram_size,
> -                   const char *boot_device,
> -                   const char *kernel_filename, const char *kernel_cmdline,
> -                   const char *initrd_filename, const char *cpu_model)
> +mips_mipssim_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
>     char *filename;
>     MemoryRegion *address_space_mem = get_system_memory();
>     MemoryRegion *ram = g_new(MemoryRegion, 1);
> diff --git a/hw/mips_r4k.c b/hw/mips_r4k.c
> index 967a76e..b73cdc3 100644
> --- a/hw/mips_r4k.c
> +++ b/hw/mips_r4k.c
> @@ -151,11 +151,13 @@ static void main_cpu_reset(void *opaque)
> 
> static const int sector_len = 32 * 1024;
> static
> -void mips_r4k_init (ram_addr_t ram_size,
> -                    const char *boot_device,
> -                    const char *kernel_filename, const char *kernel_cmdline,
> -                    const char *initrd_filename, const char *cpu_model)
> +void mips_r4k_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
>     char *filename;
>     MemoryRegion *address_space_mem = get_system_memory();
>     MemoryRegion *ram = g_new(MemoryRegion, 1);
> diff --git a/hw/musicpal.c b/hw/musicpal.c
> index f305e21..f06814c 100644
> --- a/hw/musicpal.c
> +++ b/hw/musicpal.c
> @@ -1508,11 +1508,12 @@ static struct arm_boot_info musicpal_binfo = {
>     .board_id = 0x20e,
> };
> 
> -static void musicpal_init(ram_addr_t ram_size,
> -               const char *boot_device,
> -               const char *kernel_filename, const char *kernel_cmdline,
> -               const char *initrd_filename, const char *cpu_model)
> +static void musicpal_init(QEMUMachineInitArgs *args)
> {
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
>     ARMCPU *cpu;
>     qemu_irq *cpu_pic;
>     qemu_irq pic[32];
> diff --git a/hw/nseries.c b/hw/nseries.c
> index 6df71eb..7ada90d 100644
> --- a/hw/nseries.c
> +++ b/hw/nseries.c
> @@ -1397,21 +1397,27 @@ static struct arm_boot_info n810_binfo = {
>     .atag_board = n810_atag_setup,
> };
> 
> -static void n800_init(ram_addr_t ram_size,
> -                const char *boot_device,
> -                const char *kernel_filename, const char *kernel_cmdline,
> -                const char *initrd_filename, const char *cpu_model)
> +static void n800_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_device = args->boot_device;
>     return n8x0_init(ram_size, boot_device,
>                     kernel_filename, kernel_cmdline, initrd_filename,
>                     cpu_model, &n800_binfo, 800);
> }
> 
> -static void n810_init(ram_addr_t ram_size,
> -                const char *boot_device,
> -                const char *kernel_filename, const char *kernel_cmdline,
> -                const char *initrd_filename, const char *cpu_model)
> +static void n810_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_device = args->boot_device;
>     return n8x0_init(ram_size, boot_device,
>                     kernel_filename, kernel_cmdline, initrd_filename,
>                     cpu_model, &n810_binfo, 810);
> diff --git a/hw/null-machine.c b/hw/null-machine.c
> index 69910d3..d813c08 100644
> --- a/hw/null-machine.c
> +++ b/hw/null-machine.c
> @@ -15,12 +15,7 @@
> #include "hw/hw.h"
> #include "hw/boards.h"
> 
> -static void machine_none_init(ram_addr_t ram_size,
> -                              const char *boot_device,
> -                              const char *kernel_filename,
> -                              const char *kernel_cmdline,
> -                              const char *initrd_filename,
> -                              const char *cpu_model)
> +static void machine_none_init(QEMUMachineInitArgs *args)
> {
> }
> 
> diff --git a/hw/omap_sx1.c b/hw/omap_sx1.c
> index abca341..ad17487 100644
> --- a/hw/omap_sx1.c
> +++ b/hw/omap_sx1.c
> @@ -209,20 +209,26 @@ static void sx1_init(ram_addr_t ram_size,
>     //~ qemu_console_resize(ds, 640, 480);
> }
> 
> -static void sx1_init_v1(ram_addr_t ram_size,
> -                const char *boot_device,
> -                const char *kernel_filename, const char *kernel_cmdline,
> -                const char *initrd_filename, const char *cpu_model)
> +static void sx1_init_v1(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_device = args->boot_device;
>     sx1_init(ram_size, boot_device, kernel_filename,
>                 kernel_cmdline, initrd_filename, cpu_model, 1);
> }
> 
> -static void sx1_init_v2(ram_addr_t ram_size,
> -                const char *boot_device,
> -                const char *kernel_filename, const char *kernel_cmdline,
> -                const char *initrd_filename, const char *cpu_model)
> +static void sx1_init_v2(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_device = args->boot_device;
>     sx1_init(ram_size, boot_device, kernel_filename,
>                 kernel_cmdline, initrd_filename, cpu_model, 2);
> }
> diff --git a/hw/openrisc_sim.c b/hw/openrisc_sim.c
> index 55e97f0..e96a944 100644
> --- a/hw/openrisc_sim.c
> +++ b/hw/openrisc_sim.c
> @@ -90,13 +90,11 @@ static void cpu_openrisc_load_kernel(ram_addr_t ram_size,
>     cpu->env.pc = entry;
> }
> 
> -static void openrisc_sim_init(ram_addr_t ram_size,
> -                              const char *boot_device,
> -                              const char *kernel_filename,
> -                              const char *kernel_cmdline,
> -                              const char *initrd_filename,
> -                              const char *cpu_model)
> +static void openrisc_sim_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
>    OpenRISCCPU *cpu = NULL;
>     MemoryRegion *ram;
>     int n;
> diff --git a/hw/palm.c b/hw/palm.c
> index bacdc90..032b8d6 100644
> --- a/hw/palm.c
> +++ b/hw/palm.c
> @@ -190,11 +190,12 @@ static struct arm_boot_info palmte_binfo = {
>     .board_id = 0x331,
> };
> 
> -static void palmte_init(ram_addr_t ram_size,
> -                const char *boot_device,
> -                const char *kernel_filename, const char *kernel_cmdline,
> -                const char *initrd_filename, const char *cpu_model)
> +static void palmte_init(QEMUMachineInitArgs *args)
> {
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
>     MemoryRegion *address_space_mem = get_system_memory();
>     struct omap_mpu_state_s *mpu;
>     int flash_size = 0x00800000;
> diff --git a/hw/pc_piix.c b/hw/pc_piix.c
> index fd5898f..9efc822 100644
> --- a/hw/pc_piix.c
> +++ b/hw/pc_piix.c
> @@ -287,13 +287,14 @@ static void pc_init1(MemoryRegion *system_memory,
>     }
> }
> 
> -static void pc_init_pci(ram_addr_t ram_size,
> -                        const char *boot_device,
> -                        const char *kernel_filename,
> -                        const char *kernel_cmdline,
> -                        const char *initrd_filename,
> -                        const char *cpu_model)
> +static void pc_init_pci(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_device = args->boot_device;
>     pc_init1(get_system_memory(),
>              get_system_io(),
>              ram_size, boot_device,
> @@ -301,13 +302,14 @@ static void pc_init_pci(ram_addr_t ram_size,
>              initrd_filename, cpu_model, 1, 1);
> }
> 
> -static void pc_init_pci_no_kvmclock(ram_addr_t ram_size,
> -                                    const char *boot_device,
> -                                    const char *kernel_filename,
> -                                    const char *kernel_cmdline,
> -                                    const char *initrd_filename,
> -                                    const char *cpu_model)
> +static void pc_init_pci_no_kvmclock(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_device = args->boot_device;
>     pc_init1(get_system_memory(),
>              get_system_io(),
>              ram_size, boot_device,
> @@ -315,13 +317,14 @@ static void pc_init_pci_no_kvmclock(ram_addr_t ram_size,
>              initrd_filename, cpu_model, 1, 0);
> }
> 
> -static void pc_init_isa(ram_addr_t ram_size,
> -                        const char *boot_device,
> -                        const char *kernel_filename,
> -                        const char *kernel_cmdline,
> -                        const char *initrd_filename,
> -                        const char *cpu_model)
> +static void pc_init_isa(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_device = args->boot_device;
>     if (cpu_model == NULL)
>         cpu_model = "486";
>     pc_init1(get_system_memory(),
> @@ -332,7 +335,8 @@ static void pc_init_isa(ram_addr_t ram_size,
> }
> 
> #ifdef CONFIG_XEN
> -static void pc_xen_hvm_init(ram_addr_t ram_size,
> +static void pc_xen_hvm_init(QEMUMachine *machine,
> +                            ram_addr_t ram_size,
>                             const char *boot_device,
>                             const char *kernel_filename,
>                             const char *kernel_cmdline,
> diff --git a/hw/petalogix_ml605_mmu.c b/hw/petalogix_ml605_mmu.c
> index dced648..ace0187 100644
> --- a/hw/petalogix_ml605_mmu.c
> +++ b/hw/petalogix_ml605_mmu.c
> @@ -70,12 +70,10 @@ static void machine_cpu_reset(MicroBlazeCPU *cpu)
> }
> 
> static void
> -petalogix_ml605_init(ram_addr_t ram_size,
> -                          const char *boot_device,
> -                          const char *kernel_filename,
> -                          const char *kernel_cmdline,
> -                          const char *initrd_filename, const char *cpu_model)
> +petalogix_ml605_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
>     MemoryRegion *address_space_mem = get_system_memory();
>     DeviceState *dev, *dma, *eth0;
>     MicroBlazeCPU *cpu;
> diff --git a/hw/petalogix_s3adsp1800_mmu.c b/hw/petalogix_s3adsp1800_mmu.c
> index 2cf6882..71c32ce 100644
> --- a/hw/petalogix_s3adsp1800_mmu.c
> +++ b/hw/petalogix_s3adsp1800_mmu.c
> @@ -57,12 +57,10 @@ static void machine_cpu_reset(MicroBlazeCPU *cpu)
> }
> 
> static void
> -petalogix_s3adsp1800_init(ram_addr_t ram_size,
> -                          const char *boot_device,
> -                          const char *kernel_filename,
> -                          const char *kernel_cmdline,
> -                          const char *initrd_filename, const char *cpu_model)
> +petalogix_s3adsp1800_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
>     DeviceState *dev;
>     MicroBlazeCPU *cpu;
>     CPUMBState *env;
> diff --git a/hw/ppc/e500plat.c b/hw/ppc/e500plat.c
> index 60a5cb3..4cfb940 100644
> --- a/hw/ppc/e500plat.c
> +++ b/hw/ppc/e500plat.c
> @@ -25,13 +25,14 @@ static void e500plat_fixup_devtree(PPCE500Params *params, void *fdt)
>                          sizeof(compatible));
> }
> 
> -static void e500plat_init(ram_addr_t ram_size,
> -                           const char *boot_device,
> -                           const char *kernel_filename,
> -                           const char *kernel_cmdline,
> -                           const char *initrd_filename,
> -                           const char *cpu_model)
> +static void e500plat_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *boot_device = args->boot_device;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
>     PPCE500Params params = {
>         .ram_size = ram_size,
>         .boot_device = boot_device,
> diff --git a/hw/ppc/mpc8544ds.c b/hw/ppc/mpc8544ds.c
> index 984d21c..e651661 100644
> --- a/hw/ppc/mpc8544ds.c
> +++ b/hw/ppc/mpc8544ds.c
> @@ -25,13 +25,14 @@ static void mpc8544ds_fixup_devtree(PPCE500Params *params, void *fdt)
>                          sizeof(compatible));
> }
> 
> -static void mpc8544ds_init(ram_addr_t ram_size,
> -                           const char *boot_device,
> -                           const char *kernel_filename,
> -                           const char *kernel_cmdline,
> -                           const char *initrd_filename,
> -                           const char *cpu_model)
> +static void mpc8544ds_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *boot_device = args->boot_device;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
>     PPCE500Params params = {
>         .ram_size = ram_size,
>         .boot_device = boot_device,
> diff --git a/hw/ppc405_boards.c b/hw/ppc405_boards.c
> index 476775d..e848cb0 100644
> --- a/hw/ppc405_boards.c
> +++ b/hw/ppc405_boards.c
> @@ -158,7 +158,7 @@ static void ref405ep_fpga_reset (void *opaque)
>     fpga->reg1 = 0x0F;
> }
> 
> -static void ref405ep_fpga_init (MemoryRegion *sysmem, uint32_t base)
> +static void ref405ep_fpga_init(MemoryRegion *sysmem, uint32_t base)
> {
>     ref405ep_fpga_t *fpga;
>     MemoryRegion *fpga_memory = g_new(MemoryRegion, 1);
> @@ -170,13 +170,12 @@ static void ref405ep_fpga_init (MemoryRegion *sysmem, uint32_t base)
>     qemu_register_reset(&ref405ep_fpga_reset, fpga);
> }
> 
> -static void ref405ep_init (ram_addr_t ram_size,
> -                           const char *boot_device,
> -                           const char *kernel_filename,
> -                           const char *kernel_cmdline,
> -                           const char *initrd_filename,
> -                           const char *cpu_model)
> +static void ref405ep_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
>     char *filename;
>     ppc4xx_bd_info_t bd;
>     CPUPPCState *env;
> @@ -484,7 +483,7 @@ static void taihu_cpld_reset (void *opaque)
>     cpld->reg1 = 0x80;
> }
> 
> -static void taihu_cpld_init (MemoryRegion *sysmem, uint32_t base)
> +static void taihu_cpld_init(MemoryRegion *sysmem, uint32_t base)
> {
>     taihu_cpld_t *cpld;
>     MemoryRegion *cpld_memory = g_new(MemoryRegion, 1);
> @@ -495,13 +494,11 @@ static void taihu_cpld_init (MemoryRegion *sysmem, uint32_t base)
>     qemu_register_reset(&taihu_cpld_reset, cpld);
> }
> 
> -static void taihu_405ep_init(ram_addr_t ram_size,
> -                             const char *boot_device,
> -                             const char *kernel_filename,
> -                             const char *kernel_cmdline,
> -                             const char *initrd_filename,
> -                             const char *cpu_model)
> +static void taihu_405ep_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *initrd_filename = args->initrd_filename;
>     char *filename;
>     qemu_irq *pic;
>     MemoryRegion *sysmem = get_system_memory();
> diff --git a/hw/ppc440_bamboo.c b/hw/ppc440_bamboo.c
> index c198071..78e7985 100644
> --- a/hw/ppc440_bamboo.c
> +++ b/hw/ppc440_bamboo.c
> @@ -157,13 +157,13 @@ static void main_cpu_reset(void *opaque)
>     mmubooke_create_initial_mapping(env, 0, 0);
> }
> 
> -static void bamboo_init(ram_addr_t ram_size,
> -                        const char *boot_device,
> -                        const char *kernel_filename,
> -                        const char *kernel_cmdline,
> -                        const char *initrd_filename,
> -                        const char *cpu_model)
> +static void bamboo_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
>     unsigned int pci_irq_nrs[4] = { 28, 27, 26, 25 };
>     MemoryRegion *address_space_mem = get_system_memory();
>     MemoryRegion *ram_memories
> diff --git a/hw/ppc_newworld.c b/hw/ppc_newworld.c
> index e95cfe8..e7c0747 100644
> --- a/hw/ppc_newworld.c
> +++ b/hw/ppc_newworld.c
> @@ -129,13 +129,14 @@ static void ppc_core99_reset(void *opaque)
> }
> 
> /* PowerPC Mac99 hardware initialisation */
> -static void ppc_core99_init (ram_addr_t ram_size,
> -                             const char *boot_device,
> -                             const char *kernel_filename,
> -                             const char *kernel_cmdline,
> -                             const char *initrd_filename,
> -                             const char *cpu_model)
> +static void ppc_core99_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_device = args->boot_device;
>     PowerPCCPU *cpu = NULL;
>     CPUPPCState *env = NULL;
>     char *filename;
> diff --git a/hw/ppc_oldworld.c b/hw/ppc_oldworld.c
> index 1dcd8a6..d9f76a8 100644
> --- a/hw/ppc_oldworld.c
> +++ b/hw/ppc_oldworld.c
> @@ -72,13 +72,14 @@ static void ppc_heathrow_reset(void *opaque)
>     cpu_reset(CPU(cpu));
> }
> 
> -static void ppc_heathrow_init (ram_addr_t ram_size,
> -                               const char *boot_device,
> -                               const char *kernel_filename,
> -                               const char *kernel_cmdline,
> -                               const char *initrd_filename,
> -                               const char *cpu_model)
> +static void ppc_heathrow_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_device = args->boot_device;
>     MemoryRegion *sysmem = get_system_memory();
>     PowerPCCPU *cpu = NULL;
>     CPUPPCState *env = NULL;
> diff --git a/hw/ppc_prep.c b/hw/ppc_prep.c
> index 592b7b2..f51f78a 100644
> --- a/hw/ppc_prep.c
> +++ b/hw/ppc_prep.c
> @@ -448,13 +448,14 @@ static void ppc_prep_reset(void *opaque)
> }
> 
> /* PowerPC PREP hardware initialisation */
> -static void ppc_prep_init (ram_addr_t ram_size,
> -                           const char *boot_device,
> -                           const char *kernel_filename,
> -                           const char *kernel_cmdline,
> -                           const char *initrd_filename,
> -                           const char *cpu_model)
> +static void ppc_prep_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_device = args->boot_device;
>     MemoryRegion *sysmem = get_system_memory();
>     PowerPCCPU *cpu = NULL;
>     CPUPPCState *env = NULL;
> diff --git a/hw/puv3.c b/hw/puv3.c
> index 43f7216..764799c 100644
> --- a/hw/puv3.c
> +++ b/hw/puv3.c
> @@ -91,10 +91,12 @@ static void puv3_load_kernel(const char *kernel_filename)
>     graphic_console_init(NULL, NULL, NULL, NULL, NULL);
> }
> 
> -static void puv3_init(ram_addr_t ram_size, const char *boot_device,
> -                     const char *kernel_filename, const char *kernel_cmdline,
> -                     const char *initrd_filename, const char *cpu_model)
> +static void puv3_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *initrd_filename = args->initrd_filename;
>     CPUUniCore32State *env;
> 
>     if (initrd_filename) {
> diff --git a/hw/r2d.c b/hw/r2d.c
> index 0f16e81..5daa42f 100644
> --- a/hw/r2d.c
> +++ b/hw/r2d.c
> @@ -219,11 +219,12 @@ static struct QEMU_PACKED
>     char kernel_cmdline[256];
> } boot_params;
> 
> -static void r2d_init(ram_addr_t ram_size,
> -              const char *boot_device,
> -          const char *kernel_filename, const char *kernel_cmdline,
> -          const char *initrd_filename, const char *cpu_model)
> +static void r2d_init(QEMUMachineInitArgs *args)
> {
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
>     SuperHCPU *cpu;
>     CPUSH4State *env;
>     ResetData *reset_info;
> diff --git a/hw/realview.c b/hw/realview.c
> index 19db4d0..8dc4be6 100644
> --- a/hw/realview.c
> +++ b/hw/realview.c
> @@ -330,11 +330,14 @@ static void realview_init(ram_addr_t ram_size,
>     arm_load_kernel(arm_env_get_cpu(first_cpu), &realview_binfo);
> }
> 
> -static void realview_eb_init(ram_addr_t ram_size,
> -                     const char *boot_device,
> -                     const char *kernel_filename, const char *kernel_cmdline,
> -                     const char *initrd_filename, const char *cpu_model)
> +static void realview_eb_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_device = args->boot_device;
>     if (!cpu_model) {
>         cpu_model = "arm926";
>     }
> @@ -342,11 +345,14 @@ static void realview_eb_init(ram_addr_t ram_size,
>                   initrd_filename, cpu_model, BOARD_EB);
> }
> 
> -static void realview_eb_mpcore_init(ram_addr_t ram_size,
> -                     const char *boot_device,
> -                     const char *kernel_filename, const char *kernel_cmdline,
> -                     const char *initrd_filename, const char *cpu_model)
> +static void realview_eb_mpcore_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_device = args->boot_device;
>     if (!cpu_model) {
>         cpu_model = "arm11mpcore";
>     }
> @@ -354,11 +360,14 @@ static void realview_eb_mpcore_init(ram_addr_t ram_size,
>                   initrd_filename, cpu_model, BOARD_EB_MPCORE);
> }
> 
> -static void realview_pb_a8_init(ram_addr_t ram_size,
> -                     const char *boot_device,
> -                     const char *kernel_filename, const char *kernel_cmdline,
> -                     const char *initrd_filename, const char *cpu_model)
> +static void realview_pb_a8_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_device = args->boot_device;
>     if (!cpu_model) {
>         cpu_model = "cortex-a8";
>     }
> @@ -366,11 +375,14 @@ static void realview_pb_a8_init(ram_addr_t ram_size,
>                   initrd_filename, cpu_model, BOARD_PB_A8);
> }
> 
> -static void realview_pbx_a9_init(ram_addr_t ram_size,
> -                     const char *boot_device,
> -                     const char *kernel_filename, const char *kernel_cmdline,
> -                     const char *initrd_filename, const char *cpu_model)
> +static void realview_pbx_a9_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_device = args->boot_device;
>     if (!cpu_model) {
>         cpu_model = "cortex-a9";
>     }
> diff --git a/hw/s390-virtio.c b/hw/s390-virtio.c
> index 47eed35..39ff178 100644
> --- a/hw/s390-virtio.c
> +++ b/hw/s390-virtio.c
> @@ -151,13 +151,14 @@ unsigned s390_del_running_cpu(CPUS390XState *env)
> }
> 
> /* PC hardware initialisation */
> -static void s390_init(ram_addr_t my_ram_size,
> -                      const char *boot_device,
> -                      const char *kernel_filename,
> -                      const char *kernel_cmdline,
> -                      const char *initrd_filename,
> -                      const char *cpu_model)
> +static void s390_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t my_ram_size = args->ram_size;
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
>     CPUS390XState *env = NULL;
>     MemoryRegion *sysmem = get_system_memory();
>     MemoryRegion *ram = g_new(MemoryRegion, 1);
> diff --git a/hw/shix.c b/hw/shix.c
> index dd9ce17..b56dd54 100644
> --- a/hw/shix.c
> +++ b/hw/shix.c
> @@ -37,11 +37,9 @@
> #define BIOS_FILENAME "shix_bios.bin"
> #define BIOS_ADDRESS 0xA0000000
> 
> -static void shix_init(ram_addr_t ram_size,
> -               const char *boot_device,
> -           const char *kernel_filename, const char *kernel_cmdline,
> -           const char *initrd_filename, const char *cpu_model)
> +static void shix_init(QEMUMachineInitArgs *args)
> {
> +    const char *cpu_model = args->cpu_model;
>     int ret;
>     CPUSH4State *env;
>     struct SH7750State *s;
> diff --git a/hw/spapr.c b/hw/spapr.c
> index c34b767..8921c4d 100644
> --- a/hw/spapr.c
> +++ b/hw/spapr.c
> @@ -603,13 +603,14 @@ static int spapr_vga_init(PCIBus *pci_bus)
> }
> 
> /* pSeries LPAR / sPAPR hardware init */
> -static void ppc_spapr_init(ram_addr_t ram_size,
> -                           const char *boot_device,
> -                           const char *kernel_filename,
> -                           const char *kernel_cmdline,
> -                           const char *initrd_filename,
> -                           const char *cpu_model)
> +static void ppc_spapr_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_device = args->boot_device;
>     PowerPCCPU *cpu;
>     CPUPPCState *env;
>     PCIHostState *phb;
> diff --git a/hw/spitz.c b/hw/spitz.c
> index 20e7835..df829b3 100644
> --- a/hw/spitz.c
> +++ b/hw/spitz.c
> @@ -936,38 +936,46 @@ static void spitz_common_init(ram_addr_t ram_size,
>     sl_bootparam_write(SL_PXA_PARAM_BASE);
> }
> 
> -static void spitz_init(ram_addr_t ram_size,
> -                const char *boot_device,
> -                const char *kernel_filename, const char *kernel_cmdline,
> -                const char *initrd_filename, const char *cpu_model)
> +static void spitz_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
>     spitz_common_init(ram_size, kernel_filename,
>                 kernel_cmdline, initrd_filename, cpu_model, spitz, 0x2c9);
> }
> 
> -static void borzoi_init(ram_addr_t ram_size,
> -                const char *boot_device,
> -                const char *kernel_filename, const char *kernel_cmdline,
> -                const char *initrd_filename, const char *cpu_model)
> +static void borzoi_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
>     spitz_common_init(ram_size, kernel_filename,
>                 kernel_cmdline, initrd_filename, cpu_model, borzoi, 0x33f);
> }
> 
> -static void akita_init(ram_addr_t ram_size,
> -                const char *boot_device,
> -                const char *kernel_filename, const char *kernel_cmdline,
> -                const char *initrd_filename, const char *cpu_model)
> +static void akita_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
>     spitz_common_init(ram_size, kernel_filename,
>                 kernel_cmdline, initrd_filename, cpu_model, akita, 0x2e8);
> }
> 
> -static void terrier_init(ram_addr_t ram_size,
> -                const char *boot_device,
> -                const char *kernel_filename, const char *kernel_cmdline,
> -                const char *initrd_filename, const char *cpu_model)
> +static void terrier_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
>     spitz_common_init(ram_size, kernel_filename,
>                 kernel_cmdline, initrd_filename, cpu_model, terrier, 0x33f);
> }
> diff --git a/hw/stellaris.c b/hw/stellaris.c
> index 562fbbf..b79c7fb 100644
> --- a/hw/stellaris.c
> +++ b/hw/stellaris.c
> @@ -1358,19 +1358,17 @@ static void stellaris_init(const char *kernel_filename, const char *cpu_model,
> }
> 
> /* FIXME: Figure out how to generate these from stellaris_boards.  */
> -static void lm3s811evb_init(ram_addr_t ram_size,
> -                     const char *boot_device,
> -                     const char *kernel_filename, const char *kernel_cmdline,
> -                     const char *initrd_filename, const char *cpu_model)
> +static void lm3s811evb_init(QEMUMachineInitArgs *args)
> {
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
>     stellaris_init(kernel_filename, cpu_model, &stellaris_boards[0]);
> }
> 
> -static void lm3s6965evb_init(ram_addr_t ram_size,
> -                     const char *boot_device,
> -                     const char *kernel_filename, const char *kernel_cmdline,
> -                     const char *initrd_filename, const char *cpu_model)
> +static void lm3s6965evb_init(QEMUMachineInitArgs *args)
> {
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
>     stellaris_init(kernel_filename, cpu_model, &stellaris_boards[1]);
> }
> 
> diff --git a/hw/sun4m.c b/hw/sun4m.c
> index c98cd5e..22e011f 100644
> --- a/hw/sun4m.c
> +++ b/hw/sun4m.c
> @@ -1303,92 +1303,118 @@ static const struct sun4m_hwdef sun4m_hwdefs[] = {
> };
> 
> /* SPARCstation 5 hardware initialisation */
> -static void ss5_init(ram_addr_t RAM_size,
> -                     const char *boot_device,
> -                     const char *kernel_filename, const char *kernel_cmdline,
> -                     const char *initrd_filename, const char *cpu_model)
> +static void ss5_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t RAM_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_device = args->boot_device;
>     sun4m_hw_init(&sun4m_hwdefs[0], RAM_size, boot_device, kernel_filename,
>                   kernel_cmdline, initrd_filename, cpu_model);
> }
> 
> /* SPARCstation 10 hardware initialisation */
> -static void ss10_init(ram_addr_t RAM_size,
> -                      const char *boot_device,
> -                      const char *kernel_filename, const char *kernel_cmdline,
> -                      const char *initrd_filename, const char *cpu_model)
> +static void ss10_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t RAM_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_device = args->boot_device;
>     sun4m_hw_init(&sun4m_hwdefs[1], RAM_size, boot_device, kernel_filename,
>                   kernel_cmdline, initrd_filename, cpu_model);
> }
> 
> /* SPARCserver 600MP hardware initialisation */
> -static void ss600mp_init(ram_addr_t RAM_size,
> -                         const char *boot_device,
> -                         const char *kernel_filename,
> -                         const char *kernel_cmdline,
> -                         const char *initrd_filename, const char *cpu_model)
> +static void ss600mp_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t RAM_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_device = args->boot_device;
>     sun4m_hw_init(&sun4m_hwdefs[2], RAM_size, boot_device, kernel_filename,
>                   kernel_cmdline, initrd_filename, cpu_model);
> }
> 
> /* SPARCstation 20 hardware initialisation */
> -static void ss20_init(ram_addr_t RAM_size,
> -                      const char *boot_device,
> -                      const char *kernel_filename, const char *kernel_cmdline,
> -                      const char *initrd_filename, const char *cpu_model)
> +static void ss20_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t RAM_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_device = args->boot_device;
>     sun4m_hw_init(&sun4m_hwdefs[3], RAM_size, boot_device, kernel_filename,
>                   kernel_cmdline, initrd_filename, cpu_model);
> }
> 
> /* SPARCstation Voyager hardware initialisation */
> -static void vger_init(ram_addr_t RAM_size,
> -                      const char *boot_device,
> -                      const char *kernel_filename, const char *kernel_cmdline,
> -                      const char *initrd_filename, const char *cpu_model)
> +static void vger_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t RAM_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_device = args->boot_device;
>     sun4m_hw_init(&sun4m_hwdefs[4], RAM_size, boot_device, kernel_filename,
>                   kernel_cmdline, initrd_filename, cpu_model);
> }
> 
> /* SPARCstation LX hardware initialisation */
> -static void ss_lx_init(ram_addr_t RAM_size,
> -                       const char *boot_device,
> -                       const char *kernel_filename, const char *kernel_cmdline,
> -                       const char *initrd_filename, const char *cpu_model)
> +static void ss_lx_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t RAM_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_device = args->boot_device;
>     sun4m_hw_init(&sun4m_hwdefs[5], RAM_size, boot_device, kernel_filename,
>                   kernel_cmdline, initrd_filename, cpu_model);
> }
> 
> /* SPARCstation 4 hardware initialisation */
> -static void ss4_init(ram_addr_t RAM_size,
> -                     const char *boot_device,
> -                     const char *kernel_filename, const char *kernel_cmdline,
> -                     const char *initrd_filename, const char *cpu_model)
> +static void ss4_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t RAM_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_device = args->boot_device;
>     sun4m_hw_init(&sun4m_hwdefs[6], RAM_size, boot_device, kernel_filename,
>                   kernel_cmdline, initrd_filename, cpu_model);
> }
> 
> /* SPARCClassic hardware initialisation */
> -static void scls_init(ram_addr_t RAM_size,
> -                      const char *boot_device,
> -                      const char *kernel_filename, const char *kernel_cmdline,
> -                      const char *initrd_filename, const char *cpu_model)
> +static void scls_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t RAM_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_device = args->boot_device;
>     sun4m_hw_init(&sun4m_hwdefs[7], RAM_size, boot_device, kernel_filename,
>                   kernel_cmdline, initrd_filename, cpu_model);
> }
> 
> /* SPARCbook hardware initialisation */
> -static void sbook_init(ram_addr_t RAM_size,
> -                       const char *boot_device,
> -                       const char *kernel_filename, const char *kernel_cmdline,
> -                       const char *initrd_filename, const char *cpu_model)
> +static void sbook_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t RAM_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_device = args->boot_device;
>     sun4m_hw_init(&sun4m_hwdefs[8], RAM_size, boot_device, kernel_filename,
>                   kernel_cmdline, initrd_filename, cpu_model);
> }
> @@ -1651,21 +1677,27 @@ static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, ram_addr_t RAM_size,
> }
> 
> /* SPARCserver 1000 hardware initialisation */
> -static void ss1000_init(ram_addr_t RAM_size,
> -                        const char *boot_device,
> -                        const char *kernel_filename, const char *kernel_cmdline,
> -                        const char *initrd_filename, const char *cpu_model)
> +static void ss1000_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t RAM_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_device = args->boot_device;
>     sun4d_hw_init(&sun4d_hwdefs[0], RAM_size, boot_device, kernel_filename,
>                   kernel_cmdline, initrd_filename, cpu_model);
> }
> 
> /* SPARCcenter 2000 hardware initialisation */
> -static void ss2000_init(ram_addr_t RAM_size,
> -                        const char *boot_device,
> -                        const char *kernel_filename, const char *kernel_cmdline,
> -                        const char *initrd_filename, const char *cpu_model)
> +static void ss2000_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t RAM_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_device = args->boot_device;
>     sun4d_hw_init(&sun4d_hwdefs[1], RAM_size, boot_device, kernel_filename,
>                   kernel_cmdline, initrd_filename, cpu_model);
> }
> @@ -1845,11 +1877,14 @@ static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size,
> }
> 
> /* SPARCstation 2 hardware initialisation */
> -static void ss2_init(ram_addr_t RAM_size,
> -                     const char *boot_device,
> -                     const char *kernel_filename, const char *kernel_cmdline,
> -                     const char *initrd_filename, const char *cpu_model)
> +static void ss2_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t RAM_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_device = args->boot_device;
>     sun4c_hw_init(&sun4c_hwdefs[0], RAM_size, boot_device, kernel_filename,
>                   kernel_cmdline, initrd_filename, cpu_model);
> }
> diff --git a/hw/sun4u.c b/hw/sun4u.c
> index 07cd042..379768c 100644
> --- a/hw/sun4u.c
> +++ b/hw/sun4u.c
> @@ -930,31 +930,40 @@ static const struct hwdef hwdefs[] = {
> };
> 
> /* Sun4u hardware initialisation */
> -static void sun4u_init(ram_addr_t RAM_size,
> -                       const char *boot_devices,
> -                       const char *kernel_filename, const char *kernel_cmdline,
> -                       const char *initrd_filename, const char *cpu_model)
> -{
> +static void sun4u_init(QEMUMachineInitArgs *args)
> +{
> +    ram_addr_t RAM_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_devices = args->boot_device;
>     sun4uv_init(get_system_memory(), RAM_size, boot_devices, kernel_filename,
>                 kernel_cmdline, initrd_filename, cpu_model, &hwdefs[0]);
> }
> 
> /* Sun4v hardware initialisation */
> -static void sun4v_init(ram_addr_t RAM_size,
> -                       const char *boot_devices,
> -                       const char *kernel_filename, const char *kernel_cmdline,
> -                       const char *initrd_filename, const char *cpu_model)
> -{
> +static void sun4v_init(QEMUMachineInitArgs *args)
> +{
> +    ram_addr_t RAM_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_devices = args->boot_device;
>     sun4uv_init(get_system_memory(), RAM_size, boot_devices, kernel_filename,
>                 kernel_cmdline, initrd_filename, cpu_model, &hwdefs[1]);
> }
> 
> /* Niagara hardware initialisation */
> -static void niagara_init(ram_addr_t RAM_size,
> -                         const char *boot_devices,
> -                         const char *kernel_filename, const char *kernel_cmdline,
> -                         const char *initrd_filename, const char *cpu_model)
> -{
> +static void niagara_init(QEMUMachineInitArgs *args)
> +{
> +    ram_addr_t RAM_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_devices = args->boot_device;
>     sun4uv_init(get_system_memory(), RAM_size, boot_devices, kernel_filename,
>                 kernel_cmdline, initrd_filename, cpu_model, &hwdefs[2]);
> }
> diff --git a/hw/tosa.c b/hw/tosa.c
> index 297a8c2..512278c 100644
> --- a/hw/tosa.c
> +++ b/hw/tosa.c
> @@ -205,11 +205,12 @@ static struct arm_boot_info tosa_binfo = {
>     .ram_size = 0x04000000,
> };
> 
> -static void tosa_init(ram_addr_t ram_size,
> -                const char *boot_device,
> -                const char *kernel_filename, const char *kernel_cmdline,
> -                const char *initrd_filename, const char *cpu_model)
> +static void tosa_init(QEMUMachineInitArgs *args)
> {
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
>     MemoryRegion *address_space_mem = get_system_memory();
>     MemoryRegion *rom = g_new(MemoryRegion, 1);
>     PXA2xxState *mpu;
> diff --git a/hw/versatilepb.c b/hw/versatilepb.c
> index 7a92034..686dcc7 100644
> --- a/hw/versatilepb.c
> +++ b/hw/versatilepb.c
> @@ -342,22 +342,28 @@ static void versatile_init(ram_addr_t ram_size,
>     arm_load_kernel(cpu, &versatile_binfo);
> }
> 
> -static void vpb_init(ram_addr_t ram_size,
> -                     const char *boot_device,
> -                     const char *kernel_filename, const char *kernel_cmdline,
> -                     const char *initrd_filename, const char *cpu_model)
> +static void vpb_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_device = args->boot_device;
>     versatile_init(ram_size,
>                    boot_device,
>                    kernel_filename, kernel_cmdline,
>                    initrd_filename, cpu_model, 0x183);
> }
> 
> -static void vab_init(ram_addr_t ram_size,
> -                     const char *boot_device,
> -                     const char *kernel_filename, const char *kernel_cmdline,
> -                     const char *initrd_filename, const char *cpu_model)
> +static void vab_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_device = args->boot_device;
>     versatile_init(ram_size,
>                    boot_device,
>                    kernel_filename, kernel_cmdline,
> diff --git a/hw/vexpress.c b/hw/vexpress.c
> index 3596d1e..36503d6 100644
> --- a/hw/vexpress.c
> +++ b/hw/vexpress.c
> @@ -467,25 +467,27 @@ static void vexpress_common_init(const VEDBoardInfo *daughterboard,
>     arm_load_kernel(arm_env_get_cpu(first_cpu), &vexpress_binfo);
> }
> 
> -static void vexpress_a9_init(ram_addr_t ram_size,
> -                             const char *boot_device,
> -                             const char *kernel_filename,
> -                             const char *kernel_cmdline,
> -                             const char *initrd_filename,
> -                             const char *cpu_model)
> +static void vexpress_a9_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_device = args->boot_device;
>     vexpress_common_init(&a9_daughterboard,
>                          ram_size, boot_device, kernel_filename,
>                          kernel_cmdline, initrd_filename, cpu_model);
> }
> 
> -static void vexpress_a15_init(ram_addr_t ram_size,
> -                              const char *boot_device,
> -                              const char *kernel_filename,
> -                              const char *kernel_cmdline,
> -                              const char *initrd_filename,
> -                              const char *cpu_model)
> +static void vexpress_a15_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_device = args->boot_device;
>     vexpress_common_init(&a15_daughterboard,
>                          ram_size, boot_device, kernel_filename,
>                          kernel_cmdline, initrd_filename, cpu_model);
> diff --git a/hw/virtex_ml507.c b/hw/virtex_ml507.c
> index 79bc0d1..a09b27a 100644
> --- a/hw/virtex_ml507.c
> +++ b/hw/virtex_ml507.c
> @@ -183,12 +183,12 @@ static int xilinx_load_device_tree(target_phys_addr_t addr,
>     return fdt_size;
> }
> 
> -static void virtex_init(ram_addr_t ram_size,
> -                        const char *boot_device,
> -                        const char *kernel_filename,
> -                        const char *kernel_cmdline,
> -                        const char *initrd_filename, const char *cpu_model)
> +static void virtex_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
>     MemoryRegion *address_space_mem = get_system_memory();
>     DeviceState *dev;
>     PowerPCCPU *cpu;
> diff --git a/hw/xen_machine_pv.c b/hw/xen_machine_pv.c
> index 4b72aa7..1ac9990 100644
> --- a/hw/xen_machine_pv.c
> +++ b/hw/xen_machine_pv.c
> @@ -29,12 +29,13 @@
> #include "xen_domainbuild.h"
> #include "blockdev.h"
> 
> -static void xen_init_pv(ram_addr_t ram_size,
> -            const char *boot_device,
> -            const char *kernel_filename,
> -            const char *kernel_cmdline,
> -            const char *initrd_filename,
> -            const char *cpu_model)
> +static void xen_init_pv(QEMUMachine *machine,
> +                        ram_addr_t ram_size,
> +                        const char *boot_device,
> +                        const char *kernel_filename,
> +                        const char *kernel_cmdline,
> +                        const char *initrd_filename,
> +                        const char *cpu_model)
> {
>     X86CPU *cpu;
>     CPUX86State *env;
> diff --git a/hw/xilinx_zynq.c b/hw/xilinx_zynq.c
> index 7e6c273..83f322e 100644
> --- a/hw/xilinx_zynq.c
> +++ b/hw/xilinx_zynq.c
> @@ -46,10 +46,13 @@ static void gem_init(NICInfo *nd, uint32_t base, qemu_irq irq)
>     sysbus_connect_irq(s, 0, irq);
> }
> 
> -static void zynq_init(ram_addr_t ram_size, const char *boot_device,
> -                        const char *kernel_filename, const char *kernel_cmdline,
> -                        const char *initrd_filename, const char *cpu_model)
> +static void zynq_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
>     ARMCPU *cpu;
>     MemoryRegion *address_space_mem = get_system_memory();
>     MemoryRegion *ext_ram = g_new(MemoryRegion, 1);
> diff --git a/hw/xtensa_lx60.c b/hw/xtensa_lx60.c
> index 3653f65..1fd2c47 100644
> --- a/hw/xtensa_lx60.c
> +++ b/hw/xtensa_lx60.c
> @@ -268,11 +268,14 @@ static void lx_init(const LxBoardDesc *board,
>     }
> }
> 
> -static void xtensa_lx60_init(ram_addr_t ram_size,
> -                     const char *boot_device,
> -                     const char *kernel_filename, const char *kernel_cmdline,
> -                     const char *initrd_filename, const char *cpu_model)
> +static void xtensa_lx60_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_device = args->boot_device;
>     static const LxBoardDesc lx60_board = {
>         .flash_size = 0x400000,
>         .flash_sector_size = 0x10000,
> @@ -283,11 +286,14 @@ static void xtensa_lx60_init(ram_addr_t ram_size,
>             initrd_filename, cpu_model);
> }
> 
> -static void xtensa_lx200_init(ram_addr_t ram_size,
> -                     const char *boot_device,
> -                     const char *kernel_filename, const char *kernel_cmdline,
> -                     const char *initrd_filename, const char *cpu_model)
> +static void xtensa_lx200_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_device = args->boot_device;
>     static const LxBoardDesc lx200_board = {
>         .flash_size = 0x1000000,
>         .flash_sector_size = 0x20000,
> diff --git a/hw/xtensa_sim.c b/hw/xtensa_sim.c
> index 831460b..2e846d8 100644
> --- a/hw/xtensa_sim.c
> +++ b/hw/xtensa_sim.c
> @@ -96,11 +96,14 @@ static void sim_init(ram_addr_t ram_size,
>     }
> }
> 
> -static void xtensa_sim_init(ram_addr_t ram_size,
> -                     const char *boot_device,
> -                     const char *kernel_filename, const char *kernel_cmdline,
> -                     const char *initrd_filename, const char *cpu_model)
> +static void xtensa_sim_init(QEMUMachineInitArgs *args)
> {
> +    ram_addr_t ram_size = args->ram_size;
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
> +    const char *boot_device = args->boot_device;
>     if (!cpu_model) {
>         cpu_model = XTENSA_DEFAULT_CPU_MODEL;
>     }
> diff --git a/hw/z2.c b/hw/z2.c
> index 289cee9..0927bad 100644
> --- a/hw/z2.c
> +++ b/hw/z2.c
> @@ -294,11 +294,12 @@ static TypeInfo aer915_info = {
>     .class_init    = aer915_class_init,
> };
> 
> -static void z2_init(ram_addr_t ram_size,
> -                const char *boot_device,
> -                const char *kernel_filename, const char *kernel_cmdline,
> -                const char *initrd_filename, const char *cpu_model)
> +static void z2_init(QEMUMachineInitArgs *args)
> {
> +    const char *cpu_model = args->cpu_model;
> +    const char *kernel_filename = args->kernel_filename;
> +    const char *kernel_cmdline = args->kernel_cmdline;
> +    const char *initrd_filename = args->initrd_filename;
>     MemoryRegion *address_space_mem = get_system_memory();
>     uint32_t sector_len = 0x10000;
>     PXA2xxState *mpu;
> diff --git a/vl.c b/vl.c
> index 8d305ca..f663e7c 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -3624,8 +3624,13 @@ int main(int argc, char **argv, char **envp)
> 
>     qdev_machine_init();
> 
> -    machine->init(ram_size, boot_devices,
> -                  kernel_filename, kernel_cmdline, initrd_filename, cpu_model);
> +    QEMUMachineInitArgs args = { .ram_size = ram_size,
> +                                 .boot_device = boot_devices,
> +                                 .kernel_filename = kernel_filename,
> +                                 .kernel_cmdline = kernel_cmdline,
> +                                 initrd_filename = initrd_filename,
> +                                 .cpu_model = cpu_model };
> +    machine->init(&args);
> 
>     cpu_synchronize_all_post_init();
> 
> -- 
> 1.7.11.4
>
Eduardo Habkost - Oct. 5, 2012, 8:09 p.m.
On Fri, Oct 05, 2012 at 03:37:00PM -0300, Eduardo Habkost wrote:
[...]
> diff --git a/hw/boards.h b/hw/boards.h
> index a2e0a54..813d0e5 100644
> --- a/hw/boards.h
> +++ b/hw/boards.h
> @@ -5,12 +5,16 @@
>  
>  #include "qdev.h"
>  
> -typedef void QEMUMachineInitFunc(ram_addr_t ram_size,
> -                                 const char *boot_device,
> -                                 const char *kernel_filename,
> -                                 const char *kernel_cmdline,
> -                                 const char *initrd_filename,
> -                                 const char *cpu_model);
> +typedef struct QEMUMachineInitArgs {
> +    ram_addr_t ram_size;
> +    const char *boot_device;
> +    const char *kernel_filename;
> +    const char *kernel_cmdline;
> +    const char *initrd_filename;
> +    const char *cpu_model;
> +} QEMUMachineInitArgs;
> +
> +typedef void QEMUMachineInitFunc(QEMUMachineInitArgs *args);
>  
>  typedef void QEMUMachineResetFunc(void);
>  
[...]
> @@ -332,7 +335,8 @@ static void pc_init_isa(ram_addr_t ram_size,
>  }
>  
>  #ifdef CONFIG_XEN
> -static void pc_xen_hvm_init(ram_addr_t ram_size,
> +static void pc_xen_hvm_init(QEMUMachine *machine,
> +                            ram_addr_t ram_size,

Oops. This is a leftover of an idea on which I was working previously
(and then abandoned). It's obviously broken.

I will submit a fixed version.

Patch

diff --git a/hw/alpha_dp264.c b/hw/alpha_dp264.c
index 9eb939f..2c2e237 100644
--- a/hw/alpha_dp264.c
+++ b/hw/alpha_dp264.c
@@ -42,13 +42,13 @@  static int clipper_pci_map_irq(PCIDevice *d, int irq_num)
     return (slot + 1) * 4 + irq_num;
 }
 
-static void clipper_init(ram_addr_t ram_size,
-                         const char *boot_device,
-                         const char *kernel_filename,
-                         const char *kernel_cmdline,
-                         const char *initrd_filename,
-                         const char *cpu_model)
+static void clipper_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
     CPUAlphaState *cpus[4];
     PCIBus *pci_bus;
     ISABus *isa_bus;
diff --git a/hw/an5206.c b/hw/an5206.c
index 25407c0..042c5fc 100644
--- a/hw/an5206.c
+++ b/hw/an5206.c
@@ -19,11 +19,11 @@ 
 
 /* Board init.  */
 
-static void an5206_init(ram_addr_t ram_size,
-                     const char *boot_device,
-                     const char *kernel_filename, const char *kernel_cmdline,
-                     const char *initrd_filename, const char *cpu_model)
+static void an5206_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
     CPUM68KState *env;
     int kernel_size;
     uint64_t elf_entry;
diff --git a/hw/axis_dev88.c b/hw/axis_dev88.c
index eab6327..2fd7356 100644
--- a/hw/axis_dev88.c
+++ b/hw/axis_dev88.c
@@ -242,11 +242,12 @@  static const MemoryRegionOps gpio_ops = {
 static struct cris_load_info li;
 
 static
-void axisdev88_init (ram_addr_t ram_size,
-                     const char *boot_device,
-                     const char *kernel_filename, const char *kernel_cmdline,
-                     const char *initrd_filename, const char *cpu_model)
+void axisdev88_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
     CRISCPU *cpu;
     CPUCRISState *env;
     DeviceState *dev;
diff --git a/hw/boards.h b/hw/boards.h
index a2e0a54..813d0e5 100644
--- a/hw/boards.h
+++ b/hw/boards.h
@@ -5,12 +5,16 @@ 
 
 #include "qdev.h"
 
-typedef void QEMUMachineInitFunc(ram_addr_t ram_size,
-                                 const char *boot_device,
-                                 const char *kernel_filename,
-                                 const char *kernel_cmdline,
-                                 const char *initrd_filename,
-                                 const char *cpu_model);
+typedef struct QEMUMachineInitArgs {
+    ram_addr_t ram_size;
+    const char *boot_device;
+    const char *kernel_filename;
+    const char *kernel_cmdline;
+    const char *initrd_filename;
+    const char *cpu_model;
+} QEMUMachineInitArgs;
+
+typedef void QEMUMachineInitFunc(QEMUMachineInitArgs *args);
 
 typedef void QEMUMachineResetFunc(void);
 
diff --git a/hw/collie.c b/hw/collie.c
index 56f89a9..695982a 100644
--- a/hw/collie.c
+++ b/hw/collie.c
@@ -23,11 +23,12 @@  static struct arm_boot_info collie_binfo = {
     .ram_size = 0x20000000,
 };
 
-static void collie_init(ram_addr_t ram_size,
-                const char *boot_device,
-                const char *kernel_filename, const char *kernel_cmdline,
-                const char *initrd_filename, const char *cpu_model)
+static void collie_init(QEMUMachineInitArgs *args)
 {
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
     StrongARMState *s;
     DriveInfo *dinfo;
     MemoryRegion *sysmem = get_system_memory();
diff --git a/hw/dummy_m68k.c b/hw/dummy_m68k.c
index 7cc7a99..f436a0c 100644
--- a/hw/dummy_m68k.c
+++ b/hw/dummy_m68k.c
@@ -16,11 +16,11 @@ 
 
 /* Board init.  */
 
-static void dummy_m68k_init(ram_addr_t ram_size,
-                     const char *boot_device,
-                     const char *kernel_filename, const char *kernel_cmdline,
-                     const char *initrd_filename, const char *cpu_model)
+static void dummy_m68k_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
     CPUM68KState *env;
     MemoryRegion *address_space_mem =  get_system_memory();
     MemoryRegion *ram = g_new(MemoryRegion, 1);
diff --git a/hw/exynos4_boards.c b/hw/exynos4_boards.c
index 4bb0a60..4951064 100644
--- a/hw/exynos4_boards.c
+++ b/hw/exynos4_boards.c
@@ -130,22 +130,22 @@  static Exynos4210State *exynos4_boards_init_common(
             exynos4_board_ram_size[board_type]);
 }
 
-static void nuri_init(ram_addr_t ram_size,
-        const char *boot_device,
-        const char *kernel_filename, const char *kernel_cmdline,
-        const char *initrd_filename, const char *cpu_model)
+static void nuri_init(QEMUMachineInitArgs *args)
 {
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
     exynos4_boards_init_common(kernel_filename, kernel_cmdline,
                 initrd_filename, EXYNOS4_BOARD_NURI);
 
     arm_load_kernel(arm_env_get_cpu(first_cpu), &exynos4_board_binfo);
 }
 
-static void smdkc210_init(ram_addr_t ram_size,
-        const char *boot_device,
-        const char *kernel_filename, const char *kernel_cmdline,
-        const char *initrd_filename, const char *cpu_model)
+static void smdkc210_init(QEMUMachineInitArgs *args)
 {
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
     Exynos4210State *s = exynos4_boards_init_common(kernel_filename,
             kernel_cmdline, initrd_filename, EXYNOS4_BOARD_SMDKC210);
 
diff --git a/hw/gumstix.c b/hw/gumstix.c
index 13a36ea..4103a88 100644
--- a/hw/gumstix.c
+++ b/hw/gumstix.c
@@ -45,10 +45,7 @@ 
 
 static const int sector_len = 128 * 1024;
 
-static void connex_init(ram_addr_t ram_size,
-                const char *boot_device,
-                const char *kernel_filename, const char *kernel_cmdline,
-                const char *initrd_filename, const char *cpu_model)
+static void connex_init(QEMUMachineInitArgs *args)
 {
     PXA2xxState *cpu;
     DriveInfo *dinfo;
@@ -84,11 +81,9 @@  static void connex_init(ram_addr_t ram_size,
                     qdev_get_gpio_in(cpu->gpio, 36));
 }
 
-static void verdex_init(ram_addr_t ram_size,
-                const char *boot_device,
-                const char *kernel_filename, const char *kernel_cmdline,
-                const char *initrd_filename, const char *cpu_model)
+static void verdex_init(QEMUMachineInitArgs *args)
 {
+    const char *cpu_model = args->cpu_model;
     PXA2xxState *cpu;
     DriveInfo *dinfo;
     int be;
diff --git a/hw/highbank.c b/hw/highbank.c
index 11aa131..15036b6 100644
--- a/hw/highbank.c
+++ b/hw/highbank.c
@@ -187,11 +187,13 @@  static struct arm_boot_info highbank_binfo;
  * 32-bit host, set the reg value of memory to 0xf7ff00000 in the
  * device tree and pass -m 2047 to QEMU.
  */
-static void highbank_init(ram_addr_t ram_size,
-                     const char *boot_device,
-                     const char *kernel_filename, const char *kernel_cmdline,
-                     const char *initrd_filename, const char *cpu_model)
+static void highbank_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
     DeviceState *dev;
     SysBusDevice *busdev;
     qemu_irq *irqp;
diff --git a/hw/integratorcp.c b/hw/integratorcp.c
index d0e2e90..ac0ea83 100644
--- a/hw/integratorcp.c
+++ b/hw/integratorcp.c
@@ -438,11 +438,13 @@  static struct arm_boot_info integrator_binfo = {
     .board_id = 0x113,
 };
 
-static void integratorcp_init(ram_addr_t ram_size,
-                     const char *boot_device,
-                     const char *kernel_filename, const char *kernel_cmdline,
-                     const char *initrd_filename, const char *cpu_model)
+static void integratorcp_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
     ARMCPU *cpu;
     MemoryRegion *address_space_mem = get_system_memory();
     MemoryRegion *ram = g_new(MemoryRegion, 1);
diff --git a/hw/kzm.c b/hw/kzm.c
index 68cd1b4..d1266d9 100644
--- a/hw/kzm.c
+++ b/hw/kzm.c
@@ -70,11 +70,13 @@  static struct arm_boot_info kzm_binfo = {
     .board_id = 1722,
 };
 
-static void kzm_init(ram_addr_t ram_size,
-                     const char *boot_device,
-                     const char *kernel_filename, const char *kernel_cmdline,
-                     const char *initrd_filename, const char *cpu_model)
+static void kzm_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
     ARMCPU *cpu;
     MemoryRegion *address_space_mem = get_system_memory();
     MemoryRegion *ram = g_new(MemoryRegion, 1);
diff --git a/hw/leon3.c b/hw/leon3.c
index 878d3aa..6486b7b 100644
--- a/hw/leon3.c
+++ b/hw/leon3.c
@@ -94,13 +94,11 @@  static void leon3_set_pil_in(void *opaque, uint32_t pil_in)
     }
 }
 
-static void leon3_generic_hw_init(ram_addr_t  ram_size,
-                                  const char *boot_device,
-                                  const char *kernel_filename,
-                                  const char *kernel_cmdline,
-                                  const char *initrd_filename,
-                                  const char *cpu_model)
+static void leon3_generic_hw_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
     SPARCCPU *cpu;
     CPUSPARCState   *env;
     MemoryRegion *address_space_mem = get_system_memory();
diff --git a/hw/lm32_boards.c b/hw/lm32_boards.c
index b76d800..c5a62c8 100644
--- a/hw/lm32_boards.c
+++ b/hw/lm32_boards.c
@@ -69,12 +69,10 @@  static void main_cpu_reset(void *opaque)
     env->deba = reset_info->flash_base;
 }
 
-static void lm32_evr_init(ram_addr_t ram_size_not_used,
-                          const char *boot_device,
-                          const char *kernel_filename,
-                          const char *kernel_cmdline,
-                          const char *initrd_filename, const char *cpu_model)
+static void lm32_evr_init(QEMUMachineInitArgs *args)
 {
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
     LM32CPU *cpu;
     CPULM32State *env;
     DriveInfo *dinfo;
@@ -159,12 +157,12 @@  static void lm32_evr_init(ram_addr_t ram_size_not_used,
     qemu_register_reset(main_cpu_reset, reset_info);
 }
 
-static void lm32_uclinux_init(ram_addr_t ram_size_not_used,
-                          const char *boot_device,
-                          const char *kernel_filename,
-                          const char *kernel_cmdline,
-                          const char *initrd_filename, const char *cpu_model)
+static void lm32_uclinux_init(QEMUMachineInitArgs *args)
 {
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
     LM32CPU *cpu;
     CPULM32State *env;
     DriveInfo *dinfo;
diff --git a/hw/mainstone.c b/hw/mainstone.c
index 97687b6..c0d6034 100644
--- a/hw/mainstone.c
+++ b/hw/mainstone.c
@@ -171,11 +171,13 @@  static void mainstone_common_init(MemoryRegion *address_space_mem,
     arm_load_kernel(mpu->cpu, &mainstone_binfo);
 }
 
-static void mainstone_init(ram_addr_t ram_size,
-                const char *boot_device,
-                const char *kernel_filename, const char *kernel_cmdline,
-                const char *initrd_filename, const char *cpu_model)
+static void mainstone_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
     mainstone_common_init(get_system_memory(), ram_size, kernel_filename,
                 kernel_cmdline, initrd_filename, cpu_model, mainstone, 0x196);
 }
diff --git a/hw/mcf5208.c b/hw/mcf5208.c
index ee25b1b..688bc3c 100644
--- a/hw/mcf5208.c
+++ b/hw/mcf5208.c
@@ -187,11 +187,11 @@  static void mcf5208_sys_init(MemoryRegion *address_space, qemu_irq *pic)
     }
 }
 
-static void mcf5208evb_init(ram_addr_t ram_size,
-                     const char *boot_device,
-                     const char *kernel_filename, const char *kernel_cmdline,
-                     const char *initrd_filename, const char *cpu_model)
+static void mcf5208evb_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
     CPUM68KState *env;
     int kernel_size;
     uint64_t elf_entry;
diff --git a/hw/milkymist.c b/hw/milkymist.c
index 2e7235b..ca9ed43 100644
--- a/hw/milkymist.c
+++ b/hw/milkymist.c
@@ -73,12 +73,12 @@  static void main_cpu_reset(void *opaque)
 }
 
 static void
-milkymist_init(ram_addr_t ram_size_not_used,
-                          const char *boot_device,
-                          const char *kernel_filename,
-                          const char *kernel_cmdline,
-                          const char *initrd_filename, const char *cpu_model)
+milkymist_init(QEMUMachineInitArgs *args)
 {
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
     LM32CPU *cpu;
     CPULM32State *env;
     int kernel_size;
diff --git a/hw/mips_fulong2e.c b/hw/mips_fulong2e.c
index 38e4b86..af7bb50 100644
--- a/hw/mips_fulong2e.c
+++ b/hw/mips_fulong2e.c
@@ -256,10 +256,13 @@  static void cpu_request_exit(void *opaque, int irq, int level)
     }
 }
 
-static void mips_fulong2e_init(ram_addr_t ram_size, const char *boot_device,
-                        const char *kernel_filename, const char *kernel_cmdline,
-                        const char *initrd_filename, const char *cpu_model)
+static void mips_fulong2e_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
     char *filename;
     MemoryRegion *address_space_mem = get_system_memory();
     MemoryRegion *ram = g_new(MemoryRegion, 1);
diff --git a/hw/mips_jazz.c b/hw/mips_jazz.c
index db927f1..14df4d7 100644
--- a/hw/mips_jazz.c
+++ b/hw/mips_jazz.c
@@ -302,21 +302,19 @@  static void mips_jazz_init(MemoryRegion *address_space,
 }
 
 static
-void mips_magnum_init (ram_addr_t ram_size,
-                       const char *boot_device,
-                       const char *kernel_filename, const char *kernel_cmdline,
-                       const char *initrd_filename, const char *cpu_model)
+void mips_magnum_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
         mips_jazz_init(get_system_memory(), get_system_io(),
                        ram_size, cpu_model, JAZZ_MAGNUM);
 }
 
 static
-void mips_pica61_init (ram_addr_t ram_size,
-                       const char *boot_device,
-                       const char *kernel_filename, const char *kernel_cmdline,
-                       const char *initrd_filename, const char *cpu_model)
+void mips_pica61_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
     mips_jazz_init(get_system_memory(), get_system_io(),
                    ram_size, cpu_model, JAZZ_PICA61);
 }
diff --git a/hw/mips_malta.c b/hw/mips_malta.c
index ad23f26..14151f9 100644
--- a/hw/mips_malta.c
+++ b/hw/mips_malta.c
@@ -777,11 +777,13 @@  static void cpu_request_exit(void *opaque, int irq, int level)
 }
 
 static
-void mips_malta_init (ram_addr_t ram_size,
-                      const char *boot_device,
-                      const char *kernel_filename, const char *kernel_cmdline,
-                      const char *initrd_filename, const char *cpu_model)
+void mips_malta_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
     char *filename;
     pflash_t *fl;
     MemoryRegion *system_memory = get_system_memory();
diff --git a/hw/mips_mipssim.c b/hw/mips_mipssim.c
index 830f635..a1d3945 100644
--- a/hw/mips_mipssim.c
+++ b/hw/mips_mipssim.c
@@ -131,11 +131,13 @@  static void mipsnet_init(int base, qemu_irq irq, NICInfo *nd)
 }
 
 static void
-mips_mipssim_init (ram_addr_t ram_size,
-                   const char *boot_device,
-                   const char *kernel_filename, const char *kernel_cmdline,
-                   const char *initrd_filename, const char *cpu_model)
+mips_mipssim_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
     char *filename;
     MemoryRegion *address_space_mem = get_system_memory();
     MemoryRegion *ram = g_new(MemoryRegion, 1);
diff --git a/hw/mips_r4k.c b/hw/mips_r4k.c
index 967a76e..b73cdc3 100644
--- a/hw/mips_r4k.c
+++ b/hw/mips_r4k.c
@@ -151,11 +151,13 @@  static void main_cpu_reset(void *opaque)
 
 static const int sector_len = 32 * 1024;
 static
-void mips_r4k_init (ram_addr_t ram_size,
-                    const char *boot_device,
-                    const char *kernel_filename, const char *kernel_cmdline,
-                    const char *initrd_filename, const char *cpu_model)
+void mips_r4k_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
     char *filename;
     MemoryRegion *address_space_mem = get_system_memory();
     MemoryRegion *ram = g_new(MemoryRegion, 1);
diff --git a/hw/musicpal.c b/hw/musicpal.c
index f305e21..f06814c 100644
--- a/hw/musicpal.c
+++ b/hw/musicpal.c
@@ -1508,11 +1508,12 @@  static struct arm_boot_info musicpal_binfo = {
     .board_id = 0x20e,
 };
 
-static void musicpal_init(ram_addr_t ram_size,
-               const char *boot_device,
-               const char *kernel_filename, const char *kernel_cmdline,
-               const char *initrd_filename, const char *cpu_model)
+static void musicpal_init(QEMUMachineInitArgs *args)
 {
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
     ARMCPU *cpu;
     qemu_irq *cpu_pic;
     qemu_irq pic[32];
diff --git a/hw/nseries.c b/hw/nseries.c
index 6df71eb..7ada90d 100644
--- a/hw/nseries.c
+++ b/hw/nseries.c
@@ -1397,21 +1397,27 @@  static struct arm_boot_info n810_binfo = {
     .atag_board = n810_atag_setup,
 };
 
-static void n800_init(ram_addr_t ram_size,
-                const char *boot_device,
-                const char *kernel_filename, const char *kernel_cmdline,
-                const char *initrd_filename, const char *cpu_model)
+static void n800_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_device = args->boot_device;
     return n8x0_init(ram_size, boot_device,
                     kernel_filename, kernel_cmdline, initrd_filename,
                     cpu_model, &n800_binfo, 800);
 }
 
-static void n810_init(ram_addr_t ram_size,
-                const char *boot_device,
-                const char *kernel_filename, const char *kernel_cmdline,
-                const char *initrd_filename, const char *cpu_model)
+static void n810_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_device = args->boot_device;
     return n8x0_init(ram_size, boot_device,
                     kernel_filename, kernel_cmdline, initrd_filename,
                     cpu_model, &n810_binfo, 810);
diff --git a/hw/null-machine.c b/hw/null-machine.c
index 69910d3..d813c08 100644
--- a/hw/null-machine.c
+++ b/hw/null-machine.c
@@ -15,12 +15,7 @@ 
 #include "hw/hw.h"
 #include "hw/boards.h"
 
-static void machine_none_init(ram_addr_t ram_size,
-                              const char *boot_device,
-                              const char *kernel_filename,
-                              const char *kernel_cmdline,
-                              const char *initrd_filename,
-                              const char *cpu_model)
+static void machine_none_init(QEMUMachineInitArgs *args)
 {
 }
 
diff --git a/hw/omap_sx1.c b/hw/omap_sx1.c
index abca341..ad17487 100644
--- a/hw/omap_sx1.c
+++ b/hw/omap_sx1.c
@@ -209,20 +209,26 @@  static void sx1_init(ram_addr_t ram_size,
     //~ qemu_console_resize(ds, 640, 480);
 }
 
-static void sx1_init_v1(ram_addr_t ram_size,
-                const char *boot_device,
-                const char *kernel_filename, const char *kernel_cmdline,
-                const char *initrd_filename, const char *cpu_model)
+static void sx1_init_v1(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_device = args->boot_device;
     sx1_init(ram_size, boot_device, kernel_filename,
                 kernel_cmdline, initrd_filename, cpu_model, 1);
 }
 
-static void sx1_init_v2(ram_addr_t ram_size,
-                const char *boot_device,
-                const char *kernel_filename, const char *kernel_cmdline,
-                const char *initrd_filename, const char *cpu_model)
+static void sx1_init_v2(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_device = args->boot_device;
     sx1_init(ram_size, boot_device, kernel_filename,
                 kernel_cmdline, initrd_filename, cpu_model, 2);
 }
diff --git a/hw/openrisc_sim.c b/hw/openrisc_sim.c
index 55e97f0..e96a944 100644
--- a/hw/openrisc_sim.c
+++ b/hw/openrisc_sim.c
@@ -90,13 +90,11 @@  static void cpu_openrisc_load_kernel(ram_addr_t ram_size,
     cpu->env.pc = entry;
 }
 
-static void openrisc_sim_init(ram_addr_t ram_size,
-                              const char *boot_device,
-                              const char *kernel_filename,
-                              const char *kernel_cmdline,
-                              const char *initrd_filename,
-                              const char *cpu_model)
+static void openrisc_sim_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
    OpenRISCCPU *cpu = NULL;
     MemoryRegion *ram;
     int n;
diff --git a/hw/palm.c b/hw/palm.c
index bacdc90..032b8d6 100644
--- a/hw/palm.c
+++ b/hw/palm.c
@@ -190,11 +190,12 @@  static struct arm_boot_info palmte_binfo = {
     .board_id = 0x331,
 };
 
-static void palmte_init(ram_addr_t ram_size,
-                const char *boot_device,
-                const char *kernel_filename, const char *kernel_cmdline,
-                const char *initrd_filename, const char *cpu_model)
+static void palmte_init(QEMUMachineInitArgs *args)
 {
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
     MemoryRegion *address_space_mem = get_system_memory();
     struct omap_mpu_state_s *mpu;
     int flash_size = 0x00800000;
diff --git a/hw/pc_piix.c b/hw/pc_piix.c
index fd5898f..9efc822 100644
--- a/hw/pc_piix.c
+++ b/hw/pc_piix.c
@@ -287,13 +287,14 @@  static void pc_init1(MemoryRegion *system_memory,
     }
 }
 
-static void pc_init_pci(ram_addr_t ram_size,
-                        const char *boot_device,
-                        const char *kernel_filename,
-                        const char *kernel_cmdline,
-                        const char *initrd_filename,
-                        const char *cpu_model)
+static void pc_init_pci(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_device = args->boot_device;
     pc_init1(get_system_memory(),
              get_system_io(),
              ram_size, boot_device,
@@ -301,13 +302,14 @@  static void pc_init_pci(ram_addr_t ram_size,
              initrd_filename, cpu_model, 1, 1);
 }
 
-static void pc_init_pci_no_kvmclock(ram_addr_t ram_size,
-                                    const char *boot_device,
-                                    const char *kernel_filename,
-                                    const char *kernel_cmdline,
-                                    const char *initrd_filename,
-                                    const char *cpu_model)
+static void pc_init_pci_no_kvmclock(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_device = args->boot_device;
     pc_init1(get_system_memory(),
              get_system_io(),
              ram_size, boot_device,
@@ -315,13 +317,14 @@  static void pc_init_pci_no_kvmclock(ram_addr_t ram_size,
              initrd_filename, cpu_model, 1, 0);
 }
 
-static void pc_init_isa(ram_addr_t ram_size,
-                        const char *boot_device,
-                        const char *kernel_filename,
-                        const char *kernel_cmdline,
-                        const char *initrd_filename,
-                        const char *cpu_model)
+static void pc_init_isa(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_device = args->boot_device;
     if (cpu_model == NULL)
         cpu_model = "486";
     pc_init1(get_system_memory(),
@@ -332,7 +335,8 @@  static void pc_init_isa(ram_addr_t ram_size,
 }
 
 #ifdef CONFIG_XEN
-static void pc_xen_hvm_init(ram_addr_t ram_size,
+static void pc_xen_hvm_init(QEMUMachine *machine,
+                            ram_addr_t ram_size,
                             const char *boot_device,
                             const char *kernel_filename,
                             const char *kernel_cmdline,
diff --git a/hw/petalogix_ml605_mmu.c b/hw/petalogix_ml605_mmu.c
index dced648..ace0187 100644
--- a/hw/petalogix_ml605_mmu.c
+++ b/hw/petalogix_ml605_mmu.c
@@ -70,12 +70,10 @@  static void machine_cpu_reset(MicroBlazeCPU *cpu)
 }
 
 static void
-petalogix_ml605_init(ram_addr_t ram_size,
-                          const char *boot_device,
-                          const char *kernel_filename,
-                          const char *kernel_cmdline,
-                          const char *initrd_filename, const char *cpu_model)
+petalogix_ml605_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
     MemoryRegion *address_space_mem = get_system_memory();
     DeviceState *dev, *dma, *eth0;
     MicroBlazeCPU *cpu;
diff --git a/hw/petalogix_s3adsp1800_mmu.c b/hw/petalogix_s3adsp1800_mmu.c
index 2cf6882..71c32ce 100644
--- a/hw/petalogix_s3adsp1800_mmu.c
+++ b/hw/petalogix_s3adsp1800_mmu.c
@@ -57,12 +57,10 @@  static void machine_cpu_reset(MicroBlazeCPU *cpu)
 }
 
 static void
-petalogix_s3adsp1800_init(ram_addr_t ram_size,
-                          const char *boot_device,
-                          const char *kernel_filename,
-                          const char *kernel_cmdline,
-                          const char *initrd_filename, const char *cpu_model)
+petalogix_s3adsp1800_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
     DeviceState *dev;
     MicroBlazeCPU *cpu;
     CPUMBState *env;
diff --git a/hw/ppc/e500plat.c b/hw/ppc/e500plat.c
index 60a5cb3..4cfb940 100644
--- a/hw/ppc/e500plat.c
+++ b/hw/ppc/e500plat.c
@@ -25,13 +25,14 @@  static void e500plat_fixup_devtree(PPCE500Params *params, void *fdt)
                          sizeof(compatible));
 }
 
-static void e500plat_init(ram_addr_t ram_size,
-                           const char *boot_device,
-                           const char *kernel_filename,
-                           const char *kernel_cmdline,
-                           const char *initrd_filename,
-                           const char *cpu_model)
+static void e500plat_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *boot_device = args->boot_device;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
     PPCE500Params params = {
         .ram_size = ram_size,
         .boot_device = boot_device,
diff --git a/hw/ppc/mpc8544ds.c b/hw/ppc/mpc8544ds.c
index 984d21c..e651661 100644
--- a/hw/ppc/mpc8544ds.c
+++ b/hw/ppc/mpc8544ds.c
@@ -25,13 +25,14 @@  static void mpc8544ds_fixup_devtree(PPCE500Params *params, void *fdt)
                          sizeof(compatible));
 }
 
-static void mpc8544ds_init(ram_addr_t ram_size,
-                           const char *boot_device,
-                           const char *kernel_filename,
-                           const char *kernel_cmdline,
-                           const char *initrd_filename,
-                           const char *cpu_model)
+static void mpc8544ds_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *boot_device = args->boot_device;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
     PPCE500Params params = {
         .ram_size = ram_size,
         .boot_device = boot_device,
diff --git a/hw/ppc405_boards.c b/hw/ppc405_boards.c
index 476775d..e848cb0 100644
--- a/hw/ppc405_boards.c
+++ b/hw/ppc405_boards.c
@@ -158,7 +158,7 @@  static void ref405ep_fpga_reset (void *opaque)
     fpga->reg1 = 0x0F;
 }
 
-static void ref405ep_fpga_init (MemoryRegion *sysmem, uint32_t base)
+static void ref405ep_fpga_init(MemoryRegion *sysmem, uint32_t base)
 {
     ref405ep_fpga_t *fpga;
     MemoryRegion *fpga_memory = g_new(MemoryRegion, 1);
@@ -170,13 +170,12 @@  static void ref405ep_fpga_init (MemoryRegion *sysmem, uint32_t base)
     qemu_register_reset(&ref405ep_fpga_reset, fpga);
 }
 
-static void ref405ep_init (ram_addr_t ram_size,
-                           const char *boot_device,
-                           const char *kernel_filename,
-                           const char *kernel_cmdline,
-                           const char *initrd_filename,
-                           const char *cpu_model)
+static void ref405ep_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
     char *filename;
     ppc4xx_bd_info_t bd;
     CPUPPCState *env;
@@ -484,7 +483,7 @@  static void taihu_cpld_reset (void *opaque)
     cpld->reg1 = 0x80;
 }
 
-static void taihu_cpld_init (MemoryRegion *sysmem, uint32_t base)
+static void taihu_cpld_init(MemoryRegion *sysmem, uint32_t base)
 {
     taihu_cpld_t *cpld;
     MemoryRegion *cpld_memory = g_new(MemoryRegion, 1);
@@ -495,13 +494,11 @@  static void taihu_cpld_init (MemoryRegion *sysmem, uint32_t base)
     qemu_register_reset(&taihu_cpld_reset, cpld);
 }
 
-static void taihu_405ep_init(ram_addr_t ram_size,
-                             const char *boot_device,
-                             const char *kernel_filename,
-                             const char *kernel_cmdline,
-                             const char *initrd_filename,
-                             const char *cpu_model)
+static void taihu_405ep_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *kernel_filename = args->kernel_filename;
+    const char *initrd_filename = args->initrd_filename;
     char *filename;
     qemu_irq *pic;
     MemoryRegion *sysmem = get_system_memory();
diff --git a/hw/ppc440_bamboo.c b/hw/ppc440_bamboo.c
index c198071..78e7985 100644
--- a/hw/ppc440_bamboo.c
+++ b/hw/ppc440_bamboo.c
@@ -157,13 +157,13 @@  static void main_cpu_reset(void *opaque)
     mmubooke_create_initial_mapping(env, 0, 0);
 }
 
-static void bamboo_init(ram_addr_t ram_size,
-                        const char *boot_device,
-                        const char *kernel_filename,
-                        const char *kernel_cmdline,
-                        const char *initrd_filename,
-                        const char *cpu_model)
+static void bamboo_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
     unsigned int pci_irq_nrs[4] = { 28, 27, 26, 25 };
     MemoryRegion *address_space_mem = get_system_memory();
     MemoryRegion *ram_memories
diff --git a/hw/ppc_newworld.c b/hw/ppc_newworld.c
index e95cfe8..e7c0747 100644
--- a/hw/ppc_newworld.c
+++ b/hw/ppc_newworld.c
@@ -129,13 +129,14 @@  static void ppc_core99_reset(void *opaque)
 }
 
 /* PowerPC Mac99 hardware initialisation */
-static void ppc_core99_init (ram_addr_t ram_size,
-                             const char *boot_device,
-                             const char *kernel_filename,
-                             const char *kernel_cmdline,
-                             const char *initrd_filename,
-                             const char *cpu_model)
+static void ppc_core99_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_device = args->boot_device;
     PowerPCCPU *cpu = NULL;
     CPUPPCState *env = NULL;
     char *filename;
diff --git a/hw/ppc_oldworld.c b/hw/ppc_oldworld.c
index 1dcd8a6..d9f76a8 100644
--- a/hw/ppc_oldworld.c
+++ b/hw/ppc_oldworld.c
@@ -72,13 +72,14 @@  static void ppc_heathrow_reset(void *opaque)
     cpu_reset(CPU(cpu));
 }
 
-static void ppc_heathrow_init (ram_addr_t ram_size,
-                               const char *boot_device,
-                               const char *kernel_filename,
-                               const char *kernel_cmdline,
-                               const char *initrd_filename,
-                               const char *cpu_model)
+static void ppc_heathrow_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_device = args->boot_device;
     MemoryRegion *sysmem = get_system_memory();
     PowerPCCPU *cpu = NULL;
     CPUPPCState *env = NULL;
diff --git a/hw/ppc_prep.c b/hw/ppc_prep.c
index 592b7b2..f51f78a 100644
--- a/hw/ppc_prep.c
+++ b/hw/ppc_prep.c
@@ -448,13 +448,14 @@  static void ppc_prep_reset(void *opaque)
 }
 
 /* PowerPC PREP hardware initialisation */
-static void ppc_prep_init (ram_addr_t ram_size,
-                           const char *boot_device,
-                           const char *kernel_filename,
-                           const char *kernel_cmdline,
-                           const char *initrd_filename,
-                           const char *cpu_model)
+static void ppc_prep_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_device = args->boot_device;
     MemoryRegion *sysmem = get_system_memory();
     PowerPCCPU *cpu = NULL;
     CPUPPCState *env = NULL;
diff --git a/hw/puv3.c b/hw/puv3.c
index 43f7216..764799c 100644
--- a/hw/puv3.c
+++ b/hw/puv3.c
@@ -91,10 +91,12 @@  static void puv3_load_kernel(const char *kernel_filename)
     graphic_console_init(NULL, NULL, NULL, NULL, NULL);
 }
 
-static void puv3_init(ram_addr_t ram_size, const char *boot_device,
-                     const char *kernel_filename, const char *kernel_cmdline,
-                     const char *initrd_filename, const char *cpu_model)
+static void puv3_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *initrd_filename = args->initrd_filename;
     CPUUniCore32State *env;
 
     if (initrd_filename) {
diff --git a/hw/r2d.c b/hw/r2d.c
index 0f16e81..5daa42f 100644
--- a/hw/r2d.c
+++ b/hw/r2d.c
@@ -219,11 +219,12 @@  static struct QEMU_PACKED
     char kernel_cmdline[256];
 } boot_params;
 
-static void r2d_init(ram_addr_t ram_size,
-              const char *boot_device,
-	      const char *kernel_filename, const char *kernel_cmdline,
-	      const char *initrd_filename, const char *cpu_model)
+static void r2d_init(QEMUMachineInitArgs *args)
 {
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
     SuperHCPU *cpu;
     CPUSH4State *env;
     ResetData *reset_info;
diff --git a/hw/realview.c b/hw/realview.c
index 19db4d0..8dc4be6 100644
--- a/hw/realview.c
+++ b/hw/realview.c
@@ -330,11 +330,14 @@  static void realview_init(ram_addr_t ram_size,
     arm_load_kernel(arm_env_get_cpu(first_cpu), &realview_binfo);
 }
 
-static void realview_eb_init(ram_addr_t ram_size,
-                     const char *boot_device,
-                     const char *kernel_filename, const char *kernel_cmdline,
-                     const char *initrd_filename, const char *cpu_model)
+static void realview_eb_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_device = args->boot_device;
     if (!cpu_model) {
         cpu_model = "arm926";
     }
@@ -342,11 +345,14 @@  static void realview_eb_init(ram_addr_t ram_size,
                   initrd_filename, cpu_model, BOARD_EB);
 }
 
-static void realview_eb_mpcore_init(ram_addr_t ram_size,
-                     const char *boot_device,
-                     const char *kernel_filename, const char *kernel_cmdline,
-                     const char *initrd_filename, const char *cpu_model)
+static void realview_eb_mpcore_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_device = args->boot_device;
     if (!cpu_model) {
         cpu_model = "arm11mpcore";
     }
@@ -354,11 +360,14 @@  static void realview_eb_mpcore_init(ram_addr_t ram_size,
                   initrd_filename, cpu_model, BOARD_EB_MPCORE);
 }
 
-static void realview_pb_a8_init(ram_addr_t ram_size,
-                     const char *boot_device,
-                     const char *kernel_filename, const char *kernel_cmdline,
-                     const char *initrd_filename, const char *cpu_model)
+static void realview_pb_a8_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_device = args->boot_device;
     if (!cpu_model) {
         cpu_model = "cortex-a8";
     }
@@ -366,11 +375,14 @@  static void realview_pb_a8_init(ram_addr_t ram_size,
                   initrd_filename, cpu_model, BOARD_PB_A8);
 }
 
-static void realview_pbx_a9_init(ram_addr_t ram_size,
-                     const char *boot_device,
-                     const char *kernel_filename, const char *kernel_cmdline,
-                     const char *initrd_filename, const char *cpu_model)
+static void realview_pbx_a9_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_device = args->boot_device;
     if (!cpu_model) {
         cpu_model = "cortex-a9";
     }
diff --git a/hw/s390-virtio.c b/hw/s390-virtio.c
index 47eed35..39ff178 100644
--- a/hw/s390-virtio.c
+++ b/hw/s390-virtio.c
@@ -151,13 +151,14 @@  unsigned s390_del_running_cpu(CPUS390XState *env)
 }
 
 /* PC hardware initialisation */
-static void s390_init(ram_addr_t my_ram_size,
-                      const char *boot_device,
-                      const char *kernel_filename,
-                      const char *kernel_cmdline,
-                      const char *initrd_filename,
-                      const char *cpu_model)
+static void s390_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t my_ram_size = args->ram_size;
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
     CPUS390XState *env = NULL;
     MemoryRegion *sysmem = get_system_memory();
     MemoryRegion *ram = g_new(MemoryRegion, 1);
diff --git a/hw/shix.c b/hw/shix.c
index dd9ce17..b56dd54 100644
--- a/hw/shix.c
+++ b/hw/shix.c
@@ -37,11 +37,9 @@ 
 #define BIOS_FILENAME "shix_bios.bin"
 #define BIOS_ADDRESS 0xA0000000
 
-static void shix_init(ram_addr_t ram_size,
-               const char *boot_device,
-	       const char *kernel_filename, const char *kernel_cmdline,
-	       const char *initrd_filename, const char *cpu_model)
+static void shix_init(QEMUMachineInitArgs *args)
 {
+    const char *cpu_model = args->cpu_model;
     int ret;
     CPUSH4State *env;
     struct SH7750State *s;
diff --git a/hw/spapr.c b/hw/spapr.c
index c34b767..8921c4d 100644
--- a/hw/spapr.c
+++ b/hw/spapr.c
@@ -603,13 +603,14 @@  static int spapr_vga_init(PCIBus *pci_bus)
 }
 
 /* pSeries LPAR / sPAPR hardware init */
-static void ppc_spapr_init(ram_addr_t ram_size,
-                           const char *boot_device,
-                           const char *kernel_filename,
-                           const char *kernel_cmdline,
-                           const char *initrd_filename,
-                           const char *cpu_model)
+static void ppc_spapr_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_device = args->boot_device;
     PowerPCCPU *cpu;
     CPUPPCState *env;
     PCIHostState *phb;
diff --git a/hw/spitz.c b/hw/spitz.c
index 20e7835..df829b3 100644
--- a/hw/spitz.c
+++ b/hw/spitz.c
@@ -936,38 +936,46 @@  static void spitz_common_init(ram_addr_t ram_size,
     sl_bootparam_write(SL_PXA_PARAM_BASE);
 }
 
-static void spitz_init(ram_addr_t ram_size,
-                const char *boot_device,
-                const char *kernel_filename, const char *kernel_cmdline,
-                const char *initrd_filename, const char *cpu_model)
+static void spitz_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
     spitz_common_init(ram_size, kernel_filename,
                 kernel_cmdline, initrd_filename, cpu_model, spitz, 0x2c9);
 }
 
-static void borzoi_init(ram_addr_t ram_size,
-                const char *boot_device,
-                const char *kernel_filename, const char *kernel_cmdline,
-                const char *initrd_filename, const char *cpu_model)
+static void borzoi_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
     spitz_common_init(ram_size, kernel_filename,
                 kernel_cmdline, initrd_filename, cpu_model, borzoi, 0x33f);
 }
 
-static void akita_init(ram_addr_t ram_size,
-                const char *boot_device,
-                const char *kernel_filename, const char *kernel_cmdline,
-                const char *initrd_filename, const char *cpu_model)
+static void akita_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
     spitz_common_init(ram_size, kernel_filename,
                 kernel_cmdline, initrd_filename, cpu_model, akita, 0x2e8);
 }
 
-static void terrier_init(ram_addr_t ram_size,
-                const char *boot_device,
-                const char *kernel_filename, const char *kernel_cmdline,
-                const char *initrd_filename, const char *cpu_model)
+static void terrier_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
     spitz_common_init(ram_size, kernel_filename,
                 kernel_cmdline, initrd_filename, cpu_model, terrier, 0x33f);
 }
diff --git a/hw/stellaris.c b/hw/stellaris.c
index 562fbbf..b79c7fb 100644
--- a/hw/stellaris.c
+++ b/hw/stellaris.c
@@ -1358,19 +1358,17 @@  static void stellaris_init(const char *kernel_filename, const char *cpu_model,
 }
 
 /* FIXME: Figure out how to generate these from stellaris_boards.  */
-static void lm3s811evb_init(ram_addr_t ram_size,
-                     const char *boot_device,
-                     const char *kernel_filename, const char *kernel_cmdline,
-                     const char *initrd_filename, const char *cpu_model)
+static void lm3s811evb_init(QEMUMachineInitArgs *args)
 {
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
     stellaris_init(kernel_filename, cpu_model, &stellaris_boards[0]);
 }
 
-static void lm3s6965evb_init(ram_addr_t ram_size,
-                     const char *boot_device,
-                     const char *kernel_filename, const char *kernel_cmdline,
-                     const char *initrd_filename, const char *cpu_model)
+static void lm3s6965evb_init(QEMUMachineInitArgs *args)
 {
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
     stellaris_init(kernel_filename, cpu_model, &stellaris_boards[1]);
 }
 
diff --git a/hw/sun4m.c b/hw/sun4m.c
index c98cd5e..22e011f 100644
--- a/hw/sun4m.c
+++ b/hw/sun4m.c
@@ -1303,92 +1303,118 @@  static const struct sun4m_hwdef sun4m_hwdefs[] = {
 };
 
 /* SPARCstation 5 hardware initialisation */
-static void ss5_init(ram_addr_t RAM_size,
-                     const char *boot_device,
-                     const char *kernel_filename, const char *kernel_cmdline,
-                     const char *initrd_filename, const char *cpu_model)
+static void ss5_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t RAM_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_device = args->boot_device;
     sun4m_hw_init(&sun4m_hwdefs[0], RAM_size, boot_device, kernel_filename,
                   kernel_cmdline, initrd_filename, cpu_model);
 }
 
 /* SPARCstation 10 hardware initialisation */
-static void ss10_init(ram_addr_t RAM_size,
-                      const char *boot_device,
-                      const char *kernel_filename, const char *kernel_cmdline,
-                      const char *initrd_filename, const char *cpu_model)
+static void ss10_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t RAM_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_device = args->boot_device;
     sun4m_hw_init(&sun4m_hwdefs[1], RAM_size, boot_device, kernel_filename,
                   kernel_cmdline, initrd_filename, cpu_model);
 }
 
 /* SPARCserver 600MP hardware initialisation */
-static void ss600mp_init(ram_addr_t RAM_size,
-                         const char *boot_device,
-                         const char *kernel_filename,
-                         const char *kernel_cmdline,
-                         const char *initrd_filename, const char *cpu_model)
+static void ss600mp_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t RAM_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_device = args->boot_device;
     sun4m_hw_init(&sun4m_hwdefs[2], RAM_size, boot_device, kernel_filename,
                   kernel_cmdline, initrd_filename, cpu_model);
 }
 
 /* SPARCstation 20 hardware initialisation */
-static void ss20_init(ram_addr_t RAM_size,
-                      const char *boot_device,
-                      const char *kernel_filename, const char *kernel_cmdline,
-                      const char *initrd_filename, const char *cpu_model)
+static void ss20_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t RAM_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_device = args->boot_device;
     sun4m_hw_init(&sun4m_hwdefs[3], RAM_size, boot_device, kernel_filename,
                   kernel_cmdline, initrd_filename, cpu_model);
 }
 
 /* SPARCstation Voyager hardware initialisation */
-static void vger_init(ram_addr_t RAM_size,
-                      const char *boot_device,
-                      const char *kernel_filename, const char *kernel_cmdline,
-                      const char *initrd_filename, const char *cpu_model)
+static void vger_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t RAM_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_device = args->boot_device;
     sun4m_hw_init(&sun4m_hwdefs[4], RAM_size, boot_device, kernel_filename,
                   kernel_cmdline, initrd_filename, cpu_model);
 }
 
 /* SPARCstation LX hardware initialisation */
-static void ss_lx_init(ram_addr_t RAM_size,
-                       const char *boot_device,
-                       const char *kernel_filename, const char *kernel_cmdline,
-                       const char *initrd_filename, const char *cpu_model)
+static void ss_lx_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t RAM_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_device = args->boot_device;
     sun4m_hw_init(&sun4m_hwdefs[5], RAM_size, boot_device, kernel_filename,
                   kernel_cmdline, initrd_filename, cpu_model);
 }
 
 /* SPARCstation 4 hardware initialisation */
-static void ss4_init(ram_addr_t RAM_size,
-                     const char *boot_device,
-                     const char *kernel_filename, const char *kernel_cmdline,
-                     const char *initrd_filename, const char *cpu_model)
+static void ss4_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t RAM_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_device = args->boot_device;
     sun4m_hw_init(&sun4m_hwdefs[6], RAM_size, boot_device, kernel_filename,
                   kernel_cmdline, initrd_filename, cpu_model);
 }
 
 /* SPARCClassic hardware initialisation */
-static void scls_init(ram_addr_t RAM_size,
-                      const char *boot_device,
-                      const char *kernel_filename, const char *kernel_cmdline,
-                      const char *initrd_filename, const char *cpu_model)
+static void scls_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t RAM_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_device = args->boot_device;
     sun4m_hw_init(&sun4m_hwdefs[7], RAM_size, boot_device, kernel_filename,
                   kernel_cmdline, initrd_filename, cpu_model);
 }
 
 /* SPARCbook hardware initialisation */
-static void sbook_init(ram_addr_t RAM_size,
-                       const char *boot_device,
-                       const char *kernel_filename, const char *kernel_cmdline,
-                       const char *initrd_filename, const char *cpu_model)
+static void sbook_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t RAM_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_device = args->boot_device;
     sun4m_hw_init(&sun4m_hwdefs[8], RAM_size, boot_device, kernel_filename,
                   kernel_cmdline, initrd_filename, cpu_model);
 }
@@ -1651,21 +1677,27 @@  static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, ram_addr_t RAM_size,
 }
 
 /* SPARCserver 1000 hardware initialisation */
-static void ss1000_init(ram_addr_t RAM_size,
-                        const char *boot_device,
-                        const char *kernel_filename, const char *kernel_cmdline,
-                        const char *initrd_filename, const char *cpu_model)
+static void ss1000_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t RAM_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_device = args->boot_device;
     sun4d_hw_init(&sun4d_hwdefs[0], RAM_size, boot_device, kernel_filename,
                   kernel_cmdline, initrd_filename, cpu_model);
 }
 
 /* SPARCcenter 2000 hardware initialisation */
-static void ss2000_init(ram_addr_t RAM_size,
-                        const char *boot_device,
-                        const char *kernel_filename, const char *kernel_cmdline,
-                        const char *initrd_filename, const char *cpu_model)
+static void ss2000_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t RAM_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_device = args->boot_device;
     sun4d_hw_init(&sun4d_hwdefs[1], RAM_size, boot_device, kernel_filename,
                   kernel_cmdline, initrd_filename, cpu_model);
 }
@@ -1845,11 +1877,14 @@  static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size,
 }
 
 /* SPARCstation 2 hardware initialisation */
-static void ss2_init(ram_addr_t RAM_size,
-                     const char *boot_device,
-                     const char *kernel_filename, const char *kernel_cmdline,
-                     const char *initrd_filename, const char *cpu_model)
+static void ss2_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t RAM_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_device = args->boot_device;
     sun4c_hw_init(&sun4c_hwdefs[0], RAM_size, boot_device, kernel_filename,
                   kernel_cmdline, initrd_filename, cpu_model);
 }
diff --git a/hw/sun4u.c b/hw/sun4u.c
index 07cd042..379768c 100644
--- a/hw/sun4u.c
+++ b/hw/sun4u.c
@@ -930,31 +930,40 @@  static const struct hwdef hwdefs[] = {
 };
 
 /* Sun4u hardware initialisation */
-static void sun4u_init(ram_addr_t RAM_size,
-                       const char *boot_devices,
-                       const char *kernel_filename, const char *kernel_cmdline,
-                       const char *initrd_filename, const char *cpu_model)
-{
+static void sun4u_init(QEMUMachineInitArgs *args)
+{
+    ram_addr_t RAM_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_devices = args->boot_device;
     sun4uv_init(get_system_memory(), RAM_size, boot_devices, kernel_filename,
                 kernel_cmdline, initrd_filename, cpu_model, &hwdefs[0]);
 }
 
 /* Sun4v hardware initialisation */
-static void sun4v_init(ram_addr_t RAM_size,
-                       const char *boot_devices,
-                       const char *kernel_filename, const char *kernel_cmdline,
-                       const char *initrd_filename, const char *cpu_model)
-{
+static void sun4v_init(QEMUMachineInitArgs *args)
+{
+    ram_addr_t RAM_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_devices = args->boot_device;
     sun4uv_init(get_system_memory(), RAM_size, boot_devices, kernel_filename,
                 kernel_cmdline, initrd_filename, cpu_model, &hwdefs[1]);
 }
 
 /* Niagara hardware initialisation */
-static void niagara_init(ram_addr_t RAM_size,
-                         const char *boot_devices,
-                         const char *kernel_filename, const char *kernel_cmdline,
-                         const char *initrd_filename, const char *cpu_model)
-{
+static void niagara_init(QEMUMachineInitArgs *args)
+{
+    ram_addr_t RAM_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_devices = args->boot_device;
     sun4uv_init(get_system_memory(), RAM_size, boot_devices, kernel_filename,
                 kernel_cmdline, initrd_filename, cpu_model, &hwdefs[2]);
 }
diff --git a/hw/tosa.c b/hw/tosa.c
index 297a8c2..512278c 100644
--- a/hw/tosa.c
+++ b/hw/tosa.c
@@ -205,11 +205,12 @@  static struct arm_boot_info tosa_binfo = {
     .ram_size = 0x04000000,
 };
 
-static void tosa_init(ram_addr_t ram_size,
-                const char *boot_device,
-                const char *kernel_filename, const char *kernel_cmdline,
-                const char *initrd_filename, const char *cpu_model)
+static void tosa_init(QEMUMachineInitArgs *args)
 {
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
     MemoryRegion *address_space_mem = get_system_memory();
     MemoryRegion *rom = g_new(MemoryRegion, 1);
     PXA2xxState *mpu;
diff --git a/hw/versatilepb.c b/hw/versatilepb.c
index 7a92034..686dcc7 100644
--- a/hw/versatilepb.c
+++ b/hw/versatilepb.c
@@ -342,22 +342,28 @@  static void versatile_init(ram_addr_t ram_size,
     arm_load_kernel(cpu, &versatile_binfo);
 }
 
-static void vpb_init(ram_addr_t ram_size,
-                     const char *boot_device,
-                     const char *kernel_filename, const char *kernel_cmdline,
-                     const char *initrd_filename, const char *cpu_model)
+static void vpb_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_device = args->boot_device;
     versatile_init(ram_size,
                    boot_device,
                    kernel_filename, kernel_cmdline,
                    initrd_filename, cpu_model, 0x183);
 }
 
-static void vab_init(ram_addr_t ram_size,
-                     const char *boot_device,
-                     const char *kernel_filename, const char *kernel_cmdline,
-                     const char *initrd_filename, const char *cpu_model)
+static void vab_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_device = args->boot_device;
     versatile_init(ram_size,
                    boot_device,
                    kernel_filename, kernel_cmdline,
diff --git a/hw/vexpress.c b/hw/vexpress.c
index 3596d1e..36503d6 100644
--- a/hw/vexpress.c
+++ b/hw/vexpress.c
@@ -467,25 +467,27 @@  static void vexpress_common_init(const VEDBoardInfo *daughterboard,
     arm_load_kernel(arm_env_get_cpu(first_cpu), &vexpress_binfo);
 }
 
-static void vexpress_a9_init(ram_addr_t ram_size,
-                             const char *boot_device,
-                             const char *kernel_filename,
-                             const char *kernel_cmdline,
-                             const char *initrd_filename,
-                             const char *cpu_model)
+static void vexpress_a9_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_device = args->boot_device;
     vexpress_common_init(&a9_daughterboard,
                          ram_size, boot_device, kernel_filename,
                          kernel_cmdline, initrd_filename, cpu_model);
 }
 
-static void vexpress_a15_init(ram_addr_t ram_size,
-                              const char *boot_device,
-                              const char *kernel_filename,
-                              const char *kernel_cmdline,
-                              const char *initrd_filename,
-                              const char *cpu_model)
+static void vexpress_a15_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_device = args->boot_device;
     vexpress_common_init(&a15_daughterboard,
                          ram_size, boot_device, kernel_filename,
                          kernel_cmdline, initrd_filename, cpu_model);
diff --git a/hw/virtex_ml507.c b/hw/virtex_ml507.c
index 79bc0d1..a09b27a 100644
--- a/hw/virtex_ml507.c
+++ b/hw/virtex_ml507.c
@@ -183,12 +183,12 @@  static int xilinx_load_device_tree(target_phys_addr_t addr,
     return fdt_size;
 }
 
-static void virtex_init(ram_addr_t ram_size,
-                        const char *boot_device,
-                        const char *kernel_filename,
-                        const char *kernel_cmdline,
-                        const char *initrd_filename, const char *cpu_model)
+static void virtex_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
     MemoryRegion *address_space_mem = get_system_memory();
     DeviceState *dev;
     PowerPCCPU *cpu;
diff --git a/hw/xen_machine_pv.c b/hw/xen_machine_pv.c
index 4b72aa7..1ac9990 100644
--- a/hw/xen_machine_pv.c
+++ b/hw/xen_machine_pv.c
@@ -29,12 +29,13 @@ 
 #include "xen_domainbuild.h"
 #include "blockdev.h"
 
-static void xen_init_pv(ram_addr_t ram_size,
-			const char *boot_device,
-			const char *kernel_filename,
-			const char *kernel_cmdline,
-			const char *initrd_filename,
-			const char *cpu_model)
+static void xen_init_pv(QEMUMachine *machine,
+                        ram_addr_t ram_size,
+                        const char *boot_device,
+                        const char *kernel_filename,
+                        const char *kernel_cmdline,
+                        const char *initrd_filename,
+                        const char *cpu_model)
 {
     X86CPU *cpu;
     CPUX86State *env;
diff --git a/hw/xilinx_zynq.c b/hw/xilinx_zynq.c
index 7e6c273..83f322e 100644
--- a/hw/xilinx_zynq.c
+++ b/hw/xilinx_zynq.c
@@ -46,10 +46,13 @@  static void gem_init(NICInfo *nd, uint32_t base, qemu_irq irq)
     sysbus_connect_irq(s, 0, irq);
 }
 
-static void zynq_init(ram_addr_t ram_size, const char *boot_device,
-                        const char *kernel_filename, const char *kernel_cmdline,
-                        const char *initrd_filename, const char *cpu_model)
+static void zynq_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
     ARMCPU *cpu;
     MemoryRegion *address_space_mem = get_system_memory();
     MemoryRegion *ext_ram = g_new(MemoryRegion, 1);
diff --git a/hw/xtensa_lx60.c b/hw/xtensa_lx60.c
index 3653f65..1fd2c47 100644
--- a/hw/xtensa_lx60.c
+++ b/hw/xtensa_lx60.c
@@ -268,11 +268,14 @@  static void lx_init(const LxBoardDesc *board,
     }
 }
 
-static void xtensa_lx60_init(ram_addr_t ram_size,
-                     const char *boot_device,
-                     const char *kernel_filename, const char *kernel_cmdline,
-                     const char *initrd_filename, const char *cpu_model)
+static void xtensa_lx60_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_device = args->boot_device;
     static const LxBoardDesc lx60_board = {
         .flash_size = 0x400000,
         .flash_sector_size = 0x10000,
@@ -283,11 +286,14 @@  static void xtensa_lx60_init(ram_addr_t ram_size,
             initrd_filename, cpu_model);
 }
 
-static void xtensa_lx200_init(ram_addr_t ram_size,
-                     const char *boot_device,
-                     const char *kernel_filename, const char *kernel_cmdline,
-                     const char *initrd_filename, const char *cpu_model)
+static void xtensa_lx200_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_device = args->boot_device;
     static const LxBoardDesc lx200_board = {
         .flash_size = 0x1000000,
         .flash_sector_size = 0x20000,
diff --git a/hw/xtensa_sim.c b/hw/xtensa_sim.c
index 831460b..2e846d8 100644
--- a/hw/xtensa_sim.c
+++ b/hw/xtensa_sim.c
@@ -96,11 +96,14 @@  static void sim_init(ram_addr_t ram_size,
     }
 }
 
-static void xtensa_sim_init(ram_addr_t ram_size,
-                     const char *boot_device,
-                     const char *kernel_filename, const char *kernel_cmdline,
-                     const char *initrd_filename, const char *cpu_model)
+static void xtensa_sim_init(QEMUMachineInitArgs *args)
 {
+    ram_addr_t ram_size = args->ram_size;
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
+    const char *boot_device = args->boot_device;
     if (!cpu_model) {
         cpu_model = XTENSA_DEFAULT_CPU_MODEL;
     }
diff --git a/hw/z2.c b/hw/z2.c
index 289cee9..0927bad 100644
--- a/hw/z2.c
+++ b/hw/z2.c
@@ -294,11 +294,12 @@  static TypeInfo aer915_info = {
     .class_init    = aer915_class_init,
 };
 
-static void z2_init(ram_addr_t ram_size,
-                const char *boot_device,
-                const char *kernel_filename, const char *kernel_cmdline,
-                const char *initrd_filename, const char *cpu_model)
+static void z2_init(QEMUMachineInitArgs *args)
 {
+    const char *cpu_model = args->cpu_model;
+    const char *kernel_filename = args->kernel_filename;
+    const char *kernel_cmdline = args->kernel_cmdline;
+    const char *initrd_filename = args->initrd_filename;
     MemoryRegion *address_space_mem = get_system_memory();
     uint32_t sector_len = 0x10000;
     PXA2xxState *mpu;
diff --git a/vl.c b/vl.c
index 8d305ca..f663e7c 100644
--- a/vl.c
+++ b/vl.c
@@ -3624,8 +3624,13 @@  int main(int argc, char **argv, char **envp)
 
     qdev_machine_init();
 
-    machine->init(ram_size, boot_devices,
-                  kernel_filename, kernel_cmdline, initrd_filename, cpu_model);
+    QEMUMachineInitArgs args = { .ram_size = ram_size,
+                                 .boot_device = boot_devices,
+                                 .kernel_filename = kernel_filename,
+                                 .kernel_cmdline = kernel_cmdline,
+                                 initrd_filename = initrd_filename,
+                                 .cpu_model = cpu_model };
+    machine->init(&args);
 
     cpu_synchronize_all_post_init();