diff mbox series

[RFC,v3,06/14] hw/arm: Filter machine types for qemu-system-arm/aarch64 binaries

Message ID 20250418172908.25147-7-philmd@linaro.org
State Superseded
Headers show
Series single-binary: Make hw/arm/ common | expand

Commit Message

Philippe Mathieu-Daudé April 18, 2025, 5:29 p.m. UTC
Since the qemu-system-aarch64 binary is able to run
all machines indistinctly, simply register the
TYPE_TARGET_AARCH64_MACHINE interface for all
existing machines under the hw/arm/ directory.

Very few machines are restricted to the qemu-system-aarch64
binary:

  $ git grep TARGET_AARCH64 hw/arm/meson.build
  hw/arm/meson.build:31:arm_common_ss.add(when: ['CONFIG_RASPI', 'TARGET_AARCH64'], if_true: files('bcm2838.c', 'raspi4b.c'))
  hw/arm/meson.build:50:arm_common_ss.add(when: ['CONFIG_ASPEED_SOC', 'TARGET_AARCH64'], if_true: files('aspeed_ast27x0.c'))

  $ git grep -W AARCH64 hw/arm/Kconfig
  hw/arm/Kconfig=185=config SBSA_REF
  hw/arm/Kconfig-186-    bool
  hw/arm/Kconfig-187-    default y
  hw/arm/Kconfig:188:    depends on TCG && AARCH64
  --
  hw/arm/Kconfig=413=config XLNX_ZYNQMP_ARM
  hw/arm/Kconfig-414-    bool
  hw/arm/Kconfig-415-    default y if PIXMAN
  hw/arm/Kconfig:416:    depends on TCG && AARCH64
  --
  hw/arm/Kconfig=435=config XLNX_VERSAL
  hw/arm/Kconfig-436-    bool
  hw/arm/Kconfig-437-    default y
  hw/arm/Kconfig:438:    depends on TCG && AARCH64
  --
  hw/arm/Kconfig=475=config NPCM8XX
  hw/arm/Kconfig-476-    bool
  hw/arm/Kconfig-477-    default y
  hw/arm/Kconfig:478:    depends on TCG && AARCH64
  --
  hw/arm/Kconfig=605=config FSL_IMX8MP_EVK
  hw/arm/Kconfig-606-    bool
  hw/arm/Kconfig-607-    default y
  hw/arm/Kconfig:608:    depends on TCG && AARCH64

  $ git grep -wW TARGET_AARCH64 hw/arm | fgrep -4 MACHINE_TYPE_NAME
  ...
  hw/arm/aspeed.c:1939:#ifdef TARGET_AARCH64
  hw/arm/aspeed.c-1940-    }, {
  hw/arm/aspeed.c-1941-        .name          = MACHINE_TYPE_NAME("ast2700a0-evb"),

  hw/arm/aspeed.c-1949-        .name          = MACHINE_TYPE_NAME("ast2700a1-evb"),

  hw/arm/raspi.c:420:#ifdef TARGET_AARCH64
  hw/arm/raspi.c-421-    }, {
  hw/arm/raspi.c-422-        .name           = MACHINE_TYPE_NAME("raspi3ap"),

  hw/arm/raspi.c-429-    }, {
  hw/arm/raspi.c-430-        .name           = MACHINE_TYPE_NAME("raspi3b"),

This can be verified as:

$ diff -u0 <(qemu-system-arm -M help) <(qemu-system-aarch64 -M help)
  @@ -5,3 +4,0 @@
  -ast2700-evb          Aspeed AST2700 A0 EVB (Cortex-A35) (alias of ast2700a0-evb)
  -ast2700a0-evb        Aspeed AST2700 A0 EVB (Cortex-A35)
  -ast2700a1-evb        Aspeed AST2700 A1 EVB (Cortex-A35)
  @@ -22 +18,0 @@
  -imx8mp-evk           NXP i.MX 8M Plus EVK Board
  @@ -49 +44,0 @@
  -npcm845-evb          Nuvoton NPCM845 Evaluation Board (Cortex-A35)
  @@ -63,3 +57,0 @@
  -raspi3ap             Raspberry Pi 3A+ (revision 1.0)
  -raspi3b              Raspberry Pi 3B (revision 1.2)
  -raspi4b              Raspberry Pi 4B (revision 1.5)
  @@ -72 +63,0 @@
  -sbsa-ref             QEMU 'SBSA Reference' ARM Virtual Machine
  @@ -116,2 +106,0 @@
  -xlnx-versal-virt     Xilinx Versal Virtual development board
  -xlnx-zcu102          Xilinx ZynqMP ZCU102 board with 4xA53s and 2xR5Fs based on the value of smp

Register the TYPE_TARGET_ARM_MACHINE interface for all
the machines not listed previously.

Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
---
 hw/arm/aspeed.c            | 109 +++++++++++++++++++++++++++++++++++++
 hw/arm/b-l475e-iot01a.c    |   6 ++
 hw/arm/bananapi_m2u.c      |   6 ++
 hw/arm/bcm2836.c           |   1 +
 hw/arm/collie.c            |   6 ++
 hw/arm/cubieboard.c        |   6 ++
 hw/arm/digic_boards.c      |   6 ++
 hw/arm/exynos4_boards.c    |  11 ++++
 hw/arm/fby35.c             |   6 ++
 hw/arm/highbank.c          |  11 ++++
 hw/arm/imx25_pdk.c         |   6 ++
 hw/arm/imx8mp-evk.c        |   5 ++
 hw/arm/integratorcp.c      |   6 ++
 hw/arm/kzm.c               |   6 ++
 hw/arm/mcimx6ul-evk.c      |   6 ++
 hw/arm/mcimx7d-sabre.c     |   6 ++
 hw/arm/microbit.c          |   6 ++
 hw/arm/mps2-tz.c           |  21 +++++++
 hw/arm/mps2.c              |  21 +++++++
 hw/arm/mps3r.c             |   6 ++
 hw/arm/msf2-som.c          |   6 ++
 hw/arm/musca.c             |  11 ++++
 hw/arm/musicpal.c          |   6 ++
 hw/arm/netduino2.c         |   6 ++
 hw/arm/netduinoplus2.c     |   6 ++
 hw/arm/npcm7xx_boards.c    |  26 +++++++++
 hw/arm/npcm8xx_boards.c    |   5 ++
 hw/arm/olimex-stm32-h405.c |   6 ++
 hw/arm/omap_sx1.c          |  11 ++++
 hw/arm/orangepi.c          |   6 ++
 hw/arm/raspi.c             |  24 ++++++++
 hw/arm/raspi4b.c           |   5 ++
 hw/arm/realview.c          |  21 +++++++
 hw/arm/sabrelite.c         |   6 ++
 hw/arm/sbsa-ref.c          |   5 ++
 hw/arm/stellaris.c         |  11 ++++
 hw/arm/stm32vldiscovery.c  |   6 ++
 hw/arm/versatilepb.c       |  11 ++++
 hw/arm/vexpress.c          |  11 ++++
 hw/arm/virt.c              |   6 ++
 hw/arm/xilinx_zynq.c       |   6 ++
 hw/arm/xlnx-versal-virt.c  |   5 ++
 hw/arm/xlnx-zcu102.c       |   5 ++
 43 files changed, 468 insertions(+)

Comments

Pierrick Bouvier April 19, 2025, 12:59 a.m. UTC | #1
On 4/18/25 10:29, Philippe Mathieu-Daudé wrote:
> Since the qemu-system-aarch64 binary is able to run
> all machines indistinctly, simply register the
> TYPE_TARGET_AARCH64_MACHINE interface for all
> existing machines under the hw/arm/ directory.
> 
> Very few machines are restricted to the qemu-system-aarch64
> binary:
> 
>    $ git grep TARGET_AARCH64 hw/arm/meson.build
>    hw/arm/meson.build:31:arm_common_ss.add(when: ['CONFIG_RASPI', 'TARGET_AARCH64'], if_true: files('bcm2838.c', 'raspi4b.c'))
>    hw/arm/meson.build:50:arm_common_ss.add(when: ['CONFIG_ASPEED_SOC', 'TARGET_AARCH64'], if_true: files('aspeed_ast27x0.c'))
> 
>    $ git grep -W AARCH64 hw/arm/Kconfig
>    hw/arm/Kconfig=185=config SBSA_REF
>    hw/arm/Kconfig-186-    bool
>    hw/arm/Kconfig-187-    default y
>    hw/arm/Kconfig:188:    depends on TCG && AARCH64
>    --
>    hw/arm/Kconfig=413=config XLNX_ZYNQMP_ARM
>    hw/arm/Kconfig-414-    bool
>    hw/arm/Kconfig-415-    default y if PIXMAN
>    hw/arm/Kconfig:416:    depends on TCG && AARCH64
>    --
>    hw/arm/Kconfig=435=config XLNX_VERSAL
>    hw/arm/Kconfig-436-    bool
>    hw/arm/Kconfig-437-    default y
>    hw/arm/Kconfig:438:    depends on TCG && AARCH64
>    --
>    hw/arm/Kconfig=475=config NPCM8XX
>    hw/arm/Kconfig-476-    bool
>    hw/arm/Kconfig-477-    default y
>    hw/arm/Kconfig:478:    depends on TCG && AARCH64
>    --
>    hw/arm/Kconfig=605=config FSL_IMX8MP_EVK
>    hw/arm/Kconfig-606-    bool
>    hw/arm/Kconfig-607-    default y
>    hw/arm/Kconfig:608:    depends on TCG && AARCH64
> 
>    $ git grep -wW TARGET_AARCH64 hw/arm | fgrep -4 MACHINE_TYPE_NAME
>    ...
>    hw/arm/aspeed.c:1939:#ifdef TARGET_AARCH64
>    hw/arm/aspeed.c-1940-    }, {
>    hw/arm/aspeed.c-1941-        .name          = MACHINE_TYPE_NAME("ast2700a0-evb"),
> 
>    hw/arm/aspeed.c-1949-        .name          = MACHINE_TYPE_NAME("ast2700a1-evb"),
> 
>    hw/arm/raspi.c:420:#ifdef TARGET_AARCH64
>    hw/arm/raspi.c-421-    }, {
>    hw/arm/raspi.c-422-        .name           = MACHINE_TYPE_NAME("raspi3ap"),
> 
>    hw/arm/raspi.c-429-    }, {
>    hw/arm/raspi.c-430-        .name           = MACHINE_TYPE_NAME("raspi3b"),
> 
> This can be verified as:
> 
> $ diff -u0 <(qemu-system-arm -M help) <(qemu-system-aarch64 -M help)
>    @@ -5,3 +4,0 @@
>    -ast2700-evb          Aspeed AST2700 A0 EVB (Cortex-A35) (alias of ast2700a0-evb)
>    -ast2700a0-evb        Aspeed AST2700 A0 EVB (Cortex-A35)
>    -ast2700a1-evb        Aspeed AST2700 A1 EVB (Cortex-A35)
>    @@ -22 +18,0 @@
>    -imx8mp-evk           NXP i.MX 8M Plus EVK Board
>    @@ -49 +44,0 @@
>    -npcm845-evb          Nuvoton NPCM845 Evaluation Board (Cortex-A35)
>    @@ -63,3 +57,0 @@
>    -raspi3ap             Raspberry Pi 3A+ (revision 1.0)
>    -raspi3b              Raspberry Pi 3B (revision 1.2)
>    -raspi4b              Raspberry Pi 4B (revision 1.5)
>    @@ -72 +63,0 @@
>    -sbsa-ref             QEMU 'SBSA Reference' ARM Virtual Machine
>    @@ -116,2 +106,0 @@
>    -xlnx-versal-virt     Xilinx Versal Virtual development board
>    -xlnx-zcu102          Xilinx ZynqMP ZCU102 board with 4xA53s and 2xR5Fs based on the value of smp
> 
> Register the TYPE_TARGET_ARM_MACHINE interface for all
> the machines not listed previously.
> 
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
> ---
>   hw/arm/aspeed.c            | 109 +++++++++++++++++++++++++++++++++++++
>   hw/arm/b-l475e-iot01a.c    |   6 ++
>   hw/arm/bananapi_m2u.c      |   6 ++
>   hw/arm/bcm2836.c           |   1 +
>   hw/arm/collie.c            |   6 ++
>   hw/arm/cubieboard.c        |   6 ++
>   hw/arm/digic_boards.c      |   6 ++
>   hw/arm/exynos4_boards.c    |  11 ++++
>   hw/arm/fby35.c             |   6 ++
>   hw/arm/highbank.c          |  11 ++++
>   hw/arm/imx25_pdk.c         |   6 ++
>   hw/arm/imx8mp-evk.c        |   5 ++
>   hw/arm/integratorcp.c      |   6 ++
>   hw/arm/kzm.c               |   6 ++
>   hw/arm/mcimx6ul-evk.c      |   6 ++
>   hw/arm/mcimx7d-sabre.c     |   6 ++
>   hw/arm/microbit.c          |   6 ++
>   hw/arm/mps2-tz.c           |  21 +++++++
>   hw/arm/mps2.c              |  21 +++++++
>   hw/arm/mps3r.c             |   6 ++
>   hw/arm/msf2-som.c          |   6 ++
>   hw/arm/musca.c             |  11 ++++
>   hw/arm/musicpal.c          |   6 ++
>   hw/arm/netduino2.c         |   6 ++
>   hw/arm/netduinoplus2.c     |   6 ++
>   hw/arm/npcm7xx_boards.c    |  26 +++++++++
>   hw/arm/npcm8xx_boards.c    |   5 ++
>   hw/arm/olimex-stm32-h405.c |   6 ++
>   hw/arm/omap_sx1.c          |  11 ++++
>   hw/arm/orangepi.c          |   6 ++
>   hw/arm/raspi.c             |  24 ++++++++
>   hw/arm/raspi4b.c           |   5 ++
>   hw/arm/realview.c          |  21 +++++++
>   hw/arm/sabrelite.c         |   6 ++
>   hw/arm/sbsa-ref.c          |   5 ++
>   hw/arm/stellaris.c         |  11 ++++
>   hw/arm/stm32vldiscovery.c  |   6 ++
>   hw/arm/versatilepb.c       |  11 ++++
>   hw/arm/vexpress.c          |  11 ++++
>   hw/arm/virt.c              |   6 ++
>   hw/arm/xilinx_zynq.c       |   6 ++
>   hw/arm/xlnx-versal-virt.c  |   5 ++
>   hw/arm/xlnx-zcu102.c       |   5 ++
>   43 files changed, 468 insertions(+)
> 
> diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
> index 82f42582fa3..ce4d49a9f59 100644
> --- a/hw/arm/aspeed.c
> +++ b/hw/arm/aspeed.c
> @@ -15,6 +15,7 @@
>   #include "hw/arm/aspeed.h"
>   #include "hw/arm/aspeed_soc.h"
>   #include "hw/arm/aspeed_eeprom.h"
> +#include "hw/arm/machines-qom.h"
>   #include "hw/block/flash.h"
>   #include "hw/i2c/i2c_mux_pca954x.h"
>   #include "hw/i2c/smbus_eeprom.h"
> @@ -1760,91 +1761,199 @@ static const TypeInfo aspeed_machine_types[] = {
>           .name          = MACHINE_TYPE_NAME("palmetto-bmc"),
>           .parent        = TYPE_ASPEED_MACHINE,
>           .class_init    = aspeed_machine_palmetto_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       }, {
>           .name          = MACHINE_TYPE_NAME("supermicrox11-bmc"),
>           .parent        = TYPE_ASPEED_MACHINE,
>           .class_init    = aspeed_machine_supermicrox11_bmc_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       }, {
>           .name          = MACHINE_TYPE_NAME("supermicro-x11spi-bmc"),
>           .parent        = TYPE_ASPEED_MACHINE,
>           .class_init    = aspeed_machine_supermicro_x11spi_bmc_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       }, {
>           .name          = MACHINE_TYPE_NAME("ast2500-evb"),
>           .parent        = TYPE_ASPEED_MACHINE,
>           .class_init    = aspeed_machine_ast2500_evb_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       }, {
>           .name          = MACHINE_TYPE_NAME("romulus-bmc"),
>           .parent        = TYPE_ASPEED_MACHINE,
>           .class_init    = aspeed_machine_romulus_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       }, {
>           .name          = MACHINE_TYPE_NAME("sonorapass-bmc"),
>           .parent        = TYPE_ASPEED_MACHINE,
>           .class_init    = aspeed_machine_sonorapass_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       }, {
>           .name          = MACHINE_TYPE_NAME("witherspoon-bmc"),
>           .parent        = TYPE_ASPEED_MACHINE,
>           .class_init    = aspeed_machine_witherspoon_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       }, {
>           .name          = MACHINE_TYPE_NAME("ast2600-evb"),
>           .parent        = TYPE_ASPEED_MACHINE,
>           .class_init    = aspeed_machine_ast2600_evb_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       }, {
>           .name          = MACHINE_TYPE_NAME("yosemitev2-bmc"),
>           .parent        = TYPE_ASPEED_MACHINE,
>           .class_init    = aspeed_machine_yosemitev2_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       }, {
>           .name          = MACHINE_TYPE_NAME("tiogapass-bmc"),
>           .parent        = TYPE_ASPEED_MACHINE,
>           .class_init    = aspeed_machine_tiogapass_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       }, {
>           .name          = MACHINE_TYPE_NAME("g220a-bmc"),
>           .parent        = TYPE_ASPEED_MACHINE,
>           .class_init    = aspeed_machine_g220a_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       }, {
>           .name          = MACHINE_TYPE_NAME("qcom-dc-scm-v1-bmc"),
>           .parent        = TYPE_ASPEED_MACHINE,
>           .class_init    = aspeed_machine_qcom_dc_scm_v1_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       }, {
>           .name          = MACHINE_TYPE_NAME("qcom-firework-bmc"),
>           .parent        = TYPE_ASPEED_MACHINE,
>           .class_init    = aspeed_machine_qcom_firework_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       }, {
>           .name          = MACHINE_TYPE_NAME("fp5280g2-bmc"),
>           .parent        = TYPE_ASPEED_MACHINE,
>           .class_init    = aspeed_machine_fp5280g2_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       }, {
>           .name          = MACHINE_TYPE_NAME("quanta-q71l-bmc"),
>           .parent        = TYPE_ASPEED_MACHINE,
>           .class_init    = aspeed_machine_quanta_q71l_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       }, {
>           .name          = MACHINE_TYPE_NAME("rainier-bmc"),
>           .parent        = TYPE_ASPEED_MACHINE,
>           .class_init    = aspeed_machine_rainier_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       }, {
>           .name          = MACHINE_TYPE_NAME("fuji-bmc"),
>           .parent        = TYPE_ASPEED_MACHINE,
>           .class_init    = aspeed_machine_fuji_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       }, {
>           .name          = MACHINE_TYPE_NAME("bletchley-bmc"),
>           .parent        = TYPE_ASPEED_MACHINE,
>           .class_init    = aspeed_machine_bletchley_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       }, {
>           .name          = MACHINE_TYPE_NAME("fby35-bmc"),
>           .parent        = MACHINE_TYPE_NAME("ast2600-evb"),
>           .class_init    = aspeed_machine_fby35_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       }, {
>           .name           = MACHINE_TYPE_NAME("ast1030-evb"),
>           .parent         = TYPE_ASPEED_MACHINE,
>           .class_init     = aspeed_minibmc_machine_ast1030_evb_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>   #ifdef TARGET_AARCH64
>       }, {
>           .name          = MACHINE_TYPE_NAME("ast2700a0-evb"),
>           .parent        = TYPE_ASPEED_MACHINE,
>           .class_init    = aspeed_machine_ast2700a0_evb_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>           }, {
>           .name          = MACHINE_TYPE_NAME("ast2700a1-evb"),
>           .parent        = TYPE_ASPEED_MACHINE,
>           .class_init    = aspeed_machine_ast2700a1_evb_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>   #endif
>       }, {
>           .name          = TYPE_ASPEED_MACHINE,
> diff --git a/hw/arm/b-l475e-iot01a.c b/hw/arm/b-l475e-iot01a.c
> index c9a5209216c..7af7db3dbb3 100644
> --- a/hw/arm/b-l475e-iot01a.c
> +++ b/hw/arm/b-l475e-iot01a.c
> @@ -29,6 +29,7 @@
>   #include "qemu/error-report.h"
>   #include "hw/arm/boot.h"
>   #include "hw/core/split-irq.h"
> +#include "hw/arm/machines-qom.h"
>   #include "hw/arm/stm32l4x5_soc.h"
>   #include "hw/gpio/stm32l4x5_gpio.h"
>   #include "hw/display/dm163.h"
> @@ -131,6 +132,11 @@ static const TypeInfo bl475e_machine_type[] = {
>           .parent         = TYPE_MACHINE,
>           .instance_size  = sizeof(Bl475eMachineState),
>           .class_init     = bl475e_machine_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       }
>   };
>   
> diff --git a/hw/arm/bananapi_m2u.c b/hw/arm/bananapi_m2u.c
> index 724ee4b05e5..5104a45390b 100644
> --- a/hw/arm/bananapi_m2u.c
> +++ b/hw/arm/bananapi_m2u.c
> @@ -27,6 +27,7 @@
>   #include "hw/qdev-properties.h"
>   #include "hw/arm/allwinner-r40.h"
>   #include "hw/arm/boot.h"
> +#include "hw/arm/machines-qom.h"
>   
>   static struct arm_boot_info bpim2u_binfo;
>   
> @@ -150,6 +151,11 @@ static const TypeInfo bananapi_machine_types[] = {
>           .name           = MACHINE_TYPE_NAME("bpim2u"),
>           .parent         = TYPE_MACHINE,
>           .class_init     = bpim2u_machine_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       },
>   };
>   
> diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
> index 95e16806fa1..f60489983ba 100644
> --- a/hw/arm/bcm2836.c
> +++ b/hw/arm/bcm2836.c
> @@ -14,6 +14,7 @@
>   #include "qemu/module.h"
>   #include "hw/arm/bcm2836.h"
>   #include "hw/arm/raspi_platform.h"
> +#include "hw/arm/machines-qom.h"
>   #include "hw/sysbus.h"
>   #include "target/arm/cpu-qom.h"
>   #include "target/arm/gtimer.h"
> diff --git a/hw/arm/collie.c b/hw/arm/collie.c
> index e83aee58c6b..458ed53f0f6 100644
> --- a/hw/arm/collie.c
> +++ b/hw/arm/collie.c
> @@ -15,6 +15,7 @@
>   #include "hw/boards.h"
>   #include "strongarm.h"
>   #include "hw/arm/boot.h"
> +#include "hw/arm/machines-qom.h"
>   #include "hw/block/flash.h"
>   #include "system/address-spaces.h"
>   #include "qom/object.h"
> @@ -86,6 +87,11 @@ static const TypeInfo collie_machine_typeinfo = {
>       .parent = TYPE_MACHINE,
>       .class_init = collie_machine_class_init,
>       .instance_size = sizeof(CollieMachineState),
> +    .interfaces = (InterfaceInfo[]) {
> +        { TYPE_TARGET_ARM_MACHINE },
> +        { TYPE_TARGET_AARCH64_MACHINE },
> +        { },
> +    },
>   };
>   
>   static void collie_machine_register_types(void)
> diff --git a/hw/arm/cubieboard.c b/hw/arm/cubieboard.c
> index 36062ac7037..00656169b72 100644
> --- a/hw/arm/cubieboard.c
> +++ b/hw/arm/cubieboard.c
> @@ -22,6 +22,7 @@
>   #include "hw/qdev-properties.h"
>   #include "hw/arm/allwinner-a10.h"
>   #include "hw/arm/boot.h"
> +#include "hw/arm/machines-qom.h"
>   #include "hw/i2c/i2c.h"
>   
>   static struct arm_boot_info cubieboard_binfo = {
> @@ -131,6 +132,11 @@ static const TypeInfo cubieboard_machine_types[] = {
>           .name           = MACHINE_TYPE_NAME("cubieboard"),
>           .parent         = TYPE_MACHINE,
>           .class_init     = cubieboard_machine_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       },
>   };
>   
> diff --git a/hw/arm/digic_boards.c b/hw/arm/digic_boards.c
> index 3c0cc6e4370..7b9fbb5524b 100644
> --- a/hw/arm/digic_boards.c
> +++ b/hw/arm/digic_boards.c
> @@ -29,6 +29,7 @@
>   #include "hw/boards.h"
>   #include "qemu/error-report.h"
>   #include "hw/arm/digic.h"
> +#include "hw/arm/machines-qom.h"
>   #include "hw/block/flash.h"
>   #include "hw/loader.h"
>   #include "system/qtest.h"
> @@ -152,6 +153,11 @@ static const TypeInfo digic_machine_types[] = {
>           .name           = MACHINE_TYPE_NAME("canon-a1100"),
>           .parent         = TYPE_MACHINE,
>           .class_init     = digic_machine_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       },
>   };
>   
> diff --git a/hw/arm/exynos4_boards.c b/hw/arm/exynos4_boards.c
> index 2d8f2d73265..71601a0d6f0 100644
> --- a/hw/arm/exynos4_boards.c
> +++ b/hw/arm/exynos4_boards.c
> @@ -28,6 +28,7 @@
>   #include "hw/sysbus.h"
>   #include "net/net.h"
>   #include "hw/arm/boot.h"
> +#include "hw/arm/machines-qom.h"
>   #include "system/address-spaces.h"
>   #include "hw/arm/exynos4210.h"
>   #include "hw/net/lan9118.h"
> @@ -172,6 +173,11 @@ static const TypeInfo nuri_type = {
>       .name = MACHINE_TYPE_NAME("nuri"),
>       .parent = TYPE_MACHINE,
>       .class_init = nuri_class_init,
> +    .interfaces = (InterfaceInfo[]) {
> +        { TYPE_TARGET_ARM_MACHINE },
> +        { TYPE_TARGET_AARCH64_MACHINE },
> +        { },
> +    },
>   };
>   
>   static void smdkc210_class_init(ObjectClass *oc, void *data)
> @@ -192,6 +198,11 @@ static const TypeInfo smdkc210_type = {
>       .name = MACHINE_TYPE_NAME("smdkc210"),
>       .parent = TYPE_MACHINE,
>       .class_init = smdkc210_class_init,
> +    .interfaces = (InterfaceInfo[]) {
> +        { TYPE_TARGET_ARM_MACHINE },
> +        { TYPE_TARGET_AARCH64_MACHINE },
> +        { },
> +    },
>   };
>   
>   static void exynos4_machines_init(void)
> diff --git a/hw/arm/fby35.c b/hw/arm/fby35.c
> index 6d3663f14a1..84b65844b34 100644
> --- a/hw/arm/fby35.c
> +++ b/hw/arm/fby35.c
> @@ -14,6 +14,7 @@
>   #include "hw/qdev-clock.h"
>   #include "hw/arm/aspeed_soc.h"
>   #include "hw/arm/boot.h"
> +#include "hw/arm/machines-qom.h"
>   
>   #define TYPE_FBY35 MACHINE_TYPE_NAME("fby35")
>   OBJECT_DECLARE_SIMPLE_TYPE(Fby35State, FBY35);
> @@ -187,6 +188,11 @@ static const TypeInfo fby35_types[] = {
>           .class_init = fby35_class_init,
>           .instance_size = sizeof(Fby35State),
>           .instance_init = fby35_instance_init,
> +        .interfaces = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       },
>   };
>   
> diff --git a/hw/arm/highbank.c b/hw/arm/highbank.c
> index 0f3c207d548..d26346ea8ad 100644
> --- a/hw/arm/highbank.c
> +++ b/hw/arm/highbank.c
> @@ -23,6 +23,7 @@
>   #include "hw/sysbus.h"
>   #include "migration/vmstate.h"
>   #include "hw/arm/boot.h"
> +#include "hw/arm/machines-qom.h"
>   #include "hw/loader.h"
>   #include "net/net.h"
>   #include "system/runstate.h"
> @@ -363,6 +364,11 @@ static const TypeInfo highbank_type = {
>       .name = MACHINE_TYPE_NAME("highbank"),
>       .parent = TYPE_MACHINE,
>       .class_init = highbank_class_init,
> +    .interfaces = (InterfaceInfo[]) {
> +        { TYPE_TARGET_ARM_MACHINE },
> +        { TYPE_TARGET_AARCH64_MACHINE },
> +        { },
> +    },
>   };
>   
>   static void midway_class_init(ObjectClass *oc, void *data)
> @@ -387,6 +393,11 @@ static const TypeInfo midway_type = {
>       .name = MACHINE_TYPE_NAME("midway"),
>       .parent = TYPE_MACHINE,
>       .class_init = midway_class_init,
> +    .interfaces = (InterfaceInfo[]) {
> +        { TYPE_TARGET_ARM_MACHINE },
> +        { TYPE_TARGET_AARCH64_MACHINE },
> +        { },
> +    },
>   };
>   
>   static void calxeda_machines_init(void)
> diff --git a/hw/arm/imx25_pdk.c b/hw/arm/imx25_pdk.c
> index a90def7f1a2..86f0855c929 100644
> --- a/hw/arm/imx25_pdk.c
> +++ b/hw/arm/imx25_pdk.c
> @@ -28,6 +28,7 @@
>   #include "hw/qdev-properties.h"
>   #include "hw/arm/fsl-imx25.h"
>   #include "hw/arm/boot.h"
> +#include "hw/arm/machines-qom.h"
>   #include "hw/boards.h"
>   #include "qemu/error-report.h"
>   #include "system/qtest.h"
> @@ -157,6 +158,11 @@ static const TypeInfo imx25_machine_types[] = {
>           .name           = MACHINE_TYPE_NAME("imx25-pdk"),
>           .parent         = TYPE_MACHINE,
>           .class_init     = imx25_pdk_machine_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       },
>   };
>   
> diff --git a/hw/arm/imx8mp-evk.c b/hw/arm/imx8mp-evk.c
> index c7d87d99230..44f704b9bd3 100644
> --- a/hw/arm/imx8mp-evk.c
> +++ b/hw/arm/imx8mp-evk.c
> @@ -10,6 +10,7 @@
>   #include "system/address-spaces.h"
>   #include "hw/arm/boot.h"
>   #include "hw/arm/fsl-imx8mp.h"
> +#include "hw/arm/machines-qom.h"
>   #include "hw/boards.h"
>   #include "hw/qdev-properties.h"
>   #include "system/qtest.h"
> @@ -79,6 +80,10 @@ static const TypeInfo imx8_machine_types[] = {
>           .name           = MACHINE_TYPE_NAME("imx8mp-evk"),
>           .parent         = TYPE_MACHINE,
>           .class_init     = imx8mp_evk_machine_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       },
>   };
>   
> diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c
> index f95916b517d..efe1075ecc0 100644
> --- a/hw/arm/integratorcp.c
> +++ b/hw/arm/integratorcp.c
> @@ -13,6 +13,7 @@
>   #include "migration/vmstate.h"
>   #include "hw/boards.h"
>   #include "hw/arm/boot.h"
> +#include "hw/arm/machines-qom.h"
>   #include "hw/misc/arm_integrator_debug.h"
>   #include "hw/net/smc91c111.h"
>   #include "net/net.h"
> @@ -760,6 +761,11 @@ static const TypeInfo integratorcp_machine_types[] = {
>           .name           = MACHINE_TYPE_NAME("integratorcp"),
>           .parent         = TYPE_MACHINE,
>           .class_init     = integratorcp_machine_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       },
>   };
>   
> diff --git a/hw/arm/kzm.c b/hw/arm/kzm.c
> index b56cabe9f94..02ece3c0139 100644
> --- a/hw/arm/kzm.c
> +++ b/hw/arm/kzm.c
> @@ -17,6 +17,7 @@
>   #include "qapi/error.h"
>   #include "hw/arm/fsl-imx31.h"
>   #include "hw/arm/boot.h"
> +#include "hw/arm/machines-qom.h"
>   #include "hw/boards.h"
>   #include "qemu/error-report.h"
>   #include "system/address-spaces.h"
> @@ -146,6 +147,11 @@ static const TypeInfo kzm_machine_types[] = {
>           .name           = MACHINE_TYPE_NAME("kzm"),
>           .parent         = TYPE_MACHINE,
>           .class_init     = kzm_machine_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       },
>   };
>   
> diff --git a/hw/arm/mcimx6ul-evk.c b/hw/arm/mcimx6ul-evk.c
> index d947836d2be..ea636fa2e7c 100644
> --- a/hw/arm/mcimx6ul-evk.c
> +++ b/hw/arm/mcimx6ul-evk.c
> @@ -14,6 +14,7 @@
>   #include "qapi/error.h"
>   #include "hw/arm/fsl-imx6ul.h"
>   #include "hw/arm/boot.h"
> +#include "hw/arm/machines-qom.h"
>   #include "hw/boards.h"
>   #include "hw/qdev-properties.h"
>   #include "qemu/error-report.h"
> @@ -84,6 +85,11 @@ static const TypeInfo imx6_machine_types[] = {
>           .name           = MACHINE_TYPE_NAME("mcimx6ul-evk"),
>           .parent         = TYPE_MACHINE,
>           .class_init     = mcimx6ul_evk_machine_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       },
>   };
>   
> diff --git a/hw/arm/mcimx7d-sabre.c b/hw/arm/mcimx7d-sabre.c
> index f5dc9c211dd..b236a6587eb 100644
> --- a/hw/arm/mcimx7d-sabre.c
> +++ b/hw/arm/mcimx7d-sabre.c
> @@ -16,6 +16,7 @@
>   #include "qapi/error.h"
>   #include "hw/arm/fsl-imx7.h"
>   #include "hw/arm/boot.h"
> +#include "hw/arm/machines-qom.h"
>   #include "hw/boards.h"
>   #include "hw/qdev-properties.h"
>   #include "qemu/error-report.h"
> @@ -84,6 +85,11 @@ static const TypeInfo imx7_machine_types[] = {
>           .name           = MACHINE_TYPE_NAME("mcimx7d-sabre"),
>           .parent         = TYPE_MACHINE,
>           .class_init     = mcimx7d_sabre_machine_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       },
>   };
>   
> diff --git a/hw/arm/microbit.c b/hw/arm/microbit.c
> index ade363daaa4..d34b1c675e5 100644
> --- a/hw/arm/microbit.c
> +++ b/hw/arm/microbit.c
> @@ -12,6 +12,7 @@
>   #include "qapi/error.h"
>   #include "hw/boards.h"
>   #include "hw/arm/boot.h"
> +#include "hw/arm/machines-qom.h"
>   #include "system/system.h"
>   #include "system/address-spaces.h"
>   
> @@ -74,6 +75,11 @@ static const TypeInfo microbit_info = {
>       .parent = TYPE_MACHINE,
>       .instance_size = sizeof(MicrobitMachineState),
>       .class_init = microbit_machine_class_init,
> +    .interfaces = (InterfaceInfo[]) {
> +        { TYPE_TARGET_ARM_MACHINE },
> +        { TYPE_TARGET_AARCH64_MACHINE },
> +        { },
> +    },
>   };
>   
>   static void microbit_machine_init(void)
> diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
> index b0633a5a69e..12512477977 100644
> --- a/hw/arm/mps2-tz.c
> +++ b/hw/arm/mps2-tz.c
> @@ -52,6 +52,7 @@
>   #include "qemu/error-report.h"
>   #include "hw/arm/boot.h"
>   #include "hw/arm/armv7m.h"
> +#include "hw/arm/machines-qom.h"
>   #include "hw/or-irq.h"
>   #include "hw/boards.h"
>   #include "system/address-spaces.h"
> @@ -1463,24 +1464,44 @@ static const TypeInfo mps2tz_an505_info = {
>       .name = TYPE_MPS2TZ_AN505_MACHINE,
>       .parent = TYPE_MPS2TZ_MACHINE,
>       .class_init = mps2tz_an505_class_init,
> +    .interfaces = (InterfaceInfo[]) {
> +        { TYPE_TARGET_ARM_MACHINE },
> +        { TYPE_TARGET_AARCH64_MACHINE },
> +        { },
> +    },
>   };
>   
>   static const TypeInfo mps2tz_an521_info = {
>       .name = TYPE_MPS2TZ_AN521_MACHINE,
>       .parent = TYPE_MPS2TZ_MACHINE,
>       .class_init = mps2tz_an521_class_init,
> +    .interfaces = (InterfaceInfo[]) {
> +        { TYPE_TARGET_ARM_MACHINE },
> +        { TYPE_TARGET_AARCH64_MACHINE },
> +        { },
> +    },
>   };
>   
>   static const TypeInfo mps3tz_an524_info = {
>       .name = TYPE_MPS3TZ_AN524_MACHINE,
>       .parent = TYPE_MPS2TZ_MACHINE,
>       .class_init = mps3tz_an524_class_init,
> +    .interfaces = (InterfaceInfo[]) {
> +        { TYPE_TARGET_ARM_MACHINE },
> +        { TYPE_TARGET_AARCH64_MACHINE },
> +        { },
> +    },
>   };
>   
>   static const TypeInfo mps3tz_an547_info = {
>       .name = TYPE_MPS3TZ_AN547_MACHINE,
>       .parent = TYPE_MPS2TZ_MACHINE,
>       .class_init = mps3tz_an547_class_init,
> +    .interfaces = (InterfaceInfo[]) {
> +        { TYPE_TARGET_ARM_MACHINE },
> +        { TYPE_TARGET_AARCH64_MACHINE },
> +        { },
> +    },
>   };
>   
>   static void mps2tz_machine_init(void)
> diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
> index 6958485a668..f39176c0005 100644
> --- a/hw/arm/mps2.c
> +++ b/hw/arm/mps2.c
> @@ -31,6 +31,7 @@
>   #include "qemu/error-report.h"
>   #include "hw/arm/boot.h"
>   #include "hw/arm/armv7m.h"
> +#include "hw/arm/machines-qom.h"
>   #include "hw/or-irq.h"
>   #include "hw/boards.h"
>   #include "system/address-spaces.h"
> @@ -563,24 +564,44 @@ static const TypeInfo mps2_an385_info = {
>       .name = TYPE_MPS2_AN385_MACHINE,
>       .parent = TYPE_MPS2_MACHINE,
>       .class_init = mps2_an385_class_init,
> +    .interfaces = (InterfaceInfo[]) {
> +        { TYPE_TARGET_ARM_MACHINE },
> +        { TYPE_TARGET_AARCH64_MACHINE },
> +        { },
> +    },
>   };
>   
>   static const TypeInfo mps2_an386_info = {
>       .name = TYPE_MPS2_AN386_MACHINE,
>       .parent = TYPE_MPS2_MACHINE,
>       .class_init = mps2_an386_class_init,
> +    .interfaces = (InterfaceInfo[]) {
> +        { TYPE_TARGET_ARM_MACHINE },
> +        { TYPE_TARGET_AARCH64_MACHINE },
> +        { },
> +    },
>   };
>   
>   static const TypeInfo mps2_an500_info = {
>       .name = TYPE_MPS2_AN500_MACHINE,
>       .parent = TYPE_MPS2_MACHINE,
>       .class_init = mps2_an500_class_init,
> +    .interfaces = (InterfaceInfo[]) {
> +        { TYPE_TARGET_ARM_MACHINE },
> +        { TYPE_TARGET_AARCH64_MACHINE },
> +        { },
> +    },
>   };
>   
>   static const TypeInfo mps2_an511_info = {
>       .name = TYPE_MPS2_AN511_MACHINE,
>       .parent = TYPE_MPS2_MACHINE,
>       .class_init = mps2_an511_class_init,
> +    .interfaces = (InterfaceInfo[]) {
> +        { TYPE_TARGET_ARM_MACHINE },
> +        { TYPE_TARGET_AARCH64_MACHINE },
> +        { },
> +    },
>   };
>   
>   static void mps2_machine_init(void)
> diff --git a/hw/arm/mps3r.c b/hw/arm/mps3r.c
> index 4dd1e8a7180..8bcf5a4d69f 100644
> --- a/hw/arm/mps3r.c
> +++ b/hw/arm/mps3r.c
> @@ -37,6 +37,7 @@
>   #include "hw/qdev-properties.h"
>   #include "hw/arm/boot.h"
>   #include "hw/arm/bsa.h"
> +#include "hw/arm/machines-qom.h"
>   #include "hw/char/cmsdk-apb-uart.h"
>   #include "hw/i2c/arm_sbcon_i2c.h"
>   #include "hw/intc/arm_gicv3.h"
> @@ -634,6 +635,11 @@ static const TypeInfo mps3r_machine_types[] = {
>           .name = TYPE_MPS3R_AN536_MACHINE,
>           .parent = TYPE_MPS3R_MACHINE,
>           .class_init = mps3r_an536_class_init,
> +        .interfaces = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       },
>   };
>   
> diff --git a/hw/arm/msf2-som.c b/hw/arm/msf2-som.c
> index 6ce47eaa27a..3f7aefc0ba4 100644
> --- a/hw/arm/msf2-som.c
> +++ b/hw/arm/msf2-som.c
> @@ -32,6 +32,7 @@
>   #include "hw/boards.h"
>   #include "hw/qdev-properties.h"
>   #include "hw/arm/boot.h"
> +#include "hw/arm/machines-qom.h"
>   #include "hw/qdev-clock.h"
>   #include "system/address-spaces.h"
>   #include "hw/arm/msf2-soc.h"
> @@ -114,6 +115,11 @@ static const TypeInfo msf2_machine_types[] = {
>           .name           = MACHINE_TYPE_NAME("emcraft-sf2"),
>           .parent         = TYPE_MACHINE,
>           .class_init     = emcraft_sf2_machine_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       },
>   };
>   
> diff --git a/hw/arm/musca.c b/hw/arm/musca.c
> index a4f43f1992b..608f16f69b2 100644
> --- a/hw/arm/musca.c
> +++ b/hw/arm/musca.c
> @@ -26,6 +26,7 @@
>   #include "system/system.h"
>   #include "hw/arm/boot.h"
>   #include "hw/arm/armsse.h"
> +#include "hw/arm/machines-qom.h"
>   #include "hw/boards.h"
>   #include "hw/char/pl011.h"
>   #include "hw/core/split-irq.h"
> @@ -657,12 +658,22 @@ static const TypeInfo musca_a_info = {
>       .name = TYPE_MUSCA_A_MACHINE,
>       .parent = TYPE_MUSCA_MACHINE,
>       .class_init = musca_a_class_init,
> +    .interfaces = (InterfaceInfo[]) {
> +        { TYPE_TARGET_ARM_MACHINE },
> +        { TYPE_TARGET_AARCH64_MACHINE },
> +        { },
> +    },
>   };
>   
>   static const TypeInfo musca_b1_info = {
>       .name = TYPE_MUSCA_B1_MACHINE,
>       .parent = TYPE_MUSCA_MACHINE,
>       .class_init = musca_b1_class_init,
> +    .interfaces = (InterfaceInfo[]) {
> +        { TYPE_TARGET_ARM_MACHINE },
> +        { TYPE_TARGET_AARCH64_MACHINE },
> +        { },
> +    },
>   };
>   
>   static void musca_machine_init(void)
> diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
> index f7c488cd1d6..e2a65f72095 100644
> --- a/hw/arm/musicpal.c
> +++ b/hw/arm/musicpal.c
> @@ -15,6 +15,7 @@
>   #include "hw/sysbus.h"
>   #include "migration/vmstate.h"
>   #include "hw/arm/boot.h"
> +#include "hw/arm/machines-qom.h"
>   #include "net/net.h"
>   #include "system/system.h"
>   #include "hw/boards.h"
> @@ -1381,6 +1382,11 @@ static const TypeInfo musicpal_types[] = {
>           .name           = MACHINE_TYPE_NAME("musicpal"),
>           .parent         = TYPE_MACHINE,
>           .class_init     = musicpal_machine_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       },
>   };
>   
> diff --git a/hw/arm/netduino2.c b/hw/arm/netduino2.c
> index 52c30055d44..2e615276902 100644
> --- a/hw/arm/netduino2.c
> +++ b/hw/arm/netduino2.c
> @@ -30,6 +30,7 @@
>   #include "qemu/error-report.h"
>   #include "hw/arm/stm32f205_soc.h"
>   #include "hw/arm/boot.h"
> +#include "hw/arm/machines-qom.h"
>   
>   /* Main SYSCLK frequency in Hz (120MHz) */
>   #define SYSCLK_FRQ 120000000ULL
> @@ -71,6 +72,11 @@ static const TypeInfo netduino_machine_types[] = {
>           .name           = MACHINE_TYPE_NAME("netduino2"),
>           .parent         = TYPE_MACHINE,
>           .class_init     = netduino2_machine_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       },
>   };
>   
> diff --git a/hw/arm/netduinoplus2.c b/hw/arm/netduinoplus2.c
> index 2735d3a0e2b..e12f78599c4 100644
> --- a/hw/arm/netduinoplus2.c
> +++ b/hw/arm/netduinoplus2.c
> @@ -30,6 +30,7 @@
>   #include "qemu/error-report.h"
>   #include "hw/arm/stm32f405_soc.h"
>   #include "hw/arm/boot.h"
> +#include "hw/arm/machines-qom.h"
>   
>   /* Main SYSCLK frequency in Hz (168MHz) */
>   #define SYSCLK_FRQ 168000000ULL
> @@ -71,6 +72,11 @@ static const TypeInfo netduino_machine_types[] = {
>           .name           = MACHINE_TYPE_NAME("netduinoplus2"),
>           .parent         = TYPE_MACHINE,
>           .class_init     = netduinoplus2_machine_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       },
>   };
>   
> diff --git a/hw/arm/npcm7xx_boards.c b/hw/arm/npcm7xx_boards.c
> index eb28b97ad83..4b6d3443d53 100644
> --- a/hw/arm/npcm7xx_boards.c
> +++ b/hw/arm/npcm7xx_boards.c
> @@ -17,6 +17,7 @@
>   #include "qemu/osdep.h"
>   
>   #include "hw/arm/npcm7xx.h"
> +#include "hw/arm/machines-qom.h"
>   #include "hw/core/cpu.h"
>   #include "hw/i2c/i2c_mux_pca954x.h"
>   #include "hw/i2c/smbus_eeprom.h"
> @@ -549,22 +550,47 @@ static const TypeInfo npcm7xx_machine_types[] = {
>           .name           = MACHINE_TYPE_NAME("npcm750-evb"),
>           .parent         = TYPE_NPCM7XX_MACHINE,
>           .class_init     = npcm750_evb_machine_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +                { TYPE_TARGET_ARM_MACHINE },
> +                { TYPE_TARGET_AARCH64_MACHINE },
> +                { },
> +        },
>       }, {
>           .name           = MACHINE_TYPE_NAME("quanta-gsj"),
>           .parent         = TYPE_NPCM7XX_MACHINE,
>           .class_init     = gsj_machine_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +                { TYPE_TARGET_ARM_MACHINE },
> +                { TYPE_TARGET_AARCH64_MACHINE },
> +                { },
> +        },
>       }, {
>           .name           = MACHINE_TYPE_NAME("quanta-gbs-bmc"),
>           .parent         = TYPE_NPCM7XX_MACHINE,
>           .class_init     = gbs_bmc_machine_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +                { TYPE_TARGET_ARM_MACHINE },
> +                { TYPE_TARGET_AARCH64_MACHINE },
> +                { },
> +        },
>       }, {
>           .name           = MACHINE_TYPE_NAME("kudo-bmc"),
>           .parent         = TYPE_NPCM7XX_MACHINE,
>           .class_init     = kudo_bmc_machine_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +                { TYPE_TARGET_ARM_MACHINE },
> +                { TYPE_TARGET_AARCH64_MACHINE },
> +                { },
> +        },
>       }, {
>           .name           = MACHINE_TYPE_NAME("mori-bmc"),
>           .parent         = TYPE_NPCM7XX_MACHINE,
>           .class_init     = mori_bmc_machine_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +                { TYPE_TARGET_ARM_MACHINE },
> +                { TYPE_TARGET_AARCH64_MACHINE },
> +                { },
> +        },
>       },
>   };
>   
> diff --git a/hw/arm/npcm8xx_boards.c b/hw/arm/npcm8xx_boards.c
> index 3fb8478e72e..919c14dd809 100644
> --- a/hw/arm/npcm8xx_boards.c
> +++ b/hw/arm/npcm8xx_boards.c
> @@ -19,6 +19,7 @@
>   #include "chardev/char.h"
>   #include "hw/boards.h"
>   #include "hw/arm/npcm8xx.h"
> +#include "hw/arm/machines-qom.h"
>   #include "hw/core/cpu.h"
>   #include "hw/loader.h"
>   #include "hw/qdev-core.h"
> @@ -248,6 +249,10 @@ static const TypeInfo npcm8xx_machine_types[] = {
>           .name           = MACHINE_TYPE_NAME("npcm845-evb"),
>           .parent         = TYPE_NPCM8XX_MACHINE,
>           .class_init     = npcm845_evb_machine_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +                { TYPE_TARGET_AARCH64_MACHINE },
> +                { },
> +        },
>       },
>   };
>   
> diff --git a/hw/arm/olimex-stm32-h405.c b/hw/arm/olimex-stm32-h405.c
> index 795218c93cf..f81f4094149 100644
> --- a/hw/arm/olimex-stm32-h405.c
> +++ b/hw/arm/olimex-stm32-h405.c
> @@ -31,6 +31,7 @@
>   #include "qemu/error-report.h"
>   #include "hw/arm/stm32f405_soc.h"
>   #include "hw/arm/boot.h"
> +#include "hw/arm/machines-qom.h"
>   
>   /* olimex-stm32-h405 implementation is derived from netduinoplus2 */
>   
> @@ -77,6 +78,11 @@ static const TypeInfo olimex_stm32_machine_types[] = {
>           .name           = MACHINE_TYPE_NAME("olimex-stm32-h405"),
>           .parent         = TYPE_MACHINE,
>           .class_init     = olimex_stm32_machine_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       },
>   };
>   
> diff --git a/hw/arm/omap_sx1.c b/hw/arm/omap_sx1.c
> index aa1e96b3ad7..2537045c1ac 100644
> --- a/hw/arm/omap_sx1.c
> +++ b/hw/arm/omap_sx1.c
> @@ -32,6 +32,7 @@
>   #include "hw/arm/omap.h"
>   #include "hw/boards.h"
>   #include "hw/arm/boot.h"
> +#include "hw/arm/machines-qom.h"
>   #include "hw/block/flash.h"
>   #include "system/qtest.h"
>   #include "system/address-spaces.h"
> @@ -219,6 +220,11 @@ static const TypeInfo sx1_machine_v2_type = {
>       .name = MACHINE_TYPE_NAME("sx1"),
>       .parent = TYPE_MACHINE,
>       .class_init = sx1_machine_v2_class_init,
> +    .interfaces = (InterfaceInfo[]) {
> +        { TYPE_TARGET_ARM_MACHINE },
> +        { TYPE_TARGET_AARCH64_MACHINE },
> +        { },
> +    },
>   };
>   
>   static void sx1_machine_v1_class_init(ObjectClass *oc, void *data)
> @@ -238,6 +244,11 @@ static const TypeInfo sx1_machine_v1_type = {
>       .name = MACHINE_TYPE_NAME("sx1-v1"),
>       .parent = TYPE_MACHINE,
>       .class_init = sx1_machine_v1_class_init,
> +    .interfaces = (InterfaceInfo[]) {
> +        { TYPE_TARGET_ARM_MACHINE },
> +        { TYPE_TARGET_AARCH64_MACHINE },
> +        { },
> +    },
>   };
>   
>   static void sx1_machine_init(void)
> diff --git a/hw/arm/orangepi.c b/hw/arm/orangepi.c
> index 6821033bfd7..4e333d428a2 100644
> --- a/hw/arm/orangepi.c
> +++ b/hw/arm/orangepi.c
> @@ -26,6 +26,7 @@
>   #include "hw/qdev-properties.h"
>   #include "hw/arm/allwinner-h3.h"
>   #include "hw/arm/boot.h"
> +#include "hw/arm/machines-qom.h"
>   
>   static struct arm_boot_info orangepi_binfo;
>   
> @@ -130,6 +131,11 @@ static const TypeInfo orangepi_machine_types[] = {
>           .name           = MACHINE_TYPE_NAME("orangepi-pc"),
>           .parent         = TYPE_MACHINE,
>           .class_init     = orangepi_machine_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       },
>   };
>   
> diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
> index dce35ca11aa..69cccdbb6b1 100644
> --- a/hw/arm/raspi.c
> +++ b/hw/arm/raspi.c
> @@ -25,6 +25,7 @@
>   #include "hw/boards.h"
>   #include "hw/loader.h"
>   #include "hw/arm/boot.h"
> +#include "hw/arm/machines-qom.h"
>   #include "qom/object.h"
>   
>   #define TYPE_RASPI_MACHINE  MACHINE_TYPE_NAME("raspi-common")
> @@ -394,23 +395,46 @@ static const TypeInfo raspi_machine_types[] = {
>           .name           = MACHINE_TYPE_NAME("raspi0"),
>           .parent         = TYPE_RASPI_MACHINE,
>           .class_init     = raspi0_machine_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       }, {
>           .name           = MACHINE_TYPE_NAME("raspi1ap"),
>           .parent         = TYPE_RASPI_MACHINE,
>           .class_init     = raspi1ap_machine_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       }, {
>           .name           = MACHINE_TYPE_NAME("raspi2b"),
>           .parent         = TYPE_RASPI_MACHINE,
>           .class_init     = raspi2b_machine_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>   #ifdef TARGET_AARCH64
>       }, {
>           .name           = MACHINE_TYPE_NAME("raspi3ap"),
>           .parent         = TYPE_RASPI_MACHINE,
>           .class_init     = raspi3ap_machine_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       }, {
>           .name           = MACHINE_TYPE_NAME("raspi3b"),
>           .parent         = TYPE_RASPI_MACHINE,
>           .class_init     = raspi3b_machine_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>   #endif
>       }, {
>           .name           = TYPE_RASPI_MACHINE,
> diff --git a/hw/arm/raspi4b.c b/hw/arm/raspi4b.c
> index f6de103a3e1..8fda6d3b0ca 100644
> --- a/hw/arm/raspi4b.c
> +++ b/hw/arm/raspi4b.c
> @@ -11,6 +11,7 @@
>   #include "qemu/cutils.h"
>   #include "qapi/error.h"
>   #include "qapi/visitor.h"
> +#include "hw/arm/machines-qom.h"
>   #include "hw/arm/raspi_platform.h"
>   #include "hw/display/bcm2835_fb.h"
>   #include "hw/registerfields.h"
> @@ -127,6 +128,10 @@ static const TypeInfo raspi4b_machine_type = {
>       .parent         = TYPE_RASPI_BASE_MACHINE,
>       .instance_size  = sizeof(Raspi4bMachineState),
>       .class_init     = raspi4b_machine_class_init,
> +    .interfaces     = (InterfaceInfo[]) {
> +        { TYPE_TARGET_AARCH64_MACHINE },
> +        { },
> +    },
>   };
>   
>   static void raspi4b_machine_register_type(void)
> diff --git a/hw/arm/realview.c b/hw/arm/realview.c
> index 008eeaf049a..aed864bcd4f 100644
> --- a/hw/arm/realview.c
> +++ b/hw/arm/realview.c
> @@ -13,6 +13,7 @@
>   #include "hw/sysbus.h"
>   #include "hw/arm/boot.h"
>   #include "hw/arm/primecell.h"
> +#include "hw/arm/machines-qom.h"
>   #include "hw/core/split-irq.h"
>   #include "hw/net/lan9118.h"
>   #include "hw/net/smc91c111.h"
> @@ -431,6 +432,11 @@ static const TypeInfo realview_eb_type = {
>       .name = MACHINE_TYPE_NAME("realview-eb"),
>       .parent = TYPE_MACHINE,
>       .class_init = realview_eb_class_init,
> +    .interfaces = (InterfaceInfo[]) {
> +        { TYPE_TARGET_ARM_MACHINE },
> +        { TYPE_TARGET_AARCH64_MACHINE },
> +        { },
> +    },
>   };
>   
>   static void realview_eb_mpcore_class_init(ObjectClass *oc, void *data)
> @@ -452,6 +458,11 @@ static const TypeInfo realview_eb_mpcore_type = {
>       .name = MACHINE_TYPE_NAME("realview-eb-mpcore"),
>       .parent = TYPE_MACHINE,
>       .class_init = realview_eb_mpcore_class_init,
> +    .interfaces = (InterfaceInfo[]) {
> +        { TYPE_TARGET_ARM_MACHINE },
> +        { TYPE_TARGET_AARCH64_MACHINE },
> +        { },
> +    },
>   };
>   
>   static void realview_pb_a8_class_init(ObjectClass *oc, void *data)
> @@ -471,6 +482,11 @@ static const TypeInfo realview_pb_a8_type = {
>       .name = MACHINE_TYPE_NAME("realview-pb-a8"),
>       .parent = TYPE_MACHINE,
>       .class_init = realview_pb_a8_class_init,
> +    .interfaces = (InterfaceInfo[]) {
> +        { TYPE_TARGET_ARM_MACHINE },
> +        { TYPE_TARGET_AARCH64_MACHINE },
> +        { },
> +    },
>   };
>   
>   static void realview_pbx_a9_class_init(ObjectClass *oc, void *data)
> @@ -491,6 +507,11 @@ static const TypeInfo realview_pbx_a9_type = {
>       .name = MACHINE_TYPE_NAME("realview-pbx-a9"),
>       .parent = TYPE_MACHINE,
>       .class_init = realview_pbx_a9_class_init,
> +    .interfaces = (InterfaceInfo[]) {
> +        { TYPE_TARGET_ARM_MACHINE },
> +        { TYPE_TARGET_AARCH64_MACHINE },
> +        { },
> +    },
>   };
>   
>   static void realview_machine_init(void)
> diff --git a/hw/arm/sabrelite.c b/hw/arm/sabrelite.c
> index ea59ba301e7..bc472dcad2c 100644
> --- a/hw/arm/sabrelite.c
> +++ b/hw/arm/sabrelite.c
> @@ -14,6 +14,7 @@
>   #include "qapi/error.h"
>   #include "hw/arm/fsl-imx6.h"
>   #include "hw/arm/boot.h"
> +#include "hw/arm/machines-qom.h"
>   #include "hw/boards.h"
>   #include "hw/qdev-properties.h"
>   #include "qemu/error-report.h"
> @@ -120,6 +121,11 @@ static const TypeInfo sabrelite_machine_types[] = {
>           .name           = MACHINE_TYPE_NAME("sabrelite"),
>           .parent         = TYPE_MACHINE,
>           .class_init     = sabrelite_machine_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       },
>   };
>   
> diff --git a/hw/arm/sbsa-ref.c b/hw/arm/sbsa-ref.c
> index aa09d7a0917..6584097fc25 100644
> --- a/hw/arm/sbsa-ref.c
> +++ b/hw/arm/sbsa-ref.c
> @@ -34,6 +34,7 @@
>   #include "hw/arm/bsa.h"
>   #include "hw/arm/fdt.h"
>   #include "hw/arm/smmuv3.h"
> +#include "hw/arm/machines-qom.h"
>   #include "hw/block/flash.h"
>   #include "hw/boards.h"
>   #include "hw/ide/ide-bus.h"
> @@ -920,6 +921,10 @@ static const TypeInfo sbsa_ref_info = {
>       .instance_init = sbsa_ref_instance_init,
>       .class_init    = sbsa_ref_class_init,
>       .instance_size = sizeof(SBSAMachineState),
> +    .interfaces    = (InterfaceInfo[]) {
> +        { TYPE_TARGET_AARCH64_MACHINE },
> +        { },
> +    },
>   };
>   
>   static void sbsa_ref_machine_init(void)
> diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
> index cbe914c93e9..8dc68c145c1 100644
> --- a/hw/arm/stellaris.c
> +++ b/hw/arm/stellaris.c
> @@ -15,6 +15,7 @@
>   #include "hw/sd/sd.h"
>   #include "hw/ssi/ssi.h"
>   #include "hw/arm/boot.h"
> +#include "hw/arm/machines-qom.h"
>   #include "qemu/timer.h"
>   #include "hw/i2c/i2c.h"
>   #include "net/net.h"
> @@ -1427,6 +1428,11 @@ static const TypeInfo lm3s811evb_type = {
>       .name = MACHINE_TYPE_NAME("lm3s811evb"),
>       .parent = TYPE_MACHINE,
>       .class_init = lm3s811evb_class_init,
> +    .interfaces = (InterfaceInfo[]) {
> +        { TYPE_TARGET_ARM_MACHINE },
> +        { TYPE_TARGET_AARCH64_MACHINE },
> +        { },
> +    },
>   };
>   
>   /*
> @@ -1448,6 +1454,11 @@ static const TypeInfo lm3s6965evb_type = {
>       .name = MACHINE_TYPE_NAME("lm3s6965evb"),
>       .parent = TYPE_MACHINE,
>       .class_init = lm3s6965evb_class_init,
> +    .interfaces = (InterfaceInfo[]) {
> +        { TYPE_TARGET_ARM_MACHINE },
> +        { TYPE_TARGET_AARCH64_MACHINE },
> +        { },
> +    },
>   };
>   
>   static void stellaris_machine_init(void)
> diff --git a/hw/arm/stm32vldiscovery.c b/hw/arm/stm32vldiscovery.c
> index 3a9728ca719..b7eb948bc2d 100644
> --- a/hw/arm/stm32vldiscovery.c
> +++ b/hw/arm/stm32vldiscovery.c
> @@ -31,6 +31,7 @@
>   #include "qemu/error-report.h"
>   #include "hw/arm/stm32f100_soc.h"
>   #include "hw/arm/boot.h"
> +#include "hw/arm/machines-qom.h"
>   
>   /* stm32vldiscovery implementation is derived from netduinoplus2 */
>   
> @@ -74,6 +75,11 @@ static const TypeInfo stm32vldiscovery_machine_types[] = {
>           .name           = MACHINE_TYPE_NAME("stm32vldiscovery"),
>           .parent         = TYPE_MACHINE,
>           .class_init     = stm32vldiscovery_machine_class_init,
> +        .interfaces     = (InterfaceInfo[]) {
> +            { TYPE_TARGET_ARM_MACHINE },
> +            { TYPE_TARGET_AARCH64_MACHINE },
> +            { },
> +        },
>       },
>   };
>   
> diff --git a/hw/arm/versatilepb.c b/hw/arm/versatilepb.c
> index 35766445fa4..defc4d7d170 100644
> --- a/hw/arm/versatilepb.c
> +++ b/hw/arm/versatilepb.c
> @@ -12,6 +12,7 @@
>   #include "hw/sysbus.h"
>   #include "migration/vmstate.h"
>   #include "hw/arm/boot.h"
> +#include "hw/arm/machines-qom.h"
>   #include "hw/net/smc91c111.h"
>   #include "net/net.h"
>   #include "system/system.h"
> @@ -431,6 +432,11 @@ static const TypeInfo versatilepb_type = {
>       .name = MACHINE_TYPE_NAME("versatilepb"),
>       .parent = TYPE_MACHINE,
>       .class_init = versatilepb_class_init,
> +    .interfaces = (InterfaceInfo[]) {
> +        { TYPE_TARGET_ARM_MACHINE },
> +        { TYPE_TARGET_AARCH64_MACHINE },
> +        { },
> +    },
>   };
>   
>   static void versatileab_class_init(ObjectClass *oc, void *data)
> @@ -452,6 +458,11 @@ static const TypeInfo versatileab_type = {
>       .name = MACHINE_TYPE_NAME("versatileab"),
>       .parent = TYPE_MACHINE,
>       .class_init = versatileab_class_init,
> +    .interfaces = (InterfaceInfo[]) {
> +        { TYPE_TARGET_ARM_MACHINE },
> +        { TYPE_TARGET_AARCH64_MACHINE },
> +        { },
> +    },
>   };
>   
>   static void versatile_machine_init(void)
> diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
> index 76c6107766c..38b203b52da 100644
> --- a/hw/arm/vexpress.c
> +++ b/hw/arm/vexpress.c
> @@ -27,6 +27,7 @@
>   #include "hw/sysbus.h"
>   #include "hw/arm/boot.h"
>   #include "hw/arm/primecell.h"
> +#include "hw/arm/machines-qom.h"
>   #include "hw/net/lan9118.h"
>   #include "hw/i2c/i2c.h"
>   #include "net/net.h"
> @@ -850,6 +851,11 @@ static const TypeInfo vexpress_a9_info = {
>       .parent = TYPE_VEXPRESS_MACHINE,
>       .class_init = vexpress_a9_class_init,
>       .instance_init = vexpress_a9_instance_init,
> +    .interfaces = (InterfaceInfo[]) {
> +        { TYPE_TARGET_ARM_MACHINE },
> +        { TYPE_TARGET_AARCH64_MACHINE },
> +        { },
> +    },
>   };
>   
>   static const TypeInfo vexpress_a15_info = {
> @@ -857,6 +863,11 @@ static const TypeInfo vexpress_a15_info = {
>       .parent = TYPE_VEXPRESS_MACHINE,
>       .class_init = vexpress_a15_class_init,
>       .instance_init = vexpress_a15_instance_init,
> +    .interfaces = (InterfaceInfo[]) {
> +        { TYPE_TARGET_ARM_MACHINE },
> +        { TYPE_TARGET_AARCH64_MACHINE },
> +        { },
> +    },
>   };
>   
>   static void vexpress_machine_init(void)
> diff --git a/hw/arm/virt.c b/hw/arm/virt.c
> index a96452f17a4..a3c9ffe29eb 100644
> --- a/hw/arm/virt.c
> +++ b/hw/arm/virt.c
> @@ -37,6 +37,7 @@
>   #include "hw/arm/boot.h"
>   #include "hw/arm/primecell.h"
>   #include "hw/arm/virt.h"
> +#include "hw/arm/machines-qom.h"
>   #include "hw/block/flash.h"
>   #include "hw/vfio/vfio-calxeda-xgmac.h"
>   #include "hw/vfio/vfio-amd-xgbe.h"
> @@ -123,6 +124,11 @@ static void arm_virt_compat_set(MachineClass *mc)
>           .name = MACHINE_VER_TYPE_NAME("virt", __VA_ARGS__), \
>           .parent = TYPE_VIRT_MACHINE, \
>           .class_init = MACHINE_VER_SYM(class_init, virt, __VA_ARGS__), \
> +        .interfaces = (InterfaceInfo[]) { \
> +            { TYPE_TARGET_ARM_MACHINE }, \
> +            { TYPE_TARGET_AARCH64_MACHINE }, \
> +            { }, \
> +        }, \
>       }; \
>       static void MACHINE_VER_SYM(register, virt, __VA_ARGS__)(void) \
>       { \
> diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
> index b8916665ed6..433907093fa 100644
> --- a/hw/arm/xilinx_zynq.c
> +++ b/hw/arm/xilinx_zynq.c
> @@ -20,6 +20,7 @@
>   #include "qapi/error.h"
>   #include "hw/sysbus.h"
>   #include "hw/arm/boot.h"
> +#include "hw/arm/machines-qom.h"
>   #include "net/net.h"
>   #include "system/system.h"
>   #include "hw/boards.h"
> @@ -480,6 +481,11 @@ static const TypeInfo zynq_machine_type = {
>       .parent = TYPE_MACHINE,
>       .class_init = zynq_machine_class_init,
>       .instance_size = sizeof(ZynqMachineState),
> +    .interfaces = (InterfaceInfo[]) {
> +        { TYPE_TARGET_ARM_MACHINE },
> +        { TYPE_TARGET_AARCH64_MACHINE },
> +        { },
> +    },
>   };
>   
>   static void zynq_machine_register_types(void)
> diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c
> index 0c6f0359e3d..cb7466f7250 100644
> --- a/hw/arm/xlnx-versal-virt.c
> +++ b/hw/arm/xlnx-versal-virt.c
> @@ -20,6 +20,7 @@
>   #include "hw/qdev-properties.h"
>   #include "hw/arm/xlnx-versal.h"
>   #include "hw/arm/boot.h"
> +#include "hw/arm/machines-qom.h"
>   #include "target/arm/multiprocessing.h"
>   #include "qom/object.h"
>   
> @@ -833,6 +834,10 @@ static const TypeInfo versal_virt_machine_init_typeinfo = {
>       .instance_init = versal_virt_machine_instance_init,
>       .instance_size = sizeof(VersalVirt),
>       .instance_finalize = versal_virt_machine_finalize,
> +    .interfaces = (InterfaceInfo[]) {
> +        { TYPE_TARGET_AARCH64_MACHINE },
> +        { },
> +    },
>   };
>   
>   static void versal_virt_machine_init_register_types(void)
> diff --git a/hw/arm/xlnx-zcu102.c b/hw/arm/xlnx-zcu102.c
> index 4fdb153e4d8..f730dbbd908 100644
> --- a/hw/arm/xlnx-zcu102.c
> +++ b/hw/arm/xlnx-zcu102.c
> @@ -19,6 +19,7 @@
>   #include "qapi/error.h"
>   #include "hw/arm/xlnx-zynqmp.h"
>   #include "hw/arm/boot.h"
> +#include "hw/arm/machines-qom.h"
>   #include "hw/boards.h"
>   #include "qemu/error-report.h"
>   #include "qemu/log.h"
> @@ -303,6 +304,10 @@ static const TypeInfo xlnx_zcu102_machine_init_typeinfo = {
>       .class_init = xlnx_zcu102_machine_class_init,
>       .instance_init = xlnx_zcu102_machine_instance_init,
>       .instance_size = sizeof(XlnxZCU102),
> +    .interfaces = (InterfaceInfo[]) {
> +        { TYPE_TARGET_AARCH64_MACHINE },
> +        { },
> +    },
>   };
>   
>   static void xlnx_zcu102_machine_init_register_types(void)

Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
diff mbox series

Patch

diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
index 82f42582fa3..ce4d49a9f59 100644
--- a/hw/arm/aspeed.c
+++ b/hw/arm/aspeed.c
@@ -15,6 +15,7 @@ 
 #include "hw/arm/aspeed.h"
 #include "hw/arm/aspeed_soc.h"
 #include "hw/arm/aspeed_eeprom.h"
+#include "hw/arm/machines-qom.h"
 #include "hw/block/flash.h"
 #include "hw/i2c/i2c_mux_pca954x.h"
 #include "hw/i2c/smbus_eeprom.h"
@@ -1760,91 +1761,199 @@  static const TypeInfo aspeed_machine_types[] = {
         .name          = MACHINE_TYPE_NAME("palmetto-bmc"),
         .parent        = TYPE_ASPEED_MACHINE,
         .class_init    = aspeed_machine_palmetto_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     }, {
         .name          = MACHINE_TYPE_NAME("supermicrox11-bmc"),
         .parent        = TYPE_ASPEED_MACHINE,
         .class_init    = aspeed_machine_supermicrox11_bmc_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     }, {
         .name          = MACHINE_TYPE_NAME("supermicro-x11spi-bmc"),
         .parent        = TYPE_ASPEED_MACHINE,
         .class_init    = aspeed_machine_supermicro_x11spi_bmc_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     }, {
         .name          = MACHINE_TYPE_NAME("ast2500-evb"),
         .parent        = TYPE_ASPEED_MACHINE,
         .class_init    = aspeed_machine_ast2500_evb_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     }, {
         .name          = MACHINE_TYPE_NAME("romulus-bmc"),
         .parent        = TYPE_ASPEED_MACHINE,
         .class_init    = aspeed_machine_romulus_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     }, {
         .name          = MACHINE_TYPE_NAME("sonorapass-bmc"),
         .parent        = TYPE_ASPEED_MACHINE,
         .class_init    = aspeed_machine_sonorapass_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     }, {
         .name          = MACHINE_TYPE_NAME("witherspoon-bmc"),
         .parent        = TYPE_ASPEED_MACHINE,
         .class_init    = aspeed_machine_witherspoon_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     }, {
         .name          = MACHINE_TYPE_NAME("ast2600-evb"),
         .parent        = TYPE_ASPEED_MACHINE,
         .class_init    = aspeed_machine_ast2600_evb_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     }, {
         .name          = MACHINE_TYPE_NAME("yosemitev2-bmc"),
         .parent        = TYPE_ASPEED_MACHINE,
         .class_init    = aspeed_machine_yosemitev2_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     }, {
         .name          = MACHINE_TYPE_NAME("tiogapass-bmc"),
         .parent        = TYPE_ASPEED_MACHINE,
         .class_init    = aspeed_machine_tiogapass_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     }, {
         .name          = MACHINE_TYPE_NAME("g220a-bmc"),
         .parent        = TYPE_ASPEED_MACHINE,
         .class_init    = aspeed_machine_g220a_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     }, {
         .name          = MACHINE_TYPE_NAME("qcom-dc-scm-v1-bmc"),
         .parent        = TYPE_ASPEED_MACHINE,
         .class_init    = aspeed_machine_qcom_dc_scm_v1_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     }, {
         .name          = MACHINE_TYPE_NAME("qcom-firework-bmc"),
         .parent        = TYPE_ASPEED_MACHINE,
         .class_init    = aspeed_machine_qcom_firework_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     }, {
         .name          = MACHINE_TYPE_NAME("fp5280g2-bmc"),
         .parent        = TYPE_ASPEED_MACHINE,
         .class_init    = aspeed_machine_fp5280g2_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     }, {
         .name          = MACHINE_TYPE_NAME("quanta-q71l-bmc"),
         .parent        = TYPE_ASPEED_MACHINE,
         .class_init    = aspeed_machine_quanta_q71l_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     }, {
         .name          = MACHINE_TYPE_NAME("rainier-bmc"),
         .parent        = TYPE_ASPEED_MACHINE,
         .class_init    = aspeed_machine_rainier_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     }, {
         .name          = MACHINE_TYPE_NAME("fuji-bmc"),
         .parent        = TYPE_ASPEED_MACHINE,
         .class_init    = aspeed_machine_fuji_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     }, {
         .name          = MACHINE_TYPE_NAME("bletchley-bmc"),
         .parent        = TYPE_ASPEED_MACHINE,
         .class_init    = aspeed_machine_bletchley_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     }, {
         .name          = MACHINE_TYPE_NAME("fby35-bmc"),
         .parent        = MACHINE_TYPE_NAME("ast2600-evb"),
         .class_init    = aspeed_machine_fby35_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     }, {
         .name           = MACHINE_TYPE_NAME("ast1030-evb"),
         .parent         = TYPE_ASPEED_MACHINE,
         .class_init     = aspeed_minibmc_machine_ast1030_evb_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
 #ifdef TARGET_AARCH64
     }, {
         .name          = MACHINE_TYPE_NAME("ast2700a0-evb"),
         .parent        = TYPE_ASPEED_MACHINE,
         .class_init    = aspeed_machine_ast2700a0_evb_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
         }, {
         .name          = MACHINE_TYPE_NAME("ast2700a1-evb"),
         .parent        = TYPE_ASPEED_MACHINE,
         .class_init    = aspeed_machine_ast2700a1_evb_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
 #endif
     }, {
         .name          = TYPE_ASPEED_MACHINE,
diff --git a/hw/arm/b-l475e-iot01a.c b/hw/arm/b-l475e-iot01a.c
index c9a5209216c..7af7db3dbb3 100644
--- a/hw/arm/b-l475e-iot01a.c
+++ b/hw/arm/b-l475e-iot01a.c
@@ -29,6 +29,7 @@ 
 #include "qemu/error-report.h"
 #include "hw/arm/boot.h"
 #include "hw/core/split-irq.h"
+#include "hw/arm/machines-qom.h"
 #include "hw/arm/stm32l4x5_soc.h"
 #include "hw/gpio/stm32l4x5_gpio.h"
 #include "hw/display/dm163.h"
@@ -131,6 +132,11 @@  static const TypeInfo bl475e_machine_type[] = {
         .parent         = TYPE_MACHINE,
         .instance_size  = sizeof(Bl475eMachineState),
         .class_init     = bl475e_machine_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     }
 };
 
diff --git a/hw/arm/bananapi_m2u.c b/hw/arm/bananapi_m2u.c
index 724ee4b05e5..5104a45390b 100644
--- a/hw/arm/bananapi_m2u.c
+++ b/hw/arm/bananapi_m2u.c
@@ -27,6 +27,7 @@ 
 #include "hw/qdev-properties.h"
 #include "hw/arm/allwinner-r40.h"
 #include "hw/arm/boot.h"
+#include "hw/arm/machines-qom.h"
 
 static struct arm_boot_info bpim2u_binfo;
 
@@ -150,6 +151,11 @@  static const TypeInfo bananapi_machine_types[] = {
         .name           = MACHINE_TYPE_NAME("bpim2u"),
         .parent         = TYPE_MACHINE,
         .class_init     = bpim2u_machine_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     },
 };
 
diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c
index 95e16806fa1..f60489983ba 100644
--- a/hw/arm/bcm2836.c
+++ b/hw/arm/bcm2836.c
@@ -14,6 +14,7 @@ 
 #include "qemu/module.h"
 #include "hw/arm/bcm2836.h"
 #include "hw/arm/raspi_platform.h"
+#include "hw/arm/machines-qom.h"
 #include "hw/sysbus.h"
 #include "target/arm/cpu-qom.h"
 #include "target/arm/gtimer.h"
diff --git a/hw/arm/collie.c b/hw/arm/collie.c
index e83aee58c6b..458ed53f0f6 100644
--- a/hw/arm/collie.c
+++ b/hw/arm/collie.c
@@ -15,6 +15,7 @@ 
 #include "hw/boards.h"
 #include "strongarm.h"
 #include "hw/arm/boot.h"
+#include "hw/arm/machines-qom.h"
 #include "hw/block/flash.h"
 #include "system/address-spaces.h"
 #include "qom/object.h"
@@ -86,6 +87,11 @@  static const TypeInfo collie_machine_typeinfo = {
     .parent = TYPE_MACHINE,
     .class_init = collie_machine_class_init,
     .instance_size = sizeof(CollieMachineState),
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_TARGET_ARM_MACHINE },
+        { TYPE_TARGET_AARCH64_MACHINE },
+        { },
+    },
 };
 
 static void collie_machine_register_types(void)
