query-cpu-definitions QMP command returns a list of unavailable features
which prevent CPU models from being usable on the current host. So far
we only checked whether the list was empty to mark CPU models as
(un)usable. This patch parses all unavailable features for each CPU
model and stores them in virDomainCapsCPUModel as a list of usability
blockers.
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
---
src/qemu/qemu_capabilities.c | 2 +-
src/qemu/qemu_monitor.c | 2 +
src/qemu/qemu_monitor.h | 1 +
src/qemu/qemu_monitor_json.c | 26 +-
tests/qemucapabilitiesdata/caps_2.10.0.s390x.xml | 1102 +++++++++++++++++++--
tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml | 236 ++++-
tests/qemucapabilitiesdata/caps_2.8.0.x86_64.xml | 154 ++-
tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml | 154 ++-
8 files changed, 1556 insertions(+), 121 deletions(-)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 1ce2aa375f..7ddc6cafd4 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -3006,7 +3006,7 @@ virQEMUCapsProbeQMPCPUDefinitions(virQEMUCapsPtr qemuCaps,
usable = VIR_DOMCAPS_CPU_USABLE_NO;
if (virDomainCapsCPUModelsAddSteal(models, &cpus[i]->name, usable,
- NULL) < 0)
+ &cpus[i]->blockers) < 0)
goto cleanup;
}
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index 363ad76cfe..04bf1ab5c1 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -3736,6 +3736,8 @@ qemuMonitorCPUDefInfoFree(qemuMonitorCPUDefInfoPtr cpu)
{
if (!cpu)
return;
+
+ virStringListFree(cpu->blockers);
VIR_FREE(cpu->name);
VIR_FREE(cpu);
}
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
index 6414d2483a..ee6f27cf35 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -972,6 +972,7 @@ typedef qemuMonitorCPUDefInfo *qemuMonitorCPUDefInfoPtr;
struct _qemuMonitorCPUDefInfo {
virTristateBool usable;
char *name;
+ char **blockers; /* NULL-terminated string list */
};
int qemuMonitorGetCPUDefinitions(qemuMonitorPtr mon,
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index c63d250d36..fcdd58b369 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -5076,6 +5076,8 @@ qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon,
if (virJSONValueObjectHasKey(child, "unavailable-features")) {
virJSONValuePtr blockers;
+ size_t j;
+ int len;
blockers = virJSONValueObjectGetArray(child,
"unavailable-features");
@@ -5086,10 +5088,32 @@ qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon,
goto cleanup;
}
- if (virJSONValueArraySize(blockers) > 0)
+ len = virJSONValueArraySize(blockers);
+
+ if (len != 0)
cpu->usable = VIR_TRISTATE_BOOL_NO;
else
cpu->usable = VIR_TRISTATE_BOOL_YES;
+
+ if (len > 0 && VIR_ALLOC_N(cpu->blockers, len + 1) < 0)
+ goto cleanup;
+
+ for (j = 0; j < len; j++) {
+ virJSONValuePtr blocker = virJSONValueArrayGet(blockers, j);
+ char *name;
+
+ if (blocker->type != VIR_JSON_TYPE_STRING) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("unexpected value in unavailable-features "
+ "array"));
+ goto cleanup;
+ }
+
+ if (VIR_STRDUP(name, virJSONValueGetString(blocker)) < 0)
+ goto cleanup;
+
+ cpu->blockers[j] = name;
+ }
}
}
diff --git a/tests/qemucapabilitiesdata/caps_2.10.0.s390x.xml b/tests/qemucapabilitiesdata/caps_2.10.0.s390x.xml
index 2806345b9d..1d3edc527b 100644
--- a/tests/qemucapabilitiesdata/caps_2.10.0.s390x.xml
+++ b/tests/qemucapabilitiesdata/caps_2.10.0.s390x.xml
@@ -241,72 +241,1050 @@
<cpu type='kvm' name='z196-base' usable='yes'/>
<cpu type='kvm' name='z13-base' usable='yes'/>
<cpu type='kvm' name='z890' usable='yes'/>
- <cpu type='tcg' name='z10EC-base' usable='no'/>
- <cpu type='tcg' name='z9EC-base' usable='no'/>
- <cpu type='tcg' name='z196.2-base' usable='no'/>
+ <cpu type='tcg' name='z10EC-base' usable='no'>
+ <blocker name='dateh2'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='ectg'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='csske'/>
+ <blocker name='srs'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z9EC-base' usable='no'>
+ <blocker name='dateh2'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='srs'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z196.2-base' usable='no'>
+ <blocker name='dateh2'/>
+ <blocker name='iacc2'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='sprogp'/>
+ <blocker name='fpe'/>
+ <blocker name='emon'/>
+ <blocker name='ectg'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='csske'/>
+ <blocker name='srs'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
<cpu type='tcg' name='z900-base' usable='yes'/>
- <cpu type='tcg' name='z990' usable='no'/>
- <cpu type='tcg' name='z900.2-base' usable='no'/>
+ <cpu type='tcg' name='z990' usable='no'>
+ <blocker name='hfpm'/>
+ <blocker name='msa'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z900.2-base' usable='no'>
+ <blocker name='type'/>
+ </cpu>
<cpu type='tcg' name='host'/>
- <cpu type='tcg' name='z900.3' usable='no'/>
- <cpu type='tcg' name='z114' usable='no'/>
- <cpu type='tcg' name='z890-base' usable='no'/>
- <cpu type='tcg' name='z13.2-base' usable='no'/>
- <cpu type='tcg' name='zEC12.2' usable='no'/>
- <cpu type='tcg' name='z10BC' usable='no'/>
- <cpu type='tcg' name='z900.2' usable='no'/>
- <cpu type='tcg' name='z10BC.2' usable='no'/>
- <cpu type='tcg' name='z196' usable='no'/>
- <cpu type='tcg' name='z9EC' usable='no'/>
- <cpu type='tcg' name='z990-base' usable='no'/>
- <cpu type='tcg' name='z10EC.3' usable='no'/>
+ <cpu type='tcg' name='z900.3' usable='no'>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z114' usable='no'>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='aefsi'/>
+ <blocker name='sthyi'/>
+ <blocker name='iacc2'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='sprogp'/>
+ <blocker name='fpe'/>
+ <blocker name='emon'/>
+ <blocker name='ectg'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='csske'/>
+ <blocker name='srs'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa4'/>
+ <blocker name='msa3'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='msa'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z890-base' usable='no'>
+ <blocker name='hfpm'/>
+ <blocker name='msa'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z13.2-base' usable='no'>
+ <blocker name='dateh2'/>
+ <blocker name='dfppc'/>
+ <blocker name='iacc2'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='sprogp'/>
+ <blocker name='fpe'/>
+ <blocker name='emon'/>
+ <blocker name='ectg'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='csske'/>
+ <blocker name='srs'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='zEC12.2' usable='no'>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='esop'/>
+ <blocker name='sea_esop2'/>
+ <blocker name='edat2'/>
+ <blocker name='aefsi'/>
+ <blocker name='sthyi'/>
+ <blocker name='te'/>
+ <blocker name='aen'/>
+ <blocker name='zpci'/>
+ <blocker name='ri'/>
+ <blocker name='iacc2'/>
+ <blocker name='cte'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='sprogp'/>
+ <blocker name='fpe'/>
+ <blocker name='emon'/>
+ <blocker name='ectg'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='csske'/>
+ <blocker name='srs'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa4'/>
+ <blocker name='msa3'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='msa'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z10BC' usable='no'>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='sthyi'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='ectg'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='csske'/>
+ <blocker name='srs'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='msa'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z900.2' usable='no'>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z10BC.2' usable='no'>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='sthyi'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='ectg'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='csske'/>
+ <blocker name='srs'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='msa'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z196' usable='no'>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='aefsi'/>
+ <blocker name='sthyi'/>
+ <blocker name='iacc2'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='sprogp'/>
+ <blocker name='fpe'/>
+ <blocker name='emon'/>
+ <blocker name='ectg'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='csske'/>
+ <blocker name='srs'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa4'/>
+ <blocker name='msa3'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='msa'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z9EC' usable='no'>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='sthyi'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='srs'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa1'/>
+ <blocker name='msa'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z990-base' usable='no'>
+ <blocker name='hfpm'/>
+ <blocker name='msa'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z10EC.3' usable='no'>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='sthyi'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='ectg'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='csske'/>
+ <blocker name='srs'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='msa'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
<cpu type='tcg' name='z900' usable='yes'/>
- <cpu type='tcg' name='z9EC.3-base' usable='no'/>
- <cpu type='tcg' name='z990.5-base' usable='no'/>
- <cpu type='tcg' name='z10EC.2' usable='no'/>
- <cpu type='tcg' name='z9BC.2' usable='no'/>
- <cpu type='tcg' name='z10EC' usable='no'/>
- <cpu type='tcg' name='z990.3-base' usable='no'/>
- <cpu type='tcg' name='z14' usable='no'/>
- <cpu type='tcg' name='z13s' usable='no'/>
- <cpu type='tcg' name='z10EC.3-base' usable='no'/>
- <cpu type='tcg' name='zEC12.2-base' usable='no'/>
- <cpu type='tcg' name='z890.3-base' usable='no'/>
- <cpu type='tcg' name='z9EC.3' usable='no'/>
- <cpu type='tcg' name='z990.5' usable='no'/>
- <cpu type='tcg' name='z13' usable='no'/>
- <cpu type='tcg' name='z13s-base' usable='no'/>
- <cpu type='tcg' name='z14-base' usable='no'/>
- <cpu type='tcg' name='z9EC.2' usable='no'/>
- <cpu type='tcg' name='z990.4' usable='no'/>
- <cpu type='tcg' name='zEC12-base' usable='no'/>
- <cpu type='tcg' name='z9EC.2-base' usable='no'/>
- <cpu type='tcg' name='zBC12' usable='no'/>
- <cpu type='tcg' name='z196.2' usable='no'/>
- <cpu type='tcg' name='z990.3' usable='no'/>
- <cpu type='tcg' name='z990.2-base' usable='no'/>
- <cpu type='tcg' name='z900.3-base' usable='no'/>
- <cpu type='tcg' name='z890.3' usable='no'/>
- <cpu type='tcg' name='z10EC.2-base' usable='no'/>
- <cpu type='tcg' name='z990.2' usable='no'/>
- <cpu type='tcg' name='z890.2' usable='no'/>
- <cpu type='tcg' name='zBC12-base' usable='no'/>
- <cpu type='tcg' name='z800-base' usable='no'/>
- <cpu type='tcg' name='zEC12' usable='no'/>
- <cpu type='tcg' name='z9BC.2-base' usable='no'/>
- <cpu type='tcg' name='z9BC' usable='no'/>
- <cpu type='tcg' name='z10BC.2-base' usable='no'/>
- <cpu type='tcg' name='z990.4-base' usable='no'/>
+ <cpu type='tcg' name='z9EC.3-base' usable='no'>
+ <blocker name='dateh2'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='srs'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z990.5-base' usable='no'>
+ <blocker name='hfpm'/>
+ <blocker name='msa'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z10EC.2' usable='no'>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='sthyi'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='ectg'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='csske'/>
+ <blocker name='srs'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='msa'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z9BC.2' usable='no'>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='sthyi'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='srs'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa1'/>
+ <blocker name='msa'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z10EC' usable='no'>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='sthyi'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='ectg'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='csske'/>
+ <blocker name='srs'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='msa'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z990.3-base' usable='no'>
+ <blocker name='hfpm'/>
+ <blocker name='msa'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z14' usable='no'>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='esop'/>
+ <blocker name='vxeh'/>
+ <blocker name='vxpd'/>
+ <blocker name='gs'/>
+ <blocker name='sea_esop2'/>
+ <blocker name='iep'/>
+ <blocker name='vx'/>
+ <blocker name='dfppc'/>
+ <blocker name='edat2'/>
+ <blocker name='aefsi'/>
+ <blocker name='sthyi'/>
+ <blocker name='te'/>
+ <blocker name='ais'/>
+ <blocker name='aen'/>
+ <blocker name='zpci'/>
+ <blocker name='ri'/>
+ <blocker name='tsi'/>
+ <blocker name='sema'/>
+ <blocker name='minste2'/>
+ <blocker name='eec'/>
+ <blocker name='iacc2'/>
+ <blocker name='cte'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='sprogp'/>
+ <blocker name='opc'/>
+ <blocker name='fpe'/>
+ <blocker name='emon'/>
+ <blocker name='ectg'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='csske'/>
+ <blocker name='srs'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa8'/>
+ <blocker name='msa7'/>
+ <blocker name='msa6'/>
+ <blocker name='msa5'/>
+ <blocker name='msa4'/>
+ <blocker name='msa3'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='msa'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z13s' usable='no'>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='esop'/>
+ <blocker name='sea_esop2'/>
+ <blocker name='vx'/>
+ <blocker name='dfppc'/>
+ <blocker name='edat2'/>
+ <blocker name='aefsi'/>
+ <blocker name='sthyi'/>
+ <blocker name='te'/>
+ <blocker name='aen'/>
+ <blocker name='zpci'/>
+ <blocker name='ri'/>
+ <blocker name='iacc2'/>
+ <blocker name='cte'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='sprogp'/>
+ <blocker name='fpe'/>
+ <blocker name='emon'/>
+ <blocker name='ectg'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='csske'/>
+ <blocker name='srs'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa5'/>
+ <blocker name='msa4'/>
+ <blocker name='msa3'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='msa'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z10EC.3-base' usable='no'>
+ <blocker name='dateh2'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='ectg'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='csske'/>
+ <blocker name='srs'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='zEC12.2-base' usable='no'>
+ <blocker name='dateh2'/>
+ <blocker name='iacc2'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='sprogp'/>
+ <blocker name='fpe'/>
+ <blocker name='emon'/>
+ <blocker name='ectg'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='csske'/>
+ <blocker name='srs'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z890.3-base' usable='no'>
+ <blocker name='hfpm'/>
+ <blocker name='msa'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z9EC.3' usable='no'>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='sthyi'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='srs'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa1'/>
+ <blocker name='msa'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z990.5' usable='no'>
+ <blocker name='hfpm'/>
+ <blocker name='msa'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z13' usable='no'>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='esop'/>
+ <blocker name='sea_esop2'/>
+ <blocker name='vx'/>
+ <blocker name='dfppc'/>
+ <blocker name='edat2'/>
+ <blocker name='aefsi'/>
+ <blocker name='sthyi'/>
+ <blocker name='te'/>
+ <blocker name='aen'/>
+ <blocker name='zpci'/>
+ <blocker name='ri'/>
+ <blocker name='iacc2'/>
+ <blocker name='cte'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='sprogp'/>
+ <blocker name='fpe'/>
+ <blocker name='emon'/>
+ <blocker name='ectg'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='csske'/>
+ <blocker name='srs'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa5'/>
+ <blocker name='msa4'/>
+ <blocker name='msa3'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='msa'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z13s-base' usable='no'>
+ <blocker name='dateh2'/>
+ <blocker name='dfppc'/>
+ <blocker name='iacc2'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='sprogp'/>
+ <blocker name='fpe'/>
+ <blocker name='emon'/>
+ <blocker name='ectg'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='csske'/>
+ <blocker name='srs'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z14-base' usable='no'>
+ <blocker name='dateh2'/>
+ <blocker name='dfppc'/>
+ <blocker name='tsi'/>
+ <blocker name='sema'/>
+ <blocker name='minste2'/>
+ <blocker name='eec'/>
+ <blocker name='iacc2'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='sprogp'/>
+ <blocker name='opc'/>
+ <blocker name='fpe'/>
+ <blocker name='emon'/>
+ <blocker name='ectg'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='csske'/>
+ <blocker name='srs'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z9EC.2' usable='no'>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='sthyi'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='srs'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa1'/>
+ <blocker name='msa'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z990.4' usable='no'>
+ <blocker name='hfpm'/>
+ <blocker name='msa'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='zEC12-base' usable='no'>
+ <blocker name='dateh2'/>
+ <blocker name='iacc2'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='sprogp'/>
+ <blocker name='fpe'/>
+ <blocker name='emon'/>
+ <blocker name='ectg'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='csske'/>
+ <blocker name='srs'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z9EC.2-base' usable='no'>
+ <blocker name='dateh2'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='srs'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='zBC12' usable='no'>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='esop'/>
+ <blocker name='sea_esop2'/>
+ <blocker name='edat2'/>
+ <blocker name='aefsi'/>
+ <blocker name='sthyi'/>
+ <blocker name='te'/>
+ <blocker name='aen'/>
+ <blocker name='zpci'/>
+ <blocker name='ri'/>
+ <blocker name='iacc2'/>
+ <blocker name='cte'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='sprogp'/>
+ <blocker name='fpe'/>
+ <blocker name='emon'/>
+ <blocker name='ectg'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='csske'/>
+ <blocker name='srs'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa4'/>
+ <blocker name='msa3'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='msa'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z196.2' usable='no'>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='aefsi'/>
+ <blocker name='sthyi'/>
+ <blocker name='iacc2'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='sprogp'/>
+ <blocker name='fpe'/>
+ <blocker name='emon'/>
+ <blocker name='ectg'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='csske'/>
+ <blocker name='srs'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa4'/>
+ <blocker name='msa3'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='msa'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z990.3' usable='no'>
+ <blocker name='hfpm'/>
+ <blocker name='msa'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z990.2-base' usable='no'>
+ <blocker name='hfpm'/>
+ <blocker name='msa'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z900.3-base' usable='no'>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z890.3' usable='no'>
+ <blocker name='hfpm'/>
+ <blocker name='msa'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z10EC.2-base' usable='no'>
+ <blocker name='dateh2'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='ectg'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='csske'/>
+ <blocker name='srs'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z990.2' usable='no'>
+ <blocker name='hfpm'/>
+ <blocker name='msa'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z890.2' usable='no'>
+ <blocker name='hfpm'/>
+ <blocker name='msa'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='zBC12-base' usable='no'>
+ <blocker name='dateh2'/>
+ <blocker name='iacc2'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='sprogp'/>
+ <blocker name='fpe'/>
+ <blocker name='emon'/>
+ <blocker name='ectg'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='csske'/>
+ <blocker name='srs'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z800-base' usable='no'>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='zEC12' usable='no'>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='esop'/>
+ <blocker name='sea_esop2'/>
+ <blocker name='edat2'/>
+ <blocker name='aefsi'/>
+ <blocker name='sthyi'/>
+ <blocker name='te'/>
+ <blocker name='aen'/>
+ <blocker name='zpci'/>
+ <blocker name='ri'/>
+ <blocker name='iacc2'/>
+ <blocker name='cte'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='sprogp'/>
+ <blocker name='fpe'/>
+ <blocker name='emon'/>
+ <blocker name='ectg'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='csske'/>
+ <blocker name='srs'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa4'/>
+ <blocker name='msa3'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='msa'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z9BC.2-base' usable='no'>
+ <blocker name='dateh2'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='srs'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z9BC' usable='no'>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='sthyi'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='srs'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa1'/>
+ <blocker name='msa'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z10BC.2-base' usable='no'>
+ <blocker name='dateh2'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='ectg'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='csske'/>
+ <blocker name='srs'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z990.4-base' usable='no'>
+ <blocker name='hfpm'/>
+ <blocker name='msa'/>
+ <blocker name='type'/>
+ </cpu>
<cpu type='tcg' name='qemu' usable='yes'/>
- <cpu type='tcg' name='z10BC-base' usable='no'/>
- <cpu type='tcg' name='z9BC-base' usable='no'/>
- <cpu type='tcg' name='z800' usable='no'/>
- <cpu type='tcg' name='z890.2-base' usable='no'/>
- <cpu type='tcg' name='z13.2' usable='no'/>
- <cpu type='tcg' name='z114-base' usable='no'/>
- <cpu type='tcg' name='z196-base' usable='no'/>
- <cpu type='tcg' name='z13-base' usable='no'/>
- <cpu type='tcg' name='z890' usable='no'/>
+ <cpu type='tcg' name='z10BC-base' usable='no'>
+ <blocker name='dateh2'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='ectg'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='csske'/>
+ <blocker name='srs'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z9BC-base' usable='no'>
+ <blocker name='dateh2'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='srs'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z800' usable='no'>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z890.2-base' usable='no'>
+ <blocker name='hfpm'/>
+ <blocker name='msa'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z13.2' usable='no'>
+ <blocker name='cmm'/>
+ <blocker name='dateh2'/>
+ <blocker name='esop'/>
+ <blocker name='sea_esop2'/>
+ <blocker name='vx'/>
+ <blocker name='dfppc'/>
+ <blocker name='edat2'/>
+ <blocker name='aefsi'/>
+ <blocker name='sthyi'/>
+ <blocker name='te'/>
+ <blocker name='aen'/>
+ <blocker name='zpci'/>
+ <blocker name='ri'/>
+ <blocker name='iacc2'/>
+ <blocker name='cte'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='sprogp'/>
+ <blocker name='fpe'/>
+ <blocker name='emon'/>
+ <blocker name='ectg'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='ipter'/>
+ <blocker name='csske'/>
+ <blocker name='srs'/>
+ <blocker name='edat'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa5'/>
+ <blocker name='msa4'/>
+ <blocker name='msa3'/>
+ <blocker name='msa2'/>
+ <blocker name='msa1'/>
+ <blocker name='msa'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z114-base' usable='no'>
+ <blocker name='dateh2'/>
+ <blocker name='iacc2'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='sprogp'/>
+ <blocker name='fpe'/>
+ <blocker name='emon'/>
+ <blocker name='ectg'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='csske'/>
+ <blocker name='srs'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z196-base' usable='no'>
+ <blocker name='dateh2'/>
+ <blocker name='iacc2'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='sprogp'/>
+ <blocker name='fpe'/>
+ <blocker name='emon'/>
+ <blocker name='ectg'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='csske'/>
+ <blocker name='srs'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z13-base' usable='no'>
+ <blocker name='dateh2'/>
+ <blocker name='dfppc'/>
+ <blocker name='iacc2'/>
+ <blocker name='dfpzc'/>
+ <blocker name='cmpsceh'/>
+ <blocker name='pfpo'/>
+ <blocker name='dfphp'/>
+ <blocker name='dfp'/>
+ <blocker name='sprogp'/>
+ <blocker name='fpe'/>
+ <blocker name='emon'/>
+ <blocker name='ectg'/>
+ <blocker name='parseh'/>
+ <blocker name='hfpue'/>
+ <blocker name='hfpm'/>
+ <blocker name='nonqks'/>
+ <blocker name='csske'/>
+ <blocker name='srs'/>
+ <blocker name='asnlxr'/>
+ <blocker name='msa'/>
+ <blocker name='gen13ptff'/>
+ <blocker name='tods'/>
+ <blocker name='type'/>
+ </cpu>
+ <cpu type='tcg' name='z890' usable='no'>
+ <blocker name='hfpm'/>
+ <blocker name='msa'/>
+ <blocker name='type'/>
+ </cpu>
<machine name='s390-ccw-virtio-2.10' alias='s390-ccw-virtio' maxCpus='248'/>
<machine name='s390-ccw-virtio-2.7' maxCpus='248'/>
<machine name='s390-ccw-virtio-2.6' maxCpus='248'/>
diff --git a/tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml
index 8a31431c09..1a4a73e0fb 100644
--- a/tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml
@@ -700,7 +700,14 @@
<cpu type='kvm' name='base' usable='yes'/>
<cpu type='kvm' name='qemu64' usable='yes'/>
<cpu type='kvm' name='qemu32' usable='yes'/>
- <cpu type='kvm' name='phenom' usable='no'/>
+ <cpu type='kvm' name='phenom' usable='no'>
+ <blocker name='mmxext'/>
+ <blocker name='fxsr-opt'/>
+ <blocker name='3dnowext'/>
+ <blocker name='3dnow'/>
+ <blocker name='sse4a'/>
+ <blocker name='npt'/>
+ </cpu>
<cpu type='kvm' name='pentium3' usable='yes'/>
<cpu type='kvm' name='pentium2' usable='yes'/>
<cpu type='kvm' name='pentium' usable='yes'/>
@@ -709,31 +716,104 @@
<cpu type='kvm' name='kvm32' usable='yes'/>
<cpu type='kvm' name='coreduo' usable='yes'/>
<cpu type='kvm' name='core2duo' usable='yes'/>
- <cpu type='kvm' name='athlon' usable='no'/>
+ <cpu type='kvm' name='athlon' usable='no'>
+ <blocker name='mmxext'/>
+ <blocker name='3dnowext'/>
+ <blocker name='3dnow'/>
+ </cpu>
<cpu type='kvm' name='Westmere' usable='yes'/>
- <cpu type='kvm' name='Skylake-Server' usable='no'/>
- <cpu type='kvm' name='Skylake-Client' usable='no'/>
+ <cpu type='kvm' name='Skylake-Server' usable='no'>
+ <blocker name='hle'/>
+ <blocker name='rtm'/>
+ <blocker name='mpx'/>
+ <blocker name='avx512f'/>
+ <blocker name='avx512dq'/>
+ <blocker name='rdseed'/>
+ <blocker name='adx'/>
+ <blocker name='smap'/>
+ <blocker name='clwb'/>
+ <blocker name='avx512cd'/>
+ <blocker name='avx512bw'/>
+ <blocker name='avx512vl'/>
+ <blocker name='3dnowprefetch'/>
+ <blocker name='xsavec'/>
+ <blocker name='xgetbv1'/>
+ <blocker name='mpx'/>
+ <blocker name='mpx'/>
+ <blocker name='avx512f'/>
+ <blocker name='avx512f'/>
+ <blocker name='avx512f'/>
+ </cpu>
+ <cpu type='kvm' name='Skylake-Client' usable='no'>
+ <blocker name='hle'/>
+ <blocker name='rtm'/>
+ <blocker name='mpx'/>
+ <blocker name='rdseed'/>
+ <blocker name='adx'/>
+ <blocker name='smap'/>
+ <blocker name='3dnowprefetch'/>
+ <blocker name='xsavec'/>
+ <blocker name='xgetbv1'/>
+ <blocker name='mpx'/>
+ <blocker name='mpx'/>
+ </cpu>
<cpu type='kvm' name='SandyBridge' usable='yes'/>
<cpu type='kvm' name='Penryn' usable='yes'/>
- <cpu type='kvm' name='Opteron_G5' usable='no'/>
- <cpu type='kvm' name='Opteron_G4' usable='no'/>
- <cpu type='kvm' name='Opteron_G3' usable='no'/>
+ <cpu type='kvm' name='Opteron_G5' usable='no'>
+ <blocker name='sse4a'/>
+ <blocker name='misalignsse'/>
+ <blocker name='3dnowprefetch'/>
+ <blocker name='xop'/>
+ <blocker name='fma4'/>
+ <blocker name='tbm'/>
+ </cpu>
+ <cpu type='kvm' name='Opteron_G4' usable='no'>
+ <blocker name='sse4a'/>
+ <blocker name='misalignsse'/>
+ <blocker name='3dnowprefetch'/>
+ <blocker name='xop'/>
+ <blocker name='fma4'/>
+ </cpu>
+ <cpu type='kvm' name='Opteron_G3' usable='no'>
+ <blocker name='sse4a'/>
+ <blocker name='misalignsse'/>
+ </cpu>
<cpu type='kvm' name='Opteron_G2' usable='yes'/>
<cpu type='kvm' name='Opteron_G1' usable='yes'/>
<cpu type='kvm' name='Nehalem' usable='yes'/>
<cpu type='kvm' name='IvyBridge' usable='yes'/>
- <cpu type='kvm' name='Haswell' usable='no'/>
+ <cpu type='kvm' name='Haswell' usable='no'>
+ <blocker name='hle'/>
+ <blocker name='rtm'/>
+ </cpu>
<cpu type='kvm' name='Haswell-noTSX' usable='yes'/>
<cpu type='kvm' name='Conroe' usable='yes'/>
- <cpu type='kvm' name='Broadwell' usable='no'/>
- <cpu type='kvm' name='Broadwell-noTSX' usable='no'/>
+ <cpu type='kvm' name='Broadwell' usable='no'>
+ <blocker name='hle'/>
+ <blocker name='rtm'/>
+ <blocker name='rdseed'/>
+ <blocker name='adx'/>
+ <blocker name='smap'/>
+ <blocker name='3dnowprefetch'/>
+ </cpu>
+ <cpu type='kvm' name='Broadwell-noTSX' usable='no'>
+ <blocker name='rdseed'/>
+ <blocker name='adx'/>
+ <blocker name='smap'/>
+ <blocker name='3dnowprefetch'/>
+ </cpu>
<cpu type='kvm' name='486' usable='yes'/>
<cpu type='tcg' name='max' usable='yes'/>
- <cpu type='tcg' name='host' usable='no'/>
+ <cpu type='tcg' name='host' usable='no'>
+ <blocker name='kvm'/>
+ </cpu>
<cpu type='tcg' name='base' usable='yes'/>
<cpu type='tcg' name='qemu64' usable='yes'/>
<cpu type='tcg' name='qemu32' usable='yes'/>
- <cpu type='tcg' name='phenom' usable='no'/>
+ <cpu type='tcg' name='phenom' usable='no'>
+ <blocker name='fxsr-opt'/>
+ <blocker name='npt'/>
+ </cpu>
<cpu type='tcg' name='pentium3' usable='yes'/>
<cpu type='tcg' name='pentium2' usable='yes'/>
<cpu type='tcg' name='pentium' usable='yes'/>
@@ -744,22 +824,132 @@
<cpu type='tcg' name='core2duo' usable='yes'/>
<cpu type='tcg' name='athlon' usable='yes'/>
<cpu type='tcg' name='Westmere' usable='yes'/>
- <cpu type='tcg' name='Skylake-Server' usable='no'/>
- <cpu type='tcg' name='Skylake-Client' usable='no'/>
- <cpu type='tcg' name='SandyBridge' usable='no'/>
+ <cpu type='tcg' name='Skylake-Server' usable='no'>
+ <blocker name='fma'/>
+ <blocker name='pcid'/>
+ <blocker name='x2apic'/>
+ <blocker name='tsc-deadline'/>
+ <blocker name='avx'/>
+ <blocker name='f16c'/>
+ <blocker name='rdrand'/>
+ <blocker name='hle'/>
+ <blocker name='avx2'/>
+ <blocker name='invpcid'/>
+ <blocker name='rtm'/>
+ <blocker name='avx512f'/>
+ <blocker name='avx512dq'/>
+ <blocker name='rdseed'/>
+ <blocker name='avx512cd'/>
+ <blocker name='avx512bw'/>
+ <blocker name='avx512vl'/>
+ <blocker name='3dnowprefetch'/>
+ <blocker name='xsavec'/>
+ </cpu>
+ <cpu type='tcg' name='Skylake-Client' usable='no'>
+ <blocker name='fma'/>
+ <blocker name='pcid'/>
+ <blocker name='x2apic'/>
+ <blocker name='tsc-deadline'/>
+ <blocker name='avx'/>
+ <blocker name='f16c'/>
+ <blocker name='rdrand'/>
+ <blocker name='hle'/>
+ <blocker name='avx2'/>
+ <blocker name='invpcid'/>
+ <blocker name='rtm'/>
+ <blocker name='rdseed'/>
+ <blocker name='3dnowprefetch'/>
+ <blocker name='xsavec'/>
+ </cpu>
+ <cpu type='tcg' name='SandyBridge' usable='no'>
+ <blocker name='x2apic'/>
+ <blocker name='tsc-deadline'/>
+ <blocker name='avx'/>
+ </cpu>
<cpu type='tcg' name='Penryn' usable='yes'/>
- <cpu type='tcg' name='Opteron_G5' usable='no'/>
- <cpu type='tcg' name='Opteron_G4' usable='no'/>
- <cpu type='tcg' name='Opteron_G3' usable='no'/>
+ <cpu type='tcg' name='Opteron_G5' usable='no'>
+ <blocker name='fma'/>
+ <blocker name='avx'/>
+ <blocker name='f16c'/>
+ <blocker name='misalignsse'/>
+ <blocker name='3dnowprefetch'/>
+ <blocker name='xop'/>
+ <blocker name='fma4'/>
+ <blocker name='tbm'/>
+ </cpu>
+ <cpu type='tcg' name='Opteron_G4' usable='no'>
+ <blocker name='avx'/>
+ <blocker name='misalignsse'/>
+ <blocker name='3dnowprefetch'/>
+ <blocker name='xop'/>
+ <blocker name='fma4'/>
+ </cpu>
+ <cpu type='tcg' name='Opteron_G3' usable='no'>
+ <blocker name='misalignsse'/>
+ </cpu>
<cpu type='tcg' name='Opteron_G2' usable='yes'/>
<cpu type='tcg' name='Opteron_G1' usable='yes'/>
<cpu type='tcg' name='Nehalem' usable='yes'/>
- <cpu type='tcg' name='IvyBridge' usable='no'/>
- <cpu type='tcg' name='Haswell' usable='no'/>
- <cpu type='tcg' name='Haswell-noTSX' usable='no'/>
+ <cpu type='tcg' name='IvyBridge' usable='no'>
+ <blocker name='x2apic'/>
+ <blocker name='tsc-deadline'/>
+ <blocker name='avx'/>
+ <blocker name='f16c'/>
+ <blocker name='rdrand'/>
+ </cpu>
+ <cpu type='tcg' name='Haswell' usable='no'>
+ <blocker name='fma'/>
+ <blocker name='pcid'/>
+ <blocker name='x2apic'/>
+ <blocker name='tsc-deadline'/>
+ <blocker name='avx'/>
+ <blocker name='f16c'/>
+ <blocker name='rdrand'/>
+ <blocker name='hle'/>
+ <blocker name='avx2'/>
+ <blocker name='invpcid'/>
+ <blocker name='rtm'/>
+ </cpu>
+ <cpu type='tcg' name='Haswell-noTSX' usable='no'>
+ <blocker name='fma'/>
+ <blocker name='pcid'/>
+ <blocker name='x2apic'/>
+ <blocker name='tsc-deadline'/>
+ <blocker name='avx'/>
+ <blocker name='f16c'/>
+ <blocker name='rdrand'/>
+ <blocker name='avx2'/>
+ <blocker name='invpcid'/>
+ </cpu>
<cpu type='tcg' name='Conroe' usable='yes'/>
- <cpu type='tcg' name='Broadwell' usable='no'/>
- <cpu type='tcg' name='Broadwell-noTSX' usable='no'/>
+ <cpu type='tcg' name='Broadwell' usable='no'>
+ <blocker name='fma'/>
+ <blocker name='pcid'/>
+ <blocker name='x2apic'/>
+ <blocker name='tsc-deadline'/>
+ <blocker name='avx'/>
+ <blocker name='f16c'/>
+ <blocker name='rdrand'/>
+ <blocker name='hle'/>
+ <blocker name='avx2'/>
+ <blocker name='invpcid'/>
+ <blocker name='rtm'/>
+ <blocker name='rdseed'/>
+ <blocker name='3dnowprefetch'/>
+ </cpu>
+ <cpu type='tcg' name='Broadwell-noTSX' usable='no'>
+ <blocker name='fma'/>
+ <blocker name='pcid'/>
+ <blocker name='x2apic'/>
+ <blocker name='tsc-deadline'/>
+ <blocker name='avx'/>
+ <blocker name='f16c'/>
+ <blocker name='rdrand'/>
+ <blocker name='avx2'/>
+ <blocker name='invpcid'/>
+ <blocker name='rdseed'/>
+ <blocker name='3dnowprefetch'/>
+ </cpu>
<cpu type='tcg' name='486' usable='yes'/>
<machine name='pc-i440fx-2.10' alias='pc' hotplugCpus='yes' maxCpus='255'/>
<machine name='pc-0.12' hotplugCpus='yes' maxCpus='255'/>
diff --git a/tests/qemucapabilitiesdata/caps_2.8.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.8.0.x86_64.xml
index 761f9d1415..7cea98cb36 100644
--- a/tests/qemucapabilitiesdata/caps_2.8.0.x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_2.8.0.x86_64.xml
@@ -216,7 +216,14 @@
<cpu type='kvm' name='host' usable='yes'/>
<cpu type='kvm' name='qemu64' usable='yes'/>
<cpu type='kvm' name='qemu32' usable='yes'/>
- <cpu type='kvm' name='phenom' usable='no'/>
+ <cpu type='kvm' name='phenom' usable='no'>
+ <blocker name='mmxext'/>
+ <blocker name='fxsr-opt'/>
+ <blocker name='3dnowext'/>
+ <blocker name='3dnow'/>
+ <blocker name='sse4a'/>
+ <blocker name='npt'/>
+ </cpu>
<cpu type='kvm' name='pentium3' usable='yes'/>
<cpu type='kvm' name='pentium2' usable='yes'/>
<cpu type='kvm' name='pentium' usable='yes'/>
@@ -225,14 +232,32 @@
<cpu type='kvm' name='kvm32' usable='yes'/>
<cpu type='kvm' name='coreduo' usable='yes'/>
<cpu type='kvm' name='core2duo' usable='yes'/>
- <cpu type='kvm' name='athlon' usable='no'/>
+ <cpu type='kvm' name='athlon' usable='no'>
+ <blocker name='mmxext'/>
+ <blocker name='3dnowext'/>
+ <blocker name='3dnow'/>
+ </cpu>
<cpu type='kvm' name='Westmere' usable='yes'/>
<cpu type='kvm' name='Skylake-Client' usable='yes'/>
<cpu type='kvm' name='SandyBridge' usable='yes'/>
<cpu type='kvm' name='Penryn' usable='yes'/>
- <cpu type='kvm' name='Opteron_G5' usable='no'/>
- <cpu type='kvm' name='Opteron_G4' usable='no'/>
- <cpu type='kvm' name='Opteron_G3' usable='no'/>
+ <cpu type='kvm' name='Opteron_G5' usable='no'>
+ <blocker name='sse4a'/>
+ <blocker name='misalignsse'/>
+ <blocker name='xop'/>
+ <blocker name='fma4'/>
+ <blocker name='tbm'/>
+ </cpu>
+ <cpu type='kvm' name='Opteron_G4' usable='no'>
+ <blocker name='sse4a'/>
+ <blocker name='misalignsse'/>
+ <blocker name='xop'/>
+ <blocker name='fma4'/>
+ </cpu>
+ <cpu type='kvm' name='Opteron_G3' usable='no'>
+ <blocker name='sse4a'/>
+ <blocker name='misalignsse'/>
+ </cpu>
<cpu type='kvm' name='Opteron_G2' usable='yes'/>
<cpu type='kvm' name='Opteron_G1' usable='yes'/>
<cpu type='kvm' name='Nehalem' usable='yes'/>
@@ -243,10 +268,15 @@
<cpu type='kvm' name='Broadwell' usable='yes'/>
<cpu type='kvm' name='Broadwell-noTSX' usable='yes'/>
<cpu type='kvm' name='486' usable='yes'/>
- <cpu type='tcg' name='host' usable='no'/>
+ <cpu type='tcg' name='host' usable='no'>
+ <blocker name='kvm'/>
+ </cpu>
<cpu type='tcg' name='qemu64' usable='yes'/>
<cpu type='tcg' name='qemu32' usable='yes'/>
- <cpu type='tcg' name='phenom' usable='no'/>
+ <cpu type='tcg' name='phenom' usable='no'>
+ <blocker name='fxsr-opt'/>
+ <blocker name='npt'/>
+ </cpu>
<cpu type='tcg' name='pentium3' usable='yes'/>
<cpu type='tcg' name='pentium2' usable='yes'/>
<cpu type='tcg' name='pentium' usable='yes'/>
@@ -257,21 +287,111 @@
<cpu type='tcg' name='core2duo' usable='yes'/>
<cpu type='tcg' name='athlon' usable='yes'/>
<cpu type='tcg' name='Westmere' usable='yes'/>
- <cpu type='tcg' name='Skylake-Client' usable='no'/>
- <cpu type='tcg' name='SandyBridge' usable='no'/>
+ <cpu type='tcg' name='Skylake-Client' usable='no'>
+ <blocker name='fma'/>
+ <blocker name='pcid'/>
+ <blocker name='x2apic'/>
+ <blocker name='tsc-deadline'/>
+ <blocker name='avx'/>
+ <blocker name='f16c'/>
+ <blocker name='rdrand'/>
+ <blocker name='hle'/>
+ <blocker name='avx2'/>
+ <blocker name='invpcid'/>
+ <blocker name='rtm'/>
+ <blocker name='rdseed'/>
+ <blocker name='3dnowprefetch'/>
+ <blocker name='xsavec'/>
+ </cpu>
+ <cpu type='tcg' name='SandyBridge' usable='no'>
+ <blocker name='x2apic'/>
+ <blocker name='tsc-deadline'/>
+ <blocker name='avx'/>
+ </cpu>
<cpu type='tcg' name='Penryn' usable='yes'/>
- <cpu type='tcg' name='Opteron_G5' usable='no'/>
- <cpu type='tcg' name='Opteron_G4' usable='no'/>
- <cpu type='tcg' name='Opteron_G3' usable='no'/>
+ <cpu type='tcg' name='Opteron_G5' usable='no'>
+ <blocker name='fma'/>
+ <blocker name='avx'/>
+ <blocker name='f16c'/>
+ <blocker name='misalignsse'/>
+ <blocker name='3dnowprefetch'/>
+ <blocker name='xop'/>
+ <blocker name='fma4'/>
+ <blocker name='tbm'/>
+ </cpu>
+ <cpu type='tcg' name='Opteron_G4' usable='no'>
+ <blocker name='avx'/>
+ <blocker name='misalignsse'/>
+ <blocker name='3dnowprefetch'/>
+ <blocker name='xop'/>
+ <blocker name='fma4'/>
+ </cpu>
+ <cpu type='tcg' name='Opteron_G3' usable='no'>
+ <blocker name='misalignsse'/>
+ </cpu>
<cpu type='tcg' name='Opteron_G2' usable='yes'/>
<cpu type='tcg' name='Opteron_G1' usable='yes'/>
<cpu type='tcg' name='Nehalem' usable='yes'/>
- <cpu type='tcg' name='IvyBridge' usable='no'/>
- <cpu type='tcg' name='Haswell' usable='no'/>
- <cpu type='tcg' name='Haswell-noTSX' usable='no'/>
+ <cpu type='tcg' name='IvyBridge' usable='no'>
+ <blocker name='x2apic'/>
+ <blocker name='tsc-deadline'/>
+ <blocker name='avx'/>
+ <blocker name='f16c'/>
+ <blocker name='rdrand'/>
+ </cpu>
+ <cpu type='tcg' name='Haswell' usable='no'>
+ <blocker name='fma'/>
+ <blocker name='pcid'/>
+ <blocker name='x2apic'/>
+ <blocker name='tsc-deadline'/>
+ <blocker name='avx'/>
+ <blocker name='f16c'/>
+ <blocker name='rdrand'/>
+ <blocker name='hle'/>
+ <blocker name='avx2'/>
+ <blocker name='invpcid'/>
+ <blocker name='rtm'/>
+ </cpu>
+ <cpu type='tcg' name='Haswell-noTSX' usable='no'>
+ <blocker name='fma'/>
+ <blocker name='pcid'/>
+ <blocker name='x2apic'/>
+ <blocker name='tsc-deadline'/>
+ <blocker name='avx'/>
+ <blocker name='f16c'/>
+ <blocker name='rdrand'/>
+ <blocker name='avx2'/>
+ <blocker name='invpcid'/>
+ </cpu>
<cpu type='tcg' name='Conroe' usable='yes'/>
- <cpu type='tcg' name='Broadwell' usable='no'/>
- <cpu type='tcg' name='Broadwell-noTSX' usable='no'/>
+ <cpu type='tcg' name='Broadwell' usable='no'>
+ <blocker name='fma'/>
+ <blocker name='pcid'/>
+ <blocker name='x2apic'/>
+ <blocker name='tsc-deadline'/>
+ <blocker name='avx'/>
+ <blocker name='f16c'/>
+ <blocker name='rdrand'/>
+ <blocker name='hle'/>
+ <blocker name='avx2'/>
+ <blocker name='invpcid'/>
+ <blocker name='rtm'/>
+ <blocker name='rdseed'/>
+ <blocker name='3dnowprefetch'/>
+ </cpu>
+ <cpu type='tcg' name='Broadwell-noTSX' usable='no'>
+ <blocker name='fma'/>
+ <blocker name='pcid'/>
+ <blocker name='x2apic'/>
+ <blocker name='tsc-deadline'/>
+ <blocker name='avx'/>
+ <blocker name='f16c'/>
+ <blocker name='rdrand'/>
+ <blocker name='avx2'/>
+ <blocker name='invpcid'/>
+ <blocker name='rdseed'/>
+ <blocker name='3dnowprefetch'/>
+ </cpu>
<cpu type='tcg' name='486' usable='yes'/>
<machine name='pc-i440fx-2.8' alias='pc' hotplugCpus='yes' maxCpus='255'/>
<machine name='pc-0.12' hotplugCpus='yes' maxCpus='255'/>
diff --git a/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml
index 3641d03323..c54ac89929 100644
--- a/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml
@@ -693,7 +693,14 @@
<cpu type='kvm' name='base' usable='yes'/>
<cpu type='kvm' name='qemu64' usable='yes'/>
<cpu type='kvm' name='qemu32' usable='yes'/>
- <cpu type='kvm' name='phenom' usable='no'/>
+ <cpu type='kvm' name='phenom' usable='no'>
+ <blocker name='mmxext'/>
+ <blocker name='fxsr-opt'/>
+ <blocker name='3dnowext'/>
+ <blocker name='3dnow'/>
+ <blocker name='sse4a'/>
+ <blocker name='npt'/>
+ </cpu>
<cpu type='kvm' name='pentium3' usable='yes'/>
<cpu type='kvm' name='pentium2' usable='yes'/>
<cpu type='kvm' name='pentium' usable='yes'/>
@@ -702,14 +709,32 @@
<cpu type='kvm' name='kvm32' usable='yes'/>
<cpu type='kvm' name='coreduo' usable='yes'/>
<cpu type='kvm' name='core2duo' usable='yes'/>
- <cpu type='kvm' name='athlon' usable='no'/>
+ <cpu type='kvm' name='athlon' usable='no'>
+ <blocker name='mmxext'/>
+ <blocker name='3dnowext'/>
+ <blocker name='3dnow'/>
+ </cpu>
<cpu type='kvm' name='Westmere' usable='yes'/>
<cpu type='kvm' name='Skylake-Client' usable='yes'/>
<cpu type='kvm' name='SandyBridge' usable='yes'/>
<cpu type='kvm' name='Penryn' usable='yes'/>
- <cpu type='kvm' name='Opteron_G5' usable='no'/>
- <cpu type='kvm' name='Opteron_G4' usable='no'/>
- <cpu type='kvm' name='Opteron_G3' usable='no'/>
+ <cpu type='kvm' name='Opteron_G5' usable='no'>
+ <blocker name='sse4a'/>
+ <blocker name='misalignsse'/>
+ <blocker name='xop'/>
+ <blocker name='fma4'/>
+ <blocker name='tbm'/>
+ </cpu>
+ <cpu type='kvm' name='Opteron_G4' usable='no'>
+ <blocker name='sse4a'/>
+ <blocker name='misalignsse'/>
+ <blocker name='xop'/>
+ <blocker name='fma4'/>
+ </cpu>
+ <cpu type='kvm' name='Opteron_G3' usable='no'>
+ <blocker name='sse4a'/>
+ <blocker name='misalignsse'/>
+ </cpu>
<cpu type='kvm' name='Opteron_G2' usable='yes'/>
<cpu type='kvm' name='Opteron_G1' usable='yes'/>
<cpu type='kvm' name='Nehalem' usable='yes'/>
@@ -721,11 +746,16 @@
<cpu type='kvm' name='Broadwell-noTSX' usable='yes'/>
<cpu type='kvm' name='486' usable='yes'/>
<cpu type='tcg' name='max' usable='yes'/>
- <cpu type='tcg' name='host' usable='no'/>
+ <cpu type='tcg' name='host' usable='no'>
+ <blocker name='kvm'/>
+ </cpu>
<cpu type='tcg' name='base' usable='yes'/>
<cpu type='tcg' name='qemu64' usable='yes'/>
<cpu type='tcg' name='qemu32' usable='yes'/>
- <cpu type='tcg' name='phenom' usable='no'/>
+ <cpu type='tcg' name='phenom' usable='no'>
+ <blocker name='fxsr-opt'/>
+ <blocker name='npt'/>
+ </cpu>
<cpu type='tcg' name='pentium3' usable='yes'/>
<cpu type='tcg' name='pentium2' usable='yes'/>
<cpu type='tcg' name='pentium' usable='yes'/>
@@ -736,21 +766,111 @@
<cpu type='tcg' name='core2duo' usable='yes'/>
<cpu type='tcg' name='athlon' usable='yes'/>
<cpu type='tcg' name='Westmere' usable='yes'/>
- <cpu type='tcg' name='Skylake-Client' usable='no'/>
- <cpu type='tcg' name='SandyBridge' usable='no'/>
+ <cpu type='tcg' name='Skylake-Client' usable='no'>
+ <blocker name='fma'/>
+ <blocker name='pcid'/>
+ <blocker name='x2apic'/>
+ <blocker name='tsc-deadline'/>
+ <blocker name='avx'/>
+ <blocker name='f16c'/>
+ <blocker name='rdrand'/>
+ <blocker name='hle'/>
+ <blocker name='avx2'/>
+ <blocker name='invpcid'/>
+ <blocker name='rtm'/>
+ <blocker name='rdseed'/>
+ <blocker name='3dnowprefetch'/>
+ <blocker name='xsavec'/>
+ </cpu>
+ <cpu type='tcg' name='SandyBridge' usable='no'>
+ <blocker name='x2apic'/>
+ <blocker name='tsc-deadline'/>
+ <blocker name='avx'/>
+ </cpu>
<cpu type='tcg' name='Penryn' usable='yes'/>
- <cpu type='tcg' name='Opteron_G5' usable='no'/>
- <cpu type='tcg' name='Opteron_G4' usable='no'/>
- <cpu type='tcg' name='Opteron_G3' usable='no'/>
+ <cpu type='tcg' name='Opteron_G5' usable='no'>
+ <blocker name='fma'/>
+ <blocker name='avx'/>
+ <blocker name='f16c'/>
+ <blocker name='misalignsse'/>
+ <blocker name='3dnowprefetch'/>
+ <blocker name='xop'/>
+ <blocker name='fma4'/>
+ <blocker name='tbm'/>
+ </cpu>
+ <cpu type='tcg' name='Opteron_G4' usable='no'>
+ <blocker name='avx'/>
+ <blocker name='misalignsse'/>
+ <blocker name='3dnowprefetch'/>
+ <blocker name='xop'/>
+ <blocker name='fma4'/>
+ </cpu>
+ <cpu type='tcg' name='Opteron_G3' usable='no'>
+ <blocker name='misalignsse'/>
+ </cpu>
<cpu type='tcg' name='Opteron_G2' usable='yes'/>
<cpu type='tcg' name='Opteron_G1' usable='yes'/>
<cpu type='tcg' name='Nehalem' usable='yes'/>
- <cpu type='tcg' name='IvyBridge' usable='no'/>
- <cpu type='tcg' name='Haswell' usable='no'/>
- <cpu type='tcg' name='Haswell-noTSX' usable='no'/>
+ <cpu type='tcg' name='IvyBridge' usable='no'>
+ <blocker name='x2apic'/>
+ <blocker name='tsc-deadline'/>
+ <blocker name='avx'/>
+ <blocker name='f16c'/>
+ <blocker name='rdrand'/>
+ </cpu>
+ <cpu type='tcg' name='Haswell' usable='no'>
+ <blocker name='fma'/>
+ <blocker name='pcid'/>
+ <blocker name='x2apic'/>
+ <blocker name='tsc-deadline'/>
+ <blocker name='avx'/>
+ <blocker name='f16c'/>
+ <blocker name='rdrand'/>
+ <blocker name='hle'/>
+ <blocker name='avx2'/>
+ <blocker name='invpcid'/>
+ <blocker name='rtm'/>
+ </cpu>
+ <cpu type='tcg' name='Haswell-noTSX' usable='no'>
+ <blocker name='fma'/>
+ <blocker name='pcid'/>
+ <blocker name='x2apic'/>
+ <blocker name='tsc-deadline'/>
+ <blocker name='avx'/>
+ <blocker name='f16c'/>
+ <blocker name='rdrand'/>
+ <blocker name='avx2'/>
+ <blocker name='invpcid'/>
+ </cpu>
<cpu type='tcg' name='Conroe' usable='yes'/>
- <cpu type='tcg' name='Broadwell' usable='no'/>
- <cpu type='tcg' name='Broadwell-noTSX' usable='no'/>
+ <cpu type='tcg' name='Broadwell' usable='no'>
+ <blocker name='fma'/>
+ <blocker name='pcid'/>
+ <blocker name='x2apic'/>
+ <blocker name='tsc-deadline'/>
+ <blocker name='avx'/>
+ <blocker name='f16c'/>
+ <blocker name='rdrand'/>
+ <blocker name='hle'/>
+ <blocker name='avx2'/>
+ <blocker name='invpcid'/>
+ <blocker name='rtm'/>
+ <blocker name='rdseed'/>
+ <blocker name='3dnowprefetch'/>
+ </cpu>
+ <cpu type='tcg' name='Broadwell-noTSX' usable='no'>
+ <blocker name='fma'/>
+ <blocker name='pcid'/>
+ <blocker name='x2apic'/>
+ <blocker name='tsc-deadline'/>
+ <blocker name='avx'/>
+ <blocker name='f16c'/>
+ <blocker name='rdrand'/>
+ <blocker name='avx2'/>
+ <blocker name='invpcid'/>
+ <blocker name='rdseed'/>
+ <blocker name='3dnowprefetch'/>
+ </cpu>
<cpu type='tcg' name='486' usable='yes'/>
<machine name='pc-i440fx-2.9' alias='pc' hotplugCpus='yes' maxCpus='255'/>
<machine name='pc-0.12' hotplugCpus='yes' maxCpus='255'/>
--
2.14.2
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
On 10/04/2017 10:58 AM, Jiri Denemark wrote:
> query-cpu-definitions QMP command returns a list of unavailable features
> which prevent CPU models from being usable on the current host. So far
> we only checked whether the list was empty to mark CPU models as
> (un)usable. This patch parses all unavailable features for each CPU
> model and stores them in virDomainCapsCPUModel as a list of usability
> blockers.
>
> Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
> ---
> src/qemu/qemu_capabilities.c | 2 +-
> src/qemu/qemu_monitor.c | 2 +
> src/qemu/qemu_monitor.h | 1 +
> src/qemu/qemu_monitor_json.c | 26 +-
> tests/qemucapabilitiesdata/caps_2.10.0.s390x.xml | 1102 +++++++++++++++++++--
> tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml | 236 ++++-
> tests/qemucapabilitiesdata/caps_2.8.0.x86_64.xml | 154 ++-
> tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml | 154 ++-
> 8 files changed, 1556 insertions(+), 121 deletions(-)
>
[...]
> diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
> index c63d250d36..fcdd58b369 100644
> --- a/src/qemu/qemu_monitor_json.c
> +++ b/src/qemu/qemu_monitor_json.c
> @@ -5076,6 +5076,8 @@ qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon,
>
> if (virJSONValueObjectHasKey(child, "unavailable-features")) {
> virJSONValuePtr blockers;
> + size_t j;
> + int len;
>
> blockers = virJSONValueObjectGetArray(child,
> "unavailable-features");
> @@ -5086,10 +5088,32 @@ qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon,
> goto cleanup;
> }
>
> - if (virJSONValueArraySize(blockers) > 0)
> + len = virJSONValueArraySize(blockers);
> +
> + if (len != 0)
At this point len is either 0 (empty) or > 0 because if it was < 0 the
virJSONValueObjectGetArray would have already caused a failure, right?
So why not :
if (len == 0) {
cpu->usable = VIR_TRISTATE_BOOL_YES;
continue;
}
cpu->usable = VIR_TRISTATE_BOOL_NO;
if (VIR_ALLOC_N(cpu->blockers, len + 1) < 0)
...
> cpu->usable = VIR_TRISTATE_BOOL_NO;
> else
> cpu->usable = VIR_TRISTATE_BOOL_YES;
> +
> + if (len > 0 && VIR_ALLOC_N(cpu->blockers, len + 1) < 0)
> + goto cleanup;
> +
> + for (j = 0; j < len; j++) {
> + virJSONValuePtr blocker = virJSONValueArrayGet(blockers, j);
> + char *name;
virJSONValueArrayGet can return NULL, but that shouldn't affect us since
blockers is an ARRAY and there's no way j >= len...
> +
> + if (blocker->type != VIR_JSON_TYPE_STRING) {
> + virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> + _("unexpected value in unavailable-features "
> + "array"));
> + goto cleanup;
> + }
...but because of this check...
> +
> + if (VIR_STRDUP(name, virJSONValueGetString(blocker)) < 0)
...wouldn't virJSONValueGetString return a non NULL string, so...
> + goto cleanup;
> +
> + cpu->blockers[j] = name;
...why not just go direct to cpu->blockers[j]? Or did you come across
something in testing that had a NULL return from the call to
virJSONValueGetString(blocker)?
Maybe a NULL entry should just be ignored so as to not tank the whole
thing using the logic that if a blocker isn't there, by name, then is it
a blocker?
> + }
> }
> }
>
Reviewed-by: John Ferlan <jferlan@redhat.com>
John
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
On Thu, Oct 12, 2017 at 07:25:59 -0400, John Ferlan wrote:
>
>
> On 10/04/2017 10:58 AM, Jiri Denemark wrote:
> > query-cpu-definitions QMP command returns a list of unavailable features
> > which prevent CPU models from being usable on the current host. So far
> > we only checked whether the list was empty to mark CPU models as
> > (un)usable. This patch parses all unavailable features for each CPU
> > model and stores them in virDomainCapsCPUModel as a list of usability
> > blockers.
> [...]
>
> > diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
> > index c63d250d36..fcdd58b369 100644
> > --- a/src/qemu/qemu_monitor_json.c
> > +++ b/src/qemu/qemu_monitor_json.c
> > @@ -5086,10 +5088,32 @@ qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon,
> > goto cleanup;
> > }
> >
> > - if (virJSONValueArraySize(blockers) > 0)
> > + len = virJSONValueArraySize(blockers);
> > +
> > + if (len != 0)
>
> At this point len is either 0 (empty) or > 0 because if it was < 0 the
> virJSONValueObjectGetArray would have already caused a failure, right?
>
> So why not :
>
> if (len == 0) {
> cpu->usable = VIR_TRISTATE_BOOL_YES;
> continue;
> }
>
> cpu->usable = VIR_TRISTATE_BOOL_NO;
> if (VIR_ALLOC_N(cpu->blockers, len + 1) < 0)
OK
>
>
> > cpu->usable = VIR_TRISTATE_BOOL_NO;
> > else
> > cpu->usable = VIR_TRISTATE_BOOL_YES;
> > +
> > + if (len > 0 && VIR_ALLOC_N(cpu->blockers, len + 1) < 0)
> > + goto cleanup;
> > +
> > + for (j = 0; j < len; j++) {
> > + virJSONValuePtr blocker = virJSONValueArrayGet(blockers, j);
> > + char *name;
>
> virJSONValueArrayGet can return NULL, but that shouldn't affect us since
> blockers is an ARRAY and there's no way j >= len...
Right.
> > +
> > + if (blocker->type != VIR_JSON_TYPE_STRING) {
> > + virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> > + _("unexpected value in unavailable-features "
> > + "array"));
> > + goto cleanup;
> > + }
>
> ...but because of this check...
>
> > +
> > + if (VIR_STRDUP(name, virJSONValueGetString(blocker)) < 0)
> ...wouldn't virJSONValueGetString return a non NULL string, so...
Sure, but this is not checking whether virJSONValueGetString returns
NULL or not, this checks whether we successfully made a copy of the
blocker string.
> > + goto cleanup;
> > +
> > + cpu->blockers[j] = name;
>
> ...why not just go direct to cpu->blockers[j]? Or did you come across
> something in testing that had a NULL return from the call to
> virJSONValueGetString(blocker)?
>
> Maybe a NULL entry should just be ignored so as to not tank the whole
> thing using the logic that if a blocker isn't there, by name, then is it
> a blocker?
I'm not really sure what you were trying to say. Is the temporary name
variable confusing you? No problem, it's not needed at all, I changed
the code so that VIR_STRDUP stores the result directly in
cpu->blockers[j].
Jirka
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
On 10/13/2017 10:39 AM, Jiri Denemark wrote:
> On Thu, Oct 12, 2017 at 07:25:59 -0400, John Ferlan wrote:
>>
>>
>> On 10/04/2017 10:58 AM, Jiri Denemark wrote:
>>> query-cpu-definitions QMP command returns a list of unavailable features
>>> which prevent CPU models from being usable on the current host. So far
>>> we only checked whether the list was empty to mark CPU models as
>>> (un)usable. This patch parses all unavailable features for each CPU
>>> model and stores them in virDomainCapsCPUModel as a list of usability
>>> blockers.
>> [...]
>>
>>> diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
>>> index c63d250d36..fcdd58b369 100644
>>> --- a/src/qemu/qemu_monitor_json.c
>>> +++ b/src/qemu/qemu_monitor_json.c
>>> @@ -5086,10 +5088,32 @@ qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon,
>>> goto cleanup;
>>> }
>>>
>>> - if (virJSONValueArraySize(blockers) > 0)
>>> + len = virJSONValueArraySize(blockers);
>>> +
>>> + if (len != 0)
>>
>> At this point len is either 0 (empty) or > 0 because if it was < 0 the
>> virJSONValueObjectGetArray would have already caused a failure, right?
>>
>> So why not :
>>
>> if (len == 0) {
>> cpu->usable = VIR_TRISTATE_BOOL_YES;
>> continue;
>> }
>>
>> cpu->usable = VIR_TRISTATE_BOOL_NO;
>> if (VIR_ALLOC_N(cpu->blockers, len + 1) < 0)
>
> OK
>
>>
>>
>>> cpu->usable = VIR_TRISTATE_BOOL_NO;
>>> else
>>> cpu->usable = VIR_TRISTATE_BOOL_YES;
>>> +
>>> + if (len > 0 && VIR_ALLOC_N(cpu->blockers, len + 1) < 0)
>>> + goto cleanup;
>>> +
>>> + for (j = 0; j < len; j++) {
>>> + virJSONValuePtr blocker = virJSONValueArrayGet(blockers, j);
>>> + char *name;
>>
>> virJSONValueArrayGet can return NULL, but that shouldn't affect us since
>> blockers is an ARRAY and there's no way j >= len...
>
> Right.
>
>>> +
>>> + if (blocker->type != VIR_JSON_TYPE_STRING) {
>>> + virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>>> + _("unexpected value in unavailable-features "
>>> + "array"));
>>> + goto cleanup;
>>> + }
>>
>> ...but because of this check...
>>
>>> +
>>> + if (VIR_STRDUP(name, virJSONValueGetString(blocker)) < 0)
>> ...wouldn't virJSONValueGetString return a non NULL string, so...
>
> Sure, but this is not checking whether virJSONValueGetString returns
> NULL or not, this checks whether we successfully made a copy of the
> blocker string.
>
>>> + goto cleanup;
>>> +
>>> + cpu->blockers[j] = name;
>>
>> ...why not just go direct to cpu->blockers[j]? Or did you come across
>> something in testing that had a NULL return from the call to
>> virJSONValueGetString(blocker)?
>>
>> Maybe a NULL entry should just be ignored so as to not tank the whole
>> thing using the logic that if a blocker isn't there, by name, then is it
>> a blocker?
>
> I'm not really sure what you were trying to say. Is the temporary name
> variable confusing you? No problem, it's not needed at all, I changed
> the code so that VIR_STRDUP stores the result directly in
> cpu->blockers[j].
>
> Jirka
>
I think the first comment after ...why was more what I was wondering
(vis-a-vis the usage of a local @name when direct assignment would also
work) ... then I started thinking was there some edge condition that you
were avoiding hence the extra cruft. It wouldn't seem right that you'd
get a NULL blockers entry from QEMU, but then again making that
assumption can be risky too (since VIR_STRDUP(xxx, NULL), just assigns
NULL to xxx and doesn't cause an error. No matter - just me overthinking
and overtyping.
John
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
© 2016 - 2026 Red Hat, Inc.