diff --git a/docs/formatdomaincaps.html.in b/docs/formatdomaincaps.html.in
index ce43658e06b66c0d976f3ef60576ec09e238a57a..045ba939fe06f6a9ac1b2e6cae00a4aeb4c4ea96 100644
--- a/docs/formatdomaincaps.html.in
+++ b/docs/formatdomaincaps.html.in
@@ -156,9 +156,9 @@
<mode name='host-passthrough' supported='yes'/>
<mode name='host-model' supported='yes'/>
<mode name='custom' supported='yes'>
- <model>Broadwell</model>
- <model>Broadwell-noTSX</model>
- <model>Haswell</model>
+ <model usable='no'>Broadwell</model>
+ <model usable='yes'>Broadwell-noTSX</model>
+ <model usable='no'>Haswell</model>
...
</mode>
</cpu>
@@ -183,6 +183,10 @@
The mode
element contains a list of supported CPU
models, each described by a dedicated model
element.
+ The usable
attribute specifies whether the model can
+ be used on the host. A special value unknown
indicates
+ libvirt does not have enough information to provide the usability
+ data.
diff --git a/docs/schemas/domaincaps.rng b/docs/schemas/domaincaps.rng
index 9f3d225b5e3209e4c3c97a2b7fd2a98a246259e9..5a605a7e1a853a5b7d0ffeaa379c9aef393814c1 100644
--- a/docs/schemas/domaincaps.rng
+++ b/docs/schemas/domaincaps.rng
@@ -105,6 +105,13 @@
+
+
+ yes
+ no
+ unknown
+
+
diff --git a/src/conf/domain_capabilities.c b/src/conf/domain_capabilities.c
index 828fa707cac6f1115b90024baa853cb742796e5e..9ec416e3b091e3fbe67cbd62f57edec82450577c 100644
--- a/src/conf/domain_capabilities.c
+++ b/src/conf/domain_capabilities.c
@@ -29,6 +29,9 @@
#define VIR_FROM_THIS VIR_FROM_CAPABILITIES
+VIR_ENUM_IMPL(virDomainCapsCPUUsable, VIR_DOMCAPS_CPU_USABLE_LAST,
+ "unknown", "yes", "no");
+
static virClassPtr virDomainCapsClass;
static virClassPtr virDomainCapsCPUModelsClass;
@@ -157,7 +160,9 @@ virDomainCapsCPUModelsCopy(virDomainCapsCPUModelsPtr old)
return NULL;
for (i = 0; i < old->nmodels; i++) {
- if (virDomainCapsCPUModelsAdd(cpuModels, old->models[i].name, -1) < 0)
+ if (virDomainCapsCPUModelsAdd(cpuModels,
+ old->models[i].name, -1,
+ old->models[i].usable) < 0)
goto error;
}
@@ -184,7 +189,8 @@ virDomainCapsCPUModelsFilter(virDomainCapsCPUModelsPtr old,
continue;
if (virDomainCapsCPUModelsAdd(cpuModels,
- old->models[i].name, -1) < 0)
+ old->models[i].name, -1,
+ old->models[i].usable) < 0)
goto error;
}
@@ -198,13 +204,16 @@ virDomainCapsCPUModelsFilter(virDomainCapsCPUModelsPtr old,
int
virDomainCapsCPUModelsAddSteal(virDomainCapsCPUModelsPtr cpuModels,
- char **name)
+ char **name,
+ virDomainCapsCPUUsable usable)
{
if (VIR_RESIZE_N(cpuModels->models, cpuModels->nmodels_max,
cpuModels->nmodels, 1) < 0)
return -1;
- VIR_STEAL_PTR(cpuModels->models[cpuModels->nmodels++].name, *name);
+ cpuModels->models[cpuModels->nmodels].usable = usable;
+ VIR_STEAL_PTR(cpuModels->models[cpuModels->nmodels].name, *name);
+ cpuModels->nmodels++;
return 0;
}
@@ -212,14 +221,15 @@ virDomainCapsCPUModelsAddSteal(virDomainCapsCPUModelsPtr cpuModels,
int
virDomainCapsCPUModelsAdd(virDomainCapsCPUModelsPtr cpuModels,
const char *name,
- ssize_t nameLen)
+ ssize_t nameLen,
+ virDomainCapsCPUUsable usable)
{
char *copy = NULL;
if (VIR_STRNDUP(copy, name, nameLen) < 0)
goto error;
- if (virDomainCapsCPUModelsAddSteal(cpuModels, ©) < 0)
+ if (virDomainCapsCPUModelsAddSteal(cpuModels, ©, usable) < 0)
goto error;
return 0;
@@ -372,8 +382,10 @@ virDomainCapsCPUCustomFormat(virBufferPtr buf,
virBufferAdjustIndent(buf, 2);
for (i = 0; i < custom->nmodels; i++) {
- virBufferAsprintf(buf, "%s\n",
- custom->models[i].name);
+ virDomainCapsCPUModelPtr model = custom->models + i;
+ virBufferAsprintf(buf, "%s\n",
+ virDomainCapsCPUUsableTypeToString(model->usable),
+ model->name);
}
virBufferAdjustIndent(buf, -2);
diff --git a/src/conf/domain_capabilities.h b/src/conf/domain_capabilities.h
index 57f0161be895899a495b1d620f4364c8791f745a..3ec05dc07dba28fc7e61f90839d1c6a5fb1e52a9 100644
--- a/src/conf/domain_capabilities.h
+++ b/src/conf/domain_capabilities.h
@@ -102,10 +102,20 @@ struct _virDomainCapsFeatureGIC {
virDomainCapsEnum version; /* Info about virGICVersion */
};
+typedef enum {
+ VIR_DOMCAPS_CPU_USABLE_UNKNOWN,
+ VIR_DOMCAPS_CPU_USABLE_YES,
+ VIR_DOMCAPS_CPU_USABLE_NO,
+
+ VIR_DOMCAPS_CPU_USABLE_LAST
+} virDomainCapsCPUUsable;
+VIR_ENUM_DECL(virDomainCapsCPUUsable);
+
typedef struct _virDomainCapsCPUModel virDomainCapsCPUModel;
typedef virDomainCapsCPUModel *virDomainCapsCPUModelPtr;
struct _virDomainCapsCPUModel {
char *name;
+ virDomainCapsCPUUsable usable;
};
typedef struct _virDomainCapsCPUModels virDomainCapsCPUModels;
@@ -159,10 +169,12 @@ virDomainCapsCPUModelsPtr virDomainCapsCPUModelsCopy(virDomainCapsCPUModelsPtr o
virDomainCapsCPUModelsPtr virDomainCapsCPUModelsFilter(virDomainCapsCPUModelsPtr old,
const char **models);
int virDomainCapsCPUModelsAddSteal(virDomainCapsCPUModelsPtr cpuModels,
- char **name);
+ char **name,
+ virDomainCapsCPUUsable usable);
int virDomainCapsCPUModelsAdd(virDomainCapsCPUModelsPtr cpuModels,
const char *name,
- ssize_t nameLen);
+ ssize_t nameLen,
+ virDomainCapsCPUUsable usable);
# define VIR_DOMAIN_CAPS_ENUM_SET(capsEnum, ...) \
do { \
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index dc4bba71f3b9bd0710be510dfe03d1a38ce04289..b6561e803ad9ae22b1fffd19106a2860c637ecae 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -158,6 +158,8 @@ virDomainCapsCPUModelsAddSteal;
virDomainCapsCPUModelsCopy;
virDomainCapsCPUModelsFilter;
virDomainCapsCPUModelsNew;
+virDomainCapsCPUUsableTypeFromString;
+virDomainCapsCPUUsableTypeToString;
virDomainCapsEnumClear;
virDomainCapsEnumSet;
virDomainCapsFormat;
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 92b8b026de9e320af9c24ad4d27a976161b9d639..86e40ba4fe976265326f6ca4ba22804849941f90 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -671,7 +671,8 @@ virQEMUCapsParseX86Models(const char *output,
len -= 2;
}
- if (virDomainCapsCPUModelsAdd(cpus, p, len) < 0)
+ if (virDomainCapsCPUModelsAdd(cpus, p, len,
+ VIR_DOMCAPS_CPU_USABLE_UNKNOWN) < 0)
goto error;
} while ((p = next));
@@ -719,7 +720,8 @@ virQEMUCapsParsePPCModels(const char *output,
if (*p == '\n')
continue;
- if (virDomainCapsCPUModelsAdd(cpus, p, t - p - 1) < 0)
+ if (virDomainCapsCPUModelsAdd(cpus, p, t - p - 1,
+ VIR_DOMCAPS_CPU_USABLE_UNKNOWN) < 0)
goto error;
} while ((p = next));
@@ -2306,7 +2308,8 @@ virQEMUCapsAddCPUDefinitions(virQEMUCapsPtr qemuCaps,
return -1;
for (i = 0; i < count; i++) {
- if (virDomainCapsCPUModelsAdd(qemuCaps->cpuDefinitions, name[i], -1) < 0)
+ if (virDomainCapsCPUModelsAdd(qemuCaps->cpuDefinitions, name[i], -1,
+ VIR_DOMCAPS_CPU_USABLE_UNKNOWN) < 0)
return -1;
}
@@ -2674,7 +2677,8 @@ virQEMUCapsProbeQMPCPUDefinitions(virQEMUCapsPtr qemuCaps,
for (i = 0; i < ncpus; i++) {
if (virDomainCapsCPUModelsAddSteal(qemuCaps->cpuDefinitions,
- &cpus[i]->name) < 0)
+ &cpus[i]->name,
+ VIR_DOMCAPS_CPU_USABLE_UNKNOWN) < 0)
goto cleanup;
}
@@ -3041,7 +3045,8 @@ virQEMUCapsLoadCache(virQEMUCapsPtr qemuCaps, const char *filename,
}
if (virDomainCapsCPUModelsAddSteal(qemuCaps->cpuDefinitions,
- &str) < 0)
+ &str,
+ VIR_DOMCAPS_CPU_USABLE_UNKNOWN) < 0)
goto cleanup;
}
}
diff --git a/tests/domaincapsschemadata/full.xml b/tests/domaincapsschemadata/full.xml
index 80fd1f0bc29d46ade82aa673181dc754ee1dacae..b75e86ce5da86515db9c2b5d8e212075dc52daab 100644
--- a/tests/domaincapsschemadata/full.xml
+++ b/tests/domaincapsschemadata/full.xml
@@ -23,9 +23,9 @@
- Model1
- Model2
- Model3
+ Model1
+ Model2
+ Model3
diff --git a/tests/domaincapsschemadata/qemu_1.7.0.x86_64.xml b/tests/domaincapsschemadata/qemu_1.7.0.x86_64.xml
index 4ee2f9586d8dc367b17ff6bf740f716e31011bf7..2b17dd0f744349aa378e3dd129e974f3a042a345 100644
--- a/tests/domaincapsschemadata/qemu_1.7.0.x86_64.xml
+++ b/tests/domaincapsschemadata/qemu_1.7.0.x86_64.xml
@@ -22,30 +22,30 @@
- Opteron_G5
- Opteron_G4
- Opteron_G3
- Opteron_G2
- Opteron_G1
- Haswell
- SandyBridge
- Westmere
- Nehalem
- Penryn
- Conroe
- n270
- athlon
- pentium3
- pentium2
- pentium
- 486
- coreduo
- kvm32
- qemu32
- kvm64
- core2duo
- phenom
- qemu64
+ Opteron_G5
+ Opteron_G4
+ Opteron_G3
+ Opteron_G2
+ Opteron_G1
+ Haswell
+ SandyBridge
+ Westmere
+ Nehalem
+ Penryn
+ Conroe
+ n270
+ athlon
+ pentium3
+ pentium2
+ pentium
+ 486
+ coreduo
+ kvm32
+ qemu32
+ kvm64
+ core2duo
+ phenom
+ qemu64
diff --git a/tests/domaincapsschemadata/qemu_2.6.0-gicv2-virt.aarch64.xml b/tests/domaincapsschemadata/qemu_2.6.0-gicv2-virt.aarch64.xml
index 9e96f47d807c962b27b625e1adec5ce870366cd3..8a54f9e3fd395667b61ee1ec3775f98d3e003f14 100644
--- a/tests/domaincapsschemadata/qemu_2.6.0-gicv2-virt.aarch64.xml
+++ b/tests/domaincapsschemadata/qemu_2.6.0-gicv2-virt.aarch64.xml
@@ -22,36 +22,36 @@
- pxa262
- pxa270-a0
- arm1136
- cortex-a15
- pxa260
- arm1136-r2
- pxa261
- pxa255
- arm926
- arm11mpcore
- pxa250
- ti925t
- cortex-a57
- sa1110
- arm1176
- cortex-a53
- sa1100
- pxa270-c5
- cortex-a9
- cortex-a8
- pxa270-c0
- arm1026
- pxa270-b1
- cortex-m3
- cortex-m4
- pxa270-b0
- arm946
- cortex-r5
- pxa270-a1
- pxa270
+ pxa262
+ pxa270-a0
+ arm1136
+ cortex-a15
+ pxa260
+ arm1136-r2
+ pxa261
+ pxa255
+ arm926
+ arm11mpcore
+ pxa250
+ ti925t
+ cortex-a57
+ sa1110
+ arm1176
+ cortex-a53
+ sa1100
+ pxa270-c5
+ cortex-a9
+ cortex-a8
+ pxa270-c0
+ arm1026
+ pxa270-b1
+ cortex-m3
+ cortex-m4
+ pxa270-b0
+ arm946
+ cortex-r5
+ pxa270-a1
+ pxa270
diff --git a/tests/domaincapsschemadata/qemu_2.6.0-gicv3-virt.aarch64.xml b/tests/domaincapsschemadata/qemu_2.6.0-gicv3-virt.aarch64.xml
index c081b35992bbb2d65168152f4d261c36dd11403b..8d8087fb7cfedba9be1063cf6d73000a2e183423 100644
--- a/tests/domaincapsschemadata/qemu_2.6.0-gicv3-virt.aarch64.xml
+++ b/tests/domaincapsschemadata/qemu_2.6.0-gicv3-virt.aarch64.xml
@@ -22,36 +22,36 @@
- pxa262
- pxa270-a0
- arm1136
- cortex-a15
- pxa260
- arm1136-r2
- pxa261
- pxa255
- arm926
- arm11mpcore
- pxa250
- ti925t
- cortex-a57
- sa1110
- arm1176
- cortex-a53
- sa1100
- pxa270-c5
- cortex-a9
- cortex-a8
- pxa270-c0
- arm1026
- pxa270-b1
- cortex-m3
- cortex-m4
- pxa270-b0
- arm946
- cortex-r5
- pxa270-a1
- pxa270
+ pxa262
+ pxa270-a0
+ arm1136
+ cortex-a15
+ pxa260
+ arm1136-r2
+ pxa261
+ pxa255
+ arm926
+ arm11mpcore
+ pxa250
+ ti925t
+ cortex-a57
+ sa1110
+ arm1176
+ cortex-a53
+ sa1100
+ pxa270-c5
+ cortex-a9
+ cortex-a8
+ pxa270-c0
+ arm1026
+ pxa270-b1
+ cortex-m3
+ cortex-m4
+ pxa270-b0
+ arm946
+ cortex-r5
+ pxa270-a1
+ pxa270
diff --git a/tests/domaincapsschemadata/qemu_2.6.0.aarch64.xml b/tests/domaincapsschemadata/qemu_2.6.0.aarch64.xml
index 811d2b7246caf47049d38d653d5c2cb28d2eaa22..83c03db465c5202a495100bdfe436c503ac0a03b 100644
--- a/tests/domaincapsschemadata/qemu_2.6.0.aarch64.xml
+++ b/tests/domaincapsschemadata/qemu_2.6.0.aarch64.xml
@@ -22,36 +22,36 @@
- pxa262
- pxa270-a0
- arm1136
- cortex-a15
- pxa260
- arm1136-r2
- pxa261
- pxa255
- arm926
- arm11mpcore
- pxa250
- ti925t
- cortex-a57
- sa1110
- arm1176
- cortex-a53
- sa1100
- pxa270-c5
- cortex-a9
- cortex-a8
- pxa270-c0
- arm1026
- pxa270-b1
- cortex-m3
- cortex-m4
- pxa270-b0
- arm946
- cortex-r5
- pxa270-a1
- pxa270
+ pxa262
+ pxa270-a0
+ arm1136
+ cortex-a15
+ pxa260
+ arm1136-r2
+ pxa261
+ pxa255
+ arm926
+ arm11mpcore
+ pxa250
+ ti925t
+ cortex-a57
+ sa1110
+ arm1176
+ cortex-a53
+ sa1100
+ pxa270-c5
+ cortex-a9
+ cortex-a8
+ pxa270-c0
+ arm1026
+ pxa270-b1
+ cortex-m3
+ cortex-m4
+ pxa270-b0
+ arm946
+ cortex-r5
+ pxa270-a1
+ pxa270
diff --git a/tests/domaincapsschemadata/qemu_2.6.0.ppc64le.xml b/tests/domaincapsschemadata/qemu_2.6.0.ppc64le.xml
index d96927438eee0e87eb56ad307f305fa0a41a7c25..14a087bc1a3f3f07013f8d629151fc984cfd6d58 100644
--- a/tests/domaincapsschemadata/qemu_2.6.0.ppc64le.xml
+++ b/tests/domaincapsschemadata/qemu_2.6.0.ppc64le.xml
@@ -22,8 +22,8 @@
- POWER8
- POWER7
+ POWER8
+ POWER7
diff --git a/tests/domaincapsschemadata/qemu_2.6.0.x86_64.xml b/tests/domaincapsschemadata/qemu_2.6.0.x86_64.xml
index 80101a401ded1f5e65c39897b3e12a131cb66e08..4294c64c595e534e513bdab8a568538f9e9fb65e 100644
--- a/tests/domaincapsschemadata/qemu_2.6.0.x86_64.xml
+++ b/tests/domaincapsschemadata/qemu_2.6.0.x86_64.xml
@@ -22,34 +22,34 @@
- Opteron_G5
- Opteron_G4
- Opteron_G3
- Opteron_G2
- Opteron_G1
- Broadwell
- Broadwell-noTSX
- Haswell
- Haswell-noTSX
- IvyBridge
- SandyBridge
- Westmere
- Nehalem
- Penryn
- Conroe
- n270
- athlon
- pentium3
- pentium2
- pentium
- 486
- coreduo
- kvm32
- qemu32
- kvm64
- core2duo
- phenom
- qemu64
+ Opteron_G5
+ Opteron_G4
+ Opteron_G3
+ Opteron_G2
+ Opteron_G1
+ Broadwell
+ Broadwell-noTSX
+ Haswell
+ Haswell-noTSX
+ IvyBridge
+ SandyBridge
+ Westmere
+ Nehalem
+ Penryn
+ Conroe
+ n270
+ athlon
+ pentium3
+ pentium2
+ pentium
+ 486
+ coreduo
+ kvm32
+ qemu32
+ kvm64
+ core2duo
+ phenom
+ qemu64
diff --git a/tests/domaincapstest.c b/tests/domaincapstest.c
index 10b745209d1f20f65f01d49e436b510720d18981..511066d9ab1a2b3d89d9223f9c2da355c598e286 100644
--- a/tests/domaincapstest.c
+++ b/tests/domaincapstest.c
@@ -81,9 +81,12 @@ fillAllCaps(virDomainCapsPtr domCaps)
cpu->hostPassthrough = true;
cpu->hostModel = true;
if (!(cpu->custom = virDomainCapsCPUModelsNew(3)) ||
- virDomainCapsCPUModelsAdd(cpu->custom, "Model1", -1) < 0 ||
- virDomainCapsCPUModelsAdd(cpu->custom, "Model2", -1) < 0 ||
- virDomainCapsCPUModelsAdd(cpu->custom, "Model3", -1) < 0)
+ virDomainCapsCPUModelsAdd(cpu->custom, "Model1", -1,
+ VIR_DOMCAPS_CPU_USABLE_UNKNOWN) < 0 ||
+ virDomainCapsCPUModelsAdd(cpu->custom, "Model2", -1,
+ VIR_DOMCAPS_CPU_USABLE_NO) < 0 ||
+ virDomainCapsCPUModelsAdd(cpu->custom, "Model3", -1,
+ VIR_DOMCAPS_CPU_USABLE_YES) < 0)
return -1;
disk->supported = true;