[libvirt PATCH 1/3] cpu-data.py: Factor out cpuid parsing

Tim Wiederhake twiederh at redhat.com
Tue Apr 27 08:25:01 UTC 2021


Preparation for next patch.

Signed-off-by: Tim Wiederhake <twiederh at redhat.com>
---
 tests/cputestdata/cpu-data.py | 44 +++++++++++++++++++----------------
 1 file changed, 24 insertions(+), 20 deletions(-)

diff --git a/tests/cputestdata/cpu-data.py b/tests/cputestdata/cpu-data.py
index df71132c25..ac4d0ff8e7 100755
--- a/tests/cputestdata/cpu-data.py
+++ b/tests/cputestdata/cpu-data.py
@@ -35,14 +35,7 @@ def gather_name(args):
          "Use '--model' to set a model name.")
 
 
-def gather_cpuid_leaves(args):
-    def mask(regs, eax_in, ecx_in, eax_mask, ebx_mask, ecx_mask, edx_mask):
-        if regs["eax_in"] == eax_in and regs["ecx_in"] == ecx_in:
-            regs["eax"] &= eax_mask
-            regs["ebx"] &= ebx_mask
-            regs["ecx"] &= ecx_mask
-            regs["edx"] &= edx_mask
-
+def gather_cpuid_leaves_cpuid(output):
     leave_pattern = re.compile(
         "^\\s*"
         "(0x[0-9a-f]+)\\s*"
@@ -52,22 +45,11 @@ def gather_cpuid_leaves(args):
         "ecx=(0x[0-9a-f]+)\\s*"
         "edx=(0x[0-9a-f]+)\\s*$")
 
-    cpuid = args.path_to_cpuid or "cpuid"
-    try:
-        output = subprocess.check_output(
-            [cpuid, "-1r"],
-            universal_newlines=True)
-    except FileNotFoundError as e:
-        exit("Error: '{}' not found.\n'cpuid' can be usually found in a "
-             "package named identically. If your distro does not provide such "
-             "package, you can find the sources or binary packages at "
-             "'http://www.etallen.com/cpuid.html'.".format(e.filename))
-
     for line in output.split("\n"):
         match = leave_pattern.match(line)
         if not match:
             continue
-        regs = {
+        yield {
             "eax_in": int(match.group(1), 0),
             "ecx_in": int(match.group(2), 0),
             "eax": int(match.group(3), 0),
@@ -75,6 +57,28 @@ def gather_cpuid_leaves(args):
             "ecx": int(match.group(5), 0),
             "edx": int(match.group(6), 0)}
 
+
+def gather_cpuid_leaves(args):
+    def mask(regs, eax_in, ecx_in, eax_mask, ebx_mask, ecx_mask, edx_mask):
+        if regs["eax_in"] == eax_in and regs["ecx_in"] == ecx_in:
+            regs["eax"] &= eax_mask
+            regs["ebx"] &= ebx_mask
+            regs["ecx"] &= ecx_mask
+            regs["edx"] &= edx_mask
+
+    cpuid = args.path_to_cpuid or "cpuid"
+    try:
+        output = subprocess.check_output(
+            [cpuid, "-1r"],
+            universal_newlines=True)
+    except FileNotFoundError as e:
+        exit("Error: '{}' not found.\n'cpuid' can be usually found in a "
+             "package named identically. If your distro does not provide such "
+             "package, you can find the sources or binary packages at "
+             "'http://www.etallen.com/cpuid.html'.".format(e.filename))
+
+    reglist = gather_cpuid_leaves_cpuid(output)
+    for regs in reglist:
         # local apic id. Pretend to always run on logical processor #0.
         mask(regs, 0x01, 0x00, 0xffffffff, 0x00ffffff, 0xffffffff, 0xffffffff)
         mask(regs, 0x0b, 0x00, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffff00)
-- 
2.26.3




More information about the libvir-list mailing list