diff --git a/hw/arm/cubieboard.c b/hw/arm/cubieboard.c
index 36062ac7037..00656169b72 100644
--- a/hw/arm/cubieboard.c
+++ b/hw/arm/cubieboard.c
@@ -22,6 +22,7 @@ 
 #include "hw/qdev-properties.h"
 #include "hw/arm/allwinner-a10.h"
 #include "hw/arm/boot.h"
+#include "hw/arm/machines-qom.h"
 #include "hw/i2c/i2c.h"
 
 static struct arm_boot_info cubieboard_binfo = {
@@ -131,6 +132,11 @@  static const TypeInfo cubieboard_machine_types[] = {
         .name           = MACHINE_TYPE_NAME("cubieboard"),
         .parent         = TYPE_MACHINE,
         .class_init     = cubieboard_machine_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     },
 };
 
diff --git a/hw/arm/digic_boards.c b/hw/arm/digic_boards.c
index 3c0cc6e4370..7b9fbb5524b 100644
--- a/hw/arm/digic_boards.c
+++ b/hw/arm/digic_boards.c
@@ -29,6 +29,7 @@ 
 #include "hw/boards.h"
 #include "qemu/error-report.h"
 #include "hw/arm/digic.h"
+#include "hw/arm/machines-qom.h"
 #include "hw/block/flash.h"
 #include "hw/loader.h"
 #include "system/qtest.h"
