On Tue, Nov 19, 2024 at 07:49:47PM +0100, Jiri Denemark wrote:
The signatures in the CPU map are used for matching physical CPUs
and
thus we need to cover all possible real world variants we know about.
When adding a new version of an existing CPU model, we should copy the
signature(s) of the existing model rather than replacing it with the
signature that QEMU uses.
Also sanity check that the signature QEMU uses is part of
libvirt's existing recorded signature list ?
Signed-off-by: Jiri Denemark <jdenemar(a)redhat.com>
---
src/cpu_map/sync_qemu_models_i386.py | 46 ++++++++++++++++++++++++----
1 file changed, 40 insertions(+), 6 deletions(-)
diff --git a/src/cpu_map/sync_qemu_models_i386.py b/src/cpu_map/sync_qemu_models_i386.py
index 40d71e66be..9b7cb8a047 100755
--- a/src/cpu_map/sync_qemu_models_i386.py
+++ b/src/cpu_map/sync_qemu_models_i386.py
@@ -429,7 +429,30 @@ def transform(item):
raise RuntimeError("unexpected item type")
-def expand_model(model):
+def get_signature(outdir, model):
+ file = os.path.join(outdir, f"x86_{model}.xml")
+
+ if not os.path.isfile(file):
+ return None
+
+ xml = lxml.etree.parse(file)
+
+ signature = []
+ for sig in xml.xpath("//signature"):
+ attr = sig.attrib
+ family = attr["family"]
+ model = attr["model"]
+ if "stepping" in attr:
+ stepping = attr["stepping"]
+ else:
+ stepping = None
+
+ signature.append((family, model, stepping))
+
+ return signature
+
+
+def expand_model(outdir, model):
"""Expand a qemu cpu model description that has its feature split up
into
different fields and may have differing versions into several libvirt-
friendly cpu models."""
@@ -438,11 +461,14 @@ def expand_model(model):
"name": model.pop(".name"),
"vendor": translate_vendor(model.pop(".vendor")),
"features": set(),
- "extra": dict()}
+ "extra": dict(),
+ "signature": list(),
+ }
if ".family" in model and ".model" in model:
- result["family"] = model.pop(".family")
- result["model"] = model.pop(".model")
+ result["signature"].append((model.pop(".family"),
+ model.pop(".model"),
+ None))
for k in [k for k in model if k.startswith(".features")]:
v = model.pop(k)
@@ -469,6 +495,10 @@ def expand_model(model):
if not alias and ver == 1:
alias = name
+ sig = get_signature(outdir, name)
+ if sig:
Assert here that 'result["signature"' is part of 'sig',
before replacing it ?
+ result["signature"] = sig
With regards,
Daniel
--
|:
https://berrange.com -o-
https://www.flickr.com/photos/dberrange :|
|:
https://libvirt.org -o-
https://fstop138.berrange.com :|
|:
https://entangle-photo.org -o-
https://www.instagram.com/dberrange :|