[libvirt PATCH] cpu-data: Pretend to always run on logical processor #0

Tim Wiederhake posted 1 patch 3 years, 3 months ago
Test syntax-check failed
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/libvirt tags/patchew/20210108144302.145275-1-twiederh@redhat.com
tests/cputestdata/cpu-data.py | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
[libvirt PATCH] cpu-data: Pretend to always run on logical processor #0
Posted by Tim Wiederhake 3 years, 3 months ago
The output of cpuid depends on the logical processor id the process
runs on, as reflected by the "local apic id" present in cpuid leaves
(eax=1,ebx=0), (eax=11,ebx=0), and (eax=11,ebx=1). This produces
arbitrary changes in the output files that complicate comparisons.

This patch masks the occurences of the local apic id with 0x00, so
that two consecutive runs of "./cpu-data.py gather" produce identical
results.

Signed-off-by: Tim Wiederhake <twiederh@redhat.com>
---
 tests/cputestdata/cpu-data.py | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/tests/cputestdata/cpu-data.py b/tests/cputestdata/cpu-data.py
index a41f1d025c..df71132c25 100755
--- a/tests/cputestdata/cpu-data.py
+++ b/tests/cputestdata/cpu-data.py
@@ -36,6 +36,13 @@ def gather_name(args):
 
 
 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
+
     leave_pattern = re.compile(
         "^\\s*"
         "(0x[0-9a-f]+)\\s*"
@@ -60,7 +67,7 @@ def gather_cpuid_leaves(args):
         match = leave_pattern.match(line)
         if not match:
             continue
-        yield {
+        regs = {
             "eax_in": int(match.group(1), 0),
             "ecx_in": int(match.group(2), 0),
             "eax": int(match.group(3), 0),
@@ -68,6 +75,13 @@ def gather_cpuid_leaves(args):
             "ecx": int(match.group(5), 0),
             "edx": int(match.group(6), 0)}
 
+        # 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)
+        mask(regs, 0x0b, 0x01, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffff00)
+
+        yield regs
+
 
 def gather_msr():
     msrs = dict()
-- 
2.26.2