struct _virCPUx86Model {
char *name;
virCPUx86VendorPtr vendor;
- uint32_t signature;
+ size_t nsignatures;
+ uint32_t *signatures;
virCPUx86Data data;
};
return;
VIR_FREE(model->name);
+ VIR_FREE(model->signatures);
virCPUx86DataClear(&model->data);
VIR_FREE(model);
}
x86ModelCopySignatures(virCPUx86ModelPtr dst,
virCPUx86ModelPtr src)
{
- dst->signature = src->signature;
+ size_t i;
+
+ if (VIR_ALLOC_N(dst->signatures, src->nsignatures) < 0)
+ return -1;
+
+ dst->nsignatures = src->nsignatures;
+ for (i = 0; i < src->nsignatures; i++)
+ dst->signatures[i] = src->signatures[i];
return 0;
}
x86ModelParseSignature(virCPUx86ModelPtr model,
xmlXPathContextPtr ctxt)
{
+ /* Remove inherited signatures. */
+ VIR_FREE(model->signatures);
if (virXPathBoolean("boolean(./signature)", ctxt)) {
unsigned int sigFamily = 0;
unsigned int sigModel = 0;
int rc;
+ model->nsignatures = 1;
+ if (VIR_ALLOC_N(model->signatures, 1) < 0)
+ return -1;
+
rc = virXPathUInt("string(./signature/@family)", ctxt, &sigFamily);
if (rc < 0 || sigFamily == 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
return -1;
}
- model->signature = x86MakeSignature(sigFamily, sigModel, 0);
+ model->signatures[0] = x86MakeSignature(sigFamily, sigModel, 0);
}
return 0;
&host_model->vendor->cpuid) < 0)
goto error;
- if (x86DataAddSignature(&guest_model->data, host_model->signature) < 0)
+ if (host_model->signatures &&
+ x86DataAddSignature(&guest_model->data, *host_model->signatures) < 0)
goto error;
if (cpu->type == VIR_CPU_TYPE_GUEST
}
+static bool
+x86ModelHasSignature(virCPUx86ModelPtr model,
+ uint32_t signature)
+{
+ size_t i;
+
+ for (i = 0; i < model->nsignatures; i++) {
+ if (model->signatures[i] == signature)
+ return true;
+ }
+
+ return false;
+}
+
+
/*
* Checks whether a candidate model is a better fit for the CPU data than the
* current model.
* consider candidates with matching family/model.
*/
if (signature &&
- current->signature == signature &&
- candidate->signature != signature) {
+ x86ModelHasSignature(current, signature) &&
+ !x86ModelHasSignature(candidate, signature)) {
VIR_DEBUG("%s differs in signature from matching %s",
cpuCandidate->model, cpuCurrent->model);
return 0;
* result in longer list of features.
*/
if (signature &&
- candidate->signature == signature &&
- current->signature != signature) {
+ x86ModelHasSignature(candidate, signature) &&
+ !x86ModelHasSignature(current, signature)) {
VIR_DEBUG("%s provides matching signature", cpuCandidate->model);
return 1;
}
virCPUx86DataAddCPUIDInt(&model->data, &model->vendor->cpuid) < 0)
goto cleanup;
- if (x86DataAddSignature(&model->data, model->signature) < 0)
+ if (model->signatures &&
+ x86DataAddSignature(&model->data, model->signatures[0]) < 0)
goto cleanup;
if (!(translated = virCPUDefCopyWithoutModel(cpu)))