Change TypeInfo.is_available to the new TypeIsAvailable type, which takes a const TargetInfo *. Registration passes target_info(), so behavior is unchanged. object.h only forward-declares TargetInfo.
Switch the existing users (raspi, raspi4b, ast27x0 evb and fc) and the generated machine parents to the matching target_is_<arch> helpers. Signed-off-by: Yonggang Luo <[email protected]> --- hw/arm/aspeed_ast27x0-fc.c | 2 +- hw/arm/aspeed_ast27x0_evb.c | 4 ++-- hw/arm/raspi.c | 4 ++-- hw/arm/raspi4b.c | 2 +- hw/arm/virt.c | 4 ++-- hw/m68k/virt.c | 4 ++-- hw/or1k/virt.c | 2 +- include/qom/object.h | 12 +++++++++++- qom/object.c | 3 ++- 9 files changed, 24 insertions(+), 13 deletions(-) diff --git a/hw/arm/aspeed_ast27x0-fc.c b/hw/arm/aspeed_ast27x0-fc.c index 73362b60d2a..8a7c6a116ac 100644 --- a/hw/arm/aspeed_ast27x0-fc.c +++ b/hw/arm/aspeed_ast27x0-fc.c @@ -234,7 +234,7 @@ static const TypeInfo ast2700fc_types[] = { .parent = TYPE_MACHINE, .class_init = ast2700fc_class_init, .instance_size = sizeof(Ast2700FCState), - .is_available = target_aarch64, + .is_available = target_is_aarch64, }, }; diff --git a/hw/arm/aspeed_ast27x0_evb.c b/hw/arm/aspeed_ast27x0_evb.c index 460c9ff0d2e..02a8cff1d9d 100644 --- a/hw/arm/aspeed_ast27x0_evb.c +++ b/hw/arm/aspeed_ast27x0_evb.c @@ -75,13 +75,13 @@ static const TypeInfo aspeed_ast27x0_evb_types[] = { .name = MACHINE_TYPE_NAME("ast2700a1-evb"), .parent = TYPE_ASPEED_MACHINE, .class_init = aspeed_machine_ast2700a1_evb_class_init, - .is_available = target_aarch64, + .is_available = target_is_aarch64, }, { .name = MACHINE_TYPE_NAME("ast2700a2-evb"), .parent = TYPE_ASPEED_MACHINE, .class_init = aspeed_machine_ast2700a2_evb_class_init, - .is_available = target_aarch64, + .is_available = target_is_aarch64, } }; diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c index fadbacb2534..22b06c6ca22 100644 --- a/hw/arm/raspi.c +++ b/hw/arm/raspi.c @@ -403,12 +403,12 @@ static const TypeInfo raspi_machine_types[] = { .name = MACHINE_TYPE_NAME("raspi3ap"), .parent = TYPE_RASPI_MACHINE, .class_init = raspi3ap_machine_class_init, - .is_available = target_aarch64, + .is_available = target_is_aarch64, }, { .name = MACHINE_TYPE_NAME("raspi3b"), .parent = TYPE_RASPI_MACHINE, .class_init = raspi3b_machine_class_init, - .is_available = target_aarch64, + .is_available = target_is_aarch64, }, { .name = TYPE_RASPI_MACHINE, .parent = TYPE_RASPI_BASE_MACHINE, diff --git a/hw/arm/raspi4b.c b/hw/arm/raspi4b.c index 566d64572db..a1dc477f25e 100644 --- a/hw/arm/raspi4b.c +++ b/hw/arm/raspi4b.c @@ -121,7 +121,7 @@ static const TypeInfo raspi4b_machine_type = { .parent = TYPE_RASPI_BASE_MACHINE, .instance_size = sizeof(Raspi4bMachineState), .class_init = raspi4b_machine_class_init, - .is_available = target_aarch64, + .is_available = target_is_aarch64, }; static void raspi4b_machine_register_type(void) diff --git a/hw/arm/virt.c b/hw/arm/virt.c index 9d192515d85..18160f7fad3 100644 --- a/hw/arm/virt.c +++ b/hw/arm/virt.c @@ -132,7 +132,7 @@ static void arm_virt_compat_default_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__), \ - .is_available = target_base_arm, \ + .is_available = target_is_base_arm, \ }; \ static void MACHINE_VER_SYM(register, virt, __VA_ARGS__)(void) \ { \ @@ -4430,7 +4430,7 @@ static const TypeInfo virt_machine_info = { { TYPE_HOTPLUG_HANDLER }, { } }, - .is_available = target_base_arm, + .is_available = target_is_base_arm, }; static void machvirt_machine_init(void) diff --git a/hw/m68k/virt.c b/hw/m68k/virt.c index e52546e4fab..ad2a43ef3fb 100644 --- a/hw/m68k/virt.c +++ b/hw/m68k/virt.c @@ -327,7 +327,7 @@ static const TypeInfo virt_machine_info = { .parent = TYPE_MACHINE, .abstract = true, .class_init = virt_machine_class_init, - .is_available = target_m68k, + .is_available = target_is_m68k, }; static void virt_machine_register_types(void) @@ -355,7 +355,7 @@ type_init(virt_machine_register_types) .name = MACHINE_VER_TYPE_NAME("virt", __VA_ARGS__), \ .parent = MACHINE_TYPE_NAME("virt"), \ .class_init = MACHINE_VER_SYM(class_init, virt, __VA_ARGS__), \ - .is_available = target_m68k, \ + .is_available = target_is_m68k, \ }; \ static void MACHINE_VER_SYM(register, virt, __VA_ARGS__)(void) \ { \ diff --git a/hw/or1k/virt.c b/hw/or1k/virt.c index a3ff903839b..89fb786641f 100644 --- a/hw/or1k/virt.c +++ b/hw/or1k/virt.c @@ -559,7 +559,7 @@ static const TypeInfo or1ksim_machine_typeinfo = { .parent = TYPE_MACHINE, .class_init = openrisc_virt_machine_init, .instance_size = sizeof(OR1KVirtState), - .is_available = target_or1k, + .is_available = target_is_or1k, }; static void or1ksim_machine_init_register_types(void) diff --git a/include/qom/object.h b/include/qom/object.h index 4c0645817a5..7d52a15f6b8 100644 --- a/include/qom/object.h +++ b/include/qom/object.h @@ -17,6 +17,7 @@ #include "qapi/qapi-builtin-types.h" #include "qemu/module.h" +typedef struct TargetInfo TargetInfo; struct TypeImpl; typedef struct TypeImpl *Type; @@ -117,6 +118,15 @@ typedef void (ObjectUnparent)(Object *obj); */ typedef void (ObjectFree)(void *obj); +/** + * typedef TypeIsAvailable: + * @ti: TargetInfo to test. + * + * Returns whether a type is available for @ti. Typical implementations + * are target_is_*(). + */ +typedef bool (TypeIsAvailable)(const TargetInfo *ti); + #define OBJECT_CLASS_CAST_CACHE 4 /** @@ -498,7 +508,7 @@ struct TypeInfo void (*class_base_init)(ObjectClass *klass, const void *data); const void *class_data; - bool (*is_available)(void); + TypeIsAvailable *is_available; const InterfaceInfo *interfaces; }; diff --git a/qom/object.c b/qom/object.c index 96498f3d001..253b9562b41 100644 --- a/qom/object.c +++ b/qom/object.c @@ -15,6 +15,7 @@ #include "qom/compat-properties.h" #include "qom/object.h" #include "qom/object_interfaces.h" +#include "qemu/target-info.h" #include "qemu/cutils.h" #include "qemu/memalign.h" #include "qapi/visitor.h" @@ -167,7 +168,7 @@ static TypeImpl *type_register_internal(const TypeInfo *info) abort(); } - if (info->is_available && !info->is_available()) { + if (info->is_available && !info->is_available(target_info())) { return NULL; } -- 2.55.0.windows.3
