mirror of https://github.com/xemu-project/xemu.git
include/hw: add helpers for defining versioned machine types
The various targets which define versioned machine types have a bunch of obfuscated macro code for defining unique function and variable names using string concatenation. This adds a couple of helpers to improve the clarity of such code macro. Reviewed-by: Thomas Huth <thuth@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> Message-ID: <20240620165742.1711389-2-berrange@redhat.com> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
This commit is contained in:
parent
67f67bd854
commit
a1c314861d
|
@ -413,6 +413,191 @@ struct MachineState {
|
||||||
struct NumaState *numa_state;
|
struct NumaState *numa_state;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The macros which follow are intended to facilitate the
|
||||||
|
* definition of versioned machine types, using a somewhat
|
||||||
|
* similar pattern across targets.
|
||||||
|
*
|
||||||
|
* For example, a macro that can be used to define versioned
|
||||||
|
* 'virt' machine types would look like:
|
||||||
|
*
|
||||||
|
* #define DEFINE_VIRT_MACHINE_IMPL(latest, ...) \
|
||||||
|
* static void MACHINE_VER_SYM(class_init, virt, __VA_ARGS__)( \
|
||||||
|
* ObjectClass *oc, \
|
||||||
|
* void *data) \
|
||||||
|
* { \
|
||||||
|
* MachineClass *mc = MACHINE_CLASS(oc); \
|
||||||
|
* MACHINE_VER_SYM(options, virt, __VA_ARGS__)(mc); \
|
||||||
|
* mc->desc = "QEMU " MACHINE_VER_STR(__VA_ARGS__) " Virtual Machine"; \
|
||||||
|
* if (latest) { \
|
||||||
|
* mc->alias = "virt"; \
|
||||||
|
* } \
|
||||||
|
* } \
|
||||||
|
* static const TypeInfo MACHINE_VER_SYM(info, virt, __VA_ARGS__) = { \
|
||||||
|
* .name = MACHINE_VER_TYPE_NAME("virt", __VA_ARGS__), \
|
||||||
|
* .parent = TYPE_VIRT_MACHINE, \
|
||||||
|
* .class_init = MACHINE_VER_SYM(class_init, virt, __VA_ARGS__), \
|
||||||
|
* }; \
|
||||||
|
* static void MACHINE_VER_SYM(register, virt, __VA_ARGS__)(void) \
|
||||||
|
* { \
|
||||||
|
* type_register_static(&MACHINE_VER_SYM(info, virt, __VA_ARGS__)); \
|
||||||
|
* } \
|
||||||
|
* type_init(MACHINE_VER_SYM(register, virt, __VA_ARGS__));
|
||||||
|
*
|
||||||
|
* Following this, one (or more) helpers can be added for
|
||||||
|
* whichever scenarios need to be catered for with a machine:
|
||||||
|
*
|
||||||
|
* // Normal 2 digit, marked as latest e.g. 'virt-9.0'
|
||||||
|
* #define DEFINE_VIRT_MACHINE_LATEST(major, minor) \
|
||||||
|
* DEFINE_VIRT_MACHINE_IMPL(true, major, minor)
|
||||||
|
*
|
||||||
|
* // Normal 2 digit e.g. 'virt-9.0'
|
||||||
|
* #define DEFINE_VIRT_MACHINE(major, minor) \
|
||||||
|
* DEFINE_VIRT_MACHINE_IMPL(false, major, minor)
|
||||||
|
*
|
||||||
|
* // Bugfix 3 digit e.g. 'virt-9.0.1'
|
||||||
|
* #define DEFINE_VIRT_MACHINE_BUGFIX(major, minor, micro) \
|
||||||
|
* DEFINE_VIRT_MACHINE_IMPL(false, major, minor, micro)
|
||||||
|
*
|
||||||
|
* // Tagged 2 digit e.g. 'virt-9.0-extra'
|
||||||
|
* #define DEFINE_VIRT_MACHINE_TAGGED(major, minor, tag) \
|
||||||
|
* DEFINE_VIRT_MACHINE_IMPL(false, major, minor, _, tag)
|
||||||
|
*
|
||||||
|
* // Tagged bugfix 2 digit e.g. 'virt-9.0.1-extra'
|
||||||
|
* #define DEFINE_VIRT_MACHINE_TAGGED(major, minor, micro, tag) \
|
||||||
|
* DEFINE_VIRT_MACHINE_IMPL(false, major, minor, micro, _, tag)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Helper for dispatching different macros based on how
|
||||||
|
* many __VA_ARGS__ are passed. Supports 1 to 5 variadic
|
||||||
|
* arguments, with the called target able to be prefixed
|
||||||
|
* with 0 or more fixed arguments too. To be called thus:
|
||||||
|
*
|
||||||
|
* _MACHINE_VER_PICK(__VA_ARGS,
|
||||||
|
* MACRO_MATCHING_5_ARGS,
|
||||||
|
* MACRO_MATCHING_4_ARGS,
|
||||||
|
* MACRO_MATCHING_3_ARGS,
|
||||||
|
* MACRO_MATCHING_2_ARGS,
|
||||||
|
* MACRO_MATCHING_1_ARG) (FIXED-ARG-1,
|
||||||
|
* ...,
|
||||||
|
* FIXED-ARG-N,
|
||||||
|
* __VA_ARGS__)
|
||||||
|
*/
|
||||||
|
#define _MACHINE_VER_PICK(x1, x2, x3, x4, x5, x6, ...) x6
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Construct a human targeted machine version string.
|
||||||
|
*
|
||||||
|
* Can be invoked with various signatures
|
||||||
|
*
|
||||||
|
* MACHINE_VER_STR(sym, prefix, major, minor)
|
||||||
|
* MACHINE_VER_STR(sym, prefix, major, minor, micro)
|
||||||
|
* MACHINE_VER_STR(sym, prefix, major, minor, _, tag)
|
||||||
|
* MACHINE_VER_STR(sym, prefix, major, minor, micro, _, tag)
|
||||||
|
*
|
||||||
|
* Respectively emitting symbols with the format
|
||||||
|
*
|
||||||
|
* "{major}.{minor}"
|
||||||
|
* "{major}.{minor}-{tag}"
|
||||||
|
* "{major}.{minor}.{micro}"
|
||||||
|
* "{major}.{minor}.{micro}-{tag}"
|
||||||
|
*/
|
||||||
|
#define _MACHINE_VER_STR2(major, minor) \
|
||||||
|
#major "." #minor
|
||||||
|
|
||||||
|
#define _MACHINE_VER_STR3(major, minor, micro) \
|
||||||
|
#major "." #minor "." #micro
|
||||||
|
|
||||||
|
#define _MACHINE_VER_STR4(major, minor, _unused_, tag) \
|
||||||
|
#major "." #minor "-" #tag
|
||||||
|
|
||||||
|
#define _MACHINE_VER_STR5(major, minor, micro, _unused_, tag) \
|
||||||
|
#major "." #minor "." #micro "-" #tag
|
||||||
|
|
||||||
|
#define MACHINE_VER_STR(...) \
|
||||||
|
_MACHINE_VER_PICK(__VA_ARGS__, \
|
||||||
|
_MACHINE_VER_STR5, \
|
||||||
|
_MACHINE_VER_STR4, \
|
||||||
|
_MACHINE_VER_STR3, \
|
||||||
|
_MACHINE_VER_STR2) (__VA_ARGS__)
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Construct a QAPI type name for a versioned machine
|
||||||
|
* type
|
||||||
|
*
|
||||||
|
* Can be invoked with various signatures
|
||||||
|
*
|
||||||
|
* MACHINE_VER_TYPE_NAME(prefix, major, minor)
|
||||||
|
* MACHINE_VER_TYPE_NAME(prefix, major, minor, micro)
|
||||||
|
* MACHINE_VER_TYPE_NAME(prefix, major, minor, _, tag)
|
||||||
|
* MACHINE_VER_TYPE_NAME(prefix, major, minor, micro, _, tag)
|
||||||
|
*
|
||||||
|
* Respectively emitting symbols with the format
|
||||||
|
*
|
||||||
|
* "{prefix}-{major}.{minor}"
|
||||||
|
* "{prefix}-{major}.{minor}.{micro}"
|
||||||
|
* "{prefix}-{major}.{minor}-{tag}"
|
||||||
|
* "{prefix}-{major}.{minor}.{micro}-{tag}"
|
||||||
|
*/
|
||||||
|
#define _MACHINE_VER_TYPE_NAME2(prefix, major, minor) \
|
||||||
|
prefix "-" #major "." #minor TYPE_MACHINE_SUFFIX
|
||||||
|
|
||||||
|
#define _MACHINE_VER_TYPE_NAME3(prefix, major, minor, micro) \
|
||||||
|
prefix "-" #major "." #minor "." #micro TYPE_MACHINE_SUFFIX
|
||||||
|
|
||||||
|
#define _MACHINE_VER_TYPE_NAME4(prefix, major, minor, _unused_, tag) \
|
||||||
|
prefix "-" #major "." #minor "-" #tag TYPE_MACHINE_SUFFIX
|
||||||
|
|
||||||
|
#define _MACHINE_VER_TYPE_NAME5(prefix, major, minor, micro, _unused_, tag) \
|
||||||
|
prefix "-" #major "." #minor "." #micro "-" #tag TYPE_MACHINE_SUFFIX
|
||||||
|
|
||||||
|
#define MACHINE_VER_TYPE_NAME(prefix, ...) \
|
||||||
|
_MACHINE_VER_PICK(__VA_ARGS__, \
|
||||||
|
_MACHINE_VER_TYPE_NAME5, \
|
||||||
|
_MACHINE_VER_TYPE_NAME4, \
|
||||||
|
_MACHINE_VER_TYPE_NAME3, \
|
||||||
|
_MACHINE_VER_TYPE_NAME2) (prefix, __VA_ARGS__)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Construct a name for a versioned machine type that is
|
||||||
|
* suitable for use as a C symbol (function/variable/etc).
|
||||||
|
*
|
||||||
|
* Can be invoked with various signatures
|
||||||
|
*
|
||||||
|
* MACHINE_VER_SYM(sym, prefix, major, minor)
|
||||||
|
* MACHINE_VER_SYM(sym, prefix, major, minor, micro)
|
||||||
|
* MACHINE_VER_SYM(sym, prefix, major, minor, _, tag)
|
||||||
|
* MACHINE_VER_SYM(sym, prefix, major, minor, micro, _, tag)
|
||||||
|
*
|
||||||
|
* Respectively emitting symbols with the format
|
||||||
|
*
|
||||||
|
* {prefix}_machine_{major}_{minor}_{sym}
|
||||||
|
* {prefix}_machine_{major}_{minor}_{micro}_{sym}
|
||||||
|
* {prefix}_machine_{major}_{minor}_{tag}_{sym}
|
||||||
|
* {prefix}_machine_{major}_{minor}_{micro}_{tag}_{sym}
|
||||||
|
*/
|
||||||
|
#define _MACHINE_VER_SYM2(sym, prefix, major, minor) \
|
||||||
|
prefix ## _machine_ ## major ## _ ## minor ## _ ## sym
|
||||||
|
|
||||||
|
#define _MACHINE_VER_SYM3(sym, prefix, major, minor, micro) \
|
||||||
|
prefix ## _machine_ ## major ## _ ## minor ## _ ## micro ## _ ## sym
|
||||||
|
|
||||||
|
#define _MACHINE_VER_SYM4(sym, prefix, major, minor, _unused_, tag) \
|
||||||
|
prefix ## _machine_ ## major ## _ ## minor ## _ ## tag ## _ ## sym
|
||||||
|
|
||||||
|
#define _MACHINE_VER_SYM5(sym, prefix, major, minor, micro, _unused_, tag) \
|
||||||
|
prefix ## _machine_ ## major ## _ ## minor ## _ ## micro ## _ ## tag ## _ ## sym
|
||||||
|
|
||||||
|
#define MACHINE_VER_SYM(sym, prefix, ...) \
|
||||||
|
_MACHINE_VER_PICK(__VA_ARGS__, \
|
||||||
|
_MACHINE_VER_SYM5, \
|
||||||
|
_MACHINE_VER_SYM4, \
|
||||||
|
_MACHINE_VER_SYM3, \
|
||||||
|
_MACHINE_VER_SYM2) (sym, prefix, __VA_ARGS__)
|
||||||
|
|
||||||
|
|
||||||
#define DEFINE_MACHINE(namestr, machine_initfn) \
|
#define DEFINE_MACHINE(namestr, machine_initfn) \
|
||||||
static void machine_initfn##_class_init(ObjectClass *oc, void *data) \
|
static void machine_initfn##_class_init(ObjectClass *oc, void *data) \
|
||||||
{ \
|
{ \
|
||||||
|
|
Loading…
Reference in New Issue