diff mbox

[v3,6/6] hw: Clean up bogus default boot order

Message ID 1374493127-22930-7-git-send-email-armbru@redhat.com
State New
Headers show

Commit Message

Markus Armbruster July 22, 2013, 11:38 a.m. UTC
We set default boot order "cad" in every single machine definition
except "pseries" and "moxiesim", even though very few boards actually
care for boot order, and "cad" makes sense for even fewer.

Machines that care:

* pc and its variants

  Accept up to three letters 'a', 'b' (undocumented alias for 'a'),
  'c', 'd' and 'n'.  Reject all others (fatal with -boot).

* nseries (n800, n810)

  Check whether order starts with 'n'.  Silently ignored otherwise.

* prep, g3beige, mac99

  Extract the first character the machine understands (subset of
  'a'..'f').  Silently ignored otherwise.

* spapr

  Accept an arbitrary string (vl.c restricts it to contain only
  'a'..'p', no duplicates).

* sun4[mdc]

  Use the first character.  Silently ignored otherwise.

Strip characters these machines ignore from their default boot order.

For all other machines, remove the unused default boot order
alltogether.

Note that my rename of QEMUMachine member boot_order to
default_boot_order and QEMUMachineInitArgs member boot_device to
boot_order has a welcome side effect: it makes every use of boot
orders visible in this patch, for easy review.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 hw/alpha/dp264.c                         |  1 -
 hw/arm/collie.c                          |  1 -
 hw/arm/exynos4_boards.c                  |  2 --
 hw/arm/gumstix.c                         |  2 --
 hw/arm/highbank.c                        |  2 --
 hw/arm/integratorcp.c                    |  1 -
 hw/arm/kzm.c                             |  1 -
 hw/arm/mainstone.c                       |  1 -
 hw/arm/musicpal.c                        |  1 -
 hw/arm/nseries.c                         |  6 +++---
 hw/arm/omap_sx1.c                        |  2 --
 hw/arm/palm.c                            |  1 -
 hw/arm/realview.c                        |  4 ----
 hw/arm/spitz.c                           |  4 ----
 hw/arm/stellaris.c                       |  2 --
 hw/arm/tosa.c                            |  1 -
 hw/arm/versatilepb.c                     |  2 --
 hw/arm/vexpress.c                        |  2 --
 hw/arm/xilinx_zynq.c                     |  1 -
 hw/arm/z2.c                              |  1 -
 hw/core/null-machine.c                   |  1 -
 hw/cris/axis_dev88.c                     |  1 -
 hw/i386/pc_piix.c                        | 32 ++++++++++++++++----------------
 hw/i386/pc_q35.c                         |  8 ++++----
 hw/i386/xen_machine_pv.c                 |  1 -
 hw/lm32/lm32_boards.c                    |  2 --
 hw/lm32/milkymist.c                      |  1 -
 hw/m68k/an5206.c                         |  1 -
 hw/m68k/dummy_m68k.c                     |  1 -
 hw/m68k/mcf5208.c                        |  1 -
 hw/microblaze/petalogix_ml605_mmu.c      |  1 -
 hw/microblaze/petalogix_s3adsp1800_mmu.c |  1 -
 hw/mips/mips_fulong2e.c                  |  1 -
 hw/mips/mips_jazz.c                      |  2 --
 hw/mips/mips_malta.c                     |  1 -
 hw/mips/mips_mipssim.c                   |  1 -
 hw/mips/mips_r4k.c                       |  1 -
 hw/openrisc/openrisc_sim.c               |  1 -
 hw/ppc/e500plat.c                        |  1 -
 hw/ppc/mac_newworld.c                    |  4 ++--
 hw/ppc/mac_oldworld.c                    |  4 ++--
 hw/ppc/mpc8544ds.c                       |  1 -
 hw/ppc/ppc405_boards.c                   |  2 --
 hw/ppc/ppc440_bamboo.c                   |  1 -
 hw/ppc/prep.c                            |  4 ++--
 hw/ppc/spapr.c                           |  4 ++--
 hw/ppc/virtex_ml507.c                    |  1 -
 hw/s390x/s390-virtio-ccw.c               |  1 -
 hw/s390x/s390-virtio.c                   |  1 -
 hw/sh4/r2d.c                             |  1 -
 hw/sh4/shix.c                            |  1 -
 hw/sparc/leon3.c                         |  1 -
 hw/sparc/sun4m.c                         | 22 +++++++++++-----------
 hw/sparc64/sun4u.c                       | 10 +++++-----
 hw/unicore32/puv3.c                      |  1 -
 hw/xtensa/xtensa_lx60.c                  |  2 --
 hw/xtensa/xtensa_sim.c                   |  1 -
 include/hw/boards.h                      |  7 ++-----
 vl.c                                     |  4 ++--
 59 files changed, 51 insertions(+), 119 deletions(-)

Comments

