s390x: add helper get_machine_class

We will need the machine class at machine initialization time, so the
usual way via qdev won't do. Let's cache the machine class and also use
the default values of the base machine for capability discovery.

Signed-off-by: Halil Pasic <pasic@linux.vnet.ibm.com>
Acked-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Message-Id: <20170711145441.33925-2-pasic@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
This commit is contained in:
Halil Pasic 2017-07-11 16:54:36 +02:00 committed by Christian Borntraeger
parent 25a08b8ded
commit cec8bbf7d6
1 changed files with 23 additions and 23 deletions

View File

@ -255,36 +255,35 @@ static inline void machine_set_dea_key_wrap(Object *obj, bool value,
ms->dea_key_wrap = value; ms->dea_key_wrap = value;
} }
static S390CcwMachineClass *current_mc;
static S390CcwMachineClass *get_machine_class(void)
{
if (unlikely(!current_mc)) {
/*
* No s390 ccw machine was instantiated, we are likely to
* be called for the 'none' machine. The properties will
* have their after-initialization values.
*/
current_mc = S390_MACHINE_CLASS(
object_class_by_name(TYPE_S390_CCW_MACHINE));
}
return current_mc;
}
bool ri_allowed(void) bool ri_allowed(void)
{ {
if (kvm_enabled()) { if (!kvm_enabled()) {
MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine()); return false;
if (object_class_dynamic_cast(OBJECT_CLASS(mc),
TYPE_S390_CCW_MACHINE)) {
S390CcwMachineClass *s390mc = S390_MACHINE_CLASS(mc);
return s390mc->ri_allowed;
} }
/* /* for "none" machine this results in true */
* Make sure the "none" machine can have ri, otherwise it won't * be return get_machine_class()->ri_allowed;
* unlocked in KVM and therefore the host CPU model might be wrong.
*/
return true;
}
return 0;
} }
bool cpu_model_allowed(void) bool cpu_model_allowed(void)
{ {
MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine()); /* for "none" machine this results in true */
if (object_class_dynamic_cast(OBJECT_CLASS(mc), return get_machine_class()->cpu_model_allowed;
TYPE_S390_CCW_MACHINE)) {
S390CcwMachineClass *s390mc = S390_MACHINE_CLASS(mc);
return s390mc->cpu_model_allowed;
}
/* allow CPU model qmp queries with the "none" machine */
return true;
} }
static char *machine_get_loadparm(Object *obj, Error **errp) static char *machine_get_loadparm(Object *obj, Error **errp)
@ -394,6 +393,7 @@ static const TypeInfo ccw_machine_info = {
static void ccw_machine_##suffix##_instance_init(Object *obj) \ static void ccw_machine_##suffix##_instance_init(Object *obj) \
{ \ { \
MachineState *machine = MACHINE(obj); \ MachineState *machine = MACHINE(obj); \
current_mc = S390_MACHINE_CLASS(MACHINE_GET_CLASS(machine)); \
ccw_machine_##suffix##_instance_options(machine); \ ccw_machine_##suffix##_instance_options(machine); \
} \ } \
static const TypeInfo ccw_machine_##suffix##_info = { \ static const TypeInfo ccw_machine_##suffix##_info = { \