diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c index dcc164d165..31425783ba 100644 --- a/src/conf/cpu_conf.c +++ b/src/conf/cpu_conf.c @@ -238,6 +238,7 @@ virCPUDefCopyWithoutModel(const virCPUDef *cpu) copy->mode = cpu->mode; copy->match = cpu->match; copy->check = cpu->check; + copy->deprecated_feats = cpu->deprecated_feats; copy->fallback = cpu->fallback; copy->sockets = cpu->sockets; copy->dies = cpu->dies; @@ -450,6 +451,11 @@ virCPUDefParseXML(xmlXPathContextPtr ctxt, if (virXMLPropEnum(ctxt->node, "check", virCPUCheckTypeFromString, VIR_XML_PROP_NONE, &def->check) < 0) return -1; + + if (virXMLPropTristateSwitch(ctxt->node, "deprecated_features", + VIR_XML_PROP_NONE, + &def->deprecated_feats) < 0) + return -1; } if (def->type == VIR_CPU_TYPE_HOST) { @@ -748,6 +754,11 @@ virCPUDefFormatBufFull(virBuffer *buf, virBufferAsprintf(&attributeBuf, " migratable='%s'", virTristateSwitchTypeToString(def->migratable)); } + + if (def->deprecated_feats) { + virBufferAsprintf(&attributeBuf, " deprecated_features='%s'", + virTristateSwitchTypeToString(def->deprecated_feats)); + } } /* Format children */ diff --git a/src/conf/cpu_conf.h b/src/conf/cpu_conf.h index f71d942ce6..28e26303ef 100644 --- a/src/conf/cpu_conf.h +++ b/src/conf/cpu_conf.h @@ -161,6 +161,7 @@ struct _virCPUDef { virCPUMaxPhysAddrDef *addr; virHostCPUTscInfo *tsc; virTristateSwitch migratable; /* for host-passthrough mode */ + virTristateSwitch deprecated_feats; }; virCPUDef *virCPUDefNew(void); diff --git a/src/conf/schemas/cputypes.rng b/src/conf/schemas/cputypes.rng index 3a8910e09f..8edf1d14e3 100644 --- a/src/conf/schemas/cputypes.rng +++ b/src/conf/schemas/cputypes.rng @@ -439,6 +439,11 @@ + + + + + diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index bee7a39e4e..5f2e278156 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -6399,6 +6399,17 @@ qemuProcessUpdateGuestCPU(virDomainDef *def, &def->os.arch) < 0) return -1; + if (def->cpu->deprecated_feats && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION_DEPRECATED_PROPS)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("toggling deprecated features for CPU model is unsupported")); + return -1; + } + + if (def->cpu->deprecated_feats == VIR_TRISTATE_SWITCH_OFF) { + virQEMUCapsUpdateCPUDeprecatedFeatures(qemuCaps, def->virtType, def->cpu); + } + return 0; } diff --git a/tests/qemuxmlconfdata/cpu-model-deprecated-features-off.s390x-8.2.0.err b/tests/qemuxmlconfdata/cpu-model-deprecated-features-off.s390x-8.2.0.err new file mode 100644 index 0000000000..936d1d5a46 --- /dev/null +++ b/tests/qemuxmlconfdata/cpu-model-deprecated-features-off.s390x-8.2.0.err @@ -0,0 +1 @@ +unsupported configuration: toggling deprecated features for CPU model is unsupported diff --git a/tests/qemuxmlconfdata/cpu-model-deprecated-features-off.s390x-8.2.0.xml b/tests/qemuxmlconfdata/cpu-model-deprecated-features-off.s390x-8.2.0.xml new file mode 100644 index 0000000000..e1f7ba3857 --- /dev/null +++ b/tests/qemuxmlconfdata/cpu-model-deprecated-features-off.s390x-8.2.0.xml @@ -0,0 +1,25 @@ + + guest + 22782664-6b93-46bf-9595-317220dd2d1c + 219100 + 219100 + 1 + + hvm + + + + + destroy + restart + destroy + + /usr/bin/qemu-system-s390x + +