@@ -152,6 +153,11 @@  static const TypeInfo digic_machine_types[] = {
         .name           = MACHINE_TYPE_NAME("canon-a1100"),
         .parent         = TYPE_MACHINE,
         .class_init     = digic_machine_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     },
 };
 
diff --git a/hw/arm/exynos4_boards.c b/hw/arm/exynos4_boards.c
index 2d8f2d73265..71601a0d6f0 100644
--- a/hw/arm/exynos4_boards.c
+++ b/hw/arm/exynos4_boards.c
@@ -28,6 +28,7 @@ 
 #include "hw/sysbus.h"
 #include "net/net.h"
 #include "hw/arm/boot.h"
+#include "hw/arm/machines-qom.h"
 #include "system/address-spaces.h"
 #include "hw/arm/exynos4210.h"
 #include "hw/net/lan9118.h"
@@ -172,6 +173,11 @@  static const TypeInfo nuri_type = {
     .name = MACHINE_TYPE_NAME("nuri"),
     .parent = TYPE_MACHINE,
     .class_init = nuri_class_init,
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_TARGET_ARM_MACHINE },
+        { TYPE_TARGET_AARCH64_MACHINE },
+        { },
+    },
 };
 
 static void smdkc210_class_init(ObjectClass *oc, void *data)
