s390x: Introduce machine definition macros

Most of the machine definition code looks the same between different
machine versions. The new DEFINE_CCW_MACHINE macro makes defining a
new machine easier by inserting standard machine version
definitions. This also makes it possible to propagate values between
machine versions.

The patch is inspired by code from hw/ppc/spapr.c

Signed-off-by: Janosch Frank <frankja@linux.vnet.ibm.com>
Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
This commit is contained in:
Janosch Frank 2016-03-03 12:48:34 +01:00 committed by Cornelia Huck
parent 3a3c752f0b
commit 4fca654872

View File

@ -280,6 +280,35 @@ static const TypeInfo ccw_machine_info = {
}, },
}; };
#define DEFINE_CCW_MACHINE(suffix, verstr, latest) \
static void ccw_machine_##suffix##_class_init(ObjectClass *oc, \
void *data) \
{ \
MachineClass *mc = MACHINE_CLASS(oc); \
ccw_machine_##suffix##_class_options(mc); \
mc->desc = "VirtIO-ccw based S390 machine v" verstr; \
if (latest) { \
mc->alias = "s390-ccw-virtio"; \
mc->is_default = 1; \
} \
} \
static void ccw_machine_##suffix##_instance_init(Object *obj) \
{ \
MachineState *machine = MACHINE(obj); \
ccw_machine_##suffix##_instance_options(machine); \
} \
static const TypeInfo ccw_machine_##suffix##_info = { \
.name = MACHINE_TYPE_NAME("s390-ccw-virtio-" verstr), \
.parent = TYPE_S390_CCW_MACHINE, \
.class_init = ccw_machine_##suffix##_class_init, \
.instance_init = ccw_machine_##suffix##_instance_init, \
}; \
static void ccw_machine_register_##suffix(void) \
{ \
type_register_static(&ccw_machine_##suffix##_info); \
} \
machine_init(ccw_machine_register_##suffix)
#define CCW_COMPAT_2_5 \ #define CCW_COMPAT_2_5 \
HW_COMPAT_2_5 HW_COMPAT_2_5
@ -324,63 +353,39 @@ static const TypeInfo ccw_machine_info = {
.value = "0",\ .value = "0",\
}, },
static void ccw_machine_2_4_class_init(ObjectClass *oc, void *data) static void ccw_machine_2_6_instance_options(MachineState *machine)
{ {
MachineClass *mc = MACHINE_CLASS(oc);
static GlobalProperty compat_props[] = {
CCW_COMPAT_2_4
{ /* end of list */ }
};
mc->desc = "VirtIO-ccw based S390 machine v2.4";
mc->compat_props = compat_props;
} }
static const TypeInfo ccw_machine_2_4_info = { static void ccw_machine_2_6_class_options(MachineClass *mc)
.name = MACHINE_TYPE_NAME("s390-ccw-virtio-2.4"),
.parent = TYPE_S390_CCW_MACHINE,
.class_init = ccw_machine_2_4_class_init,
};
static void ccw_machine_2_5_class_init(ObjectClass *oc, void *data)
{ {
MachineClass *mc = MACHINE_CLASS(oc); }
static GlobalProperty compat_props[] = { DEFINE_CCW_MACHINE(2_6, "2.6", true);
CCW_COMPAT_2_5
{ /* end of list */ }
};
mc->desc = "VirtIO-ccw based S390 machine v2.5"; static void ccw_machine_2_5_instance_options(MachineState *machine)
mc->compat_props = compat_props; {
} }
static const TypeInfo ccw_machine_2_5_info = { static void ccw_machine_2_5_class_options(MachineClass *mc)
.name = MACHINE_TYPE_NAME("s390-ccw-virtio-2.5"),
.parent = TYPE_S390_CCW_MACHINE,
.class_init = ccw_machine_2_5_class_init,
};
static void ccw_machine_2_6_class_init(ObjectClass *oc, void *data)
{ {
MachineClass *mc = MACHINE_CLASS(oc); SET_MACHINE_COMPAT(mc, CCW_COMPAT_2_5);
}
DEFINE_CCW_MACHINE(2_5, "2.5", false);
mc->alias = "s390-ccw-virtio"; static void ccw_machine_2_4_instance_options(MachineState *machine)
mc->desc = "VirtIO-ccw based S390 machine v2.6"; {
mc->is_default = 1; ccw_machine_2_5_instance_options(machine);
} }
static const TypeInfo ccw_machine_2_6_info = { static void ccw_machine_2_4_class_options(MachineClass *mc)
.name = MACHINE_TYPE_NAME("s390-ccw-virtio-2.6"), {
.parent = TYPE_S390_CCW_MACHINE, SET_MACHINE_COMPAT(mc, CCW_COMPAT_2_4);
.class_init = ccw_machine_2_6_class_init, }
}; DEFINE_CCW_MACHINE(2_4, "2.4", false);
static void ccw_machine_register_types(void) static void ccw_machine_register_types(void)
{ {
type_register_static(&ccw_machine_info); type_register_static(&ccw_machine_info);
type_register_static(&ccw_machine_2_4_info);
type_register_static(&ccw_machine_2_5_info);
type_register_static(&ccw_machine_2_6_info);
} }
type_init(ccw_machine_register_types) type_init(ccw_machine_register_types)