diff --git a/src/cpu_map/sync_qemu_models_i386.py b/src/cpu_map/sync_qemu_models_i386.py index 024bc92f07..798d767f4d 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) @@ -470,6 +496,10 @@ def expand_model(model): if not alias and ver == 1: alias = name + sig = get_signature(outdir, name) + if sig: + result["signature"] = sig + props = version.pop(".props", dict()) for k, v in props: if k not in ("model-id", "stepping", "model"): @@ -524,7 +554,11 @@ def output_model(f, extra, model): if "alias" in model: f.write(f" \n") else: - f.write(f" \n") + for sig_family, sig_model, sig_stepping in model['signature']: + f.write(f" \n") f.write(f" \n") for feature in sorted(model["features"]): @@ -600,7 +634,7 @@ def main(): models = list() for model in models_json: - models.extend(expand_model(model)) + models.extend(expand_model(args.outdir, model)) files = dict()