diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index d14f0dabf3..a1d8dca512 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -4435,6 +4435,7 @@ qemuDomainDefVcpusPostParse(virDomainDefPtr def)
static int
qemuDomainDefSetDefaultCPU(virDomainDefPtr def,
+ virCapsPtr caps,
virQEMUCapsPtr qemuCaps)
{
const char *model;
@@ -4465,26 +4466,36 @@ qemuDomainDefSetDefaultCPU(virDomainDefPtr def,
return -1;
}
- VIR_DEBUG("Setting default CPU model for domain '%s' to %s",
- def->name, model);
-
if (!def->cpu)
def->cpu = g_new0(virCPUDef, 1);
- /* We need to turn off all CPU checks when the domain is started because
- * the default CPU (e.g., qemu64) may not be runnable on any host. QEMU
- * will just disable the unavailable features and we will update the CPU
- * definition accordingly and set check to FULL when starting the domain. */
def->cpu->type = VIR_CPU_TYPE_GUEST;
- def->cpu->check = VIR_CPU_CHECK_NONE;
if (STREQ(model, "host")) {
- def->cpu->mode = VIR_CPU_MODE_HOST_PASSTHROUGH;
+ if (ARCH_IS_S390(def->os.arch) &&
+ virQEMUCapsIsCPUModeSupported(qemuCaps, caps, def->virtType,
+ VIR_CPU_MODE_HOST_MODEL)) {
+ def->cpu->mode = VIR_CPU_MODE_HOST_MODEL;
+ } else {
+ def->cpu->mode = VIR_CPU_MODE_HOST_PASSTHROUGH;
+ }
+
+ VIR_DEBUG("Setting default CPU mode for domain '%s' to %s",
+ def->name, virCPUModeTypeToString(def->cpu->mode));
} else {
+ /* We need to turn off all CPU checks when the domain is started
+ * because the default CPU (e.g., qemu64) may not be runnable on any
+ * host. QEMU will just disable the unavailable features and we will
+ * update the CPU definition accordingly and set check to FULL when
+ * starting the domain. */
+ def->cpu->check = VIR_CPU_CHECK_NONE;
def->cpu->mode = VIR_CPU_MODE_CUSTOM;
def->cpu->match = VIR_CPU_MATCH_EXACT;
def->cpu->fallback = VIR_CPU_FALLBACK_FORBID;
def->cpu->model = g_strdup(model);
+
+ VIR_DEBUG("Setting default CPU model for domain '%s' to %s",
+ def->name, model);
}
return 0;
@@ -4669,7 +4680,7 @@ qemuDomainDefPostParseBasic(virDomainDefPtr def,
static int
qemuDomainDefPostParse(virDomainDefPtr def,
- virCapsPtr caps G_GNUC_UNUSED,
+ virCapsPtr caps,
unsigned int parseFlags,
void *opaque,
void *parseOpaque)
@@ -4701,7 +4712,7 @@ qemuDomainDefPostParse(virDomainDefPtr def,
if (qemuCanonicalizeMachine(def, qemuCaps) < 0)
return -1;
- if (qemuDomainDefSetDefaultCPU(def, qemuCaps) < 0)
+ if (qemuDomainDefSetDefaultCPU(def, caps, qemuCaps) < 0)
return -1;
qemuDomainDefEnableDefaultFeatures(def, qemuCaps);
diff --git a/tests/qemuxml2argvdata/s390-default-cpu-kvm-ccw-virtio-4.2.s390x-latest.args b/tests/qemuxml2argvdata/s390-default-cpu-kvm-ccw-virtio-4.2.s390x-latest.args
index 4b7345630b..0386019418 100644
--- a/tests/qemuxml2argvdata/s390-default-cpu-kvm-ccw-virtio-4.2.s390x-latest.args
+++ b/tests/qemuxml2argvdata/s390-default-cpu-kvm-ccw-virtio-4.2.s390x-latest.args
@@ -13,7 +13,9 @@ QEMU_AUDIO_DRV=none \
-object secret,id=masterKey0,format=raw,\
file=/tmp/lib/domain--1-test/master-key.aes \
-machine s390-ccw-virtio-4.2,accel=kvm,usb=off,dump-guest-core=off \
--cpu host \
+-cpu z13.2-base,aen=on,aefsi=on,msa5=on,msa4=on,msa3=on,msa2=on,msa1=on,\
+sthyi=on,edat=on,ri=on,edat2=on,vx=on,ipter=on,ap=on,esop=on,apft=on,apqci=on,\
+cte=on,bpb=on,ppa15=on,zpci=on,sea_esop2=on,te=on,cmm=on \
-m 256 \
-overcommit mem-lock=off \
-smp 1,sockets=1,cores=1,threads=1 \
diff --git a/tests/qemuxml2xmloutdata/s390-default-cpu-kvm-ccw-virtio-4.2.s390x-latest.xml b/tests/qemuxml2xmloutdata/s390-default-cpu-kvm-ccw-virtio-4.2.s390x-latest.xml
index eec5051934..1cc2edd893 100644
--- a/tests/qemuxml2xmloutdata/s390-default-cpu-kvm-ccw-virtio-4.2.s390x-latest.xml
+++ b/tests/qemuxml2xmloutdata/s390-default-cpu-kvm-ccw-virtio-4.2.s390x-latest.xml
@@ -8,7 +8,7 @@
hvm
-
+
destroy
restart