<feature policy='require' name='vmx'/>
</mode>
<mode name='custom' supported='yes'>
- <model usable='no'>Broadwell</model>
- <model usable='yes'>Broadwell-noTSX</model>
- <model usable='no'>Haswell</model>
+ <model usable='no' deprecated='no'>Broadwell</model>
+ <model usable='yes' deprecated='no'>Broadwell-noTSX</model>
+ <model usable='no' deprecated='yes'>Haswell</model>
...
</mode>
</cpu>
cannot be used without disabling some features that the CPU of such
model is expected to have. A special value <code>unknown</code>
indicates libvirt does not have enough information to provide the
- usability data.
+ usability data. The <code>deprecated</code> attribute reflects
+ the hypervisor's policy on usage of this model
+ <span class="since">(since 7.1.0)</span>.
</dd>
</dl>
<value>unknown</value>
</choice>
</attribute>
+ <optional>
+ <attribute name="deprecated">
+ <choice>
+ <value>yes</value>
+ <value>no</value>
+ </choice>
+ </attribute>
+ </optional>
<text/>
</element>
</zeroOrMore>
if (virDomainCapsCPUModelsAdd(cpuModels,
old->models[i].name,
old->models[i].usable,
- old->models[i].blockers) < 0)
+ old->models[i].blockers,
+ old->models[i].deprecated) < 0)
goto error;
}
virDomainCapsCPUModelsAdd(virDomainCapsCPUModelsPtr cpuModels,
const char *name,
virDomainCapsCPUUsable usable,
- char **blockers)
+ char **blockers,
+ bool deprecated)
{
g_autofree char * nameCopy = NULL;
virDomainCapsCPUModelPtr cpu;
cpu->usable = usable;
cpu->name = g_steal_pointer(&nameCopy);
cpu->blockers = g_strdupv(blockers);
+ cpu->deprecated = deprecated;
return 0;
}
for (i = 0; i < custom->nmodels; i++) {
virDomainCapsCPUModelPtr model = custom->models + i;
- virBufferAsprintf(buf, "<model usable='%s'>%s</model>\n",
- virDomainCapsCPUUsableTypeToString(model->usable),
+ virBufferAsprintf(buf, "<model usable='%s'",
+ virDomainCapsCPUUsableTypeToString(model->usable));
+ if (model->deprecated)
+ virBufferAddLit(buf, " deprecated='yes'");
+ virBufferAsprintf(buf, ">%s</model>\n",
model->name);
}
char *name;
virDomainCapsCPUUsable usable;
char **blockers; /* NULL-terminated list of usability blockers */
+ bool deprecated;
};
typedef struct _virDomainCapsCPUModels virDomainCapsCPUModels;
int virDomainCapsCPUModelsAdd(virDomainCapsCPUModelsPtr cpuModels,
const char *name,
virDomainCapsCPUUsable usable,
- char **blockers);
+ char **blockers,
+ bool deprecated);
virDomainCapsCPUModelPtr
virDomainCapsCPUModelsGet(virDomainCapsCPUModelsPtr cpuModels,
const char *name);
continue;
if (virDomainCapsCPUModelsAdd(cpuModels, cpu->name, cpu->usable,
- cpu->blockers) < 0)
+ cpu->blockers, cpu->deprecated) < 0)
return NULL;
}
int usable = VIR_DOMCAPS_CPU_USABLE_UNKNOWN;
g_autofree char * strUsable = NULL;
g_autofree xmlNodePtr * blockerNodes = NULL;
+ g_autofree char *deprecated = NULL;
int nblockers;
if ((strUsable = virXMLPropString(nodes[i], "usable")) &&
}
}
}
+
+ deprecated = virXMLPropString(nodes[i], "deprecated");
+ if (deprecated &&
+ STREQ(deprecated, "yes"))
+ cpu->deprecated = true;
}
caps->cpuModels = g_steal_pointer(&defs);
virBufferAsprintf(buf, " usable='%s'",
virDomainCapsCPUUsableTypeToString(cpu->usable));
}
+ if (cpu->deprecated)
+ virBufferAddLit(buf, " deprecated='yes'");
if (cpu->blockers) {
size_t j;
cpuDst->name = g_strdup(cpuSrc->name);
cpuDst->type = g_strdup(cpuSrc->type);
cpuDst->blockers = g_strdupv(cpuSrc->blockers);
+ cpuDst->deprecated = cpuSrc->deprecated;
}
return g_steal_pointer(&defs);
char *name;
char *type;
char **blockers; /* NULL-terminated string list */
+ bool deprecated;
};
typedef struct _qemuMonitorCPUDefs qemuMonitorCPUDefs;
cpu->usable = VIR_DOMCAPS_CPU_USABLE_NO;
}
+
+ if (virJSONValueObjectHasKey(child, "deprecated") &&
+ virJSONValueObjectGetBoolean(child, "deprecated", &cpu->deprecated) < 0)
+ return -1;
}
*cpuDefs = g_steal_pointer(&defs);
}
if (virDomainCapsCPUModelsAdd(models, expected->model,
- usable, blockers) < 0)
+ usable, blockers, false) < 0)
goto cleanup;
cpu->fallback = VIR_CPU_FALLBACK_ALLOW;
for (model = list; *model; model++) {
if (virDomainCapsCPUModelsAdd(cpus, *model,
- VIR_DOMCAPS_CPU_USABLE_UNKNOWN, NULL) < 0)
+ VIR_DOMCAPS_CPU_USABLE_UNKNOWN, NULL, false) < 0)
goto error;
}
<model usable='no'>IvyBridge</model>
<model usable='no'>Icelake-Server-noTSX</model>
<model usable='no'>Icelake-Server</model>
- <model usable='no'>Icelake-Client-noTSX</model>
- <model usable='no'>Icelake-Client</model>
+ <model usable='no' deprecated='yes'>Icelake-Client-noTSX</model>
+ <model usable='no' deprecated='yes'>Icelake-Client</model>
<model usable='no'>Haswell-noTSX-IBRS</model>
<model usable='no'>Haswell-noTSX</model>
<model usable='no'>Haswell-IBRS</model>
<model usable='no'>IvyBridge</model>
<model usable='no'>Icelake-Server-noTSX</model>
<model usable='no'>Icelake-Server</model>
- <model usable='no'>Icelake-Client-noTSX</model>
- <model usable='no'>Icelake-Client</model>
+ <model usable='no' deprecated='yes'>Icelake-Client-noTSX</model>
+ <model usable='no' deprecated='yes'>Icelake-Client</model>
<model usable='no'>Haswell-noTSX-IBRS</model>
<model usable='no'>Haswell-noTSX</model>
<model usable='no'>Haswell-IBRS</model>
<model usable='no'>IvyBridge</model>
<model usable='no'>Icelake-Server-noTSX</model>
<model usable='no'>Icelake-Server</model>
- <model usable='no'>Icelake-Client-noTSX</model>
- <model usable='no'>Icelake-Client</model>
+ <model usable='no' deprecated='yes'>Icelake-Client-noTSX</model>
+ <model usable='no' deprecated='yes'>Icelake-Client</model>
<model usable='no'>Haswell-noTSX-IBRS</model>
<model usable='no'>Haswell-noTSX</model>
<model usable='no'>Haswell-IBRS</model>
<model usable='no'>IvyBridge</model>
<model usable='no'>Icelake-Server-noTSX</model>
<model usable='no'>Icelake-Server</model>
- <model usable='no'>Icelake-Client-noTSX</model>
- <model usable='no'>Icelake-Client</model>
+ <model usable='no' deprecated='yes'>Icelake-Client-noTSX</model>
+ <model usable='no' deprecated='yes'>Icelake-Client</model>
<model usable='no'>Haswell-noTSX-IBRS</model>
<model usable='no'>Haswell-noTSX</model>
<model usable='no'>Haswell-IBRS</model>
<model usable='no'>IvyBridge</model>
<model usable='no'>Icelake-Server-noTSX</model>
<model usable='no'>Icelake-Server</model>
- <model usable='no'>Icelake-Client-noTSX</model>
- <model usable='no'>Icelake-Client</model>
+ <model usable='no' deprecated='yes'>Icelake-Client-noTSX</model>
+ <model usable='no' deprecated='yes'>Icelake-Client</model>
<model usable='no'>Haswell-noTSX-IBRS</model>
<model usable='no'>Haswell-noTSX</model>
<model usable='no'>Haswell-IBRS</model>
<model usable='no'>IvyBridge</model>
<model usable='no'>Icelake-Server-noTSX</model>
<model usable='no'>Icelake-Server</model>
- <model usable='no'>Icelake-Client-noTSX</model>
- <model usable='no'>Icelake-Client</model>
+ <model usable='no' deprecated='yes'>Icelake-Client-noTSX</model>
+ <model usable='no' deprecated='yes'>Icelake-Client</model>
<model usable='no'>Haswell-noTSX-IBRS</model>
<model usable='no'>Haswell-noTSX</model>
<model usable='no'>Haswell-IBRS</model>
<blocker name='avx512f'/>
<blocker name='pku'/>
</cpu>
- <cpu type='kvm' name='Icelake-Client-v2' typename='Icelake-Client-v2-x86_64-cpu' usable='no'>
+ <cpu type='kvm' name='Icelake-Client-v2' typename='Icelake-Client-v2-x86_64-cpu' usable='no' deprecated='yes'>
<blocker name='pcid'/>
<blocker name='erms'/>
<blocker name='invpcid'/>
<blocker name='spec-ctrl'/>
<blocker name='pku'/>
</cpu>
- <cpu type='kvm' name='Icelake-Client-v1' typename='Icelake-Client-v1-x86_64-cpu' usable='no'>
+ <cpu type='kvm' name='Icelake-Client-v1' typename='Icelake-Client-v1-x86_64-cpu' usable='no' deprecated='yes'>
<blocker name='pcid'/>
<blocker name='hle'/>
<blocker name='erms'/>
<blocker name='spec-ctrl'/>
<blocker name='pku'/>
</cpu>
- <cpu type='kvm' name='Icelake-Client-noTSX' typename='Icelake-Client-noTSX-x86_64-cpu' usable='no'>
+ <cpu type='kvm' name='Icelake-Client-noTSX' typename='Icelake-Client-noTSX-x86_64-cpu' usable='no' deprecated='yes'>
<blocker name='pcid'/>
<blocker name='erms'/>
<blocker name='invpcid'/>
<blocker name='spec-ctrl'/>
<blocker name='pku'/>
</cpu>
- <cpu type='kvm' name='Icelake-Client' typename='Icelake-Client-x86_64-cpu' usable='no'>
+ <cpu type='kvm' name='Icelake-Client' typename='Icelake-Client-x86_64-cpu' usable='no' deprecated='yes'>
<blocker name='pcid'/>
<blocker name='hle'/>
<blocker name='erms'/>
<blocker name='wbnoinvd'/>
<blocker name='xsavec'/>
</cpu>
- <cpu type='tcg' name='Icelake-Client-v2' typename='Icelake-Client-v2-x86_64-cpu' usable='no'>
+ <cpu type='tcg' name='Icelake-Client-v2' typename='Icelake-Client-v2-x86_64-cpu' usable='no' deprecated='yes'>
<blocker name='fma'/>
<blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='wbnoinvd'/>
<blocker name='xsavec'/>
</cpu>
- <cpu type='tcg' name='Icelake-Client-v1' typename='Icelake-Client-v1-x86_64-cpu' usable='no'>
+ <cpu type='tcg' name='Icelake-Client-v1' typename='Icelake-Client-v1-x86_64-cpu' usable='no' deprecated='yes'>
<blocker name='fma'/>
<blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='wbnoinvd'/>
<blocker name='xsavec'/>
</cpu>
- <cpu type='tcg' name='Icelake-Client-noTSX' typename='Icelake-Client-noTSX-x86_64-cpu' usable='no'>
+ <cpu type='tcg' name='Icelake-Client-noTSX' typename='Icelake-Client-noTSX-x86_64-cpu' usable='no' deprecated='yes'>
<blocker name='fma'/>
<blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='wbnoinvd'/>
<blocker name='xsavec'/>
</cpu>
- <cpu type='tcg' name='Icelake-Client' typename='Icelake-Client-x86_64-cpu' usable='no'>
+ <cpu type='tcg' name='Icelake-Client' typename='Icelake-Client-x86_64-cpu' usable='no' deprecated='yes'>
<blocker name='fma'/>
<blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='avx512f'/>
<blocker name='pku'/>
</cpu>
- <cpu type='kvm' name='Icelake-Client-v2' typename='Icelake-Client-v2-x86_64-cpu' usable='no'>
+ <cpu type='kvm' name='Icelake-Client-v2' typename='Icelake-Client-v2-x86_64-cpu' usable='no' deprecated='yes'>
<blocker name='pcid'/>
<blocker name='erms'/>
<blocker name='invpcid'/>
<blocker name='spec-ctrl'/>
<blocker name='pku'/>
</cpu>
- <cpu type='kvm' name='Icelake-Client-v1' typename='Icelake-Client-v1-x86_64-cpu' usable='no'>
+ <cpu type='kvm' name='Icelake-Client-v1' typename='Icelake-Client-v1-x86_64-cpu' usable='no' deprecated='yes'>
<blocker name='pcid'/>
<blocker name='hle'/>
<blocker name='erms'/>
<blocker name='spec-ctrl'/>
<blocker name='pku'/>
</cpu>
- <cpu type='kvm' name='Icelake-Client-noTSX' typename='Icelake-Client-noTSX-x86_64-cpu' usable='no'>
+ <cpu type='kvm' name='Icelake-Client-noTSX' typename='Icelake-Client-noTSX-x86_64-cpu' usable='no' deprecated='yes'>
<blocker name='pcid'/>
<blocker name='erms'/>
<blocker name='invpcid'/>
<blocker name='spec-ctrl'/>
<blocker name='pku'/>
</cpu>
- <cpu type='kvm' name='Icelake-Client' typename='Icelake-Client-x86_64-cpu' usable='no'>
+ <cpu type='kvm' name='Icelake-Client' typename='Icelake-Client-x86_64-cpu' usable='no' deprecated='yes'>
<blocker name='pcid'/>
<blocker name='hle'/>
<blocker name='erms'/>
<blocker name='wbnoinvd'/>
<blocker name='xsavec'/>
</cpu>
- <cpu type='tcg' name='Icelake-Client-v2' typename='Icelake-Client-v2-x86_64-cpu' usable='no'>
+ <cpu type='tcg' name='Icelake-Client-v2' typename='Icelake-Client-v2-x86_64-cpu' usable='no' deprecated='yes'>
<blocker name='fma'/>
<blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='wbnoinvd'/>
<blocker name='xsavec'/>
</cpu>
- <cpu type='tcg' name='Icelake-Client-v1' typename='Icelake-Client-v1-x86_64-cpu' usable='no'>
+ <cpu type='tcg' name='Icelake-Client-v1' typename='Icelake-Client-v1-x86_64-cpu' usable='no' deprecated='yes'>
<blocker name='fma'/>
<blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='wbnoinvd'/>
<blocker name='xsavec'/>
</cpu>
- <cpu type='tcg' name='Icelake-Client-noTSX' typename='Icelake-Client-noTSX-x86_64-cpu' usable='no'>
+ <cpu type='tcg' name='Icelake-Client-noTSX' typename='Icelake-Client-noTSX-x86_64-cpu' usable='no' deprecated='yes'>
<blocker name='fma'/>
<blocker name='pcid'/>
<blocker name='x2apic'/>
<blocker name='wbnoinvd'/>
<blocker name='xsavec'/>
</cpu>
- <cpu type='tcg' name='Icelake-Client' typename='Icelake-Client-x86_64-cpu' usable='no'>
+ <cpu type='tcg' name='Icelake-Client' typename='Icelake-Client-x86_64-cpu' usable='no' deprecated='yes'>
<blocker name='fma'/>
<blocker name='pcid'/>
<blocker name='x2apic'/>