Michael S. Tsirkin Aug. 21, 2013, 2:51 p.m. UTC | #1
On Mon, Jul 22, 2013 at 01:38:47PM +0200, Markus Armbruster wrote:
> We set default boot order "cad" in every single machine definition
> except "pseries" and "moxiesim", even though very few boards actually
> care for boot order, and "cad" makes sense for even fewer.
> 
> Machines that care:
> 
> * pc and its variants
> 
>   Accept up to three letters 'a', 'b' (undocumented alias for 'a'),
>   'c', 'd' and 'n'.  Reject all others (fatal with -boot).
> 
> * nseries (n800, n810)
> 
>   Check whether order starts with 'n'.  Silently ignored otherwise.
> 
> * prep, g3beige, mac99
> 
>   Extract the first character the machine understands (subset of
>   'a'..'f').  Silently ignored otherwise.
> 
> * spapr
> 
>   Accept an arbitrary string (vl.c restricts it to contain only
>   'a'..'p', no duplicates).
> 
> * sun4[mdc]
> 
>   Use the first character.  Silently ignored otherwise.
> 
> Strip characters these machines ignore from their default boot order.
> 
> For all other machines, remove the unused default boot order
> alltogether.
> 
> Note that my rename of QEMUMachine member boot_order to
> default_boot_order and QEMUMachineInitArgs member boot_device to
> boot_order has a welcome side effect: it makes every use of boot
> orders visible in this patch, for easy review.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>  hw/alpha/dp264.c                         |  1 -
>  hw/arm/collie.c                          |  1 -
>  hw/arm/exynos4_boards.c                  |  2 --
>  hw/arm/gumstix.c                         |  2 --
>  hw/arm/highbank.c                        |  2 --
>  hw/arm/integratorcp.c                    |  1 -
>  hw/arm/kzm.c                             |  1 -
>  hw/arm/mainstone.c                       |  1 -
>  hw/arm/musicpal.c                        |  1 -
>  hw/arm/nseries.c                         |  6 +++---
>  hw/arm/omap_sx1.c                        |  2 --
>  hw/arm/palm.c                            |  1 -
>  hw/arm/realview.c                        |  4 ----
>  hw/arm/spitz.c                           |  4 ----
>  hw/arm/stellaris.c                       |  2 --
>  hw/arm/tosa.c                            |  1 -
>  hw/arm/versatilepb.c                     |  2 --
>  hw/arm/vexpress.c                        |  2 --
>  hw/arm/xilinx_zynq.c                     |  1 -
>  hw/arm/z2.c                              |  1 -
>  hw/core/null-machine.c                   |  1 -
>  hw/cris/axis_dev88.c                     |  1 -
>  hw/i386/pc_piix.c                        | 32 ++++++++++++++++----------------
>  hw/i386/pc_q35.c                         |  8 ++++----
>  hw/i386/xen_machine_pv.c                 |  1 -
>  hw/lm32/lm32_boards.c                    |  2 --
>  hw/lm32/milkymist.c                      |  1 -
>  hw/m68k/an5206.c                         |  1 -
>  hw/m68k/dummy_m68k.c                     |  1 -
>  hw/m68k/mcf5208.c                        |  1 -
>  hw/microblaze/petalogix_ml605_mmu.c      |  1 -
>  hw/microblaze/petalogix_s3adsp1800_mmu.c |  1 -
>  hw/mips/mips_fulong2e.c                  |  1 -
>  hw/mips/mips_jazz.c                      |  2 --
>  hw/mips/mips_malta.c                     |  1 -
>  hw/mips/mips_mipssim.c                   |  1 -
>  hw/mips/mips_r4k.c                       |  1 -
>  hw/openrisc/openrisc_sim.c               |  1 -
>  hw/ppc/e500plat.c                        |  1 -
>  hw/ppc/mac_newworld.c                    |  4 ++--
>  hw/ppc/mac_oldworld.c                    |  4 ++--
>  hw/ppc/mpc8544ds.c                       |  1 -
>  hw/ppc/ppc405_boards.c                   |  2 --
>  hw/ppc/ppc440_bamboo.c                   |  1 -
>  hw/ppc/prep.c                            |  4 ++--
>  hw/ppc/spapr.c                           |  4 ++--
>  hw/ppc/virtex_ml507.c                    |  1 -
>  hw/s390x/s390-virtio-ccw.c               |  1 -
>  hw/s390x/s390-virtio.c                   |  1 -
>  hw/sh4/r2d.c                             |  1 -
>  hw/sh4/shix.c                            |  1 -
>  hw/sparc/leon3.c                         |  1 -
>  hw/sparc/sun4m.c                         | 22 +++++++++++-----------
>  hw/sparc64/sun4u.c                       | 10 +++++-----
>  hw/unicore32/puv3.c                      |  1 -
>  hw/xtensa/xtensa_lx60.c                  |  2 --
>  hw/xtensa/xtensa_sim.c                   |  1 -
>  include/hw/boards.h                      |  7 ++-----
>  vl.c                                     |  4 ++--
>  59 files changed, 51 insertions(+), 119 deletions(-)
> 
> diff --git a/hw/alpha/dp264.c b/hw/alpha/dp264.c
> index 95fde61..20795ac 100644
> --- a/hw/alpha/dp264.c
> +++ b/hw/alpha/dp264.c
> @@ -173,7 +173,6 @@ static QEMUMachine clipper_machine = {
>      .init = clipper_init,
>      .max_cpus = 4,
>      .is_default = 1,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void clipper_machine_init(void)
> diff --git a/hw/arm/collie.c b/hw/arm/collie.c
> index a19857a..8878b0e 100644
> --- a/hw/arm/collie.c
> +++ b/hw/arm/collie.c
> @@ -62,7 +62,6 @@ static QEMUMachine collie_machine = {
>      .name = "collie",
>      .desc = "Collie PDA (SA-1110)",
>      .init = collie_init,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void collie_machine_init(void)
> diff --git a/hw/arm/exynos4_boards.c b/hw/arm/exynos4_boards.c
> index 7c90b2d..2929f9f 100644
> --- a/hw/arm/exynos4_boards.c
> +++ b/hw/arm/exynos4_boards.c
> @@ -150,14 +150,12 @@ static QEMUMachine exynos4_machines[EXYNOS4_NUM_OF_BOARDS] = {
>          .desc = "Samsung NURI board (Exynos4210)",
>          .init = nuri_init,
>          .max_cpus = EXYNOS4210_NCPUS,
> -        DEFAULT_MACHINE_OPTIONS,
>      },
>      [EXYNOS4_BOARD_SMDKC210] = {
>          .name = "smdkc210",
>          .desc = "Samsung SMDKC210 board (Exynos4210)",
>          .init = smdkc210_init,
>          .max_cpus = EXYNOS4210_NCPUS,
> -        DEFAULT_MACHINE_OPTIONS,
>      },
>  };
>  
> diff --git a/hw/arm/gumstix.c b/hw/arm/gumstix.c
> index b8cab10..e97fbbd 100644
> --- a/hw/arm/gumstix.c
> +++ b/hw/arm/gumstix.c
> @@ -122,14 +122,12 @@ static QEMUMachine connex_machine = {
>      .name = "connex",
>      .desc = "Gumstix Connex (PXA255)",
>      .init = connex_init,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static QEMUMachine verdex_machine = {
>      .name = "verdex",
>      .desc = "Gumstix Verdex (PXA270)",
>      .init = verdex_init,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void gumstix_machine_init(void)
> diff --git a/hw/arm/highbank.c b/hw/arm/highbank.c
> index be264d3..4dfcfd0 100644
> --- a/hw/arm/highbank.c
> +++ b/hw/arm/highbank.c
> @@ -359,7 +359,6 @@ static QEMUMachine highbank_machine = {
>      .init = highbank_init,
>      .block_default_type = IF_SCSI,
>      .max_cpus = 4,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static QEMUMachine midway_machine = {
> @@ -368,7 +367,6 @@ static QEMUMachine midway_machine = {
>      .init = midway_init,
>      .block_default_type = IF_SCSI,
>      .max_cpus = 4,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void calxeda_machines_init(void)
> diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c
> index 249a430..5b20859 100644
> --- a/hw/arm/integratorcp.c
> +++ b/hw/arm/integratorcp.c
> @@ -513,7 +513,6 @@ static QEMUMachine integratorcp_machine = {
>      .desc = "ARM Integrator/CP (ARM926EJ-S)",
>      .init = integratorcp_init,
>      .is_default = 1,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void integratorcp_machine_init(void)
> diff --git a/hw/arm/kzm.c b/hw/arm/kzm.c
> index bd6c05c..0007923 100644
> --- a/hw/arm/kzm.c
> +++ b/hw/arm/kzm.c
> @@ -146,7 +146,6 @@ static QEMUMachine kzm_machine = {
>      .name = "kzm",
>      .desc = "ARM KZM Emulation Baseboard (ARM1136)",
>      .init = kzm_init,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void kzm_machine_init(void)
> diff --git a/hw/arm/mainstone.c b/hw/arm/mainstone.c
> index 8e5fc26..b244f7e 100644
> --- a/hw/arm/mainstone.c
> +++ b/hw/arm/mainstone.c
> @@ -179,7 +179,6 @@ static QEMUMachine mainstone2_machine = {
>      .name = "mainstone",
>      .desc = "Mainstone II (PXA27x)",
>      .init = mainstone_init,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void mainstone_machine_init(void)
> diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
> index b06d442..bed9e16 100644
> --- a/hw/arm/musicpal.c
> +++ b/hw/arm/musicpal.c
> @@ -1681,7 +1681,6 @@ static QEMUMachine musicpal_machine = {
>      .name = "musicpal",
>      .desc = "Marvell 88w8618 / MusicPal (ARM926EJ-S)",
>      .init = musicpal_init,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void musicpal_machine_init(void)
> diff --git a/hw/arm/nseries.c b/hw/arm/nseries.c
> index f6c9dc0..9ef31ca 100644
> --- a/hw/arm/nseries.c
> +++ b/hw/arm/nseries.c
> @@ -1340,7 +1340,7 @@ static void n8x0_init(QEMUMachineInitArgs *args,
>      }
>  
>      if (option_rom[0].name &&
> -        (args->boot_device[0] == 'n' || !args->kernel_filename)) {
> +        (args->boot_order[0] == 'n' || !args->kernel_filename)) {
>          uint8_t nolo_tags[0x10000];
>          /* No, wait, better start at the ROM.  */
>          s->mpu->cpu->env.regs[15] = OMAP2_Q2_BASE + 0x400000;
> @@ -1396,14 +1396,14 @@ static QEMUMachine n800_machine = {
>      .name = "n800",
>      .desc = "Nokia N800 tablet aka. RX-34 (OMAP2420)",
>      .init = n800_init,
> -    DEFAULT_MACHINE_OPTIONS,
> +    .default_boot_order = "",
>  };
>  
>  static QEMUMachine n810_machine = {
>      .name = "n810",
>      .desc = "Nokia N810 tablet aka. RX-44 (OMAP2420)",
>      .init = n810_init,
> -    DEFAULT_MACHINE_OPTIONS,
> +    .default_boot_order = "",
>  };
>  
>  static void nseries_machine_init(void)
> diff --git a/hw/arm/omap_sx1.c b/hw/arm/omap_sx1.c
> index 05b0353..b0f8664 100644
> --- a/hw/arm/omap_sx1.c
> +++ b/hw/arm/omap_sx1.c
> @@ -219,14 +219,12 @@ static QEMUMachine sx1_machine_v2 = {
>      .name = "sx1",
>      .desc = "Siemens SX1 (OMAP310) V2",
>      .init = sx1_init_v2,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static QEMUMachine sx1_machine_v1 = {
>      .name = "sx1-v1",
>      .desc = "Siemens SX1 (OMAP310) V1",
>      .init = sx1_init_v1,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void sx1_machine_init(void)
> diff --git a/hw/arm/palm.c b/hw/arm/palm.c
> index cdc3c3a..3e39044 100644
> --- a/hw/arm/palm.c
> +++ b/hw/arm/palm.c
> @@ -273,7 +273,6 @@ static QEMUMachine palmte_machine = {
>      .name = "cheetah",
>      .desc = "Palm Tungsten|E aka. Cheetah PDA (OMAP310)",
>      .init = palmte_init,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void palmte_machine_init(void)
> diff --git a/hw/arm/realview.c b/hw/arm/realview.c
> index 3060f48..1f4e5b0 100644
> --- a/hw/arm/realview.c
> +++ b/hw/arm/realview.c
> @@ -371,7 +371,6 @@ static QEMUMachine realview_eb_machine = {
>      .desc = "ARM RealView Emulation Baseboard (ARM926EJ-S)",
>      .init = realview_eb_init,
>      .block_default_type = IF_SCSI,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static QEMUMachine realview_eb_mpcore_machine = {
> @@ -380,14 +379,12 @@ static QEMUMachine realview_eb_mpcore_machine = {
>      .init = realview_eb_mpcore_init,
>      .block_default_type = IF_SCSI,
>      .max_cpus = 4,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static QEMUMachine realview_pb_a8_machine = {
>      .name = "realview-pb-a8",
>      .desc = "ARM RealView Platform Baseboard for Cortex-A8",
>      .init = realview_pb_a8_init,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static QEMUMachine realview_pbx_a9_machine = {
> @@ -396,7 +393,6 @@ static QEMUMachine realview_pbx_a9_machine = {
>      .init = realview_pbx_a9_init,
>      .block_default_type = IF_SCSI,
>      .max_cpus = 4,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void realview_machine_init(void)
> diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
> index 593b75e..5062020 100644
> --- a/hw/arm/spitz.c
> +++ b/hw/arm/spitz.c
> @@ -959,28 +959,24 @@ static QEMUMachine akitapda_machine = {
>      .name = "akita",
>      .desc = "Akita PDA (PXA270)",
>      .init = akita_init,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static QEMUMachine spitzpda_machine = {
>      .name = "spitz",
>      .desc = "Spitz PDA (PXA270)",
>      .init = spitz_init,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static QEMUMachine borzoipda_machine = {
>      .name = "borzoi",
>      .desc = "Borzoi PDA (PXA270)",
>      .init = borzoi_init,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static QEMUMachine terrierpda_machine = {
>      .name = "terrier",
>      .desc = "Terrier PDA (PXA270)",
>      .init = terrier_init,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void spitz_machine_init(void)
> diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
> index a2b6b17..3b9bca6 100644
> --- a/hw/arm/stellaris.c
> +++ b/hw/arm/stellaris.c
> @@ -1331,14 +1331,12 @@ static QEMUMachine lm3s811evb_machine = {
>      .name = "lm3s811evb",
>      .desc = "Stellaris LM3S811EVB",
>      .init = lm3s811evb_init,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static QEMUMachine lm3s6965evb_machine = {
>      .name = "lm3s6965evb",
>      .desc = "Stellaris LM3S6965EVB",
>      .init = lm3s6965evb_init,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void stellaris_machine_init(void)
> diff --git a/hw/arm/tosa.c b/hw/arm/tosa.c
> index 47d1f4f..c00d8c2 100644
> --- a/hw/arm/tosa.c
> +++ b/hw/arm/tosa.c
> @@ -251,7 +251,6 @@ static QEMUMachine tosapda_machine = {
>      .name = "tosa",
>      .desc = "Tosa PDA (PXA255)",
>      .init = tosa_init,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void tosapda_machine_init(void)
> diff --git a/hw/arm/versatilepb.c b/hw/arm/versatilepb.c
> index 725f60f..326bf63 100644
> --- a/hw/arm/versatilepb.c
> +++ b/hw/arm/versatilepb.c
> @@ -363,7 +363,6 @@ static QEMUMachine versatilepb_machine = {
>      .desc = "ARM Versatile/PB (ARM926EJ-S)",
>      .init = vpb_init,
>      .block_default_type = IF_SCSI,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static QEMUMachine versatileab_machine = {
> @@ -371,7 +370,6 @@ static QEMUMachine versatileab_machine = {
>      .desc = "ARM Versatile/AB (ARM926EJ-S)",
>      .init = vab_init,
>      .block_default_type = IF_SCSI,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void versatile_machine_init(void)
> diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
> index 7d1b823..072e91c 100644
> --- a/hw/arm/vexpress.c
> +++ b/hw/arm/vexpress.c
> @@ -553,7 +553,6 @@ static QEMUMachine vexpress_a9_machine = {
>      .init = vexpress_a9_init,
>      .block_default_type = IF_SCSI,
>      .max_cpus = 4,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static QEMUMachine vexpress_a15_machine = {
> @@ -562,7 +561,6 @@ static QEMUMachine vexpress_a15_machine = {
>      .init = vexpress_a15_init,
>      .block_default_type = IF_SCSI,
>      .max_cpus = 4,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void vexpress_machine_init(void)
> diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
> index 3444823..608686a 100644
> --- a/hw/arm/xilinx_zynq.c
> +++ b/hw/arm/xilinx_zynq.c
> @@ -236,7 +236,6 @@ static QEMUMachine zynq_machine = {
>      .block_default_type = IF_SCSI,
>      .max_cpus = 1,
>      .no_sdcard = 1,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void zynq_machine_init(void)
> diff --git a/hw/arm/z2.c b/hw/arm/z2.c
> index 07a127b..2e0d5d4 100644
> --- a/hw/arm/z2.c
> +++ b/hw/arm/z2.c
> @@ -373,7 +373,6 @@ static QEMUMachine z2_machine = {
>      .name = "z2",
>      .desc = "Zipit Z2 (PXA27x)",
>      .init = z2_init,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void z2_machine_init(void)
> diff --git a/hw/core/null-machine.c b/hw/core/null-machine.c
> index bdf109f..d813c08 100644
> --- a/hw/core/null-machine.c
> +++ b/hw/core/null-machine.c
> @@ -24,7 +24,6 @@ static QEMUMachine machine_none = {
>      .desc = "empty machine",
>      .init = machine_none_init,
>      .max_cpus = 0,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void register_machines(void)
> diff --git a/hw/cris/axis_dev88.c b/hw/cris/axis_dev88.c
> index 9104d61..03058d3 100644
> --- a/hw/cris/axis_dev88.c
> +++ b/hw/cris/axis_dev88.c
> @@ -355,7 +355,6 @@ static QEMUMachine axisdev88_machine = {
>      .desc = "AXIS devboard 88",
>      .init = axisdev88_init,
>      .is_default = 1,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void axisdev88_machine_init(void)
> diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
> index 9327ac1..3700bd5 100644
> --- a/hw/i386/pc_piix.c
> +++ b/hw/i386/pc_piix.c
> @@ -216,7 +216,7 @@ static void pc_init1(QEMUMachineInitArgs *args,
>          }
>      }
>  
> -    pc_cmos_init(below_4g_mem_size, above_4g_mem_size, args->boot_device,
> +    pc_cmos_init(below_4g_mem_size, above_4g_mem_size, args->boot_order,
>                   floppy, idebus[0], idebus[1], rtc_state);
>  
>      if (pci_enabled && usb_enabled(false)) {
> @@ -324,7 +324,7 @@ static QEMUMachine pc_i440fx_machine_v1_6 = {
>      .hot_add_cpu = pc_hot_add_cpu,
>      .max_cpus = 255,
>      .is_default = 1,
> -    DEFAULT_MACHINE_OPTIONS,
> +    .default_boot_order = "cad",
>  };
>  
>  static QEMUMachine pc_i440fx_machine_v1_5 = {
> @@ -337,7 +337,7 @@ static QEMUMachine pc_i440fx_machine_v1_5 = {
>          PC_COMPAT_1_5,
>          { /* end of list */ }
>      },
> -    DEFAULT_MACHINE_OPTIONS,
> +    .default_boot_order = "cad",
>  };
>  
>  static QEMUMachine pc_i440fx_machine_v1_4 = {

So all PC machine types share this?
Can we set this in some common code, somehow?


> @@ -345,11 +345,11 @@ static QEMUMachine pc_i440fx_machine_v1_4 = {
>      .desc = "Standard PC (i440FX + PIIX, 1996)",
>      .init = pc_init_pci_1_4,
>      .max_cpus = 255,
> +    .default_boot_order = "cad",
>      .compat_props = (GlobalProperty[]) {
>          PC_COMPAT_1_4,
>          { /* end of list */ }
>      },
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  #define PC_COMPAT_1_3 \
> @@ -377,11 +377,11 @@ static QEMUMachine pc_machine_v1_3 = {
>      .desc = "Standard PC",
>      .init = pc_init_pci_1_3,
>      .max_cpus = 255,
> +    .default_boot_order = "cad",
>      .compat_props = (GlobalProperty[]) {
>          PC_COMPAT_1_3,
>          { /* end of list */ }
>      },
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  #define PC_COMPAT_1_2 \
> @@ -417,11 +417,11 @@ static QEMUMachine pc_machine_v1_2 = {
>      .desc = "Standard PC",
>      .init = pc_init_pci_1_2,
>      .max_cpus = 255,
> +    .default_boot_order = "cad",
>      .compat_props = (GlobalProperty[]) {
>          PC_COMPAT_1_2,
>          { /* end of list */ }
>      },
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  #define PC_COMPAT_1_1 \
> @@ -461,11 +461,11 @@ static QEMUMachine pc_machine_v1_1 = {
>      .desc = "Standard PC",
>      .init = pc_init_pci_1_2,
>      .max_cpus = 255,
> +    .default_boot_order = "cad",
>      .compat_props = (GlobalProperty[]) {
>          PC_COMPAT_1_1,
>          { /* end of list */ }
>      },
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  #define PC_COMPAT_1_0 \
> @@ -497,12 +497,12 @@ static QEMUMachine pc_machine_v1_0 = {
>      .desc = "Standard PC",
>      .init = pc_init_pci_1_0,
>      .max_cpus = 255,
> +    .default_boot_order = "cad",
>      .compat_props = (GlobalProperty[]) {
>          PC_COMPAT_1_0,
>          { /* end of list */ }
>      },
>      .hw_version = "1.0",
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  #define PC_COMPAT_0_15 \
> @@ -513,12 +513,12 @@ static QEMUMachine pc_machine_v0_15 = {
>      .desc = "Standard PC",
>      .init = pc_init_pci_1_0,
>      .max_cpus = 255,
> +    .default_boot_order = "cad",
>      .compat_props = (GlobalProperty[]) {
>          PC_COMPAT_0_15,
>          { /* end of list */ }
>      },
>      .hw_version = "0.15",
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  #define PC_COMPAT_0_14 \
> @@ -546,6 +546,7 @@ static QEMUMachine pc_machine_v0_14 = {
>      .desc = "Standard PC",
>      .init = pc_init_pci_1_0,
>      .max_cpus = 255,
> +    .default_boot_order = "cad",
>      .compat_props = (GlobalProperty[]) {
>          PC_COMPAT_0_14, 
>          {
> @@ -560,7 +561,6 @@ static QEMUMachine pc_machine_v0_14 = {
>          { /* end of list */ }
>      },
>      .hw_version = "0.14",
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  #define PC_COMPAT_0_13 \
> @@ -580,6 +580,7 @@ static QEMUMachine pc_machine_v0_13 = {
>      .desc = "Standard PC",
>      .init = pc_init_pci_no_kvmclock,
>      .max_cpus = 255,
> +    .default_boot_order = "cad",
>      .compat_props = (GlobalProperty[]) {
>          PC_COMPAT_0_13,
>          {
> @@ -598,7 +599,6 @@ static QEMUMachine pc_machine_v0_13 = {
>          { /* end of list */ }
>      },
>      .hw_version = "0.13",
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  #define PC_COMPAT_0_12 \
> @@ -630,6 +630,7 @@ static QEMUMachine pc_machine_v0_12 = {
>      .desc = "Standard PC",
>      .init = pc_init_pci_no_kvmclock,
>      .max_cpus = 255,
> +    .default_boot_order = "cad",
>      .compat_props = (GlobalProperty[]) {
>          PC_COMPAT_0_12,
>          {
> @@ -644,7 +645,6 @@ static QEMUMachine pc_machine_v0_12 = {
>          { /* end of list */ }
>      },
>      .hw_version = "0.12",
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  #define PC_COMPAT_0_11 \
> @@ -664,6 +664,7 @@ static QEMUMachine pc_machine_v0_11 = {
>      .desc = "Standard PC, qemu 0.11",
>      .init = pc_init_pci_no_kvmclock,
>      .max_cpus = 255,
> +    .default_boot_order = "cad",
>      .compat_props = (GlobalProperty[]) {
>          PC_COMPAT_0_11,
>          {
> @@ -678,7 +679,6 @@ static QEMUMachine pc_machine_v0_11 = {
>          { /* end of list */ }
>      },
>      .hw_version = "0.11",
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static QEMUMachine pc_machine_v0_10 = {
> @@ -686,6 +686,7 @@ static QEMUMachine pc_machine_v0_10 = {
>      .desc = "Standard PC, qemu 0.10",
>      .init = pc_init_pci_no_kvmclock,
>      .max_cpus = 255,
> +    .default_boot_order = "cad",
>      .compat_props = (GlobalProperty[]) {
>          PC_COMPAT_0_11,
>          {
> @@ -712,7 +713,6 @@ static QEMUMachine pc_machine_v0_10 = {
>          { /* end of list */ }
>      },
>      .hw_version = "0.10",
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static QEMUMachine isapc_machine = {
> @@ -720,6 +720,7 @@ static QEMUMachine isapc_machine = {
>      .desc = "ISA-only PC",
>      .init = pc_init_isa,
>      .max_cpus = 1,
> +    .default_boot_order = "cad",
>      .compat_props = (GlobalProperty[]) {
>          {
>              .driver   = "pc-sysfw",
> @@ -733,7 +734,6 @@ static QEMUMachine isapc_machine = {
>          },
>          { /* end of list */ }
>      },
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  #ifdef CONFIG_XEN
> @@ -743,7 +743,7 @@ static QEMUMachine xenfv_machine = {
>      .init = pc_xen_hvm_init,
>      .max_cpus = HVM_MAX_VCPUS,
>      .default_machine_opts = "accel=xen",
> -    DEFAULT_MACHINE_OPTIONS,
> +    .default_boot_order = "cad",
>  };
>  #endif
>  
> diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
> index 1657eb3..28ecf76 100644
> --- a/hw/i386/pc_q35.c
> +++ b/hw/i386/pc_q35.c
> @@ -195,7 +195,7 @@ static void pc_q35_init(QEMUMachineInitArgs *args)
>                                      0xb100),
>                        8, NULL, 0);
>  
> -    pc_cmos_init(below_4g_mem_size, above_4g_mem_size, args->boot_device,
> +    pc_cmos_init(below_4g_mem_size, above_4g_mem_size, args->boot_order,
>                   floppy, idebus[0], idebus[1], rtc_state);
>  
>      /* the rest devices to which pci devfn is automatically assigned */
> @@ -230,7 +230,7 @@ static QEMUMachine pc_q35_machine_v1_6 = {
>      .init = pc_q35_init,
>      .hot_add_cpu = pc_hot_add_cpu,
>      .max_cpus = 255,
> -    DEFAULT_MACHINE_OPTIONS,
> +    .default_boot_order = "cad",
>  };
>  
>  static QEMUMachine pc_q35_machine_v1_5 = {
> @@ -239,11 +239,11 @@ static QEMUMachine pc_q35_machine_v1_5 = {
>      .init = pc_q35_init_1_5,
>      .hot_add_cpu = pc_hot_add_cpu,
>      .max_cpus = 255,
> +    .default_boot_order = "cad",
>      .compat_props = (GlobalProperty[]) {
>          PC_COMPAT_1_5,
>          { /* end of list */ }
>      },
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static QEMUMachine pc_q35_machine_v1_4 = {
> @@ -251,11 +251,11 @@ static QEMUMachine pc_q35_machine_v1_4 = {
>      .desc = "Standard PC (Q35 + ICH9, 2009)",
>      .init = pc_q35_init_1_4,
>      .max_cpus = 255,
> +    .default_boot_order = "cad",
>      .compat_props = (GlobalProperty[]) {
>          PC_COMPAT_1_4,
>          { /* end of list */ }
>      },
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void pc_q35_machine_init(void)
> diff --git a/hw/i386/xen_machine_pv.c b/hw/i386/xen_machine_pv.c
> index 9f2e291..9adb57f 100644
> --- a/hw/i386/xen_machine_pv.c
> +++ b/hw/i386/xen_machine_pv.c
> @@ -99,7 +99,6 @@ static QEMUMachine xenpv_machine = {
>      .init = xen_init_pv,
>      .max_cpus = 1,
>      .default_machine_opts = "accel=xen",
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void xenpv_machine_init(void)
> diff --git a/hw/lm32/lm32_boards.c b/hw/lm32/lm32_boards.c
> index 62003b8..c032bb8 100644
> --- a/hw/lm32/lm32_boards.c
> +++ b/hw/lm32/lm32_boards.c
> @@ -289,7 +289,6 @@ static QEMUMachine lm32_evr_machine = {
>      .desc = "LatticeMico32 EVR32 eval system",
>      .init = lm32_evr_init,
>      .is_default = 1,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static QEMUMachine lm32_uclinux_machine = {
> @@ -297,7 +296,6 @@ static QEMUMachine lm32_uclinux_machine = {
>      .desc = "lm32 platform for uClinux and u-boot by Theobroma Systems",
>      .init = lm32_uclinux_init,
>      .is_default = 0,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void lm32_machine_init(void)
> diff --git a/hw/lm32/milkymist.c b/hw/lm32/milkymist.c
> index 7ceedb8..f1744ec 100644
> --- a/hw/lm32/milkymist.c
> +++ b/hw/lm32/milkymist.c
> @@ -208,7 +208,6 @@ static QEMUMachine milkymist_machine = {
>      .desc = "Milkymist One",
>      .init = milkymist_init,
>      .is_default = 0,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void milkymist_machine_init(void)
> diff --git a/hw/m68k/an5206.c b/hw/m68k/an5206.c
> index 0c03a87..a8eee44 100644
> --- a/hw/m68k/an5206.c
> +++ b/hw/m68k/an5206.c
> @@ -89,7 +89,6 @@ static QEMUMachine an5206_machine = {
>      .name = "an5206",
>      .desc = "Arnewsh 5206",
>      .init = an5206_init,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void an5206_machine_init(void)
> diff --git a/hw/m68k/dummy_m68k.c b/hw/m68k/dummy_m68k.c
> index f4ed7c6..86e2e6e 100644
> --- a/hw/m68k/dummy_m68k.c
> +++ b/hw/m68k/dummy_m68k.c
> @@ -73,7 +73,6 @@ static QEMUMachine dummy_m68k_machine = {
>      .name = "dummy",
>      .desc = "Dummy board",
>      .init = dummy_m68k_init,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void dummy_m68k_machine_init(void)
> diff --git a/hw/m68k/mcf5208.c b/hw/m68k/mcf5208.c
> index 9cf000f..fb96fe8 100644
> --- a/hw/m68k/mcf5208.c
> +++ b/hw/m68k/mcf5208.c
> @@ -295,7 +295,6 @@ static QEMUMachine mcf5208evb_machine = {
>      .desc = "MCF5206EVB",
>      .init = mcf5208evb_init,
>      .is_default = 1,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void mcf5208evb_machine_init(void)
> diff --git a/hw/microblaze/petalogix_ml605_mmu.c b/hw/microblaze/petalogix_ml605_mmu.c
> index 989da25..e003c7c 100644
> --- a/hw/microblaze/petalogix_ml605_mmu.c
> +++ b/hw/microblaze/petalogix_ml605_mmu.c
> @@ -186,7 +186,6 @@ static QEMUMachine petalogix_ml605_machine = {
>      .desc = "PetaLogix linux refdesign for xilinx ml605 little endian",
>      .init = petalogix_ml605_init,
>      .is_default = 0,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void petalogix_ml605_machine_init(void)
> diff --git a/hw/microblaze/petalogix_s3adsp1800_mmu.c b/hw/microblaze/petalogix_s3adsp1800_mmu.c
> index a461494..00af2b5 100644
> --- a/hw/microblaze/petalogix_s3adsp1800_mmu.c
> +++ b/hw/microblaze/petalogix_s3adsp1800_mmu.c
> @@ -116,7 +116,6 @@ static QEMUMachine petalogix_s3adsp1800_machine = {
>      .desc = "PetaLogix linux refdesign for xilinx Spartan 3ADSP1800",
>      .init = petalogix_s3adsp1800_init,
>      .is_default = 1,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void petalogix_s3adsp1800_machine_init(void)
> diff --git a/hw/mips/mips_fulong2e.c b/hw/mips/mips_fulong2e.c
> index 9e305d2..bf9ae4a 100644
> --- a/hw/mips/mips_fulong2e.c
> +++ b/hw/mips/mips_fulong2e.c
> @@ -400,7 +400,6 @@ static QEMUMachine mips_fulong2e_machine = {
>      .name = "fulong2e",
>      .desc = "Fulong 2e mini pc",
>      .init = mips_fulong2e_init,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void mips_fulong2e_machine_init(void)
> diff --git a/hw/mips/mips_jazz.c b/hw/mips/mips_jazz.c
> index 31e138b..bf12faa 100644
> --- a/hw/mips/mips_jazz.c
> +++ b/hw/mips/mips_jazz.c
> @@ -323,7 +323,6 @@ static QEMUMachine mips_magnum_machine = {
>      .desc = "MIPS Magnum",
>      .init = mips_magnum_init,
>      .block_default_type = IF_SCSI,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static QEMUMachine mips_pica61_machine = {
> @@ -331,7 +330,6 @@ static QEMUMachine mips_pica61_machine = {
>      .desc = "Acer Pica 61",
>      .init = mips_pica61_init,
>      .block_default_type = IF_SCSI,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void mips_jazz_machine_init(void)
> diff --git a/hw/mips/mips_malta.c b/hw/mips/mips_malta.c
> index de87241..cb22279 100644
> --- a/hw/mips/mips_malta.c
> +++ b/hw/mips/mips_malta.c
> @@ -1017,7 +1017,6 @@ static QEMUMachine mips_malta_machine = {
>      .init = mips_malta_init,
>      .max_cpus = 16,
>      .is_default = 1,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void mips_malta_register_types(void)
> diff --git a/hw/mips/mips_mipssim.c b/hw/mips/mips_mipssim.c
> index a10cf13..ea5868c 100644
> --- a/hw/mips/mips_mipssim.c
> +++ b/hw/mips/mips_mipssim.c
> @@ -229,7 +229,6 @@ static QEMUMachine mips_mipssim_machine = {
>      .name = "mipssim",
>      .desc = "MIPS MIPSsim platform",
>      .init = mips_mipssim_init,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void mips_mipssim_machine_init(void)
> diff --git a/hw/mips/mips_r4k.c b/hw/mips/mips_r4k.c
> index 22beb0a..cf569c1 100644
> --- a/hw/mips/mips_r4k.c
> +++ b/hw/mips/mips_r4k.c
> @@ -302,7 +302,6 @@ static QEMUMachine mips_machine = {
>      .name = "mips",
>      .desc = "mips r4k platform",
>      .init = mips_r4k_init,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void mips_machine_init(void)
> diff --git a/hw/openrisc/openrisc_sim.c b/hw/openrisc/openrisc_sim.c
> index 924438b..2e32bea 100644
> --- a/hw/openrisc/openrisc_sim.c
> +++ b/hw/openrisc/openrisc_sim.c
> @@ -139,7 +139,6 @@ static QEMUMachine openrisc_sim_machine = {
>      .init = openrisc_sim_init,
>      .max_cpus = 1,
>      .is_default = 1,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void openrisc_sim_machine_init(void)
> diff --git a/hw/ppc/e500plat.c b/hw/ppc/e500plat.c
> index bf65b69..2e964b2 100644
> --- a/hw/ppc/e500plat.c
> +++ b/hw/ppc/e500plat.c
> @@ -51,7 +51,6 @@ static QEMUMachine e500plat_machine = {
>      .desc = "generic paravirt e500 platform",
>      .init = e500plat_init,
>      .max_cpus = 32,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void e500plat_machine_init(void)
> diff --git a/hw/ppc/mac_newworld.c b/hw/ppc/mac_newworld.c
> index fe80348..670c473 100644
> --- a/hw/ppc/mac_newworld.c
> +++ b/hw/ppc/mac_newworld.c
> @@ -147,7 +147,7 @@ static void ppc_core99_init(QEMUMachineInitArgs *args)
>      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;
> +    const char *boot_device = args->boot_order;
>      PowerPCCPU *cpu = NULL;
>      CPUPPCState *env = NULL;
>      char *filename;
> @@ -474,7 +474,7 @@ static QEMUMachine core99_machine = {
>      .desc = "Mac99 based PowerMAC",
>      .init = ppc_core99_init,
>      .max_cpus = MAX_CPUS,
> -    DEFAULT_MACHINE_OPTIONS,
> +    .default_boot_order = "cd",
>  };
>  
>  static void core99_machine_init(void)
> diff --git a/hw/ppc/mac_oldworld.c b/hw/ppc/mac_oldworld.c
> index 8b8c6b9..a3ec9a5 100644
> --- a/hw/ppc/mac_oldworld.c
> +++ b/hw/ppc/mac_oldworld.c
> @@ -78,7 +78,7 @@ static void ppc_heathrow_init(QEMUMachineInitArgs *args)
>      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;
> +    const char *boot_device = args->boot_order;
>      MemoryRegion *sysmem = get_system_memory();
>      PowerPCCPU *cpu = NULL;
>      CPUPPCState *env = NULL;
> @@ -347,7 +347,7 @@ static QEMUMachine heathrow_machine = {
>  #ifndef TARGET_PPC64
>      .is_default = 1,
>  #endif
> -    DEFAULT_MACHINE_OPTIONS,
> +    .default_boot_order = "cd", /* TOFIX "cad" when Mac floppy is implemented */
>  };
>  
>  static void heathrow_machine_init(void)
> diff --git a/hw/ppc/mpc8544ds.c b/hw/ppc/mpc8544ds.c
> index 1888e75..edcc0be 100644
> --- a/hw/ppc/mpc8544ds.c
> +++ b/hw/ppc/mpc8544ds.c
> @@ -44,7 +44,6 @@ static QEMUMachine ppce500_machine = {
>      .desc = "mpc8544ds",
>      .init = mpc8544ds_init,
>      .max_cpus = 15,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void ppce500_machine_init(void)
> diff --git a/hw/ppc/ppc405_boards.c b/hw/ppc/ppc405_boards.c
> index f74e5e5..43a83ca 100644
> --- a/hw/ppc/ppc405_boards.c
> +++ b/hw/ppc/ppc405_boards.c
> @@ -362,7 +362,6 @@ static QEMUMachine ref405ep_machine = {
>      .name = "ref405ep",
>      .desc = "ref405ep",
>      .init = ref405ep_init,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  /*****************************************************************************/
> @@ -650,7 +649,6 @@ static QEMUMachine taihu_machine = {
>      .name = "taihu",
>      .desc = "taihu",
>      .init = taihu_405ep_init,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void ppc405_machine_init(void)
> diff --git a/hw/ppc/ppc440_bamboo.c b/hw/ppc/ppc440_bamboo.c
> index 5b039ab..698ec87 100644
> --- a/hw/ppc/ppc440_bamboo.c
> +++ b/hw/ppc/ppc440_bamboo.c
> @@ -293,7 +293,6 @@ static QEMUMachine bamboo_machine = {
>      .name = "bamboo",
>      .desc = "bamboo",
>      .init = bamboo_init,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void bamboo_machine_init(void)
> diff --git a/hw/ppc/prep.c b/hw/ppc/prep.c
> index 19f2442..e884d3e 100644
> --- a/hw/ppc/prep.c
> +++ b/hw/ppc/prep.c
> @@ -452,7 +452,7 @@ static void ppc_prep_init(QEMUMachineInitArgs *args)
>      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;
> +    const char *boot_device = args->boot_order;
>      MemoryRegion *sysmem = get_system_memory();
>      PowerPCCPU *cpu = NULL;
>      CPUPPCState *env = NULL;
> @@ -691,7 +691,7 @@ static QEMUMachine prep_machine = {
>      .desc = "PowerPC PREP platform",
>      .init = ppc_prep_init,
>      .max_cpus = MAX_CPUS,
> -    DEFAULT_MACHINE_OPTIONS,
> +    .default_boot_order = "cad",
>  };
>  
>  static void prep_machine_init(void)
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index 48ae092..805261a 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -718,7 +718,7 @@ static void ppc_spapr_init(QEMUMachineInitArgs *args)
>      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;
> +    const char *boot_device = args->boot_order;
>      PowerPCCPU *cpu;
>      CPUPPCState *env;
>      PCIHostState *phb;
> @@ -971,7 +971,7 @@ static QEMUMachine spapr_machine = {
>      .block_default_type = IF_SCSI,
>      .max_cpus = MAX_CPUS,
>      .no_parallel = 1,
> -    .boot_order = NULL,
> +    .default_boot_order = NULL,
>  };
>  
>  static void spapr_machine_init(void)
> diff --git a/hw/ppc/virtex_ml507.c b/hw/ppc/virtex_ml507.c
> index 08e77fb..7250f51 100644
> --- a/hw/ppc/virtex_ml507.c
> +++ b/hw/ppc/virtex_ml507.c
> @@ -245,7 +245,6 @@ static QEMUMachine virtex_machine = {
>      .name = "virtex-ml507",
>      .desc = "Xilinx Virtex ML507 reference design",
>      .init = virtex_init,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void virtex_machine_init(void)
> diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
> index aebbbf1..e2681a6 100644
> --- a/hw/s390x/s390-virtio-ccw.c
> +++ b/hw/s390x/s390-virtio-ccw.c
> @@ -126,7 +126,6 @@ static QEMUMachine ccw_machine = {
>      .no_sdcard = 1,
>      .use_sclp = 1,
>      .max_cpus = 255,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void ccw_machine_init(void)
> diff --git a/hw/s390x/s390-virtio.c b/hw/s390x/s390-virtio.c
> index edbde00..df52f1f 100644
> --- a/hw/s390x/s390-virtio.c
> +++ b/hw/s390x/s390-virtio.c
> @@ -293,7 +293,6 @@ static QEMUMachine s390_machine = {
>      .use_virtcon = 1,
>      .max_cpus = 255,
>      .is_default = 1,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void s390_machine_init(void)
> diff --git a/hw/sh4/r2d.c b/hw/sh4/r2d.c
> index 98b3408..7b1de85 100644
> --- a/hw/sh4/r2d.c
> +++ b/hw/sh4/r2d.c
> @@ -356,7 +356,6 @@ static QEMUMachine r2d_machine = {
>      .name = "r2d",
>      .desc = "r2d-plus board",
>      .init = r2d_init,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void r2d_machine_init(void)
> diff --git a/hw/sh4/shix.c b/hw/sh4/shix.c
> index 84dd666..1ff37f5 100644
> --- a/hw/sh4/shix.c
> +++ b/hw/sh4/shix.c
> @@ -96,7 +96,6 @@ static QEMUMachine shix_machine = {
>      .desc = "shix card",
>      .init = shix_init,
>      .is_default = 1,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void shix_machine_init(void)
> diff --git a/hw/sparc/leon3.c b/hw/sparc/leon3.c
> index 5ef282f..390f3e4 100644
> --- a/hw/sparc/leon3.c
> +++ b/hw/sparc/leon3.c
> @@ -216,7 +216,6 @@ static QEMUMachine leon3_generic_machine = {
>      .name     = "leon3_generic",
>      .desc     = "Leon-3 generic",
>      .init     = leon3_generic_hw_init,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void leon3_machine_init(void)
> diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c
> index 97c3ee0..ad09312 100644
> --- a/hw/sparc/sun4m.c
> +++ b/hw/sparc/sun4m.c
> @@ -976,7 +976,7 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef,
>                                      args->ram_size);
>  
>      nvram_init(nvram, (uint8_t *)&nd_table[0].macaddr, args->kernel_cmdline,
> -               args->boot_device, args->ram_size, kernel_size, graphic_width,
> +               args->boot_order, args->ram_size, kernel_size, graphic_width,
>                 graphic_height, graphic_depth, hwdef->nvram_machine_id,
>                 "Sun4m");
>  
> @@ -1005,7 +1005,7 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef,
>      }
>      fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_ADDR, INITRD_LOAD_ADDR);
>      fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_SIZE, 0); // not used
> -    fw_cfg_add_i16(fw_cfg, FW_CFG_BOOT_DEVICE, args->boot_device[0]);
> +    fw_cfg_add_i16(fw_cfg, FW_CFG_BOOT_DEVICE, args->boot_order[0]);
>      qemu_register_boot_set(fw_cfg_boot_set, fw_cfg);
>  }
>  
> @@ -1326,7 +1326,7 @@ static QEMUMachine ss5_machine = {
>      .init = ss5_init,
>      .block_default_type = IF_SCSI,
>      .is_default = 1,
> -    DEFAULT_MACHINE_OPTIONS,
> +    .default_boot_order = "c",
>  };
>  
>  static QEMUMachine ss10_machine = {
> @@ -1335,7 +1335,7 @@ static QEMUMachine ss10_machine = {
>      .init = ss10_init,
>      .block_default_type = IF_SCSI,
>      .max_cpus = 4,
> -    DEFAULT_MACHINE_OPTIONS,
> +    .default_boot_order = "c",
>  };
>  
>  static QEMUMachine ss600mp_machine = {
> @@ -1344,7 +1344,7 @@ static QEMUMachine ss600mp_machine = {
>      .init = ss600mp_init,
>      .block_default_type = IF_SCSI,
>      .max_cpus = 4,
> -    DEFAULT_MACHINE_OPTIONS,
> +    .default_boot_order = "c",
>  };
>  
>  static QEMUMachine ss20_machine = {
> @@ -1353,7 +1353,7 @@ static QEMUMachine ss20_machine = {
>      .init = ss20_init,
>      .block_default_type = IF_SCSI,
>      .max_cpus = 4,
> -    DEFAULT_MACHINE_OPTIONS,
> +    .default_boot_order = "c",
>  };
>  
>  static QEMUMachine voyager_machine = {
> @@ -1361,7 +1361,7 @@ static QEMUMachine voyager_machine = {
>      .desc = "Sun4m platform, SPARCstation Voyager",
>      .init = vger_init,
>      .block_default_type = IF_SCSI,
> -    DEFAULT_MACHINE_OPTIONS,
> +    .default_boot_order = "c",
>  };
>  
>  static QEMUMachine ss_lx_machine = {
> @@ -1369,7 +1369,7 @@ static QEMUMachine ss_lx_machine = {
>      .desc = "Sun4m platform, SPARCstation LX",
>      .init = ss_lx_init,
>      .block_default_type = IF_SCSI,
> -    DEFAULT_MACHINE_OPTIONS,
> +    .default_boot_order = "c",
>  };
>  
>  static QEMUMachine ss4_machine = {
> @@ -1377,7 +1377,7 @@ static QEMUMachine ss4_machine = {
>      .desc = "Sun4m platform, SPARCstation 4",
>      .init = ss4_init,
>      .block_default_type = IF_SCSI,
> -    DEFAULT_MACHINE_OPTIONS,
> +    .default_boot_order = "c",
>  };
>  
>  static QEMUMachine scls_machine = {
> @@ -1385,7 +1385,7 @@ static QEMUMachine scls_machine = {
>      .desc = "Sun4m platform, SPARCClassic",
>      .init = scls_init,
>      .block_default_type = IF_SCSI,
> -    DEFAULT_MACHINE_OPTIONS,
> +    .default_boot_order = "c",
>  };
>  
>  static QEMUMachine sbook_machine = {
> @@ -1393,7 +1393,7 @@ static QEMUMachine sbook_machine = {
>      .desc = "Sun4m platform, SPARCbook",
>      .init = sbook_init,
>      .block_default_type = IF_SCSI,
> -    DEFAULT_MACHINE_OPTIONS,
> +    .default_boot_order = "c",
>  };
>  
>  static void sun4m_register_types(void)
> diff --git a/hw/sparc64/sun4u.c b/hw/sparc64/sun4u.c
> index 22e9818..9f726b4 100644
> --- a/hw/sparc64/sun4u.c
> +++ b/hw/sparc64/sun4u.c
> @@ -872,7 +872,7 @@ static void sun4uv_init(MemoryRegion *address_space_mem,
>                                      &kernel_addr, &kernel_entry);
>  
>      sun4u_NVRAM_set_params(nvram, NVRAM_SIZE, "Sun4u", args->ram_size,
> -                           args->boot_device,
> +                           args->boot_order,
>                             kernel_addr, kernel_size,
>                             args->kernel_cmdline,
>                             initrd_addr, initrd_size,
> @@ -897,7 +897,7 @@ static void sun4uv_init(MemoryRegion *address_space_mem,
>      }
>      fw_cfg_add_i64(fw_cfg, FW_CFG_INITRD_ADDR, initrd_addr);
>      fw_cfg_add_i64(fw_cfg, FW_CFG_INITRD_SIZE, initrd_size);
> -    fw_cfg_add_i16(fw_cfg, FW_CFG_BOOT_DEVICE, args->boot_device[0]);
> +    fw_cfg_add_i16(fw_cfg, FW_CFG_BOOT_DEVICE, args->boot_order[0]);
>  
>      fw_cfg_add_i16(fw_cfg, FW_CFG_SPARC64_WIDTH, graphic_width);
>      fw_cfg_add_i16(fw_cfg, FW_CFG_SPARC64_HEIGHT, graphic_height);
> @@ -960,7 +960,7 @@ static QEMUMachine sun4u_machine = {
>      .init = sun4u_init,
>      .max_cpus = 1, // XXX for now
>      .is_default = 1,
> -    DEFAULT_MACHINE_OPTIONS,
> +    .default_boot_order = "c",
>  };
>  
>  static QEMUMachine sun4v_machine = {
> @@ -968,7 +968,7 @@ static QEMUMachine sun4v_machine = {
>      .desc = "Sun4v platform",
>      .init = sun4v_init,
>      .max_cpus = 1, // XXX for now
> -    DEFAULT_MACHINE_OPTIONS,
> +    .default_boot_order = "c",
>  };
>  
>  static QEMUMachine niagara_machine = {
> @@ -976,7 +976,7 @@ static QEMUMachine niagara_machine = {
>      .desc = "Sun4v platform, Niagara",
>      .init = niagara_init,
>      .max_cpus = 1, // XXX for now
> -    DEFAULT_MACHINE_OPTIONS,
> +    .default_boot_order = "c",
>  };
>  
>  static void sun4u_register_types(void)
> diff --git a/hw/unicore32/puv3.c b/hw/unicore32/puv3.c
> index 5ff0dc9..a900061 100644
> --- a/hw/unicore32/puv3.c
> +++ b/hw/unicore32/puv3.c
> @@ -128,7 +128,6 @@ static QEMUMachine puv3_machine = {
>      .desc = "PKUnity Version-3 based on UniCore32",
>      .init = puv3_init,
>      .is_default = 1,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void puv3_machine_init(void)
> diff --git a/hw/xtensa/xtensa_lx60.c b/hw/xtensa/xtensa_lx60.c
> index 075daf1..3d2f990 100644
> --- a/hw/xtensa/xtensa_lx60.c
> +++ b/hw/xtensa/xtensa_lx60.c
> @@ -295,7 +295,6 @@ static QEMUMachine xtensa_lx60_machine = {
>      .desc = "lx60 EVB (" XTENSA_DEFAULT_CPU_MODEL ")",
>      .init = xtensa_lx60_init,
>      .max_cpus = 4,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static QEMUMachine xtensa_lx200_machine = {
> @@ -303,7 +302,6 @@ static QEMUMachine xtensa_lx200_machine = {
>      .desc = "lx200 EVB (" XTENSA_DEFAULT_CPU_MODEL ")",
>      .init = xtensa_lx200_init,
>      .max_cpus = 4,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void xtensa_lx_machines_init(void)
> diff --git a/hw/xtensa/xtensa_sim.c b/hw/xtensa/xtensa_sim.c
> index a88707e..af9af10 100644
> --- a/hw/xtensa/xtensa_sim.c
> +++ b/hw/xtensa/xtensa_sim.c
> @@ -106,7 +106,6 @@ static QEMUMachine xtensa_sim_machine = {
>      .is_default = true,
>      .init = xtensa_sim_init,
>      .max_cpus = 4,
> -    DEFAULT_MACHINE_OPTIONS,
>  };
>  
>  static void xtensa_sim_machine_init(void)
> diff --git a/include/hw/boards.h b/include/hw/boards.h
> index fb7c6f1..5a7ae9f 100644
> --- a/include/hw/boards.h
> +++ b/include/hw/boards.h
> @@ -6,12 +6,9 @@
>  #include "sysemu/blockdev.h"
>  #include "hw/qdev.h"
>  
> -#define DEFAULT_MACHINE_OPTIONS \
> -    .boot_order = "cad"
> -
>  typedef struct QEMUMachineInitArgs {
>      ram_addr_t ram_size;
> -    const char *boot_device;
> +    const char *boot_order;
>      const char *kernel_filename;
>      const char *kernel_cmdline;
>      const char *initrd_filename;
> @@ -42,7 +39,7 @@ typedef struct QEMUMachine {
>          no_sdcard:1;
>      int is_default;
>      const char *default_machine_opts;
> -    const char *boot_order;
> +    const char *default_boot_order;
>      GlobalProperty *compat_props;
>      struct QEMUMachine *next;
>      const char *hw_version;
> diff --git a/vl.c b/vl.c
> index 25b8f2f..dcd7661 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -4121,7 +4121,7 @@ int main(int argc, char **argv, char **envp)
>      kernel_cmdline = qemu_opt_get(machine_opts, "append");
>  
>      if (!boot_order) {
> -        boot_order = machine->boot_order;
> +        boot_order = machine->default_boot_order;
>      }
>      opts = qemu_opts_find(qemu_find_opts("boot-opts"), NULL);
>      if (opts) {
> @@ -4309,7 +4309,7 @@ int main(int argc, char **argv, char **envp)
>      qdev_machine_init();
>  
>      QEMUMachineInitArgs args = { .ram_size = ram_size,
> -                                 .boot_device = boot_order,
> +                                 .boot_order = boot_order,
>                                   .kernel_filename = kernel_filename,
>                                   .kernel_cmdline = kernel_cmdline,
>                                   .initrd_filename = initrd_filename,
> -- 
> 1.7.11.7
>
Markus Armbruster Aug. 21, 2013, 3:10 p.m. UTC | #2
"Michael S. Tsirkin" <mst@redhat.com> writes:

> On Mon, Jul 22, 2013 at 01:38:47PM +0200, Markus Armbruster wrote:
>> We set default boot order "cad" in every single machine definition
>> except "pseries" and "moxiesim", even though very few boards actually
>> care for boot order, and "cad" makes sense for even fewer.
>> 
>> Machines that care:
>> 
>> * pc and its variants
>> 
>>   Accept up to three letters 'a', 'b' (undocumented alias for 'a'),
>>   'c', 'd' and 'n'.  Reject all others (fatal with -boot).
>> 
>> * nseries (n800, n810)
>> 
>>   Check whether order starts with 'n'.  Silently ignored otherwise.
>> 
>> * prep, g3beige, mac99
>> 
>>   Extract the first character the machine understands (subset of
>>   'a'..'f').  Silently ignored otherwise.
>> 
>> * spapr
>> 
>>   Accept an arbitrary string (vl.c restricts it to contain only
>>   'a'..'p', no duplicates).
>> 
>> * sun4[mdc]
>> 
>>   Use the first character.  Silently ignored otherwise.
>> 
>> Strip characters these machines ignore from their default boot order.
>> 
>> For all other machines, remove the unused default boot order
>> alltogether.
>> 
>> Note that my rename of QEMUMachine member boot_order to
>> default_boot_order and QEMUMachineInitArgs member boot_device to
>> boot_order has a welcome side effect: it makes every use of boot
>> orders visible in this patch, for easy review.
>> 
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> ---
[...]
>> diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
>> index 9327ac1..3700bd5 100644
>> --- a/hw/i386/pc_piix.c
>> +++ b/hw/i386/pc_piix.c
>> @@ -216,7 +216,7 @@ static void pc_init1(QEMUMachineInitArgs *args,
>>          }
>>      }
>>  
>> -    pc_cmos_init(below_4g_mem_size, above_4g_mem_size, args->boot_device,
>> +    pc_cmos_init(below_4g_mem_size, above_4g_mem_size, args->boot_order,
>>                   floppy, idebus[0], idebus[1], rtc_state);
>>  
>>      if (pci_enabled && usb_enabled(false)) {
>> @@ -324,7 +324,7 @@ static QEMUMachine pc_i440fx_machine_v1_6 = {
>>      .hot_add_cpu = pc_hot_add_cpu,
>>      .max_cpus = 255,
>>      .is_default = 1,
>> -    DEFAULT_MACHINE_OPTIONS,
>> +    .default_boot_order = "cad",
>>  };
>>  
>>  static QEMUMachine pc_i440fx_machine_v1_5 = {
>> @@ -337,7 +337,7 @@ static QEMUMachine pc_i440fx_machine_v1_5 = {
>>          PC_COMPAT_1_5,
>>          { /* end of list */ }
>>      },
>> -    DEFAULT_MACHINE_OPTIONS,
>> +    .default_boot_order = "cad",
>>  };
>>  
>>  static QEMUMachine pc_i440fx_machine_v1_4 = {
>
> So all PC machine types share this?

Correct, just like they share DEFAULT_MACHINE_OPTIONS before my patch.
Which is defined as

    #define DEFAULT_MACHINE_OPTIONS \
        .boot_order = "cad"

I.e. my patch merely peels off a layer of obfuscation :)

> Can we set this in some common code, somehow?

We don't have an inheritance notion for machine types.

vl.c uses machine->boot_order before calling one of its methods, so
monkey-patching .boot_order from a method won't do.  Besides, that cure
looks much worse than the disease to me.

Can't think of anything else offhand.

[...]
Michael S. Tsirkin Aug. 21, 2013, 3:23 p.m. UTC | #3
On Wed, Aug 21, 2013 at 05:10:56PM +0200, Markus Armbruster wrote:
> "Michael S. Tsirkin" <mst@redhat.com> writes:
> 
> > On Mon, Jul 22, 2013 at 01:38:47PM +0200, Markus Armbruster wrote:
> >> We set default boot order "cad" in every single machine definition
> >> except "pseries" and "moxiesim", even though very few boards actually
> >> care for boot order, and "cad" makes sense for even fewer.
> >> 
> >> Machines that care:
> >> 
> >> * pc and its variants
> >> 
> >>   Accept up to three letters 'a', 'b' (undocumented alias for 'a'),
> >>   'c', 'd' and 'n'.  Reject all others (fatal with -boot).
> >> 
> >> * nseries (n800, n810)
> >> 
> >>   Check whether order starts with 'n'.  Silently ignored otherwise.
> >> 
> >> * prep, g3beige, mac99
> >> 
> >>   Extract the first character the machine understands (subset of
> >>   'a'..'f').  Silently ignored otherwise.
> >> 
> >> * spapr
> >> 
> >>   Accept an arbitrary string (vl.c restricts it to contain only
> >>   'a'..'p', no duplicates).
> >> 
> >> * sun4[mdc]
> >> 
> >>   Use the first character.  Silently ignored otherwise.
> >> 
> >> Strip characters these machines ignore from their default boot order.
> >> 
> >> For all other machines, remove the unused default boot order
> >> alltogether.
> >> 
> >> Note that my rename of QEMUMachine member boot_order to
> >> default_boot_order and QEMUMachineInitArgs member boot_device to
> >> boot_order has a welcome side effect: it makes every use of boot
> >> orders visible in this patch, for easy review.
> >> 
> >> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> >> ---
> [...]
> >> diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
> >> index 9327ac1..3700bd5 100644
> >> --- a/hw/i386/pc_piix.c
> >> +++ b/hw/i386/pc_piix.c
> >> @@ -216,7 +216,7 @@ static void pc_init1(QEMUMachineInitArgs *args,
> >>          }
> >>      }
> >>  
> >> -    pc_cmos_init(below_4g_mem_size, above_4g_mem_size, args->boot_device,
> >> +    pc_cmos_init(below_4g_mem_size, above_4g_mem_size, args->boot_order,
> >>                   floppy, idebus[0], idebus[1], rtc_state);
> >>  
> >>      if (pci_enabled && usb_enabled(false)) {
> >> @@ -324,7 +324,7 @@ static QEMUMachine pc_i440fx_machine_v1_6 = {
> >>      .hot_add_cpu = pc_hot_add_cpu,
> >>      .max_cpus = 255,
> >>      .is_default = 1,
> >> -    DEFAULT_MACHINE_OPTIONS,
> >> +    .default_boot_order = "cad",
> >>  };
> >>  
> >>  static QEMUMachine pc_i440fx_machine_v1_5 = {
> >> @@ -337,7 +337,7 @@ static QEMUMachine pc_i440fx_machine_v1_5 = {
> >>          PC_COMPAT_1_5,
> >>          { /* end of list */ }
> >>      },
> >> -    DEFAULT_MACHINE_OPTIONS,
> >> +    .default_boot_order = "cad",
> >>  };
> >>  
> >>  static QEMUMachine pc_i440fx_machine_v1_4 = {
> >
> > So all PC machine types share this?
> 
> Correct, just like they share DEFAULT_MACHINE_OPTIONS before my patch.
> Which is defined as
> 
>     #define DEFAULT_MACHINE_OPTIONS \
>         .boot_order = "cad"
> 
> I.e. my patch merely peels off a layer of obfuscation :)

Using a macro in multiple places, instead of a hard-coded constant is
not obfuscation.

> > Can we set this in some common code, somehow?
> 
> We don't have an inheritance notion for machine types.
> 
> vl.c uses machine->boot_order before calling one of its methods, so
> monkey-patching .boot_order from a method won't do.  Besides, that cure
> looks much worse than the disease to me.
> 
> Can't think of anything else offhand.
> 
> [...]

Set this in pc_init_pci somehow?
Set DEFAULT_MACHINE_OPTIONS locally in this file?
Markus Armbruster Aug. 21, 2013, 4:01 p.m. UTC | #4
"Michael S. Tsirkin" <mst@redhat.com> writes:

> On Wed, Aug 21, 2013 at 05:10:56PM +0200, Markus Armbruster wrote:
>> "Michael S. Tsirkin" <mst@redhat.com> writes:
>> 
>> > On Mon, Jul 22, 2013 at 01:38:47PM +0200, Markus Armbruster wrote:
>> >> We set default boot order "cad" in every single machine definition
>> >> except "pseries" and "moxiesim", even though very few boards actually
>> >> care for boot order, and "cad" makes sense for even fewer.
>> >> 
>> >> Machines that care:
>> >> 
>> >> * pc and its variants
>> >> 
>> >>   Accept up to three letters 'a', 'b' (undocumented alias for 'a'),
>> >>   'c', 'd' and 'n'.  Reject all others (fatal with -boot).
>> >> 
>> >> * nseries (n800, n810)
>> >> 
>> >>   Check whether order starts with 'n'.  Silently ignored otherwise.
>> >> 
>> >> * prep, g3beige, mac99
>> >> 
>> >>   Extract the first character the machine understands (subset of
>> >>   'a'..'f').  Silently ignored otherwise.
>> >> 
>> >> * spapr
>> >> 
>> >>   Accept an arbitrary string (vl.c restricts it to contain only
>> >>   'a'..'p', no duplicates).
>> >> 
>> >> * sun4[mdc]
>> >> 
>> >>   Use the first character.  Silently ignored otherwise.
>> >> 
>> >> Strip characters these machines ignore from their default boot order.
>> >> 
>> >> For all other machines, remove the unused default boot order
>> >> alltogether.
>> >> 
>> >> Note that my rename of QEMUMachine member boot_order to
>> >> default_boot_order and QEMUMachineInitArgs member boot_device to
>> >> boot_order has a welcome side effect: it makes every use of boot
>> >> orders visible in this patch, for easy review.
>> >> 
>> >> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> >> ---
>> [...]
>> >> diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
>> >> index 9327ac1..3700bd5 100644
>> >> --- a/hw/i386/pc_piix.c
>> >> +++ b/hw/i386/pc_piix.c
>> >> @@ -216,7 +216,7 @@ static void pc_init1(QEMUMachineInitArgs *args,
>> >>          }
>> >>      }
>> >>  
>> >> -    pc_cmos_init(below_4g_mem_size, above_4g_mem_size, args->boot_device,
>> >> +    pc_cmos_init(below_4g_mem_size, above_4g_mem_size, args->boot_order,
>> >>                   floppy, idebus[0], idebus[1], rtc_state);
>> >>  
>> >>      if (pci_enabled && usb_enabled(false)) {
>> >> @@ -324,7 +324,7 @@ static QEMUMachine pc_i440fx_machine_v1_6 = {
>> >>      .hot_add_cpu = pc_hot_add_cpu,
>> >>      .max_cpus = 255,
>> >>      .is_default = 1,
>> >> -    DEFAULT_MACHINE_OPTIONS,
>> >> +    .default_boot_order = "cad",
>> >>  };
>> >>  
>> >>  static QEMUMachine pc_i440fx_machine_v1_5 = {
>> >> @@ -337,7 +337,7 @@ static QEMUMachine pc_i440fx_machine_v1_5 = {
>> >>          PC_COMPAT_1_5,
>> >>          { /* end of list */ }
>> >>      },
>> >> -    DEFAULT_MACHINE_OPTIONS,
>> >> +    .default_boot_order = "cad",
>> >>  };
>> >>  
>> >>  static QEMUMachine pc_i440fx_machine_v1_4 = {
>> >
>> > So all PC machine types share this?
>> 
>> Correct, just like they share DEFAULT_MACHINE_OPTIONS before my patch.
>> Which is defined as
>> 
>>     #define DEFAULT_MACHINE_OPTIONS \
>>         .boot_order = "cad"
>> 
>> I.e. my patch merely peels off a layer of obfuscation :)
>
> Using a macro in multiple places, instead of a hard-coded constant is
> not obfuscation.
>
>> > Can we set this in some common code, somehow?
>> 
>> We don't have an inheritance notion for machine types.
>> 
>> vl.c uses machine->boot_order before calling one of its methods, so
>> monkey-patching .boot_order from a method won't do.  Besides, that cure
>> looks much worse than the disease to me.
>> 
>> Can't think of anything else offhand.
>> 
>> [...]
>
> Set this in pc_init_pci somehow?

Too late, see "vl.c uses..." above.

> Set DEFAULT_MACHINE_OPTIONS locally in this file?

I can do #define CAD "cad" for you ;)

Seriously, I'd be okay with ".bootorder = DEFAULT_PC_BOOT_ORDER", with
#define DEFAULT_PC_BOOT_ORDER either locally, or in
include/hw/i386/pc.h.

Hiding the complete initialization in a macro would be bad style, in my
opinion.
Michael S. Tsirkin Aug. 21, 2013, 5:42 p.m. UTC | #5
On Wed, Aug 21, 2013 at 06:01:45PM +0200, Markus Armbruster wrote:
> "Michael S. Tsirkin" <mst@redhat.com> writes:
> 
> > On Wed, Aug 21, 2013 at 05:10:56PM +0200, Markus Armbruster wrote:
> >> "Michael S. Tsirkin" <mst@redhat.com> writes:
> >> 
> >> > On Mon, Jul 22, 2013 at 01:38:47PM +0200, Markus Armbruster wrote:
> >> >> We set default boot order "cad" in every single machine definition
> >> >> except "pseries" and "moxiesim", even though very few boards actually
> >> >> care for boot order, and "cad" makes sense for even fewer.
> >> >> 
> >> >> Machines that care:
> >> >> 
> >> >> * pc and its variants
> >> >> 
> >> >>   Accept up to three letters 'a', 'b' (undocumented alias for 'a'),
> >> >>   'c', 'd' and 'n'.  Reject all others (fatal with -boot).
> >> >> 
> >> >> * nseries (n800, n810)
> >> >> 
> >> >>   Check whether order starts with 'n'.  Silently ignored otherwise.
> >> >> 
> >> >> * prep, g3beige, mac99
> >> >> 
> >> >>   Extract the first character the machine understands (subset of
> >> >>   'a'..'f').  Silently ignored otherwise.
> >> >> 
> >> >> * spapr
> >> >> 
> >> >>   Accept an arbitrary string (vl.c restricts it to contain only
> >> >>   'a'..'p', no duplicates).
> >> >> 
> >> >> * sun4[mdc]
> >> >> 
> >> >>   Use the first character.  Silently ignored otherwise.
> >> >> 
> >> >> Strip characters these machines ignore from their default boot order.
> >> >> 
> >> >> For all other machines, remove the unused default boot order
> >> >> alltogether.
> >> >> 
> >> >> Note that my rename of QEMUMachine member boot_order to
> >> >> default_boot_order and QEMUMachineInitArgs member boot_device to
> >> >> boot_order has a welcome side effect: it makes every use of boot
> >> >> orders visible in this patch, for easy review.
> >> >> 
> >> >> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> >> >> ---
> >> [...]
> >> >> diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
> >> >> index 9327ac1..3700bd5 100644
> >> >> --- a/hw/i386/pc_piix.c
> >> >> +++ b/hw/i386/pc_piix.c
> >> >> @@ -216,7 +216,7 @@ static void pc_init1(QEMUMachineInitArgs *args,
> >> >>          }
> >> >>      }
> >> >>  
> >> >> -    pc_cmos_init(below_4g_mem_size, above_4g_mem_size, args->boot_device,
> >> >> +    pc_cmos_init(below_4g_mem_size, above_4g_mem_size, args->boot_order,
> >> >>                   floppy, idebus[0], idebus[1], rtc_state);
> >> >>  
> >> >>      if (pci_enabled && usb_enabled(false)) {
> >> >> @@ -324,7 +324,7 @@ static QEMUMachine pc_i440fx_machine_v1_6 = {
> >> >>      .hot_add_cpu = pc_hot_add_cpu,
> >> >>      .max_cpus = 255,
> >> >>      .is_default = 1,
> >> >> -    DEFAULT_MACHINE_OPTIONS,
> >> >> +    .default_boot_order = "cad",
> >> >>  };
> >> >>  
> >> >>  static QEMUMachine pc_i440fx_machine_v1_5 = {
> >> >> @@ -337,7 +337,7 @@ static QEMUMachine pc_i440fx_machine_v1_5 = {
> >> >>          PC_COMPAT_1_5,
> >> >>          { /* end of list */ }
> >> >>      },
> >> >> -    DEFAULT_MACHINE_OPTIONS,
> >> >> +    .default_boot_order = "cad",
> >> >>  };
> >> >>  
> >> >>  static QEMUMachine pc_i440fx_machine_v1_4 = {
> >> >
> >> > So all PC machine types share this?
> >> 
> >> Correct, just like they share DEFAULT_MACHINE_OPTIONS before my patch.
> >> Which is defined as
> >> 
> >>     #define DEFAULT_MACHINE_OPTIONS \
> >>         .boot_order = "cad"
> >> 
> >> I.e. my patch merely peels off a layer of obfuscation :)
> >
> > Using a macro in multiple places, instead of a hard-coded constant is
> > not obfuscation.
> >
> >> > Can we set this in some common code, somehow?
> >> 
> >> We don't have an inheritance notion for machine types.
> >> 
> >> vl.c uses machine->boot_order before calling one of its methods, so
> >> monkey-patching .boot_order from a method won't do.  Besides, that cure
> >> looks much worse than the disease to me.
> >> 
> >> Can't think of anything else offhand.
> >> 
> >> [...]
> >
> > Set this in pc_init_pci somehow?
> 
> Too late, see "vl.c uses..." above.

Ah, missed it.
Can we fix that?

> > Set DEFAULT_MACHINE_OPTIONS locally in this file?
> 
> I can do #define CAD "cad" for you ;)
> 
> Seriously, I'd be okay with ".bootorder = DEFAULT_PC_BOOT_ORDER", with
> #define DEFAULT_PC_BOOT_ORDER either locally, or in
> include/hw/i386/pc.h.
> 
> Hiding the complete initialization in a macro would be bad style, in my
> opinion.
Markus Armbruster Aug. 22, 2013, 8:39 a.m. UTC | #6
"Michael S. Tsirkin" <mst@redhat.com> writes:

> On Wed, Aug 21, 2013 at 06:01:45PM +0200, Markus Armbruster wrote:
>> "Michael S. Tsirkin" <mst@redhat.com> writes:
>> 
>> > On Wed, Aug 21, 2013 at 05:10:56PM +0200, Markus Armbruster wrote:
>> >> "Michael S. Tsirkin" <mst@redhat.com> writes:
>> >> 
>> >> > On Mon, Jul 22, 2013 at 01:38:47PM +0200, Markus Armbruster wrote:
>> >> >> We set default boot order "cad" in every single machine definition
>> >> >> except "pseries" and "moxiesim", even though very few boards actually
>> >> >> care for boot order, and "cad" makes sense for even fewer.
>> >> >> 
>> >> >> Machines that care:
>> >> >> 
>> >> >> * pc and its variants
>> >> >> 
>> >> >>   Accept up to three letters 'a', 'b' (undocumented alias for 'a'),
>> >> >>   'c', 'd' and 'n'.  Reject all others (fatal with -boot).
>> >> >> 
>> >> >> * nseries (n800, n810)
>> >> >> 
>> >> >>   Check whether order starts with 'n'.  Silently ignored otherwise.
>> >> >> 
>> >> >> * prep, g3beige, mac99
>> >> >> 
>> >> >>   Extract the first character the machine understands (subset of
>> >> >>   'a'..'f').  Silently ignored otherwise.
>> >> >> 
>> >> >> * spapr
>> >> >> 
>> >> >>   Accept an arbitrary string (vl.c restricts it to contain only
>> >> >>   'a'..'p', no duplicates).
>> >> >> 
>> >> >> * sun4[mdc]
>> >> >> 
>> >> >>   Use the first character.  Silently ignored otherwise.
>> >> >> 
>> >> >> Strip characters these machines ignore from their default boot order.
>> >> >> 
>> >> >> For all other machines, remove the unused default boot order
>> >> >> alltogether.
>> >> >> 
>> >> >> Note that my rename of QEMUMachine member boot_order to
>> >> >> default_boot_order and QEMUMachineInitArgs member boot_device to
>> >> >> boot_order has a welcome side effect: it makes every use of boot
>> >> >> orders visible in this patch, for easy review.
>> >> >> 
>> >> >> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> >> >> ---
>> >> [...]
>> >> >> diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
>> >> >> index 9327ac1..3700bd5 100644
>> >> >> --- a/hw/i386/pc_piix.c
>> >> >> +++ b/hw/i386/pc_piix.c
>> >> >> @@ -216,7 +216,7 @@ static void pc_init1(QEMUMachineInitArgs *args,
>> >> >>          }
>> >> >>      }
>> >> >>  
>> >> >> -    pc_cmos_init(below_4g_mem_size, above_4g_mem_size, args->boot_device,
>> >> >> +    pc_cmos_init(below_4g_mem_size, above_4g_mem_size, args->boot_order,
>> >> >>                   floppy, idebus[0], idebus[1], rtc_state);
>> >> >>  
>> >> >>      if (pci_enabled && usb_enabled(false)) {
>> >> >> @@ -324,7 +324,7 @@ static QEMUMachine pc_i440fx_machine_v1_6 = {
>> >> >>      .hot_add_cpu = pc_hot_add_cpu,
>> >> >>      .max_cpus = 255,
>> >> >>      .is_default = 1,
>> >> >> -    DEFAULT_MACHINE_OPTIONS,
>> >> >> +    .default_boot_order = "cad",
>> >> >>  };
>> >> >>  
>> >> >>  static QEMUMachine pc_i440fx_machine_v1_5 = {
>> >> >> @@ -337,7 +337,7 @@ static QEMUMachine pc_i440fx_machine_v1_5 = {
>> >> >>          PC_COMPAT_1_5,
>> >> >>          { /* end of list */ }
>> >> >>      },
>> >> >> -    DEFAULT_MACHINE_OPTIONS,
>> >> >> +    .default_boot_order = "cad",
>> >> >>  };
>> >> >>  
>> >> >>  static QEMUMachine pc_i440fx_machine_v1_4 = {
>> >> >
>> >> > So all PC machine types share this?
>> >> 
>> >> Correct, just like they share DEFAULT_MACHINE_OPTIONS before my patch.
>> >> Which is defined as
>> >> 
>> >>     #define DEFAULT_MACHINE_OPTIONS \
>> >>         .boot_order = "cad"
>> >> 
>> >> I.e. my patch merely peels off a layer of obfuscation :)
>> >
>> > Using a macro in multiple places, instead of a hard-coded constant is
>> > not obfuscation.
>> >
>> >> > Can we set this in some common code, somehow?
>> >> 
>> >> We don't have an inheritance notion for machine types.
>> >> 
>> >> vl.c uses machine->boot_order before calling one of its methods, so
>> >> monkey-patching .boot_order from a method won't do.  Besides, that cure
>> >> looks much worse than the disease to me.
>> >> 
>> >> Can't think of anything else offhand.
>> >> 
>> >> [...]
>> >
>> > Set this in pc_init_pci somehow?
>> 
>> Too late, see "vl.c uses..." above.
>
> Ah, missed it.
> Can we fix that?

If I understand you correctly, you want to monkey-patch
machine->boot_order from machine->init().  Issues:

* machine->init() does not have access to machine.  Fixable.

* machine is read-only, except for a few places in vl.c (one is managing
  the list of registered machines, the other monkey-patches
  machine->max_cpus to one when it's zero).  I don't want *more*
  monkey-patching, I want *less*, so we can make machines const.  In
  fact, we can make current_machine const right away, and I think we
  should (patch coming).

* If machine->init() can change the default boot order, we get a data
  dependency cycle.  Current data dependency chain:

  0. Initialize QEMUMachine *machine to the default machine.

  1. Option parsing sets machine, and collects "boot-opts" options.

  2. Evaluation of "boot-opts": find normal boot order (from
     machine->boot_order and option parameter "boot") and one-time boot
     order (if option parameter "once" is given).

     Set boot_order to the initial boot order.

     Register a reset handler to revert the boot order from one-time to
     normal, if necessary.

  3. machine->init()

     Gets passed boot_order via QEMUMachineInitArgs.  Currently doesn't
     have access to machine.

  4. Set global variable current_machine = machine.

  Cycle: step 2 uses default boot order and defines boot order, step 3
  uses boot order and defines default boot order.

  I guess we could break this cycle by some sufficiently ingenious code
  shuffling.  But I'm pretty sure that would only complicate matters.
  Right now, boot order data flows down the program text, which makes it
  easy to understand.

>> > Set DEFAULT_MACHINE_OPTIONS locally in this file?
>> 
>> I can do #define CAD "cad" for you ;)
>> 
>> Seriously, I'd be okay with ".bootorder = DEFAULT_PC_BOOT_ORDER", with
>> #define DEFAULT_PC_BOOT_ORDER either locally, or in
>> include/hw/i386/pc.h.
>> 
>> Hiding the complete initialization in a macro would be bad style, in my
>> opinion.

Would you accept #define DEFAULT_PC_BOOT_ORDER in pc.h?
Michael S. Tsirkin Aug. 22, 2013, 9:54 a.m. UTC | #7
On Thu, Aug 22, 2013 at 10:39:34AM +0200, Markus Armbruster wrote:
> "Michael S. Tsirkin" <mst@redhat.com> writes:
> 
> > On Wed, Aug 21, 2013 at 06:01:45PM +0200, Markus Armbruster wrote:
> >> "Michael S. Tsirkin" <mst@redhat.com> writes:
> >> 
> >> > On Wed, Aug 21, 2013 at 05:10:56PM +0200, Markus Armbruster wrote:
> >> >> "Michael S. Tsirkin" <mst@redhat.com> writes:
> >> >> 
> >> >> > On Mon, Jul 22, 2013 at 01:38:47PM +0200, Markus Armbruster wrote:
> >> >> >> We set default boot order "cad" in every single machine definition
> >> >> >> except "pseries" and "moxiesim", even though very few boards actually
> >> >> >> care for boot order, and "cad" makes sense for even fewer.
> >> >> >> 
> >> >> >> Machines that care:
> >> >> >> 
> >> >> >> * pc and its variants
> >> >> >> 
> >> >> >>   Accept up to three letters 'a', 'b' (undocumented alias for 'a'),
> >> >> >>   'c', 'd' and 'n'.  Reject all others (fatal with -boot).
> >> >> >> 
> >> >> >> * nseries (n800, n810)
> >> >> >> 
> >> >> >>   Check whether order starts with 'n'.  Silently ignored otherwise.
> >> >> >> 
> >> >> >> * prep, g3beige, mac99
> >> >> >> 
> >> >> >>   Extract the first character the machine understands (subset of
> >> >> >>   'a'..'f').  Silently ignored otherwise.
> >> >> >> 
> >> >> >> * spapr
> >> >> >> 
> >> >> >>   Accept an arbitrary string (vl.c restricts it to contain only
> >> >> >>   'a'..'p', no duplicates).
> >> >> >> 
> >> >> >> * sun4[mdc]
> >> >> >> 
> >> >> >>   Use the first character.  Silently ignored otherwise.
> >> >> >> 
> >> >> >> Strip characters these machines ignore from their default boot order.
> >> >> >> 
> >> >> >> For all other machines, remove the unused default boot order
> >> >> >> alltogether.
> >> >> >> 
> >> >> >> Note that my rename of QEMUMachine member boot_order to
> >> >> >> default_boot_order and QEMUMachineInitArgs member boot_device to
> >> >> >> boot_order has a welcome side effect: it makes every use of boot
> >> >> >> orders visible in this patch, for easy review.
> >> >> >> 
> >> >> >> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> >> >> >> ---
> >> >> [...]
> >> >> >> diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
> >> >> >> index 9327ac1..3700bd5 100644
> >> >> >> --- a/hw/i386/pc_piix.c
> >> >> >> +++ b/hw/i386/pc_piix.c
> >> >> >> @@ -216,7 +216,7 @@ static void pc_init1(QEMUMachineInitArgs *args,
> >> >> >>          }
> >> >> >>      }
> >> >> >>  
> >> >> >> -    pc_cmos_init(below_4g_mem_size, above_4g_mem_size, args->boot_device,
> >> >> >> +    pc_cmos_init(below_4g_mem_size, above_4g_mem_size, args->boot_order,
> >> >> >>                   floppy, idebus[0], idebus[1], rtc_state);
> >> >> >>  
> >> >> >>      if (pci_enabled && usb_enabled(false)) {
> >> >> >> @@ -324,7 +324,7 @@ static QEMUMachine pc_i440fx_machine_v1_6 = {
> >> >> >>      .hot_add_cpu = pc_hot_add_cpu,
> >> >> >>      .max_cpus = 255,
> >> >> >>      .is_default = 1,
> >> >> >> -    DEFAULT_MACHINE_OPTIONS,
> >> >> >> +    .default_boot_order = "cad",
> >> >> >>  };
> >> >> >>  
> >> >> >>  static QEMUMachine pc_i440fx_machine_v1_5 = {
> >> >> >> @@ -337,7 +337,7 @@ static QEMUMachine pc_i440fx_machine_v1_5 = {
> >> >> >>          PC_COMPAT_1_5,
> >> >> >>          { /* end of list */ }
> >> >> >>      },
> >> >> >> -    DEFAULT_MACHINE_OPTIONS,
> >> >> >> +    .default_boot_order = "cad",
> >> >> >>  };
> >> >> >>  
> >> >> >>  static QEMUMachine pc_i440fx_machine_v1_4 = {
> >> >> >
> >> >> > So all PC machine types share this?
> >> >> 
> >> >> Correct, just like they share DEFAULT_MACHINE_OPTIONS before my patch.
> >> >> Which is defined as
> >> >> 
> >> >>     #define DEFAULT_MACHINE_OPTIONS \
> >> >>         .boot_order = "cad"
> >> >> 
> >> >> I.e. my patch merely peels off a layer of obfuscation :)
> >> >
> >> > Using a macro in multiple places, instead of a hard-coded constant is
> >> > not obfuscation.
> >> >
> >> >> > Can we set this in some common code, somehow?
> >> >> 
> >> >> We don't have an inheritance notion for machine types.
> >> >> 
> >> >> vl.c uses machine->boot_order before calling one of its methods, so
> >> >> monkey-patching .boot_order from a method won't do.  Besides, that cure
> >> >> looks much worse than the disease to me.
> >> >> 
> >> >> Can't think of anything else offhand.
> >> >> 
> >> >> [...]
> >> >
> >> > Set this in pc_init_pci somehow?
> >> 
> >> Too late, see "vl.c uses..." above.
> >
> > Ah, missed it.
> > Can we fix that?
> 
> If I understand you correctly, you want to monkey-patch
> machine->boot_order from machine->init().  Issues:
> 
> * machine->init() does not have access to machine.  Fixable.
> 
> * machine is read-only, except for a few places in vl.c (one is managing
>   the list of registered machines, the other monkey-patches
>   machine->max_cpus to one when it's zero).  I don't want *more*
>   monkey-patching, I want *less*, so we can make machines const.  In
>   fact, we can make current_machine const right away, and I think we
>   should (patch coming).
> 
> * If machine->init() can change the default boot order, we get a data
>   dependency cycle.  Current data dependency chain:
> 
>   0. Initialize QEMUMachine *machine to the default machine.
> 
>   1. Option parsing sets machine, and collects "boot-opts" options.
> 
>   2. Evaluation of "boot-opts": find normal boot order (from
>      machine->boot_order and option parameter "boot") and one-time boot
>      order (if option parameter "once" is given).
> 
>      Set boot_order to the initial boot order.
> 
>      Register a reset handler to revert the boot order from one-time to
>      normal, if necessary.
> 
>   3. machine->init()
> 
>      Gets passed boot_order via QEMUMachineInitArgs.  Currently doesn't
>      have access to machine.
> 
>   4. Set global variable current_machine = machine.
> 
>   Cycle: step 2 uses default boot order and defines boot order, step 3
>   uses boot order and defines default boot order.
> 
>   I guess we could break this cycle by some sufficiently ingenious code
>   shuffling.  But I'm pretty sure that would only complicate matters.
>   Right now, boot order data flows down the program text, which makes it
>   easy to understand.

I agree, it's a concern.

> >> > Set DEFAULT_MACHINE_OPTIONS locally in this file?
> >> 
> >> I can do #define CAD "cad" for you ;)
> >> 
> >> Seriously, I'd be okay with ".bootorder = DEFAULT_PC_BOOT_ORDER", with
> >> #define DEFAULT_PC_BOOT_ORDER either locally, or in
> >> include/hw/i386/pc.h.
> >> 
> >> Hiding the complete initialization in a macro would be bad style, in my
> >> opinion.
> 
> Would you accept #define DEFAULT_PC_BOOT_ORDER in pc.h?


Here's what bothers me.
static QEMUMachine pc_i440fx_machine_v1_6 = {
    .name = "pc-i440fx-1.6",
    .alias = "pc", 
    .desc = "Standard PC (i440FX + PIIX, 1996)", <-- mostly copied over,
				but different for 1.3 - this is likely a bug
    .init = pc_init_pci_1_6,
    .hot_add_cpu = pc_hot_add_cpu, <- has to be copied over at least for
					newer PCs. Not sure about older ones -
					could be a bug or intentional
    .max_cpus = 255,		<- always 255 except isapc
    DEFAULT_MACHINE_OPTIONS, <- always copied
};


So there's a lot of boiler plate eahc time we add
a machine type.

DEFAULT_MACHINE_OPTIONS kind of offered a way to address
that, maybe with per-version inheritance like we do
for compat properties.

Now you want to remove that for style reasons, so we'll
have to stay with duplicated code :(

I'm not nacking this, but I think you'll agree it's not
a clear-cut improvement - if we are cleaning this up
it would be better to do something that fixes the
code duplication.
Markus Armbruster Aug. 22, 2013, 11:24 a.m. UTC | #8
"Michael S. Tsirkin" <mst@redhat.com> writes:

> On Thu, Aug 22, 2013 at 10:39:34AM +0200, Markus Armbruster wrote:
>> "Michael S. Tsirkin" <mst@redhat.com> writes:
>> 
>> > On Wed, Aug 21, 2013 at 06:01:45PM +0200, Markus Armbruster wrote:
>> >> "Michael S. Tsirkin" <mst@redhat.com> writes:
>> >> 
>> >> > On Wed, Aug 21, 2013 at 05:10:56PM +0200, Markus Armbruster wrote:
>> >> >> "Michael S. Tsirkin" <mst@redhat.com> writes:
>> >> >> 
>> >> >> > On Mon, Jul 22, 2013 at 01:38:47PM +0200, Markus Armbruster wrote:
>> >> >> >> We set default boot order "cad" in every single machine definition
>> >> >> >> except "pseries" and "moxiesim", even though very few boards actually
>> >> >> >> care for boot order, and "cad" makes sense for even fewer.
>> >> >> >> 
>> >> >> >> Machines that care:
>> >> >> >> 
>> >> >> >> * pc and its variants
>> >> >> >> 
>> >> >> >>   Accept up to three letters 'a', 'b' (undocumented alias for 'a'),
>> >> >> >>   'c', 'd' and 'n'.  Reject all others (fatal with -boot).
>> >> >> >> 
>> >> >> >> * nseries (n800, n810)
>> >> >> >> 
>> >> >> >>   Check whether order starts with 'n'.  Silently ignored otherwise.
>> >> >> >> 
>> >> >> >> * prep, g3beige, mac99
>> >> >> >> 
>> >> >> >>   Extract the first character the machine understands (subset of
>> >> >> >>   'a'..'f').  Silently ignored otherwise.
>> >> >> >> 
>> >> >> >> * spapr
>> >> >> >> 
>> >> >> >>   Accept an arbitrary string (vl.c restricts it to contain only
>> >> >> >>   'a'..'p', no duplicates).
>> >> >> >> 
>> >> >> >> * sun4[mdc]
>> >> >> >> 
>> >> >> >>   Use the first character.  Silently ignored otherwise.
>> >> >> >> 
>> >> >> >> Strip characters these machines ignore from their default boot order.
>> >> >> >> 
>> >> >> >> For all other machines, remove the unused default boot order
>> >> >> >> alltogether.
>> >> >> >> 
>> >> >> >> Note that my rename of QEMUMachine member boot_order to
>> >> >> >> default_boot_order and QEMUMachineInitArgs member boot_device to
>> >> >> >> boot_order has a welcome side effect: it makes every use of boot
>> >> >> >> orders visible in this patch, for easy review.
>> >> >> >> 
>> >> >> >> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> >> >> >> ---
>> >> >> [...]
>> >> >> >> diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
>> >> >> >> index 9327ac1..3700bd5 100644
>> >> >> >> --- a/hw/i386/pc_piix.c
>> >> >> >> +++ b/hw/i386/pc_piix.c
>> >> >> >> @@ -216,7 +216,7 @@ static void pc_init1(QEMUMachineInitArgs *args,
>> >> >> >>          }
>> >> >> >>      }
>> >> >> >>  
>> >> >> >> -    pc_cmos_init(below_4g_mem_size, above_4g_mem_size, args->boot_device,
>> >> >> >> +    pc_cmos_init(below_4g_mem_size, above_4g_mem_size, args->boot_order,
>> >> >> >>                   floppy, idebus[0], idebus[1], rtc_state);
>> >> >> >>  
>> >> >> >>      if (pci_enabled && usb_enabled(false)) {
>> >> >> >> @@ -324,7 +324,7 @@ static QEMUMachine pc_i440fx_machine_v1_6 = {
>> >> >> >>      .hot_add_cpu = pc_hot_add_cpu,
>> >> >> >>      .max_cpus = 255,
>> >> >> >>      .is_default = 1,
>> >> >> >> -    DEFAULT_MACHINE_OPTIONS,
>> >> >> >> +    .default_boot_order = "cad",
>> >> >> >>  };
>> >> >> >>  
>> >> >> >>  static QEMUMachine pc_i440fx_machine_v1_5 = {
>> >> >> >> @@ -337,7 +337,7 @@ static QEMUMachine pc_i440fx_machine_v1_5 = {
>> >> >> >>          PC_COMPAT_1_5,
>> >> >> >>          { /* end of list */ }
>> >> >> >>      },
>> >> >> >> -    DEFAULT_MACHINE_OPTIONS,
>> >> >> >> +    .default_boot_order = "cad",
>> >> >> >>  };
>> >> >> >>  
>> >> >> >>  static QEMUMachine pc_i440fx_machine_v1_4 = {
>> >> >> >
>> >> >> > So all PC machine types share this?
>> >> >> 
>> >> >> Correct, just like they share DEFAULT_MACHINE_OPTIONS before my patch.
>> >> >> Which is defined as
>> >> >> 
>> >> >>     #define DEFAULT_MACHINE_OPTIONS \
>> >> >>         .boot_order = "cad"
>> >> >> 
>> >> >> I.e. my patch merely peels off a layer of obfuscation :)
>> >> >
>> >> > Using a macro in multiple places, instead of a hard-coded constant is
>> >> > not obfuscation.
>> >> >
>> >> >> > Can we set this in some common code, somehow?
>> >> >> 
>> >> >> We don't have an inheritance notion for machine types.
>> >> >> 
>> >> >> vl.c uses machine->boot_order before calling one of its methods, so
>> >> >> monkey-patching .boot_order from a method won't do.  Besides, that cure
>> >> >> looks much worse than the disease to me.
>> >> >> 
>> >> >> Can't think of anything else offhand.
>> >> >> 
>> >> >> [...]
>> >> >
>> >> > Set this in pc_init_pci somehow?
>> >> 
>> >> Too late, see "vl.c uses..." above.
>> >
>> > Ah, missed it.
>> > Can we fix that?
>> 
>> If I understand you correctly, you want to monkey-patch
>> machine->boot_order from machine->init().  Issues:
>> 
>> * machine->init() does not have access to machine.  Fixable.
>> 
>> * machine is read-only, except for a few places in vl.c (one is managing
>>   the list of registered machines, the other monkey-patches
>>   machine->max_cpus to one when it's zero).  I don't want *more*
>>   monkey-patching, I want *less*, so we can make machines const.  In
>>   fact, we can make current_machine const right away, and I think we
>>   should (patch coming).
>> 
>> * If machine->init() can change the default boot order, we get a data
>>   dependency cycle.  Current data dependency chain:
>> 
>>   0. Initialize QEMUMachine *machine to the default machine.
>> 
>>   1. Option parsing sets machine, and collects "boot-opts" options.
>> 
>>   2. Evaluation of "boot-opts": find normal boot order (from
>>      machine->boot_order and option parameter "boot") and one-time boot
>>      order (if option parameter "once" is given).
>> 
>>      Set boot_order to the initial boot order.
>> 
>>      Register a reset handler to revert the boot order from one-time to
>>      normal, if necessary.
>> 
>>   3. machine->init()
>> 
>>      Gets passed boot_order via QEMUMachineInitArgs.  Currently doesn't
>>      have access to machine.
>> 
>>   4. Set global variable current_machine = machine.
>> 
>>   Cycle: step 2 uses default boot order and defines boot order, step 3
>>   uses boot order and defines default boot order.
>> 
>>   I guess we could break this cycle by some sufficiently ingenious code
>>   shuffling.  But I'm pretty sure that would only complicate matters.
>>   Right now, boot order data flows down the program text, which makes it
>>   easy to understand.
>
> I agree, it's a concern.
>
>> >> > Set DEFAULT_MACHINE_OPTIONS locally in this file?
>> >> 
>> >> I can do #define CAD "cad" for you ;)
>> >> 
>> >> Seriously, I'd be okay with ".bootorder = DEFAULT_PC_BOOT_ORDER", with
>> >> #define DEFAULT_PC_BOOT_ORDER either locally, or in
>> >> include/hw/i386/pc.h.
>> >> 
>> >> Hiding the complete initialization in a macro would be bad style, in my
>> >> opinion.
>> 
>> Would you accept #define DEFAULT_PC_BOOT_ORDER in pc.h?
>
>
> Here's what bothers me.
> static QEMUMachine pc_i440fx_machine_v1_6 = {
>     .name = "pc-i440fx-1.6",
>     .alias = "pc", 
>     .desc = "Standard PC (i440FX + PIIX, 1996)", <-- mostly copied over,
> 				but different for 1.3 - this is likely a bug
>     .init = pc_init_pci_1_6,
>     .hot_add_cpu = pc_hot_add_cpu, <- has to be copied over at least for
> 					newer PCs. Not sure about older ones -
> 					could be a bug or intentional
>     .max_cpus = 255,		<- always 255 except isapc
>     DEFAULT_MACHINE_OPTIONS, <- always copied
> };
>
>
> So there's a lot of boiler plate eahc time we add
> a machine type.
>
> DEFAULT_MACHINE_OPTIONS kind of offered a way to address
> that, maybe with per-version inheritance like we do
> for compat properties.
>
> Now you want to remove that for style reasons, so we'll
> have to stay with duplicated code :(

DEFAULT_MACHINE_OPTIONS are copied to *every* machine.  I can't see why
anything that's common to every machine should be duplicated in every
machine type definition.

Turns out the stuff DEFAULT_MACHINE_OPTIONS copies shouldn't be copied:
it's bogus for most machines.  My patch cleans that up, no more, no
less.

There are groups of related machines, such as the PC machines, which
have stuff in common legitimately.  Avoiding duplicating this stuff in
their machine initializers may be worthwhile.  However, that's not my
patch's aim.  Nothing in my patch precludes future de-duplication.

> I'm not nacking this, but I think you'll agree it's not
> a clear-cut improvement

I agree de-duplication may be worthwhile.  I further agree my patch
makes the existing duplication of one initializer (default boot order) a
bit more visible than it was before (in addition to removing its
existing duplication from lots of places where it makes no sense).  It
doesn't affect the existing duplication of all the other initializers.

>                         - if we are cleaning this up
> it would be better to do something that fixes the
> code duplication.

The patch is not about cleaning up code duplication in related machine
initializers.  It's about cleaning up bogus default boot orders.

I'm wary of patch series mission creep :)
Michael S. Tsirkin Aug. 25, 2013, 11:12 a.m. UTC | #9
On Thu, Aug 22, 2013 at 01:24:50PM +0200, Markus Armbruster wrote:
> "Michael S. Tsirkin" <mst@redhat.com> writes:
> 
> > On Thu, Aug 22, 2013 at 10:39:34AM +0200, Markus Armbruster wrote:
> >> "Michael S. Tsirkin" <mst@redhat.com> writes:
> >> 
> >> > On Wed, Aug 21, 2013 at 06:01:45PM +0200, Markus Armbruster wrote:
> >> >> "Michael S. Tsirkin" <mst@redhat.com> writes:
> >> >> 
> >> >> > On Wed, Aug 21, 2013 at 05:10:56PM +0200, Markus Armbruster wrote:
> >> >> >> "Michael S. Tsirkin" <mst@redhat.com> writes:
> >> >> >> 
> >> >> >> > On Mon, Jul 22, 2013 at 01:38:47PM +0200, Markus Armbruster wrote:
> >> >> >> >> We set default boot order "cad" in every single machine definition
> >> >> >> >> except "pseries" and "moxiesim", even though very few boards actually
> >> >> >> >> care for boot order, and "cad" makes sense for even fewer.
> >> >> >> >> 
> >> >> >> >> Machines that care:
> >> >> >> >> 
> >> >> >> >> * pc and its variants
> >> >> >> >> 
> >> >> >> >>   Accept up to three letters 'a', 'b' (undocumented alias for 'a'),
> >> >> >> >>   'c', 'd' and 'n'.  Reject all others (fatal with -boot).
> >> >> >> >> 
> >> >> >> >> * nseries (n800, n810)
> >> >> >> >> 
> >> >> >> >>   Check whether order starts with 'n'.  Silently ignored otherwise.
> >> >> >> >> 
> >> >> >> >> * prep, g3beige, mac99
> >> >> >> >> 
> >> >> >> >>   Extract the first character the machine understands (subset of
> >> >> >> >>   'a'..'f').  Silently ignored otherwise.
> >> >> >> >> 
> >> >> >> >> * spapr
> >> >> >> >> 
> >> >> >> >>   Accept an arbitrary string (vl.c restricts it to contain only
> >> >> >> >>   'a'..'p', no duplicates).
> >> >> >> >> 
> >> >> >> >> * sun4[mdc]
> >> >> >> >> 
> >> >> >> >>   Use the first character.  Silently ignored otherwise.
> >> >> >> >> 
> >> >> >> >> Strip characters these machines ignore from their default boot order.
> >> >> >> >> 
> >> >> >> >> For all other machines, remove the unused default boot order
> >> >> >> >> alltogether.
> >> >> >> >> 
> >> >> >> >> Note that my rename of QEMUMachine member boot_order to
> >> >> >> >> default_boot_order and QEMUMachineInitArgs member boot_device to
> >> >> >> >> boot_order has a welcome side effect: it makes every use of boot
> >> >> >> >> orders visible in this patch, for easy review.
> >> >> >> >> 
> >> >> >> >> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> >> >> >> >> ---
> >> >> >> [...]
> >> >> >> >> diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
> >> >> >> >> index 9327ac1..3700bd5 100644
> >> >> >> >> --- a/hw/i386/pc_piix.c
> >> >> >> >> +++ b/hw/i386/pc_piix.c
> >> >> >> >> @@ -216,7 +216,7 @@ static void pc_init1(QEMUMachineInitArgs *args,
> >> >> >> >>          }
> >> >> >> >>      }
> >> >> >> >>  
> >> >> >> >> -    pc_cmos_init(below_4g_mem_size, above_4g_mem_size, args->boot_device,
> >> >> >> >> +    pc_cmos_init(below_4g_mem_size, above_4g_mem_size, args->boot_order,
> >> >> >> >>                   floppy, idebus[0], idebus[1], rtc_state);
> >> >> >> >>  
> >> >> >> >>      if (pci_enabled && usb_enabled(false)) {
> >> >> >> >> @@ -324,7 +324,7 @@ static QEMUMachine pc_i440fx_machine_v1_6 = {
> >> >> >> >>      .hot_add_cpu = pc_hot_add_cpu,
> >> >> >> >>      .max_cpus = 255,
> >> >> >> >>      .is_default = 1,
> >> >> >> >> -    DEFAULT_MACHINE_OPTIONS,
> >> >> >> >> +    .default_boot_order = "cad",
> >> >> >> >>  };
> >> >> >> >>  
> >> >> >> >>  static QEMUMachine pc_i440fx_machine_v1_5 = {
> >> >> >> >> @@ -337,7 +337,7 @@ static QEMUMachine pc_i440fx_machine_v1_5 = {
> >> >> >> >>          PC_COMPAT_1_5,
> >> >> >> >>          { /* end of list */ }
> >> >> >> >>      },
> >> >> >> >> -    DEFAULT_MACHINE_OPTIONS,
> >> >> >> >> +    .default_boot_order = "cad",
> >> >> >> >>  };
> >> >> >> >>  
> >> >> >> >>  static QEMUMachine pc_i440fx_machine_v1_4 = {
> >> >> >> >
> >> >> >> > So all PC machine types share this?
> >> >> >> 
> >> >> >> Correct, just like they share DEFAULT_MACHINE_OPTIONS before my patch.
> >> >> >> Which is defined as
> >> >> >> 
> >> >> >>     #define DEFAULT_MACHINE_OPTIONS \
> >> >> >>         .boot_order = "cad"
> >> >> >> 
> >> >> >> I.e. my patch merely peels off a layer of obfuscation :)
> >> >> >
> >> >> > Using a macro in multiple places, instead of a hard-coded constant is
> >> >> > not obfuscation.
> >> >> >
> >> >> >> > Can we set this in some common code, somehow?
> >> >> >> 
> >> >> >> We don't have an inheritance notion for machine types.
> >> >> >> 
> >> >> >> vl.c uses machine->boot_order before calling one of its methods, so
> >> >> >> monkey-patching .boot_order from a method won't do.  Besides, that cure
> >> >> >> looks much worse than the disease to me.
> >> >> >> 
> >> >> >> Can't think of anything else offhand.
> >> >> >> 
> >> >> >> [...]
> >> >> >
> >> >> > Set this in pc_init_pci somehow?
> >> >> 
> >> >> Too late, see "vl.c uses..." above.
> >> >
> >> > Ah, missed it.
> >> > Can we fix that?
> >> 
> >> If I understand you correctly, you want to monkey-patch
> >> machine->boot_order from machine->init().  Issues:
> >> 
> >> * machine->init() does not have access to machine.  Fixable.
> >> 
> >> * machine is read-only, except for a few places in vl.c (one is managing
> >>   the list of registered machines, the other monkey-patches
> >>   machine->max_cpus to one when it's zero).  I don't want *more*
> >>   monkey-patching, I want *less*, so we can make machines const.  In
> >>   fact, we can make current_machine const right away, and I think we
> >>   should (patch coming).
> >> 
> >> * If machine->init() can change the default boot order, we get a data
> >>   dependency cycle.  Current data dependency chain:
> >> 
> >>   0. Initialize QEMUMachine *machine to the default machine.
> >> 
> >>   1. Option parsing sets machine, and collects "boot-opts" options.
> >> 
> >>   2. Evaluation of "boot-opts": find normal boot order (from
> >>      machine->boot_order and option parameter "boot") and one-time boot
> >>      order (if option parameter "once" is given).
> >> 
> >>      Set boot_order to the initial boot order.
> >> 
> >>      Register a reset handler to revert the boot order from one-time to
> >>      normal, if necessary.
> >> 
> >>   3. machine->init()
> >> 
> >>      Gets passed boot_order via QEMUMachineInitArgs.  Currently doesn't
> >>      have access to machine.
> >> 
> >>   4. Set global variable current_machine = machine.
> >> 
> >>   Cycle: step 2 uses default boot order and defines boot order, step 3
> >>   uses boot order and defines default boot order.
> >> 
> >>   I guess we could break this cycle by some sufficiently ingenious code
> >>   shuffling.  But I'm pretty sure that would only complicate matters.
> >>   Right now, boot order data flows down the program text, which makes it
> >>   easy to understand.
> >
> > I agree, it's a concern.
> >
> >> >> > Set DEFAULT_MACHINE_OPTIONS locally in this file?
> >> >> 
> >> >> I can do #define CAD "cad" for you ;)
> >> >> 
> >> >> Seriously, I'd be okay with ".bootorder = DEFAULT_PC_BOOT_ORDER", with
> >> >> #define DEFAULT_PC_BOOT_ORDER either locally, or in
> >> >> include/hw/i386/pc.h.
> >> >> 
> >> >> Hiding the complete initialization in a macro would be bad style, in my
> >> >> opinion.
> >> 
> >> Would you accept #define DEFAULT_PC_BOOT_ORDER in pc.h?
> >
> >
> > Here's what bothers me.
> > static QEMUMachine pc_i440fx_machine_v1_6 = {
> >     .name = "pc-i440fx-1.6",
> >     .alias = "pc", 
> >     .desc = "Standard PC (i440FX + PIIX, 1996)", <-- mostly copied over,
> > 				but different for 1.3 - this is likely a bug
> >     .init = pc_init_pci_1_6,
> >     .hot_add_cpu = pc_hot_add_cpu, <- has to be copied over at least for
> > 					newer PCs. Not sure about older ones -
> > 					could be a bug or intentional
> >     .max_cpus = 255,		<- always 255 except isapc
> >     DEFAULT_MACHINE_OPTIONS, <- always copied
> > };
> >
> >
> > So there's a lot of boiler plate eahc time we add
> > a machine type.
> >
> > DEFAULT_MACHINE_OPTIONS kind of offered a way to address
> > that, maybe with per-version inheritance like we do
> > for compat properties.
> >
> > Now you want to remove that for style reasons, so we'll
> > have to stay with duplicated code :(
> 
> DEFAULT_MACHINE_OPTIONS are copied to *every* machine.  I can't see why
> anything that's common to every machine should be duplicated in every
> machine type definition.
> 
> Turns out the stuff DEFAULT_MACHINE_OPTIONS copies shouldn't be copied:
> it's bogus for most machines.  My patch cleans that up, no more, no
> less.
> 
> There are groups of related machines, such as the PC machines, which
> have stuff in common legitimately.  Avoiding duplicating this stuff in
> their machine initializers may be worthwhile.  However, that's not my
> patch's aim.  Nothing in my patch precludes future de-duplication.
> 
> > I'm not nacking this, but I think you'll agree it's not
> > a clear-cut improvement
> 
> I agree de-duplication may be worthwhile.  I further agree my patch
> makes the existing duplication of one initializer (default boot order) a
> bit more visible than it was before (in addition to removing its
> existing duplication from lots of places where it makes no sense).  It
> doesn't affect the existing duplication of all the other initializers.

Now that it's visible, maybe you can be persuaded to fix it?
If it were not for code duplication, your patch would have
been much smaller, right?

> >                         - if we are cleaning this up
> > it would be better to do something that fixes the
> > code duplication.
> 
> The patch is not about cleaning up code duplication in related machine
> initializers.  It's about cleaning up bogus default boot orders.
> 
> I'm wary of patch series mission creep :)

My point is that once we have that cleanup, it's possible
that you will want to tweak 6/6.
Markus Armbruster Aug. 26, 2013, 7:12 a.m. UTC | #10
"Michael S. Tsirkin" <mst@redhat.com> writes:

> On Thu, Aug 22, 2013 at 01:24:50PM +0200, Markus Armbruster wrote:
>> "Michael S. Tsirkin" <mst@redhat.com> writes:
>> 
>> > On Thu, Aug 22, 2013 at 10:39:34AM +0200, Markus Armbruster wrote:
>> >> "Michael S. Tsirkin" <mst@redhat.com> writes:
>> >> 
>> >> > On Wed, Aug 21, 2013 at 06:01:45PM +0200, Markus Armbruster wrote:
>> >> >> "Michael S. Tsirkin" <mst@redhat.com> writes:
>> >> >> 
>> >> >> > On Wed, Aug 21, 2013 at 05:10:56PM +0200, Markus Armbruster wrote:
>> >> >> >> "Michael S. Tsirkin" <mst@redhat.com> writes:
>> >> >> >> 
>> >> >> >> > On Mon, Jul 22, 2013 at 01:38:47PM +0200, Markus Armbruster wrote:
>> >> >> >> >> We set default boot order "cad" in every single machine definition
>> >> >> >> >> except "pseries" and "moxiesim", even though very few
>> >> >> >> >> boards actually
>> >> >> >> >> care for boot order, and "cad" makes sense for even fewer.
>> >> >> >> >> 
>> >> >> >> >> Machines that care:
>> >> >> >> >> 
>> >> >> >> >> * pc and its variants
>> >> >> >> >> 
>> >> >> >> >>   Accept up to three letters 'a', 'b' (undocumented
>> >> >> >> >> alias for 'a'),
>> >> >> >> >>   'c', 'd' and 'n'.  Reject all others (fatal with -boot).
>> >> >> >> >> 
>> >> >> >> >> * nseries (n800, n810)
>> >> >> >> >> 
>> >> >> >> >>   Check whether order starts with 'n'.  Silently ignored
>> >> >> >> >> otherwise.
>> >> >> >> >> 
>> >> >> >> >> * prep, g3beige, mac99
>> >> >> >> >> 
>> >> >> >> >>   Extract the first character the machine understands (subset of
>> >> >> >> >>   'a'..'f').  Silently ignored otherwise.
>> >> >> >> >> 
>> >> >> >> >> * spapr
>> >> >> >> >> 
>> >> >> >> >>   Accept an arbitrary string (vl.c restricts it to contain only
>> >> >> >> >>   'a'..'p', no duplicates).
>> >> >> >> >> 
>> >> >> >> >> * sun4[mdc]
>> >> >> >> >> 
>> >> >> >> >>   Use the first character.  Silently ignored otherwise.
>> >> >> >> >> 
>> >> >> >> >> Strip characters these machines ignore from their
>> >> >> >> >> default boot order.
>> >> >> >> >> 
>> >> >> >> >> For all other machines, remove the unused default boot order
>> >> >> >> >> alltogether.
>> >> >> >> >> 
>> >> >> >> >> Note that my rename of QEMUMachine member boot_order to
>> >> >> >> >> default_boot_order and QEMUMachineInitArgs member boot_device to
>> >> >> >> >> boot_order has a welcome side effect: it makes every use of boot
>> >> >> >> >> orders visible in this patch, for easy review.
>> >> >> >> >> 
>> >> >> >> >> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> >> >> >> >> ---
>> >> >> >> [...]
>> >> >> >> >> diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
>> >> >> >> >> index 9327ac1..3700bd5 100644
>> >> >> >> >> --- a/hw/i386/pc_piix.c
>> >> >> >> >> +++ b/hw/i386/pc_piix.c
>> >> >> >> >> @@ -216,7 +216,7 @@ static void pc_init1(QEMUMachineInitArgs *args,
>> >> >> >> >>          }
>> >> >> >> >>      }
>> >> >> >> >>  
>> >> >> >> >> -    pc_cmos_init(below_4g_mem_size, above_4g_mem_size, args->boot_device,
>> >> >> >> >> +    pc_cmos_init(below_4g_mem_size, above_4g_mem_size, args->boot_order,
>> >> >> >> >>                   floppy, idebus[0], idebus[1], rtc_state);
>> >> >> >> >>  
>> >> >> >> >>      if (pci_enabled && usb_enabled(false)) {
>> >> >> >> >> @@ -324,7 +324,7 @@ static QEMUMachine pc_i440fx_machine_v1_6 = {
>> >> >> >> >>      .hot_add_cpu = pc_hot_add_cpu,
>> >> >> >> >>      .max_cpus = 255,
>> >> >> >> >>      .is_default = 1,
>> >> >> >> >> -    DEFAULT_MACHINE_OPTIONS,
>> >> >> >> >> +    .default_boot_order = "cad",
>> >> >> >> >>  };
>> >> >> >> >>  
>> >> >> >> >>  static QEMUMachine pc_i440fx_machine_v1_5 = {
>> >> >> >> >> @@ -337,7 +337,7 @@ static QEMUMachine pc_i440fx_machine_v1_5 = {
>> >> >> >> >>          PC_COMPAT_1_5,
>> >> >> >> >>          { /* end of list */ }
>> >> >> >> >>      },
>> >> >> >> >> -    DEFAULT_MACHINE_OPTIONS,
>> >> >> >> >> +    .default_boot_order = "cad",
>> >> >> >> >>  };
>> >> >> >> >>  
>> >> >> >> >>  static QEMUMachine pc_i440fx_machine_v1_4 = {
>> >> >> >> >
>> >> >> >> > So all PC machine types share this?
>> >> >> >> 
>> >> >> >> Correct, just like they share DEFAULT_MACHINE_OPTIONS before my patch.
>> >> >> >> Which is defined as
>> >> >> >> 
>> >> >> >>     #define DEFAULT_MACHINE_OPTIONS \
>> >> >> >>         .boot_order = "cad"
>> >> >> >> 
>> >> >> >> I.e. my patch merely peels off a layer of obfuscation :)
>> >> >> >
>> >> >> > Using a macro in multiple places, instead of a hard-coded constant is
>> >> >> > not obfuscation.
>> >> >> >
>> >> >> >> > Can we set this in some common code, somehow?
>> >> >> >> 
>> >> >> >> We don't have an inheritance notion for machine types.
>> >> >> >> 
>> >> >> >> vl.c uses machine->boot_order before calling one of its methods, so
>> >> >> >> monkey-patching .boot_order from a method won't do.
>> >> >> >> Besides, that cure
>> >> >> >> looks much worse than the disease to me.
>> >> >> >> 
>> >> >> >> Can't think of anything else offhand.
>> >> >> >> 
>> >> >> >> [...]
>> >> >> >
>> >> >> > Set this in pc_init_pci somehow?
>> >> >> 
>> >> >> Too late, see "vl.c uses..." above.
>> >> >
>> >> > Ah, missed it.
>> >> > Can we fix that?
>> >> 
>> >> If I understand you correctly, you want to monkey-patch
>> >> machine->boot_order from machine->init().  Issues:
>> >> 
>> >> * machine->init() does not have access to machine.  Fixable.
>> >> 
>> >> * machine is read-only, except for a few places in vl.c (one is managing
>> >>   the list of registered machines, the other monkey-patches
>> >>   machine->max_cpus to one when it's zero).  I don't want *more*
>> >>   monkey-patching, I want *less*, so we can make machines const.  In
>> >>   fact, we can make current_machine const right away, and I think we
>> >>   should (patch coming).
>> >> 
>> >> * If machine->init() can change the default boot order, we get a data
>> >>   dependency cycle.  Current data dependency chain:
>> >> 
>> >>   0. Initialize QEMUMachine *machine to the default machine.
>> >> 
>> >>   1. Option parsing sets machine, and collects "boot-opts" options.
>> >> 
>> >>   2. Evaluation of "boot-opts": find normal boot order (from
>> >>      machine->boot_order and option parameter "boot") and one-time boot
>> >>      order (if option parameter "once" is given).
>> >> 
>> >>      Set boot_order to the initial boot order.
>> >> 
>> >>      Register a reset handler to revert the boot order from one-time to
>> >>      normal, if necessary.
>> >> 
>> >>   3. machine->init()
>> >> 
>> >>      Gets passed boot_order via QEMUMachineInitArgs.  Currently doesn't
>> >>      have access to machine.
>> >> 
>> >>   4. Set global variable current_machine = machine.
>> >> 
>> >>   Cycle: step 2 uses default boot order and defines boot order, step 3
>> >>   uses boot order and defines default boot order.
>> >> 
>> >>   I guess we could break this cycle by some sufficiently ingenious code
>> >>   shuffling.  But I'm pretty sure that would only complicate matters.
>> >>   Right now, boot order data flows down the program text, which makes it
>> >>   easy to understand.
>> >
>> > I agree, it's a concern.
>> >
>> >> >> > Set DEFAULT_MACHINE_OPTIONS locally in this file?
>> >> >> 
>> >> >> I can do #define CAD "cad" for you ;)
>> >> >> 
>> >> >> Seriously, I'd be okay with ".bootorder = DEFAULT_PC_BOOT_ORDER", with
>> >> >> #define DEFAULT_PC_BOOT_ORDER either locally, or in
>> >> >> include/hw/i386/pc.h.
>> >> >> 
>> >> >> Hiding the complete initialization in a macro would be bad style, in my
>> >> >> opinion.
>> >> 
>> >> Would you accept #define DEFAULT_PC_BOOT_ORDER in pc.h?
>> >
>> >
>> > Here's what bothers me.
>> > static QEMUMachine pc_i440fx_machine_v1_6 = {
>> >     .name = "pc-i440fx-1.6",
>> >     .alias = "pc", 
>> >     .desc = "Standard PC (i440FX + PIIX, 1996)", <-- mostly copied over,
>> > 				but different for 1.3 - this is likely a bug
>> >     .init = pc_init_pci_1_6,
>> >     .hot_add_cpu = pc_hot_add_cpu, <- has to be copied over at least for
>> > 					newer PCs. Not sure about older ones -
>> > 					could be a bug or intentional
>> >     .max_cpus = 255,		<- always 255 except isapc
>> >     DEFAULT_MACHINE_OPTIONS, <- always copied
>> > };
>> >
>> >
>> > So there's a lot of boiler plate eahc time we add
>> > a machine type.
>> >
>> > DEFAULT_MACHINE_OPTIONS kind of offered a way to address
>> > that, maybe with per-version inheritance like we do
>> > for compat properties.
>> >
>> > Now you want to remove that for style reasons, so we'll
>> > have to stay with duplicated code :(
>> 
>> DEFAULT_MACHINE_OPTIONS are copied to *every* machine.  I can't see why
>> anything that's common to every machine should be duplicated in every
>> machine type definition.
>> 
>> Turns out the stuff DEFAULT_MACHINE_OPTIONS copies shouldn't be copied:
>> it's bogus for most machines.  My patch cleans that up, no more, no
>> less.
>> 
>> There are groups of related machines, such as the PC machines, which
>> have stuff in common legitimately.  Avoiding duplicating this stuff in
>> their machine initializers may be worthwhile.  However, that's not my
>> patch's aim.  Nothing in my patch precludes future de-duplication.
>> 
>> > I'm not nacking this, but I think you'll agree it's not
>> > a clear-cut improvement
>> 
>> I agree de-duplication may be worthwhile.  I further agree my patch
>> makes the existing duplication of one initializer (default boot order) a
>> bit more visible than it was before (in addition to removing its
>> existing duplication from lots of places where it makes no sense).  It
>> doesn't affect the existing duplication of all the other initializers.
>
> Now that it's visible, maybe you can be persuaded to fix it?
> If it were not for code duplication, your patch would have
> been much smaller, right?

Not really.

The patch touches all 100 machine types.  For 65 types,
DEFAULT_MACHINE_OPTIONS is simply dropped without replacement (patch
can't get smaller than that).  The remaining 35 can be grouped as
follows:

* nseries (n800, n810)

  Two machines get .default_boot_order = ""

* prep, g3beige, mac99

  Three machines either .default_boot_order = "cd" or "cad".  Really
  depends on the machine, so no duplication here.

* spapr

  Doesn't use DEFAULT_MACHINE_OPTIONS, still touched because I rename
  .boot_order to .default_boot_order.

* sun4[mdc]

  Twelve machines get .default_boot_order = "c".  Some or all may be
  related closely enough to make this duplication, but I don't know.

* pc and its variants

  Of 19 PC types, 18 get .default_boot_order = "cad", and one (xenfv)
  gets nothing.

Total diffstat is 59 files changed, 51 insertions(+), 119 deletions(-).

If we accomplished perfect de-duplication of PC other than xenfv, we'd
save 17 insertions.  If we can do the same for sun4[mdc], we'd save
another 11.

The machinery enabling de-duplication would likely change more than 28
lines, and insert *code* rather than data.

>> >                         - if we are cleaning this up
>> > it would be better to do something that fixes the
>> > code duplication.
>> 
>> The patch is not about cleaning up code duplication in related machine
>> initializers.  It's about cleaning up bogus default boot orders.
>> 
>> I'm wary of patch series mission creep :)
>
> My point is that once we have that cleanup, it's possible
> that you will want to tweak 6/6.

I definitely would not want to tweak 6/6 for that, because it's hard
enough to review as it is, and it already got competent review.  Any
further cleanup should be done on top.

The cleanup could drop up to 30 lines of trivial code changed in this
patch.  That's not nearly enough churn to make invalidating a review
that "wasn't easy" according to Laszlo worthwhile.
Michael S. Tsirkin Aug. 27, 2013, 5:57 a.m. UTC | #11
On Mon, Aug 26, 2013 at 09:12:41AM +0200, Markus Armbruster wrote:
> "Michael S. Tsirkin" <mst@redhat.com> writes:
> 
> > On Thu, Aug 22, 2013 at 01:24:50PM +0200, Markus Armbruster wrote:
> >> "Michael S. Tsirkin" <mst@redhat.com> writes:
> >> 
> >> > On Thu, Aug 22, 2013 at 10:39:34AM +0200, Markus Armbruster wrote:
> >> >> "Michael S. Tsirkin" <mst@redhat.com> writes:
> >> >> 
> >> >> > On Wed, Aug 21, 2013 at 06:01:45PM +0200, Markus Armbruster wrote:
> >> >> >> "Michael S. Tsirkin" <mst@redhat.com> writes:
> >> >> >> 
> >> >> >> > On Wed, Aug 21, 2013 at 05:10:56PM +0200, Markus Armbruster wrote:
> >> >> >> >> "Michael S. Tsirkin" <mst@redhat.com> writes:
> >> >> >> >> 
> >> >> >> >> > On Mon, Jul 22, 2013 at 01:38:47PM +0200, Markus Armbruster wrote:
> >> >> >> >> >> We set default boot order "cad" in every single machine definition
> >> >> >> >> >> except "pseries" and "moxiesim", even though very few
> >> >> >> >> >> boards actually
> >> >> >> >> >> care for boot order, and "cad" makes sense for even fewer.
> >> >> >> >> >> 
> >> >> >> >> >> Machines that care:
> >> >> >> >> >> 
> >> >> >> >> >> * pc and its variants
> >> >> >> >> >> 
> >> >> >> >> >>   Accept up to three letters 'a', 'b' (undocumented
> >> >> >> >> >> alias for 'a'),
> >> >> >> >> >>   'c', 'd' and 'n'.  Reject all others (fatal with -boot).
> >> >> >> >> >> 
> >> >> >> >> >> * nseries (n800, n810)
> >> >> >> >> >> 
> >> >> >> >> >>   Check whether order starts with 'n'.  Silently ignored
> >> >> >> >> >> otherwise.
> >> >> >> >> >> 
> >> >> >> >> >> * prep, g3beige, mac99
> >> >> >> >> >> 
> >> >> >> >> >>   Extract the first character the machine understands (subset of
> >> >> >> >> >>   'a'..'f').  Silently ignored otherwise.
> >> >> >> >> >> 
> >> >> >> >> >> * spapr
> >> >> >> >> >> 
> >> >> >> >> >>   Accept an arbitrary string (vl.c restricts it to contain only
> >> >> >> >> >>   'a'..'p', no duplicates).
> >> >> >> >> >> 
> >> >> >> >> >> * sun4[mdc]
> >> >> >> >> >> 
> >> >> >> >> >>   Use the first character.  Silently ignored otherwise.
> >> >> >> >> >> 
> >> >> >> >> >> Strip characters these machines ignore from their
> >> >> >> >> >> default boot order.
> >> >> >> >> >> 
> >> >> >> >> >> For all other machines, remove the unused default boot order
> >> >> >> >> >> alltogether.
> >> >> >> >> >> 
> >> >> >> >> >> Note that my rename of QEMUMachine member boot_order to
> >> >> >> >> >> default_boot_order and QEMUMachineInitArgs member boot_device to
> >> >> >> >> >> boot_order has a welcome side effect: it makes every use of boot
> >> >> >> >> >> orders visible in this patch, for easy review.
> >> >> >> >> >> 
> >> >> >> >> >> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> >> >> >> >> >> ---
> >> >> >> >> [...]
> >> >> >> >> >> diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
> >> >> >> >> >> index 9327ac1..3700bd5 100644
> >> >> >> >> >> --- a/hw/i386/pc_piix.c
> >> >> >> >> >> +++ b/hw/i386/pc_piix.c
> >> >> >> >> >> @@ -216,7 +216,7 @@ static void pc_init1(QEMUMachineInitArgs *args,
> >> >> >> >> >>          }
> >> >> >> >> >>      }
> >> >> >> >> >>  
> >> >> >> >> >> -    pc_cmos_init(below_4g_mem_size, above_4g_mem_size, args->boot_device,
> >> >> >> >> >> +    pc_cmos_init(below_4g_mem_size, above_4g_mem_size, args->boot_order,
> >> >> >> >> >>                   floppy, idebus[0], idebus[1], rtc_state);
> >> >> >> >> >>  
> >> >> >> >> >>      if (pci_enabled && usb_enabled(false)) {
> >> >> >> >> >> @@ -324,7 +324,7 @@ static QEMUMachine pc_i440fx_machine_v1_6 = {
> >> >> >> >> >>      .hot_add_cpu = pc_hot_add_cpu,
> >> >> >> >> >>      .max_cpus = 255,
> >> >> >> >> >>      .is_default = 1,
> >> >> >> >> >> -    DEFAULT_MACHINE_OPTIONS,
> >> >> >> >> >> +    .default_boot_order = "cad",
> >> >> >> >> >>  };
> >> >> >> >> >>  
> >> >> >> >> >>  static QEMUMachine pc_i440fx_machine_v1_5 = {
> >> >> >> >> >> @@ -337,7 +337,7 @@ static QEMUMachine pc_i440fx_machine_v1_5 = {
> >> >> >> >> >>          PC_COMPAT_1_5,
> >> >> >> >> >>          { /* end of list */ }
> >> >> >> >> >>      },
> >> >> >> >> >> -    DEFAULT_MACHINE_OPTIONS,
> >> >> >> >> >> +    .default_boot_order = "cad",
> >> >> >> >> >>  };
> >> >> >> >> >>  
> >> >> >> >> >>  static QEMUMachine pc_i440fx_machine_v1_4 = {
> >> >> >> >> >
> >> >> >> >> > So all PC machine types share this?
> >> >> >> >> 
> >> >> >> >> Correct, just like they share DEFAULT_MACHINE_OPTIONS before my patch.
> >> >> >> >> Which is defined as
> >> >> >> >> 
> >> >> >> >>     #define DEFAULT_MACHINE_OPTIONS \
> >> >> >> >>         .boot_order = "cad"
> >> >> >> >> 
> >> >> >> >> I.e. my patch merely peels off a layer of obfuscation :)
> >> >> >> >
> >> >> >> > Using a macro in multiple places, instead of a hard-coded constant is
> >> >> >> > not obfuscation.
> >> >> >> >
> >> >> >> >> > Can we set this in some common code, somehow?
> >> >> >> >> 
> >> >> >> >> We don't have an inheritance notion for machine types.
> >> >> >> >> 
> >> >> >> >> vl.c uses machine->boot_order before calling one of its methods, so
> >> >> >> >> monkey-patching .boot_order from a method won't do.
> >> >> >> >> Besides, that cure
> >> >> >> >> looks much worse than the disease to me.
> >> >> >> >> 
> >> >> >> >> Can't think of anything else offhand.
> >> >> >> >> 
> >> >> >> >> [...]
> >> >> >> >
> >> >> >> > Set this in pc_init_pci somehow?
> >> >> >> 
> >> >> >> Too late, see "vl.c uses..." above.
> >> >> >
> >> >> > Ah, missed it.
> >> >> > Can we fix that?
> >> >> 
> >> >> If I understand you correctly, you want to monkey-patch
> >> >> machine->boot_order from machine->init().  Issues:
> >> >> 
> >> >> * machine->init() does not have access to machine.  Fixable.
> >> >> 
> >> >> * machine is read-only, except for a few places in vl.c (one is managing
> >> >>   the list of registered machines, the other monkey-patches
> >> >>   machine->max_cpus to one when it's zero).  I don't want *more*
> >> >>   monkey-patching, I want *less*, so we can make machines const.  In
> >> >>   fact, we can make current_machine const right away, and I think we
> >> >>   should (patch coming).
> >> >> 
> >> >> * If machine->init() can change the default boot order, we get a data
> >> >>   dependency cycle.  Current data dependency chain:
> >> >> 
> >> >>   0. Initialize QEMUMachine *machine to the default machine.
> >> >> 
> >> >>   1. Option parsing sets machine, and collects "boot-opts" options.
> >> >> 
> >> >>   2. Evaluation of "boot-opts": find normal boot order (from
> >> >>      machine->boot_order and option parameter "boot") and one-time boot
> >> >>      order (if option parameter "once" is given).
> >> >> 
> >> >>      Set boot_order to the initial boot order.
> >> >> 
> >> >>      Register a reset handler to revert the boot order from one-time to
> >> >>      normal, if necessary.
> >> >> 
> >> >>   3. machine->init()
> >> >> 
> >> >>      Gets passed boot_order via QEMUMachineInitArgs.  Currently doesn't
> >> >>      have access to machine.
> >> >> 
> >> >>   4. Set global variable current_machine = machine.
> >> >> 
> >> >>   Cycle: step 2 uses default boot order and defines boot order, step 3
> >> >>   uses boot order and defines default boot order.
> >> >> 
> >> >>   I guess we could break this cycle by some sufficiently ingenious code
> >> >>   shuffling.  But I'm pretty sure that would only complicate matters.
> >> >>   Right now, boot order data flows down the program text, which makes it
> >> >>   easy to understand.
> >> >
> >> > I agree, it's a concern.
> >> >
> >> >> >> > Set DEFAULT_MACHINE_OPTIONS locally in this file?
> >> >> >> 
> >> >> >> I can do #define CAD "cad" for you ;)
> >> >> >> 
> >> >> >> Seriously, I'd be okay with ".bootorder = DEFAULT_PC_BOOT_ORDER", with
> >> >> >> #define DEFAULT_PC_BOOT_ORDER either locally, or in
> >> >> >> include/hw/i386/pc.h.
> >> >> >> 
> >> >> >> Hiding the complete initialization in a macro would be bad style, in my
> >> >> >> opinion.
> >> >> 
> >> >> Would you accept #define DEFAULT_PC_BOOT_ORDER in pc.h?
> >> >
> >> >
> >> > Here's what bothers me.
> >> > static QEMUMachine pc_i440fx_machine_v1_6 = {
> >> >     .name = "pc-i440fx-1.6",
> >> >     .alias = "pc", 
> >> >     .desc = "Standard PC (i440FX + PIIX, 1996)", <-- mostly copied over,
> >> > 				but different for 1.3 - this is likely a bug
> >> >     .init = pc_init_pci_1_6,
> >> >     .hot_add_cpu = pc_hot_add_cpu, <- has to be copied over at least for
> >> > 					newer PCs. Not sure about older ones -
> >> > 					could be a bug or intentional
> >> >     .max_cpus = 255,		<- always 255 except isapc
> >> >     DEFAULT_MACHINE_OPTIONS, <- always copied
> >> > };
> >> >
> >> >
> >> > So there's a lot of boiler plate eahc time we add
> >> > a machine type.
> >> >
> >> > DEFAULT_MACHINE_OPTIONS kind of offered a way to address
> >> > that, maybe with per-version inheritance like we do
> >> > for compat properties.
> >> >
> >> > Now you want to remove that for style reasons, so we'll
> >> > have to stay with duplicated code :(
> >> 
> >> DEFAULT_MACHINE_OPTIONS are copied to *every* machine.  I can't see why
> >> anything that's common to every machine should be duplicated in every
> >> machine type definition.
> >> 
> >> Turns out the stuff DEFAULT_MACHINE_OPTIONS copies shouldn't be copied:
> >> it's bogus for most machines.  My patch cleans that up, no more, no
> >> less.
> >> 
> >> There are groups of related machines, such as the PC machines, which
> >> have stuff in common legitimately.  Avoiding duplicating this stuff in
> >> their machine initializers may be worthwhile.  However, that's not my
> >> patch's aim.  Nothing in my patch precludes future de-duplication.
> >> 
> >> > I'm not nacking this, but I think you'll agree it's not
> >> > a clear-cut improvement
> >> 
> >> I agree de-duplication may be worthwhile.  I further agree my patch
> >> makes the existing duplication of one initializer (default boot order) a
> >> bit more visible than it was before (in addition to removing its
> >> existing duplication from lots of places where it makes no sense).  It
> >> doesn't affect the existing duplication of all the other initializers.
> >
> > Now that it's visible, maybe you can be persuaded to fix it?
> > If it were not for code duplication, your patch would have
> > been much smaller, right?
> 
> Not really.
> 
> The patch touches all 100 machine types.  For 65 types,
> DEFAULT_MACHINE_OPTIONS is simply dropped without replacement (patch
> can't get smaller than that).  The remaining 35 can be grouped as
> follows:
> 
> * nseries (n800, n810)
> 
>   Two machines get .default_boot_order = ""
> 
> * prep, g3beige, mac99
> 
>   Three machines either .default_boot_order = "cd" or "cad".  Really
>   depends on the machine, so no duplication here.
> 
> * spapr
> 
>   Doesn't use DEFAULT_MACHINE_OPTIONS, still touched because I rename
>   .boot_order to .default_boot_order.
> 
> * sun4[mdc]
> 
>   Twelve machines get .default_boot_order = "c".  Some or all may be
>   related closely enough to make this duplication, but I don't know.
> 
> * pc and its variants
> 
>   Of 19 PC types, 18 get .default_boot_order = "cad", and one (xenfv)
>   gets nothing.
> 
> Total diffstat is 59 files changed, 51 insertions(+), 119 deletions(-).
> 
> If we accomplished perfect de-duplication of PC other than xenfv, we'd
> save 17 insertions.  If we can do the same for sun4[mdc], we'd save
> another 11.
> 
> The machinery enabling de-duplication would likely change more than 28
> lines, and insert *code* rather than data.
> 
> >> >                         - if we are cleaning this up
> >> > it would be better to do something that fixes the
> >> > code duplication.
> >> 
> >> The patch is not about cleaning up code duplication in related machine
> >> initializers.  It's about cleaning up bogus default boot orders.
> >> 
> >> I'm wary of patch series mission creep :)
> >
> > My point is that once we have that cleanup, it's possible
> > that you will want to tweak 6/6.
> 
> I definitely would not want to tweak 6/6 for that, because it's hard
> enough to review as it is, and it already got competent review.  Any
> further cleanup should be done on top.
> 
> The cleanup could drop up to 30 lines of trivial code changed in this
> patch.  That's not nearly enough churn to make invalidating a review
> that "wasn't easy" according to Laszlo worthwhile.

I'm fine with cleanup being on top if this helps.
Paolo Bonzini Aug. 27, 2013, 7:07 a.m. UTC | #12
Il 26/08/2013 09:12, Markus Armbruster ha scritto:
> * pc and its variants
> 
>   Of 19 PC types, 18 get .default_boot_order = "cad", and one (xenfv)
>   gets nothing.

I think you mean xenpv---which isn't a PC machine, in principle (or so
Stefano told me) it could be used for ARM as well.

Paolo
Markus Armbruster Aug. 27, 2013, 7:28 a.m. UTC | #13
Paolo Bonzini <pbonzini@redhat.com> writes:

> Il 26/08/2013 09:12, Markus Armbruster ha scritto:
>> * pc and its variants
>> 
>>   Of 19 PC types, 18 get .default_boot_order = "cad", and one (xenfv)
>>   gets nothing.
>
> I think you mean xenpv---which isn't a PC machine, in principle (or so
> Stefano told me) it could be used for ARM as well.


Yes, I slipped in the alphabet soup.  Thanks for the correction.
diff mbox

Patch

diff --git a/hw/alpha/dp264.c b/hw/alpha/dp264.c
index 95fde61..20795ac 100644
--- a/hw/alpha/dp264.c
+++ b/hw/alpha/dp264.c
@@ -173,7 +173,6 @@  static QEMUMachine clipper_machine = {
     .init = clipper_init,
     .max_cpus = 4,
     .is_default = 1,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void clipper_machine_init(void)
diff --git a/hw/arm/collie.c b/hw/arm/collie.c
index a19857a..8878b0e 100644
--- a/hw/arm/collie.c
+++ b/hw/arm/collie.c
@@ -62,7 +62,6 @@  static QEMUMachine collie_machine = {
     .name = "collie",
     .desc = "Collie PDA (SA-1110)",
     .init = collie_init,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void collie_machine_init(void)
diff --git a/hw/arm/exynos4_boards.c b/hw/arm/exynos4_boards.c
index 7c90b2d..2929f9f 100644
--- a/hw/arm/exynos4_boards.c
+++ b/hw/arm/exynos4_boards.c
@@ -150,14 +150,12 @@  static QEMUMachine exynos4_machines[EXYNOS4_NUM_OF_BOARDS] = {
         .desc = "Samsung NURI board (Exynos4210)",
         .init = nuri_init,
         .max_cpus = EXYNOS4210_NCPUS,
-        DEFAULT_MACHINE_OPTIONS,
     },
     [EXYNOS4_BOARD_SMDKC210] = {
         .name = "smdkc210",
         .desc = "Samsung SMDKC210 board (Exynos4210)",
         .init = smdkc210_init,
         .max_cpus = EXYNOS4210_NCPUS,
-        DEFAULT_MACHINE_OPTIONS,
     },
 };
 
diff --git a/hw/arm/gumstix.c b/hw/arm/gumstix.c
index b8cab10..e97fbbd 100644
--- a/hw/arm/gumstix.c
+++ b/hw/arm/gumstix.c
@@ -122,14 +122,12 @@  static QEMUMachine connex_machine = {
     .name = "connex",
     .desc = "Gumstix Connex (PXA255)",
     .init = connex_init,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static QEMUMachine verdex_machine = {
     .name = "verdex",
     .desc = "Gumstix Verdex (PXA270)",
     .init = verdex_init,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void gumstix_machine_init(void)
diff --git a/hw/arm/highbank.c b/hw/arm/highbank.c
index be264d3..4dfcfd0 100644
--- a/hw/arm/highbank.c
+++ b/hw/arm/highbank.c
@@ -359,7 +359,6 @@  static QEMUMachine highbank_machine = {
     .init = highbank_init,
     .block_default_type = IF_SCSI,
     .max_cpus = 4,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static QEMUMachine midway_machine = {
@@ -368,7 +367,6 @@  static QEMUMachine midway_machine = {
     .init = midway_init,
     .block_default_type = IF_SCSI,
     .max_cpus = 4,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void calxeda_machines_init(void)
diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c
index 249a430..5b20859 100644
--- a/hw/arm/integratorcp.c
+++ b/hw/arm/integratorcp.c
@@ -513,7 +513,6 @@  static QEMUMachine integratorcp_machine = {
     .desc = "ARM Integrator/CP (ARM926EJ-S)",
     .init = integratorcp_init,
     .is_default = 1,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void integratorcp_machine_init(void)
diff --git a/hw/arm/kzm.c b/hw/arm/kzm.c
index bd6c05c..0007923 100644
--- a/hw/arm/kzm.c
+++ b/hw/arm/kzm.c
@@ -146,7 +146,6 @@  static QEMUMachine kzm_machine = {
     .name = "kzm",
     .desc = "ARM KZM Emulation Baseboard (ARM1136)",
     .init = kzm_init,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void kzm_machine_init(void)
diff --git a/hw/arm/mainstone.c b/hw/arm/mainstone.c
index 8e5fc26..b244f7e 100644
--- a/hw/arm/mainstone.c
+++ b/hw/arm/mainstone.c
@@ -179,7 +179,6 @@  static QEMUMachine mainstone2_machine = {
     .name = "mainstone",
     .desc = "Mainstone II (PXA27x)",
     .init = mainstone_init,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void mainstone_machine_init(void)
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
index b06d442..bed9e16 100644
--- a/hw/arm/musicpal.c
+++ b/hw/arm/musicpal.c
@@ -1681,7 +1681,6 @@  static QEMUMachine musicpal_machine = {
     .name = "musicpal",
     .desc = "Marvell 88w8618 / MusicPal (ARM926EJ-S)",
     .init = musicpal_init,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void musicpal_machine_init(void)
diff --git a/hw/arm/nseries.c b/hw/arm/nseries.c
index f6c9dc0..9ef31ca 100644
--- a/hw/arm/nseries.c
+++ b/hw/arm/nseries.c
@@ -1340,7 +1340,7 @@  static void n8x0_init(QEMUMachineInitArgs *args,
     }
 
     if (option_rom[0].name &&
-        (args->boot_device[0] == 'n' || !args->kernel_filename)) {
+        (args->boot_order[0] == 'n' || !args->kernel_filename)) {
         uint8_t nolo_tags[0x10000];
         /* No, wait, better start at the ROM.  */
         s->mpu->cpu->env.regs[15] = OMAP2_Q2_BASE + 0x400000;
@@ -1396,14 +1396,14 @@  static QEMUMachine n800_machine = {
     .name = "n800",
     .desc = "Nokia N800 tablet aka. RX-34 (OMAP2420)",
     .init = n800_init,
-    DEFAULT_MACHINE_OPTIONS,
+    .default_boot_order = "",
 };
 
 static QEMUMachine n810_machine = {
     .name = "n810",
     .desc = "Nokia N810 tablet aka. RX-44 (OMAP2420)",
     .init = n810_init,
-    DEFAULT_MACHINE_OPTIONS,
+    .default_boot_order = "",
 };
 
 static void nseries_machine_init(void)
diff --git a/hw/arm/omap_sx1.c b/hw/arm/omap_sx1.c
index 05b0353..b0f8664 100644
--- a/hw/arm/omap_sx1.c
+++ b/hw/arm/omap_sx1.c
@@ -219,14 +219,12 @@  static QEMUMachine sx1_machine_v2 = {
     .name = "sx1",
     .desc = "Siemens SX1 (OMAP310) V2",
     .init = sx1_init_v2,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static QEMUMachine sx1_machine_v1 = {
     .name = "sx1-v1",
     .desc = "Siemens SX1 (OMAP310) V1",
     .init = sx1_init_v1,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void sx1_machine_init(void)
diff --git a/hw/arm/palm.c b/hw/arm/palm.c
index cdc3c3a..3e39044 100644
--- a/hw/arm/palm.c
+++ b/hw/arm/palm.c
@@ -273,7 +273,6 @@  static QEMUMachine palmte_machine = {
     .name = "cheetah",
     .desc = "Palm Tungsten|E aka. Cheetah PDA (OMAP310)",
     .init = palmte_init,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void palmte_machine_init(void)
diff --git a/hw/arm/realview.c b/hw/arm/realview.c
index 3060f48..1f4e5b0 100644
--- a/hw/arm/realview.c
+++ b/hw/arm/realview.c
@@ -371,7 +371,6 @@  static QEMUMachine realview_eb_machine = {
     .desc = "ARM RealView Emulation Baseboard (ARM926EJ-S)",
     .init = realview_eb_init,
     .block_default_type = IF_SCSI,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static QEMUMachine realview_eb_mpcore_machine = {
@@ -380,14 +379,12 @@  static QEMUMachine realview_eb_mpcore_machine = {
     .init = realview_eb_mpcore_init,
     .block_default_type = IF_SCSI,
     .max_cpus = 4,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static QEMUMachine realview_pb_a8_machine = {
     .name = "realview-pb-a8",
     .desc = "ARM RealView Platform Baseboard for Cortex-A8",
     .init = realview_pb_a8_init,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static QEMUMachine realview_pbx_a9_machine = {
@@ -396,7 +393,6 @@  static QEMUMachine realview_pbx_a9_machine = {
     .init = realview_pbx_a9_init,
     .block_default_type = IF_SCSI,
     .max_cpus = 4,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void realview_machine_init(void)
diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
index 593b75e..5062020 100644
--- a/hw/arm/spitz.c
+++ b/hw/arm/spitz.c
@@ -959,28 +959,24 @@  static QEMUMachine akitapda_machine = {
     .name = "akita",
     .desc = "Akita PDA (PXA270)",
     .init = akita_init,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static QEMUMachine spitzpda_machine = {
     .name = "spitz",
     .desc = "Spitz PDA (PXA270)",
     .init = spitz_init,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static QEMUMachine borzoipda_machine = {
     .name = "borzoi",
     .desc = "Borzoi PDA (PXA270)",
     .init = borzoi_init,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static QEMUMachine terrierpda_machine = {
     .name = "terrier",
     .desc = "Terrier PDA (PXA270)",
     .init = terrier_init,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void spitz_machine_init(void)
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
index a2b6b17..3b9bca6 100644
--- a/hw/arm/stellaris.c
+++ b/hw/arm/stellaris.c
@@ -1331,14 +1331,12 @@  static QEMUMachine lm3s811evb_machine = {
     .name = "lm3s811evb",
     .desc = "Stellaris LM3S811EVB",
     .init = lm3s811evb_init,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static QEMUMachine lm3s6965evb_machine = {
     .name = "lm3s6965evb",
     .desc = "Stellaris LM3S6965EVB",
     .init = lm3s6965evb_init,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void stellaris_machine_init(void)
diff --git a/hw/arm/tosa.c b/hw/arm/tosa.c
index 47d1f4f..c00d8c2 100644
--- a/hw/arm/tosa.c
+++ b/hw/arm/tosa.c
@@ -251,7 +251,6 @@  static QEMUMachine tosapda_machine = {
     .name = "tosa",
     .desc = "Tosa PDA (PXA255)",
     .init = tosa_init,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void tosapda_machine_init(void)
diff --git a/hw/arm/versatilepb.c b/hw/arm/versatilepb.c
index 725f60f..326bf63 100644
--- a/hw/arm/versatilepb.c
+++ b/hw/arm/versatilepb.c
@@ -363,7 +363,6 @@  static QEMUMachine versatilepb_machine = {
     .desc = "ARM Versatile/PB (ARM926EJ-S)",
     .init = vpb_init,
     .block_default_type = IF_SCSI,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static QEMUMachine versatileab_machine = {
@@ -371,7 +370,6 @@  static QEMUMachine versatileab_machine = {
     .desc = "ARM Versatile/AB (ARM926EJ-S)",
     .init = vab_init,
     .block_default_type = IF_SCSI,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void versatile_machine_init(void)
diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
index 7d1b823..072e91c 100644
--- a/hw/arm/vexpress.c
+++ b/hw/arm/vexpress.c
@@ -553,7 +553,6 @@  static QEMUMachine vexpress_a9_machine = {
     .init = vexpress_a9_init,
     .block_default_type = IF_SCSI,
     .max_cpus = 4,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static QEMUMachine vexpress_a15_machine = {
@@ -562,7 +561,6 @@  static QEMUMachine vexpress_a15_machine = {
     .init = vexpress_a15_init,
     .block_default_type = IF_SCSI,
     .max_cpus = 4,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void vexpress_machine_init(void)
diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
index 3444823..608686a 100644
--- a/hw/arm/xilinx_zynq.c
+++ b/hw/arm/xilinx_zynq.c
@@ -236,7 +236,6 @@  static QEMUMachine zynq_machine = {
     .block_default_type = IF_SCSI,
     .max_cpus = 1,
     .no_sdcard = 1,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void zynq_machine_init(void)
diff --git a/hw/arm/z2.c b/hw/arm/z2.c
index 07a127b..2e0d5d4 100644
--- a/hw/arm/z2.c
+++ b/hw/arm/z2.c
@@ -373,7 +373,6 @@  static QEMUMachine z2_machine = {
     .name = "z2",
     .desc = "Zipit Z2 (PXA27x)",
     .init = z2_init,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void z2_machine_init(void)
diff --git a/hw/core/null-machine.c b/hw/core/null-machine.c
index bdf109f..d813c08 100644
--- a/hw/core/null-machine.c
+++ b/hw/core/null-machine.c
@@ -24,7 +24,6 @@  static QEMUMachine machine_none = {
     .desc = "empty machine",
     .init = machine_none_init,
     .max_cpus = 0,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void register_machines(void)
diff --git a/hw/cris/axis_dev88.c b/hw/cris/axis_dev88.c
index 9104d61..03058d3 100644
--- a/hw/cris/axis_dev88.c
+++ b/hw/cris/axis_dev88.c
@@ -355,7 +355,6 @@  static QEMUMachine axisdev88_machine = {
     .desc = "AXIS devboard 88",
     .init = axisdev88_init,
     .is_default = 1,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void axisdev88_machine_init(void)
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 9327ac1..3700bd5 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -216,7 +216,7 @@  static void pc_init1(QEMUMachineInitArgs *args,
         }
     }
 
-    pc_cmos_init(below_4g_mem_size, above_4g_mem_size, args->boot_device,
+    pc_cmos_init(below_4g_mem_size, above_4g_mem_size, args->boot_order,
                  floppy, idebus[0], idebus[1], rtc_state);
 
     if (pci_enabled && usb_enabled(false)) {
@@ -324,7 +324,7 @@  static QEMUMachine pc_i440fx_machine_v1_6 = {
     .hot_add_cpu = pc_hot_add_cpu,
     .max_cpus = 255,
     .is_default = 1,
-    DEFAULT_MACHINE_OPTIONS,
+    .default_boot_order = "cad",
 };
 
 static QEMUMachine pc_i440fx_machine_v1_5 = {
@@ -337,7 +337,7 @@  static QEMUMachine pc_i440fx_machine_v1_5 = {
         PC_COMPAT_1_5,
         { /* end of list */ }
     },
-    DEFAULT_MACHINE_OPTIONS,
+    .default_boot_order = "cad",
 };
 
 static QEMUMachine pc_i440fx_machine_v1_4 = {
@@ -345,11 +345,11 @@  static QEMUMachine pc_i440fx_machine_v1_4 = {
     .desc = "Standard PC (i440FX + PIIX, 1996)",
     .init = pc_init_pci_1_4,
     .max_cpus = 255,
+    .default_boot_order = "cad",
     .compat_props = (GlobalProperty[]) {
         PC_COMPAT_1_4,
         { /* end of list */ }
     },
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 #define PC_COMPAT_1_3 \
@@ -377,11 +377,11 @@  static QEMUMachine pc_machine_v1_3 = {
     .desc = "Standard PC",
     .init = pc_init_pci_1_3,
     .max_cpus = 255,
+    .default_boot_order = "cad",
     .compat_props = (GlobalProperty[]) {
         PC_COMPAT_1_3,
         { /* end of list */ }
     },
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 #define PC_COMPAT_1_2 \
@@ -417,11 +417,11 @@  static QEMUMachine pc_machine_v1_2 = {
     .desc = "Standard PC",
     .init = pc_init_pci_1_2,
     .max_cpus = 255,
+    .default_boot_order = "cad",
     .compat_props = (GlobalProperty[]) {
         PC_COMPAT_1_2,
         { /* end of list */ }
     },
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 #define PC_COMPAT_1_1 \
@@ -461,11 +461,11 @@  static QEMUMachine pc_machine_v1_1 = {
     .desc = "Standard PC",
     .init = pc_init_pci_1_2,
     .max_cpus = 255,
+    .default_boot_order = "cad",
     .compat_props = (GlobalProperty[]) {
         PC_COMPAT_1_1,
         { /* end of list */ }
     },
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 #define PC_COMPAT_1_0 \
@@ -497,12 +497,12 @@  static QEMUMachine pc_machine_v1_0 = {
     .desc = "Standard PC",
     .init = pc_init_pci_1_0,
     .max_cpus = 255,
+    .default_boot_order = "cad",
     .compat_props = (GlobalProperty[]) {
         PC_COMPAT_1_0,
         { /* end of list */ }
     },
     .hw_version = "1.0",
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 #define PC_COMPAT_0_15 \
@@ -513,12 +513,12 @@  static QEMUMachine pc_machine_v0_15 = {
     .desc = "Standard PC",
     .init = pc_init_pci_1_0,
     .max_cpus = 255,
+    .default_boot_order = "cad",
     .compat_props = (GlobalProperty[]) {
         PC_COMPAT_0_15,
         { /* end of list */ }
     },
     .hw_version = "0.15",
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 #define PC_COMPAT_0_14 \
@@ -546,6 +546,7 @@  static QEMUMachine pc_machine_v0_14 = {
     .desc = "Standard PC",
     .init = pc_init_pci_1_0,
     .max_cpus = 255,
+    .default_boot_order = "cad",
     .compat_props = (GlobalProperty[]) {
         PC_COMPAT_0_14, 
         {
@@ -560,7 +561,6 @@  static QEMUMachine pc_machine_v0_14 = {
         { /* end of list */ }
     },
     .hw_version = "0.14",
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 #define PC_COMPAT_0_13 \
@@ -580,6 +580,7 @@  static QEMUMachine pc_machine_v0_13 = {
     .desc = "Standard PC",
     .init = pc_init_pci_no_kvmclock,
     .max_cpus = 255,
+    .default_boot_order = "cad",
     .compat_props = (GlobalProperty[]) {
         PC_COMPAT_0_13,
         {
@@ -598,7 +599,6 @@  static QEMUMachine pc_machine_v0_13 = {
         { /* end of list */ }
     },
     .hw_version = "0.13",
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 #define PC_COMPAT_0_12 \
@@ -630,6 +630,7 @@  static QEMUMachine pc_machine_v0_12 = {
     .desc = "Standard PC",
     .init = pc_init_pci_no_kvmclock,
     .max_cpus = 255,
+    .default_boot_order = "cad",
     .compat_props = (GlobalProperty[]) {
         PC_COMPAT_0_12,
         {
@@ -644,7 +645,6 @@  static QEMUMachine pc_machine_v0_12 = {
         { /* end of list */ }
     },
     .hw_version = "0.12",
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 #define PC_COMPAT_0_11 \
@@ -664,6 +664,7 @@  static QEMUMachine pc_machine_v0_11 = {
     .desc = "Standard PC, qemu 0.11",
     .init = pc_init_pci_no_kvmclock,
     .max_cpus = 255,
+    .default_boot_order = "cad",
     .compat_props = (GlobalProperty[]) {
         PC_COMPAT_0_11,
         {
@@ -678,7 +679,6 @@  static QEMUMachine pc_machine_v0_11 = {
         { /* end of list */ }
     },
     .hw_version = "0.11",
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static QEMUMachine pc_machine_v0_10 = {
@@ -686,6 +686,7 @@  static QEMUMachine pc_machine_v0_10 = {
     .desc = "Standard PC, qemu 0.10",
     .init = pc_init_pci_no_kvmclock,
     .max_cpus = 255,
+    .default_boot_order = "cad",
     .compat_props = (GlobalProperty[]) {
         PC_COMPAT_0_11,
         {
@@ -712,7 +713,6 @@  static QEMUMachine pc_machine_v0_10 = {
         { /* end of list */ }
     },
     .hw_version = "0.10",
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static QEMUMachine isapc_machine = {
@@ -720,6 +720,7 @@  static QEMUMachine isapc_machine = {
     .desc = "ISA-only PC",
     .init = pc_init_isa,
     .max_cpus = 1,
+    .default_boot_order = "cad",
     .compat_props = (GlobalProperty[]) {
         {
             .driver   = "pc-sysfw",
@@ -733,7 +734,6 @@  static QEMUMachine isapc_machine = {
         },
         { /* end of list */ }
     },
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 #ifdef CONFIG_XEN
@@ -743,7 +743,7 @@  static QEMUMachine xenfv_machine = {
     .init = pc_xen_hvm_init,
     .max_cpus = HVM_MAX_VCPUS,
     .default_machine_opts = "accel=xen",
-    DEFAULT_MACHINE_OPTIONS,
+    .default_boot_order = "cad",
 };
 #endif
 
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index 1657eb3..28ecf76 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -195,7 +195,7 @@  static void pc_q35_init(QEMUMachineInitArgs *args)
                                     0xb100),
                       8, NULL, 0);
 
-    pc_cmos_init(below_4g_mem_size, above_4g_mem_size, args->boot_device,
+    pc_cmos_init(below_4g_mem_size, above_4g_mem_size, args->boot_order,
                  floppy, idebus[0], idebus[1], rtc_state);
 
     /* the rest devices to which pci devfn is automatically assigned */
@@ -230,7 +230,7 @@  static QEMUMachine pc_q35_machine_v1_6 = {
     .init = pc_q35_init,
     .hot_add_cpu = pc_hot_add_cpu,
     .max_cpus = 255,
-    DEFAULT_MACHINE_OPTIONS,
+    .default_boot_order = "cad",
 };
 
 static QEMUMachine pc_q35_machine_v1_5 = {
@@ -239,11 +239,11 @@  static QEMUMachine pc_q35_machine_v1_5 = {
     .init = pc_q35_init_1_5,
     .hot_add_cpu = pc_hot_add_cpu,
     .max_cpus = 255,
+    .default_boot_order = "cad",
     .compat_props = (GlobalProperty[]) {
         PC_COMPAT_1_5,
         { /* end of list */ }
     },
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static QEMUMachine pc_q35_machine_v1_4 = {
@@ -251,11 +251,11 @@  static QEMUMachine pc_q35_machine_v1_4 = {
     .desc = "Standard PC (Q35 + ICH9, 2009)",
     .init = pc_q35_init_1_4,
     .max_cpus = 255,
+    .default_boot_order = "cad",
     .compat_props = (GlobalProperty[]) {
         PC_COMPAT_1_4,
         { /* end of list */ }
     },
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void pc_q35_machine_init(void)
diff --git a/hw/i386/xen_machine_pv.c b/hw/i386/xen_machine_pv.c
index 9f2e291..9adb57f 100644
--- a/hw/i386/xen_machine_pv.c
+++ b/hw/i386/xen_machine_pv.c
@@ -99,7 +99,6 @@  static QEMUMachine xenpv_machine = {
     .init = xen_init_pv,
     .max_cpus = 1,
     .default_machine_opts = "accel=xen",
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void xenpv_machine_init(void)
diff --git a/hw/lm32/lm32_boards.c b/hw/lm32/lm32_boards.c
index 62003b8..c032bb8 100644
--- a/hw/lm32/lm32_boards.c
+++ b/hw/lm32/lm32_boards.c
@@ -289,7 +289,6 @@  static QEMUMachine lm32_evr_machine = {
     .desc = "LatticeMico32 EVR32 eval system",
     .init = lm32_evr_init,
     .is_default = 1,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static QEMUMachine lm32_uclinux_machine = {
@@ -297,7 +296,6 @@  static QEMUMachine lm32_uclinux_machine = {
     .desc = "lm32 platform for uClinux and u-boot by Theobroma Systems",
     .init = lm32_uclinux_init,
     .is_default = 0,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void lm32_machine_init(void)
diff --git a/hw/lm32/milkymist.c b/hw/lm32/milkymist.c
index 7ceedb8..f1744ec 100644
--- a/hw/lm32/milkymist.c
+++ b/hw/lm32/milkymist.c
@@ -208,7 +208,6 @@  static QEMUMachine milkymist_machine = {
     .desc = "Milkymist One",
     .init = milkymist_init,
     .is_default = 0,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void milkymist_machine_init(void)
diff --git a/hw/m68k/an5206.c b/hw/m68k/an5206.c
index 0c03a87..a8eee44 100644
--- a/hw/m68k/an5206.c
+++ b/hw/m68k/an5206.c
@@ -89,7 +89,6 @@  static QEMUMachine an5206_machine = {
     .name = "an5206",
     .desc = "Arnewsh 5206",
     .init = an5206_init,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void an5206_machine_init(void)
diff --git a/hw/m68k/dummy_m68k.c b/hw/m68k/dummy_m68k.c
index f4ed7c6..86e2e6e 100644
--- a/hw/m68k/dummy_m68k.c
+++ b/hw/m68k/dummy_m68k.c
@@ -73,7 +73,6 @@  static QEMUMachine dummy_m68k_machine = {
     .name = "dummy",
     .desc = "Dummy board",
     .init = dummy_m68k_init,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void dummy_m68k_machine_init(void)
diff --git a/hw/m68k/mcf5208.c b/hw/m68k/mcf5208.c
index 9cf000f..fb96fe8 100644
--- a/hw/m68k/mcf5208.c
+++ b/hw/m68k/mcf5208.c
@@ -295,7 +295,6 @@  static QEMUMachine mcf5208evb_machine = {
     .desc = "MCF5206EVB",
     .init = mcf5208evb_init,
     .is_default = 1,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void mcf5208evb_machine_init(void)
diff --git a/hw/microblaze/petalogix_ml605_mmu.c b/hw/microblaze/petalogix_ml605_mmu.c
index 989da25..e003c7c 100644
--- a/hw/microblaze/petalogix_ml605_mmu.c
+++ b/hw/microblaze/petalogix_ml605_mmu.c
@@ -186,7 +186,6 @@  static QEMUMachine petalogix_ml605_machine = {
     .desc = "PetaLogix linux refdesign for xilinx ml605 little endian",
     .init = petalogix_ml605_init,
     .is_default = 0,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void petalogix_ml605_machine_init(void)
diff --git a/hw/microblaze/petalogix_s3adsp1800_mmu.c b/hw/microblaze/petalogix_s3adsp1800_mmu.c
index a461494..00af2b5 100644
--- a/hw/microblaze/petalogix_s3adsp1800_mmu.c
+++ b/hw/microblaze/petalogix_s3adsp1800_mmu.c
@@ -116,7 +116,6 @@  static QEMUMachine petalogix_s3adsp1800_machine = {
     .desc = "PetaLogix linux refdesign for xilinx Spartan 3ADSP1800",
     .init = petalogix_s3adsp1800_init,
     .is_default = 1,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void petalogix_s3adsp1800_machine_init(void)
diff --git a/hw/mips/mips_fulong2e.c b/hw/mips/mips_fulong2e.c
index 9e305d2..bf9ae4a 100644
--- a/hw/mips/mips_fulong2e.c
+++ b/hw/mips/mips_fulong2e.c
@@ -400,7 +400,6 @@  static QEMUMachine mips_fulong2e_machine = {
     .name = "fulong2e",
     .desc = "Fulong 2e mini pc",
     .init = mips_fulong2e_init,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void mips_fulong2e_machine_init(void)
diff --git a/hw/mips/mips_jazz.c b/hw/mips/mips_jazz.c
index 31e138b..bf12faa 100644
--- a/hw/mips/mips_jazz.c
+++ b/hw/mips/mips_jazz.c
@@ -323,7 +323,6 @@  static QEMUMachine mips_magnum_machine = {
     .desc = "MIPS Magnum",
     .init = mips_magnum_init,
     .block_default_type = IF_SCSI,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static QEMUMachine mips_pica61_machine = {
@@ -331,7 +330,6 @@  static QEMUMachine mips_pica61_machine = {
     .desc = "Acer Pica 61",
     .init = mips_pica61_init,
     .block_default_type = IF_SCSI,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void mips_jazz_machine_init(void)
diff --git a/hw/mips/mips_malta.c b/hw/mips/mips_malta.c
index de87241..cb22279 100644
--- a/hw/mips/mips_malta.c
+++ b/hw/mips/mips_malta.c
@@ -1017,7 +1017,6 @@  static QEMUMachine mips_malta_machine = {
     .init = mips_malta_init,
     .max_cpus = 16,
     .is_default = 1,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void mips_malta_register_types(void)
diff --git a/hw/mips/mips_mipssim.c b/hw/mips/mips_mipssim.c
index a10cf13..ea5868c 100644
--- a/hw/mips/mips_mipssim.c
+++ b/hw/mips/mips_mipssim.c
@@ -229,7 +229,6 @@  static QEMUMachine mips_mipssim_machine = {
     .name = "mipssim",
     .desc = "MIPS MIPSsim platform",
     .init = mips_mipssim_init,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void mips_mipssim_machine_init(void)
diff --git a/hw/mips/mips_r4k.c b/hw/mips/mips_r4k.c
index 22beb0a..cf569c1 100644
--- a/hw/mips/mips_r4k.c
+++ b/hw/mips/mips_r4k.c
@@ -302,7 +302,6 @@  static QEMUMachine mips_machine = {
     .name = "mips",
     .desc = "mips r4k platform",
     .init = mips_r4k_init,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void mips_machine_init(void)
diff --git a/hw/openrisc/openrisc_sim.c b/hw/openrisc/openrisc_sim.c
index 924438b..2e32bea 100644
--- a/hw/openrisc/openrisc_sim.c
+++ b/hw/openrisc/openrisc_sim.c
@@ -139,7 +139,6 @@  static QEMUMachine openrisc_sim_machine = {
     .init = openrisc_sim_init,
     .max_cpus = 1,
     .is_default = 1,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void openrisc_sim_machine_init(void)
diff --git a/hw/ppc/e500plat.c b/hw/ppc/e500plat.c
index bf65b69..2e964b2 100644
--- a/hw/ppc/e500plat.c
+++ b/hw/ppc/e500plat.c
@@ -51,7 +51,6 @@  static QEMUMachine e500plat_machine = {
     .desc = "generic paravirt e500 platform",
     .init = e500plat_init,
     .max_cpus = 32,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void e500plat_machine_init(void)
diff --git a/hw/ppc/mac_newworld.c b/hw/ppc/mac_newworld.c
index fe80348..670c473 100644
--- a/hw/ppc/mac_newworld.c
+++ b/hw/ppc/mac_newworld.c
@@ -147,7 +147,7 @@  static void ppc_core99_init(QEMUMachineInitArgs *args)
     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;
+    const char *boot_device = args->boot_order;
     PowerPCCPU *cpu = NULL;
     CPUPPCState *env = NULL;
     char *filename;
@@ -474,7 +474,7 @@  static QEMUMachine core99_machine = {
     .desc = "Mac99 based PowerMAC",
     .init = ppc_core99_init,
     .max_cpus = MAX_CPUS,
-    DEFAULT_MACHINE_OPTIONS,
+    .default_boot_order = "cd",
 };
 
 static void core99_machine_init(void)
diff --git a/hw/ppc/mac_oldworld.c b/hw/ppc/mac_oldworld.c
index 8b8c6b9..a3ec9a5 100644
--- a/hw/ppc/mac_oldworld.c
+++ b/hw/ppc/mac_oldworld.c
@@ -78,7 +78,7 @@  static void ppc_heathrow_init(QEMUMachineInitArgs *args)
     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;
+    const char *boot_device = args->boot_order;
     MemoryRegion *sysmem = get_system_memory();
     PowerPCCPU *cpu = NULL;
     CPUPPCState *env = NULL;
@@ -347,7 +347,7 @@  static QEMUMachine heathrow_machine = {
 #ifndef TARGET_PPC64
     .is_default = 1,
 #endif
-    DEFAULT_MACHINE_OPTIONS,
+    .default_boot_order = "cd", /* TOFIX "cad" when Mac floppy is implemented */
 };
 
 static void heathrow_machine_init(void)
diff --git a/hw/ppc/mpc8544ds.c b/hw/ppc/mpc8544ds.c
index 1888e75..edcc0be 100644
--- a/hw/ppc/mpc8544ds.c
+++ b/hw/ppc/mpc8544ds.c
@@ -44,7 +44,6 @@  static QEMUMachine ppce500_machine = {
     .desc = "mpc8544ds",
     .init = mpc8544ds_init,
     .max_cpus = 15,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void ppce500_machine_init(void)
diff --git a/hw/ppc/ppc405_boards.c b/hw/ppc/ppc405_boards.c
index f74e5e5..43a83ca 100644
--- a/hw/ppc/ppc405_boards.c
+++ b/hw/ppc/ppc405_boards.c
@@ -362,7 +362,6 @@  static QEMUMachine ref405ep_machine = {
     .name = "ref405ep",
     .desc = "ref405ep",
     .init = ref405ep_init,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 /*****************************************************************************/
@@ -650,7 +649,6 @@  static QEMUMachine taihu_machine = {
     .name = "taihu",
     .desc = "taihu",
     .init = taihu_405ep_init,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void ppc405_machine_init(void)
diff --git a/hw/ppc/ppc440_bamboo.c b/hw/ppc/ppc440_bamboo.c
index 5b039ab..698ec87 100644
--- a/hw/ppc/ppc440_bamboo.c
+++ b/hw/ppc/ppc440_bamboo.c
@@ -293,7 +293,6 @@  static QEMUMachine bamboo_machine = {
     .name = "bamboo",
     .desc = "bamboo",
     .init = bamboo_init,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void bamboo_machine_init(void)
diff --git a/hw/ppc/prep.c b/hw/ppc/prep.c
index 19f2442..e884d3e 100644
--- a/hw/ppc/prep.c
+++ b/hw/ppc/prep.c
@@ -452,7 +452,7 @@  static void ppc_prep_init(QEMUMachineInitArgs *args)
     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;
+    const char *boot_device = args->boot_order;
     MemoryRegion *sysmem = get_system_memory();
     PowerPCCPU *cpu = NULL;
     CPUPPCState *env = NULL;
@@ -691,7 +691,7 @@  static QEMUMachine prep_machine = {
     .desc = "PowerPC PREP platform",
     .init = ppc_prep_init,
     .max_cpus = MAX_CPUS,
-    DEFAULT_MACHINE_OPTIONS,
+    .default_boot_order = "cad",
 };
 
 static void prep_machine_init(void)
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 48ae092..805261a 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -718,7 +718,7 @@  static void ppc_spapr_init(QEMUMachineInitArgs *args)
     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;
+    const char *boot_device = args->boot_order;
     PowerPCCPU *cpu;
     CPUPPCState *env;
     PCIHostState *phb;
@@ -971,7 +971,7 @@  static QEMUMachine spapr_machine = {
     .block_default_type = IF_SCSI,
     .max_cpus = MAX_CPUS,
     .no_parallel = 1,
-    .boot_order = NULL,
+    .default_boot_order = NULL,
 };
 
 static void spapr_machine_init(void)
diff --git a/hw/ppc/virtex_ml507.c b/hw/ppc/virtex_ml507.c
index 08e77fb..7250f51 100644
--- a/hw/ppc/virtex_ml507.c
+++ b/hw/ppc/virtex_ml507.c
@@ -245,7 +245,6 @@  static QEMUMachine virtex_machine = {
     .name = "virtex-ml507",
     .desc = "Xilinx Virtex ML507 reference design",
     .init = virtex_init,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void virtex_machine_init(void)
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index aebbbf1..e2681a6 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -126,7 +126,6 @@  static QEMUMachine ccw_machine = {
     .no_sdcard = 1,
     .use_sclp = 1,
     .max_cpus = 255,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void ccw_machine_init(void)
diff --git a/hw/s390x/s390-virtio.c b/hw/s390x/s390-virtio.c
index edbde00..df52f1f 100644
--- a/hw/s390x/s390-virtio.c
+++ b/hw/s390x/s390-virtio.c
@@ -293,7 +293,6 @@  static QEMUMachine s390_machine = {
     .use_virtcon = 1,
     .max_cpus = 255,
     .is_default = 1,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void s390_machine_init(void)
diff --git a/hw/sh4/r2d.c b/hw/sh4/r2d.c
index 98b3408..7b1de85 100644
--- a/hw/sh4/r2d.c
+++ b/hw/sh4/r2d.c
@@ -356,7 +356,6 @@  static QEMUMachine r2d_machine = {
     .name = "r2d",
     .desc = "r2d-plus board",
     .init = r2d_init,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void r2d_machine_init(void)
diff --git a/hw/sh4/shix.c b/hw/sh4/shix.c
index 84dd666..1ff37f5 100644
--- a/hw/sh4/shix.c
+++ b/hw/sh4/shix.c
@@ -96,7 +96,6 @@  static QEMUMachine shix_machine = {
     .desc = "shix card",
     .init = shix_init,
     .is_default = 1,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void shix_machine_init(void)
diff --git a/hw/sparc/leon3.c b/hw/sparc/leon3.c
index 5ef282f..390f3e4 100644
--- a/hw/sparc/leon3.c
+++ b/hw/sparc/leon3.c
@@ -216,7 +216,6 @@  static QEMUMachine leon3_generic_machine = {
     .name     = "leon3_generic",
     .desc     = "Leon-3 generic",
     .init     = leon3_generic_hw_init,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void leon3_machine_init(void)
diff --git a/hw/sparc/sun4m.c b/hw/sparc/sun4m.c
index 97c3ee0..ad09312 100644
--- a/hw/sparc/sun4m.c
+++ b/hw/sparc/sun4m.c
@@ -976,7 +976,7 @@  static void sun4m_hw_init(const struct sun4m_hwdef *hwdef,
                                     args->ram_size);
 
     nvram_init(nvram, (uint8_t *)&nd_table[0].macaddr, args->kernel_cmdline,
-               args->boot_device, args->ram_size, kernel_size, graphic_width,
+               args->boot_order, args->ram_size, kernel_size, graphic_width,
                graphic_height, graphic_depth, hwdef->nvram_machine_id,
                "Sun4m");
 
@@ -1005,7 +1005,7 @@  static void sun4m_hw_init(const struct sun4m_hwdef *hwdef,
     }
     fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_ADDR, INITRD_LOAD_ADDR);
     fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_SIZE, 0); // not used
-    fw_cfg_add_i16(fw_cfg, FW_CFG_BOOT_DEVICE, args->boot_device[0]);
+    fw_cfg_add_i16(fw_cfg, FW_CFG_BOOT_DEVICE, args->boot_order[0]);
     qemu_register_boot_set(fw_cfg_boot_set, fw_cfg);
 }
 
@@ -1326,7 +1326,7 @@  static QEMUMachine ss5_machine = {
     .init = ss5_init,
     .block_default_type = IF_SCSI,
     .is_default = 1,
-    DEFAULT_MACHINE_OPTIONS,
+    .default_boot_order = "c",
 };
 
 static QEMUMachine ss10_machine = {
@@ -1335,7 +1335,7 @@  static QEMUMachine ss10_machine = {
     .init = ss10_init,
     .block_default_type = IF_SCSI,
     .max_cpus = 4,
-    DEFAULT_MACHINE_OPTIONS,
+    .default_boot_order = "c",
 };
 
 static QEMUMachine ss600mp_machine = {
@@ -1344,7 +1344,7 @@  static QEMUMachine ss600mp_machine = {
     .init = ss600mp_init,
     .block_default_type = IF_SCSI,
     .max_cpus = 4,
-    DEFAULT_MACHINE_OPTIONS,
+    .default_boot_order = "c",
 };
 
 static QEMUMachine ss20_machine = {
@@ -1353,7 +1353,7 @@  static QEMUMachine ss20_machine = {
     .init = ss20_init,
     .block_default_type = IF_SCSI,
     .max_cpus = 4,
-    DEFAULT_MACHINE_OPTIONS,
+    .default_boot_order = "c",
 };
 
 static QEMUMachine voyager_machine = {
@@ -1361,7 +1361,7 @@  static QEMUMachine voyager_machine = {
     .desc = "Sun4m platform, SPARCstation Voyager",
     .init = vger_init,
     .block_default_type = IF_SCSI,
-    DEFAULT_MACHINE_OPTIONS,
+    .default_boot_order = "c",
 };
 
 static QEMUMachine ss_lx_machine = {
@@ -1369,7 +1369,7 @@  static QEMUMachine ss_lx_machine = {
     .desc = "Sun4m platform, SPARCstation LX",
     .init = ss_lx_init,
     .block_default_type = IF_SCSI,
-    DEFAULT_MACHINE_OPTIONS,
+    .default_boot_order = "c",
 };
 
 static QEMUMachine ss4_machine = {
@@ -1377,7 +1377,7 @@  static QEMUMachine ss4_machine = {
     .desc = "Sun4m platform, SPARCstation 4",
     .init = ss4_init,
     .block_default_type = IF_SCSI,
-    DEFAULT_MACHINE_OPTIONS,
+    .default_boot_order = "c",
 };
 
 static QEMUMachine scls_machine = {
@@ -1385,7 +1385,7 @@  static QEMUMachine scls_machine = {
     .desc = "Sun4m platform, SPARCClassic",
     .init = scls_init,
     .block_default_type = IF_SCSI,
-    DEFAULT_MACHINE_OPTIONS,
+    .default_boot_order = "c",
 };
 
 static QEMUMachine sbook_machine = {
@@ -1393,7 +1393,7 @@  static QEMUMachine sbook_machine = {
     .desc = "Sun4m platform, SPARCbook",
     .init = sbook_init,
     .block_default_type = IF_SCSI,
-    DEFAULT_MACHINE_OPTIONS,
+    .default_boot_order = "c",
 };
 
 static void sun4m_register_types(void)
diff --git a/hw/sparc64/sun4u.c b/hw/sparc64/sun4u.c
index 22e9818..9f726b4 100644
--- a/hw/sparc64/sun4u.c
+++ b/hw/sparc64/sun4u.c
@@ -872,7 +872,7 @@  static void sun4uv_init(MemoryRegion *address_space_mem,
                                     &kernel_addr, &kernel_entry);
 
     sun4u_NVRAM_set_params(nvram, NVRAM_SIZE, "Sun4u", args->ram_size,
-                           args->boot_device,
+                           args->boot_order,
                            kernel_addr, kernel_size,
                            args->kernel_cmdline,
                            initrd_addr, initrd_size,
@@ -897,7 +897,7 @@  static void sun4uv_init(MemoryRegion *address_space_mem,
     }
     fw_cfg_add_i64(fw_cfg, FW_CFG_INITRD_ADDR, initrd_addr);
     fw_cfg_add_i64(fw_cfg, FW_CFG_INITRD_SIZE, initrd_size);
-    fw_cfg_add_i16(fw_cfg, FW_CFG_BOOT_DEVICE, args->boot_device[0]);
+    fw_cfg_add_i16(fw_cfg, FW_CFG_BOOT_DEVICE, args->boot_order[0]);
 
     fw_cfg_add_i16(fw_cfg, FW_CFG_SPARC64_WIDTH, graphic_width);
     fw_cfg_add_i16(fw_cfg, FW_CFG_SPARC64_HEIGHT, graphic_height);
@@ -960,7 +960,7 @@  static QEMUMachine sun4u_machine = {
     .init = sun4u_init,
     .max_cpus = 1, // XXX for now
     .is_default = 1,
-    DEFAULT_MACHINE_OPTIONS,
+    .default_boot_order = "c",
 };
 
 static QEMUMachine sun4v_machine = {
@@ -968,7 +968,7 @@  static QEMUMachine sun4v_machine = {
     .desc = "Sun4v platform",
     .init = sun4v_init,
     .max_cpus = 1, // XXX for now
-    DEFAULT_MACHINE_OPTIONS,
+    .default_boot_order = "c",
 };
 
 static QEMUMachine niagara_machine = {
@@ -976,7 +976,7 @@  static QEMUMachine niagara_machine = {
     .desc = "Sun4v platform, Niagara",
     .init = niagara_init,
     .max_cpus = 1, // XXX for now
-    DEFAULT_MACHINE_OPTIONS,
+    .default_boot_order = "c",
 };
 
 static void sun4u_register_types(void)
diff --git a/hw/unicore32/puv3.c b/hw/unicore32/puv3.c
index 5ff0dc9..a900061 100644
--- a/hw/unicore32/puv3.c
+++ b/hw/unicore32/puv3.c
@@ -128,7 +128,6 @@  static QEMUMachine puv3_machine = {
     .desc = "PKUnity Version-3 based on UniCore32",
     .init = puv3_init,
     .is_default = 1,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void puv3_machine_init(void)
diff --git a/hw/xtensa/xtensa_lx60.c b/hw/xtensa/xtensa_lx60.c
index 075daf1..3d2f990 100644
--- a/hw/xtensa/xtensa_lx60.c
+++ b/hw/xtensa/xtensa_lx60.c
@@ -295,7 +295,6 @@  static QEMUMachine xtensa_lx60_machine = {
     .desc = "lx60 EVB (" XTENSA_DEFAULT_CPU_MODEL ")",
     .init = xtensa_lx60_init,
     .max_cpus = 4,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static QEMUMachine xtensa_lx200_machine = {
@@ -303,7 +302,6 @@  static QEMUMachine xtensa_lx200_machine = {
     .desc = "lx200 EVB (" XTENSA_DEFAULT_CPU_MODEL ")",
     .init = xtensa_lx200_init,
     .max_cpus = 4,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void xtensa_lx_machines_init(void)
diff --git a/hw/xtensa/xtensa_sim.c b/hw/xtensa/xtensa_sim.c
index a88707e..af9af10 100644
--- a/hw/xtensa/xtensa_sim.c
+++ b/hw/xtensa/xtensa_sim.c
@@ -106,7 +106,6 @@  static QEMUMachine xtensa_sim_machine = {
     .is_default = true,
     .init = xtensa_sim_init,
     .max_cpus = 4,
-    DEFAULT_MACHINE_OPTIONS,
 };
 
 static void xtensa_sim_machine_init(void)
diff --git a/include/hw/boards.h b/include/hw/boards.h
index fb7c6f1..5a7ae9f 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -6,12 +6,9 @@ 
 #include "sysemu/blockdev.h"
 #include "hw/qdev.h"
 
-#define DEFAULT_MACHINE_OPTIONS \
-    .boot_order = "cad"
-
 typedef struct QEMUMachineInitArgs {
     ram_addr_t ram_size;
-    const char *boot_device;
+    const char *boot_order;
     const char *kernel_filename;
     const char *kernel_cmdline;
     const char *initrd_filename;
@@ -42,7 +39,7 @@  typedef struct QEMUMachine {
         no_sdcard:1;
     int is_default;
     const char *default_machine_opts;
-    const char *boot_order;
+    const char *default_boot_order;
     GlobalProperty *compat_props;
     struct QEMUMachine *next;
     const char *hw_version;
diff --git a/vl.c b/vl.c
index 25b8f2f..dcd7661 100644
--- a/vl.c
+++ b/vl.c
@@ -4121,7 +4121,7 @@  int main(int argc, char **argv, char **envp)
     kernel_cmdline = qemu_opt_get(machine_opts, "append");
 
     if (!boot_order) {
-        boot_order = machine->boot_order;
+        boot_order = machine->default_boot_order;
     }
     opts = qemu_opts_find(qemu_find_opts("boot-opts"), NULL);
     if (opts) {
@@ -4309,7 +4309,7 @@  int main(int argc, char **argv, char **envp)
     qdev_machine_init();
 
     QEMUMachineInitArgs args = { .ram_size = ram_size,
-                                 .boot_device = boot_order,
+                                 .boot_order = boot_order,
                                  .kernel_filename = kernel_filename,
                                  .kernel_cmdline = kernel_cmdline,
                                  .initrd_filename = initrd_filename,