@@ -192,6 +198,11 @@  static const TypeInfo smdkc210_type = {
     .name = MACHINE_TYPE_NAME("smdkc210"),
     .parent = TYPE_MACHINE,
     .class_init = smdkc210_class_init,
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_TARGET_ARM_MACHINE },
+        { TYPE_TARGET_AARCH64_MACHINE },
+        { },
+    },
 };
 
 static void exynos4_machines_init(void)
diff --git a/hw/arm/fby35.c b/hw/arm/fby35.c
index 6d3663f14a1..84b65844b34 100644
--- a/hw/arm/fby35.c
+++ b/hw/arm/fby35.c
@@ -14,6 +14,7 @@ 
 #include "hw/qdev-clock.h"
 #include "hw/arm/aspeed_soc.h"
 #include "hw/arm/boot.h"
+#include "hw/arm/machines-qom.h"
 
 #define TYPE_FBY35 MACHINE_TYPE_NAME("fby35")
 OBJECT_DECLARE_SIMPLE_TYPE(Fby35State, FBY35);
@@ -187,6 +188,11 @@  static const TypeInfo fby35_types[] = {
         .class_init = fby35_class_init,
         .instance_size = sizeof(Fby35State),
         .instance_init = fby35_instance_init,
+        .interfaces = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     },
 };
 
