<!-- IBM-based CPU models -->
<model name='POWER6'>
<vendor name='IBM'/>
- <pvr value='0x003e0000'/>
+ <pvr value='0x003e0000' mask='0xffff0000'/>
</model>
<model name='POWER7'>
<vendor name='IBM'/>
- <pvr value='0x003f0000'/>
- <pvr value='0x004a0000'/>
+ <pvr value='0x003f0000' mask='0xffff0000'/>
+ <pvr value='0x004a0000' mask='0xffff0000'/>
</model>
<model name='POWER8'>
<vendor name='IBM'/>
- <pvr value='0x004b0000'/>
- <pvr value='0x004d0000'/>
+ <pvr value='0x004b0000' mask='0xffff0000'/>
+ <pvr value='0x004d0000' mask='0xffff0000'/>
</model>
<!-- Freescale-based CPU models -->
<model name='POWERPC_e5500'>
<vendor name='Freescale'/>
- <pvr value='0x80240000'/>
+ <pvr value='0x80240000' mask='0xffff0000'/>
</model>
<model name='POWERPC_e6500'>
<vendor name='Freescale'/>
- <pvr value='0x80400000'/>
+ <pvr value='0x80400000' mask='0xffff0000'/>
</model>
</arch>
</cpus>
copy->len = data->len;
- for (i = 0; i < data->len; i++)
+ for (i = 0; i < data->len; i++) {
copy->pvr[i].value = data->pvr[i].value;
+ copy->pvr[i].mask = data->pvr[i].mask;
+ }
return copy;
model = map->models;
while (model) {
for (i = 0; i < model->data->len; i++) {
- if (model->data->pvr[i].value == pvr)
+ if ((pvr & model->data->pvr[i].mask) == model->data->pvr[i].value)
return model;
}
model = model->next;
}
- /* PowerPC Processor Version Register is interpreted as follows :
- * Higher order 16 bits : Power ISA generation.
- * Lower order 16 bits : CPU chip version number.
- * If the exact CPU isn't found, return the nearest matching CPU generation
- */
- if (pvr & 0x0000FFFFul)
- return ppc64ModelFindPVR(map, (pvr & 0xFFFF0000ul));
-
return NULL;
}
goto ignore;
}
model->data->pvr[i].value = pvr;
+
+ if (virXPathULongHex("string(./@mask)", ctxt, &pvr) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Missing or invalid PVR mask in CPU model %s"),
+ model->name);
+ goto ignore;
+ }
+ model->data->pvr[i].mask = pvr;
}
if (!map->models) {
asm("mfpvr %0"
: "=r" (data->pvr[0].value));
#endif
+ data->pvr[0].mask = 0xfffffffful;
nodeData->arch = arch;