Message ID | 20250422145502.70770-4-philmd@linaro.org |
---|---|
State | New |
Headers | show |
Series | single-binary: Make hw/arm/ common | expand |
On 4/22/25 07:54, Philippe Mathieu-Daudé wrote: > Binaries can register a QOM type to filter their machines > by filling their TargetInfo::machine_typename field. > > This can be used by example by main() -> machine_help_func() > to filter the machines list. > > Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> > Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org> > --- > meson.build | 1 + > include/qemu/target-info-impl.h | 3 +++ > include/qemu/target-info.h | 8 ++++++++ > system/vl.c | 3 ++- > target-info-qom.c | 15 +++++++++++++++ > target-info-stub.c | 2 ++ > target-info.c | 5 +++++ > 7 files changed, 36 insertions(+), 1 deletion(-) > create mode 100644 target-info-qom.c > > diff --git a/meson.build b/meson.build > index 09b16e2f7ae..a1109b6db3f 100644 > --- a/meson.build > +++ b/meson.build > @@ -3808,6 +3808,7 @@ common_ss.add(pagevary) > specific_ss.add(files('page-target.c', 'page-vary-target.c')) > > common_ss.add(files('target-info.c')) > +system_ss.add(files('target-info-qom.c')) > specific_ss.add(files('target-info-stub.c')) > > subdir('backends') > diff --git a/include/qemu/target-info-impl.h b/include/qemu/target-info-impl.h > index c276b84ceca..4ef54c5136a 100644 > --- a/include/qemu/target-info-impl.h > +++ b/include/qemu/target-info-impl.h > @@ -16,6 +16,9 @@ typedef struct TargetInfo { > /* runtime equivalent of TARGET_NAME definition */ > const char *const target_name; > > + /* QOM typename machines for this binary must implement */ > + const char *const machine_typename; > + > } TargetInfo; You don't really want the second 'const' in either of these. > diff --git a/target-info-qom.c b/target-info-qom.c > new file mode 100644 > index 00000000000..a6fd8f1d5a3 > --- /dev/null > +++ b/target-info-qom.c > @@ -0,0 +1,15 @@ > +/* > + * QEMU binary/target API (QOM types) > + * > + * Copyright (c) Linaro > + * > + * SPDX-License-Identifier: GPL-2.0-or-later > + */ > + > +#include "qemu/osdep.h" > +#include "qom/object.h" > + > +static const TypeInfo target_info_types[] = { > +}; > + > +DEFINE_TYPES(target_info_types) Delay this until it's actually used. Otherwise, Reviewed-by: Richard Henderson <richard.henderson@linaro.org> r~
diff --git a/meson.build b/meson.build index 09b16e2f7ae..a1109b6db3f 100644 --- a/meson.build +++ b/meson.build @@ -3808,6 +3808,7 @@ common_ss.add(pagevary) specific_ss.add(files('page-target.c', 'page-vary-target.c')) common_ss.add(files('target-info.c')) +system_ss.add(files('target-info-qom.c')) specific_ss.add(files('target-info-stub.c')) subdir('backends') diff --git a/include/qemu/target-info-impl.h b/include/qemu/target-info-impl.h index c276b84ceca..4ef54c5136a 100644 --- a/include/qemu/target-info-impl.h +++ b/include/qemu/target-info-impl.h @@ -16,6 +16,9 @@ typedef struct TargetInfo { /* runtime equivalent of TARGET_NAME definition */ const char *const target_name; + /* QOM typename machines for this binary must implement */ + const char *const machine_typename; + } TargetInfo; /** diff --git a/include/qemu/target-info.h b/include/qemu/target-info.h index 1007dc9a5e4..0224b35b166 100644 --- a/include/qemu/target-info.h +++ b/include/qemu/target-info.h @@ -16,4 +16,12 @@ */ const char *target_name(void); +/** + * target_machine_typename: + * + * Returns: Name of the QOM interface implemented by machines + * usable on this target binary. + */ +const char *target_machine_typename(void); + #endif diff --git a/system/vl.c b/system/vl.c index cdf6eb9ee49..e8706a9ce87 100644 --- a/system/vl.c +++ b/system/vl.c @@ -27,6 +27,7 @@ #include "qemu/datadir.h" #include "qemu/units.h" #include "qemu/module.h" +#include "qemu/target-info.h" #include "exec/cpu-common.h" #include "exec/page-vary.h" #include "hw/qdev-properties.h" @@ -1564,7 +1565,7 @@ static void machine_help_func(const QDict *qdict) GSList *el; const char *type = qdict_get_try_str(qdict, "type"); - machines = object_class_get_list(TYPE_MACHINE, false); + machines = object_class_get_list(target_machine_typename(), false); if (type) { ObjectClass *machine_class = OBJECT_CLASS(find_machine(type, machines)); if (machine_class) { diff --git a/target-info-qom.c b/target-info-qom.c new file mode 100644 index 00000000000..a6fd8f1d5a3 --- /dev/null +++ b/target-info-qom.c @@ -0,0 +1,15 @@ +/* + * QEMU binary/target API (QOM types) + * + * Copyright (c) Linaro + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "qom/object.h" + +static const TypeInfo target_info_types[] = { +}; + +DEFINE_TYPES(target_info_types) diff --git a/target-info-stub.c b/target-info-stub.c index 076b9254dd0..218e5898e7f 100644 --- a/target-info-stub.c +++ b/target-info-stub.c @@ -8,9 +8,11 @@ #include "qemu/osdep.h" #include "qemu/target-info-impl.h" +#include "hw/boards.h" static const TargetInfo target_info_stub = { .target_name = TARGET_NAME, + .machine_typename = TYPE_MACHINE, }; const TargetInfo *target_info(void) diff --git a/target-info.c b/target-info.c index 84b18931e7e..0042769e3a2 100644 --- a/target-info.c +++ b/target-info.c @@ -14,3 +14,8 @@ const char *target_name(void) { return target_info()->target_name; } + +const char *target_machine_typename(void) +{ + return target_info()->machine_typename; +}