diff --git a/hw/arm/highbank.c b/hw/arm/highbank.c
index 0f3c207d548..d26346ea8ad 100644
--- a/hw/arm/highbank.c
+++ b/hw/arm/highbank.c
@@ -23,6 +23,7 @@ 
 #include "hw/sysbus.h"
 #include "migration/vmstate.h"
 #include "hw/arm/boot.h"
+#include "hw/arm/machines-qom.h"
 #include "hw/loader.h"
 #include "net/net.h"
 #include "system/runstate.h"
@@ -363,6 +364,11 @@  static const TypeInfo highbank_type = {
     .name = MACHINE_TYPE_NAME("highbank"),
     .parent = TYPE_MACHINE,
     .class_init = highbank_class_init,
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_TARGET_ARM_MACHINE },
+        { TYPE_TARGET_AARCH64_MACHINE },
+        { },
+    },
 };
 
 static void midway_class_init(ObjectClass *oc, void *data)
@@ -387,6 +393,11 @@  static const TypeInfo midway_type = {
     .name = MACHINE_TYPE_NAME("midway"),
     .parent = TYPE_MACHINE,
     .class_init = midway_class_init,
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_TARGET_ARM_MACHINE },
+        { TYPE_TARGET_AARCH64_MACHINE },
+        { },
+    },
 };
 
 static void calxeda_machines_init(void)
diff --git a/hw/arm/imx25_pdk.c b/hw/arm/imx25_pdk.c
index a90def7f1a2..86f0855c929 100644
--- a/hw/arm/imx25_pdk.c
+++ b/hw/arm/imx25_pdk.c
@@ -28,6 +28,7 @@ 
 #include "hw/qdev-properties.h"
 #include "hw/arm/fsl-imx25.h"
 #include "hw/arm/boot.h"
+#include "hw/arm/machines-qom.h"
 #include "hw/boards.h"
 #include "qemu/error-report.h"
 #include "system/qtest.h"
@@ -157,6 +158,11 @@  static const TypeInfo imx25_machine_types[] = {
         .name           = MACHINE_TYPE_NAME("imx25-pdk"),
         .parent         = TYPE_MACHINE,
         .class_init     = imx25_pdk_machine_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     },
 };
 
diff --git a/hw/arm/imx8mp-evk.c b/hw/arm/imx8mp-evk.c
index c7d87d99230..44f704b9bd3 100644
--- a/hw/arm/imx8mp-evk.c
+++ b/hw/arm/imx8mp-evk.c
@@ -10,6 +10,7 @@ 
 #include "system/address-spaces.h"
 #include "hw/arm/boot.h"
 #include "hw/arm/fsl-imx8mp.h"
+#include "hw/arm/machines-qom.h"
 #include "hw/boards.h"
 #include "hw/qdev-properties.h"
 #include "system/qtest.h"
@@ -79,6 +80,10 @@  static const TypeInfo imx8_machine_types[] = {
         .name           = MACHINE_TYPE_NAME("imx8mp-evk"),
         .parent         = TYPE_MACHINE,
         .class_init     = imx8mp_evk_machine_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     },
 };
 
diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c
index f95916b517d..efe1075ecc0 100644
--- a/hw/arm/integratorcp.c
+++ b/hw/arm/integratorcp.c
@@ -13,6 +13,7 @@ 
 #include "migration/vmstate.h"
 #include "hw/boards.h"
 #include "hw/arm/boot.h"
+#include "hw/arm/machines-qom.h"
 #include "hw/misc/arm_integrator_debug.h"
 #include "hw/net/smc91c111.h"
 #include "net/net.h"
@@ -760,6 +761,11 @@  static const TypeInfo integratorcp_machine_types[] = {
         .name           = MACHINE_TYPE_NAME("integratorcp"),
         .parent         = TYPE_MACHINE,
         .class_init     = integratorcp_machine_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     },
 };
 
diff --git a/hw/arm/kzm.c b/hw/arm/kzm.c
index b56cabe9f94..02ece3c0139 100644
--- a/hw/arm/kzm.c
+++ b/hw/arm/kzm.c
@@ -17,6 +17,7 @@ 
 #include "qapi/error.h"
 #include "hw/arm/fsl-imx31.h"
 #include "hw/arm/boot.h"
+#include "hw/arm/machines-qom.h"
 #include "hw/boards.h"
 #include "qemu/error-report.h"
 #include "system/address-spaces.h"
@@ -146,6 +147,11 @@  static const TypeInfo kzm_machine_types[] = {
         .name           = MACHINE_TYPE_NAME("kzm"),
         .parent         = TYPE_MACHINE,
         .class_init     = kzm_machine_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     },
 };
 
diff --git a/hw/arm/mcimx6ul-evk.c b/hw/arm/mcimx6ul-evk.c
index d947836d2be..ea636fa2e7c 100644
--- a/hw/arm/mcimx6ul-evk.c
+++ b/hw/arm/mcimx6ul-evk.c
@@ -14,6 +14,7 @@ 
 #include "qapi/error.h"
 #include "hw/arm/fsl-imx6ul.h"
 #include "hw/arm/boot.h"
+#include "hw/arm/machines-qom.h"
 #include "hw/boards.h"
 #include "hw/qdev-properties.h"
 #include "qemu/error-report.h"
@@ -84,6 +85,11 @@  static const TypeInfo imx6_machine_types[] = {
         .name           = MACHINE_TYPE_NAME("mcimx6ul-evk"),
         .parent         = TYPE_MACHINE,
         .class_init     = mcimx6ul_evk_machine_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     },
 };
 
diff --git a/hw/arm/mcimx7d-sabre.c b/hw/arm/mcimx7d-sabre.c
index f5dc9c211dd..b236a6587eb 100644
--- a/hw/arm/mcimx7d-sabre.c
+++ b/hw/arm/mcimx7d-sabre.c
@@ -16,6 +16,7 @@ 
 #include "qapi/error.h"
 #include "hw/arm/fsl-imx7.h"
 #include "hw/arm/boot.h"
+#include "hw/arm/machines-qom.h"
 #include "hw/boards.h"
 #include "hw/qdev-properties.h"
 #include "qemu/error-report.h"
@@ -84,6 +85,11 @@  static const TypeInfo imx7_machine_types[] = {
         .name           = MACHINE_TYPE_NAME("mcimx7d-sabre"),
         .parent         = TYPE_MACHINE,
         .class_init     = mcimx7d_sabre_machine_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     },
 };
 
diff --git a/hw/arm/microbit.c b/hw/arm/microbit.c
index ade363daaa4..d34b1c675e5 100644
--- a/hw/arm/microbit.c
+++ b/hw/arm/microbit.c
@@ -12,6 +12,7 @@ 
 #include "qapi/error.h"
 #include "hw/boards.h"
 #include "hw/arm/boot.h"
+#include "hw/arm/machines-qom.h"
 #include "system/system.h"
 #include "system/address-spaces.h"
 
@@ -74,6 +75,11 @@  static const TypeInfo microbit_info = {
     .parent = TYPE_MACHINE,
     .instance_size = sizeof(MicrobitMachineState),
     .class_init = microbit_machine_class_init,
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_TARGET_ARM_MACHINE },
+        { TYPE_TARGET_AARCH64_MACHINE },
+        { },
+    },
 };
 
 static void microbit_machine_init(void)
diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
index b0633a5a69e..12512477977 100644
--- a/hw/arm/mps2-tz.c
+++ b/hw/arm/mps2-tz.c
@@ -52,6 +52,7 @@ 
 #include "qemu/error-report.h"
 #include "hw/arm/boot.h"
 #include "hw/arm/armv7m.h"
+#include "hw/arm/machines-qom.h"
 #include "hw/or-irq.h"
 #include "hw/boards.h"
 #include "system/address-spaces.h"
