static uint32_t
x86MakeSignature(unsigned int family,
- unsigned int model)
+ unsigned int model,
+ unsigned int stepping)
{
uint32_t sig = 0;
*
* family = eax[27:20] + eax[11:8]
* model = eax[19:16] << 4 + eax[7:4]
+ * stepping = eax[3:0]
*/
/* extFam */
/* Mod */
sig |= (model & 0xf) << 4;
- /* Step is irrelevant, it is used to distinguish different revisions
- * of the same CPU model
- */
+ /* Step */
+ sig |= stepping & 0xf;
return sig;
}
goto cleanup;
}
- model->signature = x86MakeSignature(sigFamily, sigModel);
+ model->signature = x86MakeSignature(sigFamily, sigModel, 0);
}
if (virXPathBoolean("boolean(./vendor)", ctxt)) {
int
virCPUx86DataSetSignature(virCPUDataPtr cpuData,
unsigned int family,
- unsigned int model)
+ unsigned int model,
+ unsigned int stepping)
{
- uint32_t signature = x86MakeSignature(family, model);
+ uint32_t signature = x86MakeSignature(family, model, stepping);
return x86DataAddSignature(&cpuData->data.x86, signature);
}
int virCPUx86DataSetSignature(virCPUDataPtr cpuData,
unsigned int family,
- unsigned int model);
+ unsigned int model,
+ unsigned int stepping);
int virCPUx86DataSetVendor(virCPUDataPtr cpuData,
const char *vendor);
virCPUDataPtr data = NULL;
unsigned long long sigFamily = 0;
unsigned long long sigModel = 0;
+ unsigned long long sigStepping = 0;
int ret = -1;
size_t i;
sigFamily = prop->value.number;
else if (STREQ(prop->name, "model"))
sigModel = prop->value.number;
+ else if (STREQ(prop->name, "stepping"))
+ sigStepping = prop->value.number;
break;
case QEMU_MONITOR_CPU_PROPERTY_LAST:
}
}
- if (virCPUx86DataSetSignature(data, sigFamily, sigModel) < 0)
+ if (virCPUx86DataSetSignature(data, sigFamily, sigModel, sigStepping) < 0)
goto cleanup;
if (cpuDecode(cpu, data, virQEMUCapsGetCPUDefinitions(qemuCaps, type)) < 0)