@@ -89,7 +89,6 @@ static S390CPUDef s390_cpu_defs[] = {
#define QEMU_MAX_CPU_TYPE 0x8561
#define QEMU_MAX_CPU_GEN 15
#define QEMU_MAX_CPU_EC_GA 1
-static const S390FeatInit qemu_max_cpu_feat_init = { S390_FEAT_LIST_QEMU_MAX };
static S390FeatBitmap qemu_max_cpu_feat;
/* features part of a base model but not relevant for finding a base model */
@@ -728,7 +727,6 @@ static void s390_cpu_model_initfn(Object *obj)
}
}
-static S390CPUDef s390_qemu_cpu_def;
static S390CPUModel s390_qemu_cpu_model;
/* Set the qemu CPU model (on machine initialization). Must not be called
@@ -742,17 +740,8 @@ void s390_set_qemu_cpu_model(uint16_t type, uint8_t gen, uint8_t ec_ga,
g_assert(def);
g_assert(QTAILQ_EMPTY_RCU(&cpus));
- /* TCG emulates some features that can usually not be enabled with
- * the emulated machine generation. Make sure they can be enabled
- * when using the QEMU model by adding them to full_feat. We have
- * to copy the definition to do that.
- */
- memcpy(&s390_qemu_cpu_def, def, sizeof(s390_qemu_cpu_def));
- bitmap_or(s390_qemu_cpu_def.full_feat, s390_qemu_cpu_def.full_feat,
- qemu_max_cpu_feat, S390_FEAT_MAX);
-
/* build the CPU model */
- s390_qemu_cpu_model.def = &s390_qemu_cpu_def;
+ s390_qemu_cpu_model.def = def;
bitmap_zero(s390_qemu_cpu_model.features, S390_FEAT_MAX);
s390_init_feat_bitmap(feat_init, s390_qemu_cpu_model.features);
}
@@ -885,9 +874,8 @@ static void s390_max_cpu_model_class_init(ObjectClass *oc, void *data)
/*
* The "max" model is neither static nor migration safe. Under KVM
- * it represents the "host" model. Under TCG it represents some kind of
- * "qemu" CPU model without compat handling and maybe with some additional
- * CPU features that are not yet unlocked in the "qemu" model.
+ * it represents the "host" model. Under TCG it represents the "qemu" CPU
+ * model of the latest QEMU machine.
*/
xcc->desc =
"Enables all features supported by the accelerator in the current host";
@@ -966,13 +954,13 @@ static void init_ignored_base_feat(void)
static void register_types(void)
{
- static const S390FeatInit qemu_latest_init = { S390_FEAT_LIST_QEMU_LATEST };
+ static const S390FeatInit qemu_max_init = { S390_FEAT_LIST_QEMU_MAX };
int i;
init_ignored_base_feat();
/* init all bitmaps from gnerated data initially */
- s390_init_feat_bitmap(qemu_max_cpu_feat_init, qemu_max_cpu_feat);
+ s390_init_feat_bitmap(qemu_max_init, qemu_max_cpu_feat);
for (i = 0; i < ARRAY_SIZE(s390_cpu_defs); i++) {
s390_init_feat_bitmap(s390_cpu_defs[i].base_init,
s390_cpu_defs[i].base_feat);
@@ -982,9 +970,9 @@ static void register_types(void)
s390_cpu_defs[i].full_feat);
}
- /* initialize the qemu model with latest definition */
+ /* initialize the qemu model with the maximum definition ("max" model) */
s390_set_qemu_cpu_model(QEMU_MAX_CPU_TYPE, QEMU_MAX_CPU_GEN,
- QEMU_MAX_CPU_EC_GA, qemu_latest_init);
+ QEMU_MAX_CPU_EC_GA, qemu_max_init);
for (i = 0; i < ARRAY_SIZE(s390_cpu_defs); i++) {
char *base_name = s390_base_cpu_type_name(s390_cpu_defs[i].name);
@@ -738,11 +738,13 @@ static uint16_t qemu_V6_2[] = {
S390_FEAT_VECTOR_ENH,
};
-static uint16_t qemu_LATEST[] = {
- S390_FEAT_MISC_INSTRUCTION_EXT3,
-};
-/* add all new definitions before this point */
+/*
+ * Features for the "qemu" CPU model of the latest QEMU machine and the "max"
+ * CPU model under TCG. Don't include features that are not part of the full
+ * feature set of the current "max" CPU model generation.
+ */
static uint16_t qemu_MAX[] = {
+ S390_FEAT_MISC_INSTRUCTION_EXT3,
};
/****** END FEATURE DEFS ******/
@@ -864,7 +866,6 @@ static FeatGroupDefSpec QemuFeatDef[] = {
QEMU_FEAT_INITIALIZER(V4_1),
QEMU_FEAT_INITIALIZER(V6_0),
QEMU_FEAT_INITIALIZER(V6_2),
- QEMU_FEAT_INITIALIZER(LATEST),
QEMU_FEAT_INITIALIZER(MAX),
};