@@ -1463,24 +1464,44 @@  static const TypeInfo mps2tz_an505_info = {
     .name = TYPE_MPS2TZ_AN505_MACHINE,
     .parent = TYPE_MPS2TZ_MACHINE,
     .class_init = mps2tz_an505_class_init,
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_TARGET_ARM_MACHINE },
+        { TYPE_TARGET_AARCH64_MACHINE },
+        { },
+    },
 };
 
 static const TypeInfo mps2tz_an521_info = {
     .name = TYPE_MPS2TZ_AN521_MACHINE,
     .parent = TYPE_MPS2TZ_MACHINE,
     .class_init = mps2tz_an521_class_init,
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_TARGET_ARM_MACHINE },
+        { TYPE_TARGET_AARCH64_MACHINE },
+        { },
+    },
 };
 
 static const TypeInfo mps3tz_an524_info = {
     .name = TYPE_MPS3TZ_AN524_MACHINE,
     .parent = TYPE_MPS2TZ_MACHINE,
     .class_init = mps3tz_an524_class_init,
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_TARGET_ARM_MACHINE },
+        { TYPE_TARGET_AARCH64_MACHINE },
+        { },
+    },
 };
 
 static const TypeInfo mps3tz_an547_info = {
     .name = TYPE_MPS3TZ_AN547_MACHINE,
     .parent = TYPE_MPS2TZ_MACHINE,
     .class_init = mps3tz_an547_class_init,
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_TARGET_ARM_MACHINE },
+        { TYPE_TARGET_AARCH64_MACHINE },
+        { },
+    },
 };
 
 static void mps2tz_machine_init(void)
diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
index 6958485a668..f39176c0005 100644
--- a/hw/arm/mps2.c
+++ b/hw/arm/mps2.c
@@ -31,6 +31,7 @@ 
 #include "qemu/error-report.h"
 #include "hw/arm/boot.h"
 #include "hw/arm/armv7m.h"
+#include "hw/arm/machines-qom.h"
 #include "hw/or-irq.h"
 #include "hw/boards.h"
 #include "system/address-spaces.h"
@@ -563,24 +564,44 @@  static const TypeInfo mps2_an385_info = {
     .name = TYPE_MPS2_AN385_MACHINE,
     .parent = TYPE_MPS2_MACHINE,
     .class_init = mps2_an385_class_init,
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_TARGET_ARM_MACHINE },
+        { TYPE_TARGET_AARCH64_MACHINE },
+        { },
+    },
 };
 
 static const TypeInfo mps2_an386_info = {
     .name = TYPE_MPS2_AN386_MACHINE,
     .parent = TYPE_MPS2_MACHINE,
     .class_init = mps2_an386_class_init,
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_TARGET_ARM_MACHINE },
+        { TYPE_TARGET_AARCH64_MACHINE },
+        { },
+    },
 };
 
 static const TypeInfo mps2_an500_info = {
     .name = TYPE_MPS2_AN500_MACHINE,
     .parent = TYPE_MPS2_MACHINE,
     .class_init = mps2_an500_class_init,
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_TARGET_ARM_MACHINE },
+        { TYPE_TARGET_AARCH64_MACHINE },
+        { },
+    },
 };
 
 static const TypeInfo mps2_an511_info = {
     .name = TYPE_MPS2_AN511_MACHINE,
     .parent = TYPE_MPS2_MACHINE,
     .class_init = mps2_an511_class_init,
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_TARGET_ARM_MACHINE },
+        { TYPE_TARGET_AARCH64_MACHINE },
+        { },
+    },
 };
 
 static void mps2_machine_init(void)
diff --git a/hw/arm/mps3r.c b/hw/arm/mps3r.c
index 4dd1e8a7180..8bcf5a4d69f 100644
--- a/hw/arm/mps3r.c
+++ b/hw/arm/mps3r.c
@@ -37,6 +37,7 @@ 
 #include "hw/qdev-properties.h"
 #include "hw/arm/boot.h"
 #include "hw/arm/bsa.h"
+#include "hw/arm/machines-qom.h"
 #include "hw/char/cmsdk-apb-uart.h"
 #include "hw/i2c/arm_sbcon_i2c.h"
 #include "hw/intc/arm_gicv3.h"
@@ -634,6 +635,11 @@  static const TypeInfo mps3r_machine_types[] = {
         .name = TYPE_MPS3R_AN536_MACHINE,
         .parent = TYPE_MPS3R_MACHINE,
         .class_init = mps3r_an536_class_init,
+        .interfaces = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     },
 };
 
diff --git a/hw/arm/msf2-som.c b/hw/arm/msf2-som.c
index 6ce47eaa27a..3f7aefc0ba4 100644
--- a/hw/arm/msf2-som.c
+++ b/hw/arm/msf2-som.c
@@ -32,6 +32,7 @@ 
 #include "hw/boards.h"
 #include "hw/qdev-properties.h"
 #include "hw/arm/boot.h"
+#include "hw/arm/machines-qom.h"
 #include "hw/qdev-clock.h"
 #include "system/address-spaces.h"
 #include "hw/arm/msf2-soc.h"
@@ -114,6 +115,11 @@  static const TypeInfo msf2_machine_types[] = {
         .name           = MACHINE_TYPE_NAME("emcraft-sf2"),
         .parent         = TYPE_MACHINE,
         .class_init     = emcraft_sf2_machine_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     },
 };
 
diff --git a/hw/arm/musca.c b/hw/arm/musca.c
index a4f43f1992b..608f16f69b2 100644
--- a/hw/arm/musca.c
+++ b/hw/arm/musca.c
@@ -26,6 +26,7 @@ 
 #include "system/system.h"
 #include "hw/arm/boot.h"
 #include "hw/arm/armsse.h"
+#include "hw/arm/machines-qom.h"
 #include "hw/boards.h"
 #include "hw/char/pl011.h"
 #include "hw/core/split-irq.h"
@@ -657,12 +658,22 @@  static const TypeInfo musca_a_info = {
     .name = TYPE_MUSCA_A_MACHINE,
     .parent = TYPE_MUSCA_MACHINE,
     .class_init = musca_a_class_init,
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_TARGET_ARM_MACHINE },
+        { TYPE_TARGET_AARCH64_MACHINE },
+        { },
+    },
 };
 
 static const TypeInfo musca_b1_info = {
     .name = TYPE_MUSCA_B1_MACHINE,
     .parent = TYPE_MUSCA_MACHINE,
     .class_init = musca_b1_class_init,
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_TARGET_ARM_MACHINE },
+        { TYPE_TARGET_AARCH64_MACHINE },
+        { },
+    },
 };
 
 static void musca_machine_init(void)
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
index f7c488cd1d6..e2a65f72095 100644
--- a/hw/arm/musicpal.c
+++ b/hw/arm/musicpal.c
@@ -15,6 +15,7 @@ 
 #include "hw/sysbus.h"
 #include "migration/vmstate.h"
 #include "hw/arm/boot.h"
+#include "hw/arm/machines-qom.h"
 #include "net/net.h"
 #include "system/system.h"
 #include "hw/boards.h"
@@ -1381,6 +1382,11 @@  static const TypeInfo musicpal_types[] = {
         .name           = MACHINE_TYPE_NAME("musicpal"),
         .parent         = TYPE_MACHINE,
         .class_init     = musicpal_machine_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     },
 };
 
diff --git a/hw/arm/netduino2.c b/hw/arm/netduino2.c
index 52c30055d44..2e615276902 100644
--- a/hw/arm/netduino2.c
+++ b/hw/arm/netduino2.c
@@ -30,6 +30,7 @@ 
 #include "qemu/error-report.h"
 #include "hw/arm/stm32f205_soc.h"
 #include "hw/arm/boot.h"
+#include "hw/arm/machines-qom.h"
 
 /* Main SYSCLK frequency in Hz (120MHz) */
 #define SYSCLK_FRQ 120000000ULL
@@ -71,6 +72,11 @@  static const TypeInfo netduino_machine_types[] = {
         .name           = MACHINE_TYPE_NAME("netduino2"),
         .parent         = TYPE_MACHINE,
         .class_init     = netduino2_machine_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     },
 };
 
diff --git a/hw/arm/netduinoplus2.c b/hw/arm/netduinoplus2.c
index 2735d3a0e2b..e12f78599c4 100644
--- a/hw/arm/netduinoplus2.c
+++ b/hw/arm/netduinoplus2.c
@@ -30,6 +30,7 @@ 
 #include "qemu/error-report.h"
 #include "hw/arm/stm32f405_soc.h"
 #include "hw/arm/boot.h"
+#include "hw/arm/machines-qom.h"
 
 /* Main SYSCLK frequency in Hz (168MHz) */
 #define SYSCLK_FRQ 168000000ULL
@@ -71,6 +72,11 @@  static const TypeInfo netduino_machine_types[] = {
         .name           = MACHINE_TYPE_NAME("netduinoplus2"),
         .parent         = TYPE_MACHINE,
         .class_init     = netduinoplus2_machine_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     },
 };
 
diff --git a/hw/arm/npcm7xx_boards.c b/hw/arm/npcm7xx_boards.c
index eb28b97ad83..4b6d3443d53 100644
--- a/hw/arm/npcm7xx_boards.c
+++ b/hw/arm/npcm7xx_boards.c
@@ -17,6 +17,7 @@ 
 #include "qemu/osdep.h"
 
 #include "hw/arm/npcm7xx.h"
+#include "hw/arm/machines-qom.h"
 #include "hw/core/cpu.h"
 #include "hw/i2c/i2c_mux_pca954x.h"
 #include "hw/i2c/smbus_eeprom.h"
@@ -549,22 +550,47 @@  static const TypeInfo npcm7xx_machine_types[] = {
         .name           = MACHINE_TYPE_NAME("npcm750-evb"),
         .parent         = TYPE_NPCM7XX_MACHINE,
         .class_init     = npcm750_evb_machine_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+                { TYPE_TARGET_ARM_MACHINE },
+                { TYPE_TARGET_AARCH64_MACHINE },
+                { },
+        },
     }, {
         .name           = MACHINE_TYPE_NAME("quanta-gsj"),
         .parent         = TYPE_NPCM7XX_MACHINE,
         .class_init     = gsj_machine_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+                { TYPE_TARGET_ARM_MACHINE },
+                { TYPE_TARGET_AARCH64_MACHINE },
+                { },
+        },
     }, {
         .name           = MACHINE_TYPE_NAME("quanta-gbs-bmc"),
         .parent         = TYPE_NPCM7XX_MACHINE,
         .class_init     = gbs_bmc_machine_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+                { TYPE_TARGET_ARM_MACHINE },
+                { TYPE_TARGET_AARCH64_MACHINE },
+                { },
+        },
     }, {
         .name           = MACHINE_TYPE_NAME("kudo-bmc"),
         .parent         = TYPE_NPCM7XX_MACHINE,
         .class_init     = kudo_bmc_machine_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+                { TYPE_TARGET_ARM_MACHINE },
+                { TYPE_TARGET_AARCH64_MACHINE },
+                { },
+        },
     }, {
         .name           = MACHINE_TYPE_NAME("mori-bmc"),
         .parent         = TYPE_NPCM7XX_MACHINE,
         .class_init     = mori_bmc_machine_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+                { TYPE_TARGET_ARM_MACHINE },
+                { TYPE_TARGET_AARCH64_MACHINE },
+                { },
+        },
     },
 };
 
diff --git a/hw/arm/npcm8xx_boards.c b/hw/arm/npcm8xx_boards.c
index 3fb8478e72e..919c14dd809 100644
--- a/hw/arm/npcm8xx_boards.c
+++ b/hw/arm/npcm8xx_boards.c
@@ -19,6 +19,7 @@ 
 #include "chardev/char.h"
 #include "hw/boards.h"
 #include "hw/arm/npcm8xx.h"
+#include "hw/arm/machines-qom.h"
 #include "hw/core/cpu.h"
 #include "hw/loader.h"
 #include "hw/qdev-core.h"
@@ -248,6 +249,10 @@  static const TypeInfo npcm8xx_machine_types[] = {
         .name           = MACHINE_TYPE_NAME("npcm845-evb"),
         .parent         = TYPE_NPCM8XX_MACHINE,
         .class_init     = npcm845_evb_machine_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+                { TYPE_TARGET_AARCH64_MACHINE },
+                { },
+        },
     },
 };
 
diff --git a/hw/arm/olimex-stm32-h405.c b/hw/arm/olimex-stm32-h405.c
index 795218c93cf..f81f4094149 100644
--- a/hw/arm/olimex-stm32-h405.c
+++ b/hw/arm/olimex-stm32-h405.c
@@ -31,6 +31,7 @@ 
 #include "qemu/error-report.h"
 #include "hw/arm/stm32f405_soc.h"
 #include "hw/arm/boot.h"
+#include "hw/arm/machines-qom.h"
 
 /* olimex-stm32-h405 implementation is derived from netduinoplus2 */
 
@@ -77,6 +78,11 @@  static const TypeInfo olimex_stm32_machine_types[] = {
         .name           = MACHINE_TYPE_NAME("olimex-stm32-h405"),
         .parent         = TYPE_MACHINE,
         .class_init     = olimex_stm32_machine_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     },
 };
 
diff --git a/hw/arm/omap_sx1.c b/hw/arm/omap_sx1.c
index aa1e96b3ad7..2537045c1ac 100644
--- a/hw/arm/omap_sx1.c
+++ b/hw/arm/omap_sx1.c
@@ -32,6 +32,7 @@ 
 #include "hw/arm/omap.h"
 #include "hw/boards.h"
 #include "hw/arm/boot.h"
+#include "hw/arm/machines-qom.h"
 #include "hw/block/flash.h"
 #include "system/qtest.h"
 #include "system/address-spaces.h"
@@ -219,6 +220,11 @@  static const TypeInfo sx1_machine_v2_type = {
     .name = MACHINE_TYPE_NAME("sx1"),
     .parent = TYPE_MACHINE,
     .class_init = sx1_machine_v2_class_init,
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_TARGET_ARM_MACHINE },
+        { TYPE_TARGET_AARCH64_MACHINE },
+        { },
+    },
 };
 
 static void sx1_machine_v1_class_init(ObjectClass *oc, void *data)
@@ -238,6 +244,11 @@  static const TypeInfo sx1_machine_v1_type = {
     .name = MACHINE_TYPE_NAME("sx1-v1"),
     .parent = TYPE_MACHINE,
     .class_init = sx1_machine_v1_class_init,
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_TARGET_ARM_MACHINE },
+        { TYPE_TARGET_AARCH64_MACHINE },
+        { },
+    },
 };
 
 static void sx1_machine_init(void)
diff --git a/hw/arm/orangepi.c b/hw/arm/orangepi.c
index 6821033bfd7..4e333d428a2 100644
--- a/hw/arm/orangepi.c
+++ b/hw/arm/orangepi.c
@@ -26,6 +26,7 @@ 
 #include "hw/qdev-properties.h"
 #include "hw/arm/allwinner-h3.h"
 #include "hw/arm/boot.h"
+#include "hw/arm/machines-qom.h"
 
 static struct arm_boot_info orangepi_binfo;
 
@@ -130,6 +131,11 @@  static const TypeInfo orangepi_machine_types[] = {
         .name           = MACHINE_TYPE_NAME("orangepi-pc"),
         .parent         = TYPE_MACHINE,
         .class_init     = orangepi_machine_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     },
 };
 
diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
index dce35ca11aa..69cccdbb6b1 100644
--- a/hw/arm/raspi.c
+++ b/hw/arm/raspi.c
@@ -25,6 +25,7 @@ 
 #include "hw/boards.h"
 #include "hw/loader.h"
 #include "hw/arm/boot.h"
+#include "hw/arm/machines-qom.h"
 #include "qom/object.h"
 
 #define TYPE_RASPI_MACHINE  MACHINE_TYPE_NAME("raspi-common")
@@ -394,23 +395,46 @@  static const TypeInfo raspi_machine_types[] = {
         .name           = MACHINE_TYPE_NAME("raspi0"),
         .parent         = TYPE_RASPI_MACHINE,
         .class_init     = raspi0_machine_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     }, {
         .name           = MACHINE_TYPE_NAME("raspi1ap"),
         .parent         = TYPE_RASPI_MACHINE,
         .class_init     = raspi1ap_machine_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     }, {
         .name           = MACHINE_TYPE_NAME("raspi2b"),
         .parent         = TYPE_RASPI_MACHINE,
         .class_init     = raspi2b_machine_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
 #ifdef TARGET_AARCH64
     }, {
         .name           = MACHINE_TYPE_NAME("raspi3ap"),
         .parent         = TYPE_RASPI_MACHINE,
         .class_init     = raspi3ap_machine_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     }, {
         .name           = MACHINE_TYPE_NAME("raspi3b"),
         .parent         = TYPE_RASPI_MACHINE,
         .class_init     = raspi3b_machine_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
 #endif
     }, {
         .name           = TYPE_RASPI_MACHINE,
diff --git a/hw/arm/raspi4b.c b/hw/arm/raspi4b.c
index f6de103a3e1..8fda6d3b0ca 100644
--- a/hw/arm/raspi4b.c
+++ b/hw/arm/raspi4b.c
@@ -11,6 +11,7 @@ 
 #include "qemu/cutils.h"
 #include "qapi/error.h"
 #include "qapi/visitor.h"
+#include "hw/arm/machines-qom.h"
 #include "hw/arm/raspi_platform.h"
 #include "hw/display/bcm2835_fb.h"
 #include "hw/registerfields.h"
@@ -127,6 +128,10 @@  static const TypeInfo raspi4b_machine_type = {
     .parent         = TYPE_RASPI_BASE_MACHINE,
     .instance_size  = sizeof(Raspi4bMachineState),
     .class_init     = raspi4b_machine_class_init,
+    .interfaces     = (InterfaceInfo[]) {
+        { TYPE_TARGET_AARCH64_MACHINE },
+        { },
+    },
 };
 
 static void raspi4b_machine_register_type(void)
diff --git a/hw/arm/realview.c b/hw/arm/realview.c
index 008eeaf049a..aed864bcd4f 100644
--- a/hw/arm/realview.c
+++ b/hw/arm/realview.c
@@ -13,6 +13,7 @@ 
 #include "hw/sysbus.h"
 #include "hw/arm/boot.h"
 #include "hw/arm/primecell.h"
+#include "hw/arm/machines-qom.h"
 #include "hw/core/split-irq.h"
 #include "hw/net/lan9118.h"
 #include "hw/net/smc91c111.h"
@@ -431,6 +432,11 @@  static const TypeInfo realview_eb_type = {
     .name = MACHINE_TYPE_NAME("realview-eb"),
     .parent = TYPE_MACHINE,
     .class_init = realview_eb_class_init,
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_TARGET_ARM_MACHINE },
+        { TYPE_TARGET_AARCH64_MACHINE },
+        { },
+    },
 };
 
 static void realview_eb_mpcore_class_init(ObjectClass *oc, void *data)
@@ -452,6 +458,11 @@  static const TypeInfo realview_eb_mpcore_type = {
     .name = MACHINE_TYPE_NAME("realview-eb-mpcore"),
     .parent = TYPE_MACHINE,
     .class_init = realview_eb_mpcore_class_init,
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_TARGET_ARM_MACHINE },
+        { TYPE_TARGET_AARCH64_MACHINE },
+        { },
+    },
 };
 
 static void realview_pb_a8_class_init(ObjectClass *oc, void *data)
@@ -471,6 +482,11 @@  static const TypeInfo realview_pb_a8_type = {
     .name = MACHINE_TYPE_NAME("realview-pb-a8"),
     .parent = TYPE_MACHINE,
     .class_init = realview_pb_a8_class_init,
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_TARGET_ARM_MACHINE },
+        { TYPE_TARGET_AARCH64_MACHINE },
+        { },
+    },
 };
 
 static void realview_pbx_a9_class_init(ObjectClass *oc, void *data)
@@ -491,6 +507,11 @@  static const TypeInfo realview_pbx_a9_type = {
     .name = MACHINE_TYPE_NAME("realview-pbx-a9"),
     .parent = TYPE_MACHINE,
     .class_init = realview_pbx_a9_class_init,
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_TARGET_ARM_MACHINE },
+        { TYPE_TARGET_AARCH64_MACHINE },
+        { },
+    },
 };
 
 static void realview_machine_init(void)
diff --git a/hw/arm/sabrelite.c b/hw/arm/sabrelite.c
index ea59ba301e7..bc472dcad2c 100644
--- a/hw/arm/sabrelite.c
+++ b/hw/arm/sabrelite.c
@@ -14,6 +14,7 @@ 
 #include "qapi/error.h"
 #include "hw/arm/fsl-imx6.h"
 #include "hw/arm/boot.h"
+#include "hw/arm/machines-qom.h"
 #include "hw/boards.h"
 #include "hw/qdev-properties.h"
 #include "qemu/error-report.h"
@@ -120,6 +121,11 @@  static const TypeInfo sabrelite_machine_types[] = {
         .name           = MACHINE_TYPE_NAME("sabrelite"),
         .parent         = TYPE_MACHINE,
         .class_init     = sabrelite_machine_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     },
 };
 
diff --git a/hw/arm/sbsa-ref.c b/hw/arm/sbsa-ref.c
index aa09d7a0917..6584097fc25 100644
--- a/hw/arm/sbsa-ref.c
+++ b/hw/arm/sbsa-ref.c
@@ -34,6 +34,7 @@ 
 #include "hw/arm/bsa.h"
 #include "hw/arm/fdt.h"
 #include "hw/arm/smmuv3.h"
+#include "hw/arm/machines-qom.h"
 #include "hw/block/flash.h"
 #include "hw/boards.h"
 #include "hw/ide/ide-bus.h"
@@ -920,6 +921,10 @@  static const TypeInfo sbsa_ref_info = {
     .instance_init = sbsa_ref_instance_init,
     .class_init    = sbsa_ref_class_init,
     .instance_size = sizeof(SBSAMachineState),
+    .interfaces    = (InterfaceInfo[]) {
+        { TYPE_TARGET_AARCH64_MACHINE },
+        { },
+    },
 };
 
 static void sbsa_ref_machine_init(void)
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
index cbe914c93e9..8dc68c145c1 100644
--- a/hw/arm/stellaris.c
+++ b/hw/arm/stellaris.c
@@ -15,6 +15,7 @@ 
 #include "hw/sd/sd.h"
 #include "hw/ssi/ssi.h"
 #include "hw/arm/boot.h"
+#include "hw/arm/machines-qom.h"
 #include "qemu/timer.h"
 #include "hw/i2c/i2c.h"
 #include "net/net.h"
@@ -1427,6 +1428,11 @@  static const TypeInfo lm3s811evb_type = {
     .name = MACHINE_TYPE_NAME("lm3s811evb"),
     .parent = TYPE_MACHINE,
     .class_init = lm3s811evb_class_init,
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_TARGET_ARM_MACHINE },
+        { TYPE_TARGET_AARCH64_MACHINE },
+        { },
+    },
 };
 
 /*
@@ -1448,6 +1454,11 @@  static const TypeInfo lm3s6965evb_type = {
     .name = MACHINE_TYPE_NAME("lm3s6965evb"),
     .parent = TYPE_MACHINE,
     .class_init = lm3s6965evb_class_init,
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_TARGET_ARM_MACHINE },
+        { TYPE_TARGET_AARCH64_MACHINE },
+        { },
+    },
 };
 
 static void stellaris_machine_init(void)
diff --git a/hw/arm/stm32vldiscovery.c b/hw/arm/stm32vldiscovery.c
index 3a9728ca719..b7eb948bc2d 100644
--- a/hw/arm/stm32vldiscovery.c
+++ b/hw/arm/stm32vldiscovery.c
@@ -31,6 +31,7 @@ 
 #include "qemu/error-report.h"
 #include "hw/arm/stm32f100_soc.h"
 #include "hw/arm/boot.h"
+#include "hw/arm/machines-qom.h"
 
 /* stm32vldiscovery implementation is derived from netduinoplus2 */
 
@@ -74,6 +75,11 @@  static const TypeInfo stm32vldiscovery_machine_types[] = {
         .name           = MACHINE_TYPE_NAME("stm32vldiscovery"),
         .parent         = TYPE_MACHINE,
         .class_init     = stm32vldiscovery_machine_class_init,
+        .interfaces     = (InterfaceInfo[]) {
+            { TYPE_TARGET_ARM_MACHINE },
+            { TYPE_TARGET_AARCH64_MACHINE },
+            { },
+        },
     },
 };
 
diff --git a/hw/arm/versatilepb.c b/hw/arm/versatilepb.c
index 35766445fa4..defc4d7d170 100644
--- a/hw/arm/versatilepb.c
+++ b/hw/arm/versatilepb.c
@@ -12,6 +12,7 @@ 
 #include "hw/sysbus.h"
 #include "migration/vmstate.h"
 #include "hw/arm/boot.h"
+#include "hw/arm/machines-qom.h"
 #include "hw/net/smc91c111.h"
 #include "net/net.h"
 #include "system/system.h"
@@ -431,6 +432,11 @@  static const TypeInfo versatilepb_type = {
     .name = MACHINE_TYPE_NAME("versatilepb"),
     .parent = TYPE_MACHINE,
     .class_init = versatilepb_class_init,
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_TARGET_ARM_MACHINE },
+        { TYPE_TARGET_AARCH64_MACHINE },
+        { },
+    },
 };
 
 static void versatileab_class_init(ObjectClass *oc, void *data)
@@ -452,6 +458,11 @@  static const TypeInfo versatileab_type = {
     .name = MACHINE_TYPE_NAME("versatileab"),
     .parent = TYPE_MACHINE,
     .class_init = versatileab_class_init,
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_TARGET_ARM_MACHINE },
+        { TYPE_TARGET_AARCH64_MACHINE },
+        { },
+    },
 };
 
 static void versatile_machine_init(void)
diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
index 76c6107766c..38b203b52da 100644
--- a/hw/arm/vexpress.c
+++ b/hw/arm/vexpress.c
@@ -27,6 +27,7 @@ 
 #include "hw/sysbus.h"
 #include "hw/arm/boot.h"
 #include "hw/arm/primecell.h"
+#include "hw/arm/machines-qom.h"
 #include "hw/net/lan9118.h"
 #include "hw/i2c/i2c.h"
 #include "net/net.h"
@@ -850,6 +851,11 @@  static const TypeInfo vexpress_a9_info = {
     .parent = TYPE_VEXPRESS_MACHINE,
     .class_init = vexpress_a9_class_init,
     .instance_init = vexpress_a9_instance_init,
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_TARGET_ARM_MACHINE },
+        { TYPE_TARGET_AARCH64_MACHINE },
+        { },
+    },
 };
 
 static const TypeInfo vexpress_a15_info = {
@@ -857,6 +863,11 @@  static const TypeInfo vexpress_a15_info = {
     .parent = TYPE_VEXPRESS_MACHINE,
     .class_init = vexpress_a15_class_init,
     .instance_init = vexpress_a15_instance_init,
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_TARGET_ARM_MACHINE },
+        { TYPE_TARGET_AARCH64_MACHINE },
+        { },
+    },
 };
 
 static void vexpress_machine_init(void)
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index a96452f17a4..a3c9ffe29eb 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -37,6 +37,7 @@ 
 #include "hw/arm/boot.h"
 #include "hw/arm/primecell.h"
 #include "hw/arm/virt.h"
+#include "hw/arm/machines-qom.h"
 #include "hw/block/flash.h"
 #include "hw/vfio/vfio-calxeda-xgmac.h"
 #include "hw/vfio/vfio-amd-xgbe.h"
@@ -123,6 +124,11 @@  static void arm_virt_compat_set(MachineClass *mc)
         .name = MACHINE_VER_TYPE_NAME("virt", __VA_ARGS__), \
         .parent = TYPE_VIRT_MACHINE, \
         .class_init = MACHINE_VER_SYM(class_init, virt, __VA_ARGS__), \
+        .interfaces = (InterfaceInfo[]) { \
+            { TYPE_TARGET_ARM_MACHINE }, \
+            { TYPE_TARGET_AARCH64_MACHINE }, \
+            { }, \
+        }, \
     }; \
     static void MACHINE_VER_SYM(register, virt, __VA_ARGS__)(void) \
     { \
diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
index b8916665ed6..433907093fa 100644
--- a/hw/arm/xilinx_zynq.c
+++ b/hw/arm/xilinx_zynq.c
@@ -20,6 +20,7 @@ 
 #include "qapi/error.h"
 #include "hw/sysbus.h"
 #include "hw/arm/boot.h"
+#include "hw/arm/machines-qom.h"
 #include "net/net.h"
 #include "system/system.h"
 #include "hw/boards.h"
@@ -480,6 +481,11 @@  static const TypeInfo zynq_machine_type = {
     .parent = TYPE_MACHINE,
     .class_init = zynq_machine_class_init,
     .instance_size = sizeof(ZynqMachineState),
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_TARGET_ARM_MACHINE },
+        { TYPE_TARGET_AARCH64_MACHINE },
+        { },
+    },
 };
 
 static void zynq_machine_register_types(void)
diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c
index 0c6f0359e3d..cb7466f7250 100644
--- a/hw/arm/xlnx-versal-virt.c
+++ b/hw/arm/xlnx-versal-virt.c
@@ -20,6 +20,7 @@ 
 #include "hw/qdev-properties.h"
 #include "hw/arm/xlnx-versal.h"
 #include "hw/arm/boot.h"
+#include "hw/arm/machines-qom.h"
 #include "target/arm/multiprocessing.h"
 #include "qom/object.h"
 
@@ -833,6 +834,10 @@  static const TypeInfo versal_virt_machine_init_typeinfo = {
     .instance_init = versal_virt_machine_instance_init,
     .instance_size = sizeof(VersalVirt),
     .instance_finalize = versal_virt_machine_finalize,
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_TARGET_AARCH64_MACHINE },
+        { },
+    },
 };
 
 static void versal_virt_machine_init_register_types(void)
diff --git a/hw/arm/xlnx-zcu102.c b/hw/arm/xlnx-zcu102.c
index 4fdb153e4d8..f730dbbd908 100644
--- a/hw/arm/xlnx-zcu102.c
+++ b/hw/arm/xlnx-zcu102.c
@@ -19,6 +19,7 @@ 
 #include "qapi/error.h"
 #include "hw/arm/xlnx-zynqmp.h"
 #include "hw/arm/boot.h"
+#include "hw/arm/machines-qom.h"
 #include "hw/boards.h"
 #include "qemu/error-report.h"
 #include "qemu/log.h"
@@ -303,6 +304,10 @@  static const TypeInfo xlnx_zcu102_machine_init_typeinfo = {
     .class_init = xlnx_zcu102_machine_class_init,
     .instance_init = xlnx_zcu102_machine_instance_init,
     .instance_size = sizeof(XlnxZCU102),
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_TARGET_AARCH64_MACHINE },
+        { },
+    },
 };
 
 static void xlnx_zcu102_machine_init_register_types(void)