From nobody Tue Dec 16 21:05:07 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.39 as permitted sender) client-ip=209.132.183.39; envelope-from=libvir-list-bounces@redhat.com; helo=mx6-phx2.redhat.com; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.39 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; Return-Path: Received: from mx6-phx2.redhat.com (mx6-phx2.redhat.com [209.132.183.39]) by mx.zohomail.com with SMTPS id 1487154125497411.86880412103415; Wed, 15 Feb 2017 02:22:05 -0800 (PST) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by mx6-phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1FAHAAT047513; Wed, 15 Feb 2017 05:17:11 -0500 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v1FAFZ1Q003251 for ; Wed, 15 Feb 2017 05:15:35 -0500 Received: from virval.usersys.redhat.com (dhcp129-92.brq.redhat.com [10.34.129.92]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1FAFXv9028427 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 15 Feb 2017 05:15:34 -0500 Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 95A4A105DDC; Wed, 15 Feb 2017 11:15:29 +0100 (CET) From: Jiri Denemark To: libvir-list@redhat.com Date: Wed, 15 Feb 2017 11:15:22 +0100 Message-Id: <0b92d7ec8a0ed7bc2e2418f537be7aa11f156f23.1487152754.git.jdenemar@redhat.com> In-Reply-To: References: In-Reply-To: References: Mail-Followup-To: libvir-list@redhat.com X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 28/33] cputest: Switch host CPU data scripts to model expansion X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Instantiating "host" CPU and querying it using qom-get has been the only way of probing host CPU via QEMU until 2.9.0 implemented query-cpu-model-expansion for x86_64. Even though libvirt never really used the old way its result can be easily converted into the one produced by query-cpu-model-expansion. Thus we can reuse the original test data and possible get new data from hosts where QEMU does not support the new QMP command. Signed-off-by: Jiri Denemark --- tests/cputestdata/cpu-convert.py | 244 +++++++++++++++++++++++++++++++++++= ++++ tests/cputestdata/cpu-gather.sh | 39 ++++++- tests/cputestdata/cpu-parse.sh | 3 + 3 files changed, 280 insertions(+), 6 deletions(-) create mode 100755 tests/cputestdata/cpu-convert.py diff --git a/tests/cputestdata/cpu-convert.py b/tests/cputestdata/cpu-conve= rt.py new file mode 100755 index 000000000..5d0876854 --- /dev/null +++ b/tests/cputestdata/cpu-convert.py @@ -0,0 +1,244 @@ +#!/usr/bin/python + +import sys +import json + +# This is a list of x86 CPU features as of QEMU 2.8.50 and it won't need a= ny +# updates since in the future because query-cpu-model-expansion will be us= ed +# with newer QEMU. +cpuidMap =3D [ + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00000= 001, "edx": 0, "names": ["pni", "sse3"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00000= 002, "edx": 0, "names": ["pclmulqdq", "pclmuldq"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00000= 004, "edx": 0, "names": ["dtes64"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00000= 008, "edx": 0, "names": ["monitor"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00000= 010, "edx": 0, "names": ["ds-cpl", "ds_cpl"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00000= 020, "edx": 0, "names": ["vmx"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00000= 040, "edx": 0, "names": ["smx"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00000= 080, "edx": 0, "names": ["est"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00000= 100, "edx": 0, "names": ["tm2"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00000= 200, "edx": 0, "names": ["ssse3"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00000= 400, "edx": 0, "names": ["cid"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00001= 000, "edx": 0, "names": ["fma"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00002= 000, "edx": 0, "names": ["cx16"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00004= 000, "edx": 0, "names": ["xtpr"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00008= 000, "edx": 0, "names": ["pdcm"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00020= 000, "edx": 0, "names": ["pcid"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00040= 000, "edx": 0, "names": ["dca"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00080= 000, "edx": 0, "names": ["sse4.1", "sse4-1", "sse4_1"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00100= 000, "edx": 0, "names": ["sse4.2", "sse4-2", "sse4_2"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00200= 000, "edx": 0, "names": ["x2apic"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00400= 000, "edx": 0, "names": ["movbe"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00800= 000, "edx": 0, "names": ["popcnt"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x01000= 000, "edx": 0, "names": ["tsc-deadline"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x02000= 000, "edx": 0, "names": ["aes"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x04000= 000, "edx": 0, "names": ["xsave"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x08000= 000, "edx": 0, "names": ["osxsave"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x10000= 000, "edx": 0, "names": ["avx"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x20000= 000, "edx": 0, "names": ["f16c"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x40000= 000, "edx": 0, "names": ["rdrand"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x80000= 000, "edx": 0, "names": ["hypervisor"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00000001, "names": ["fpu"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00000002, "names": ["vme"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00000004, "names": ["de"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00000008, "names": ["pse"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00000010, "names": ["tsc"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00000020, "names": ["msr"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00000040, "names": ["pae"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00000080, "names": ["mce"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00000100, "names": ["cx8"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00000200, "names": ["apic"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00000800, "names": ["sep"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00001000, "names": ["mtrr"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00002000, "names": ["pge"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00004000, "names": ["mca"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00008000, "names": ["cmov"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00010000, "names": ["pat"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00020000, "names": ["pse36"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00040000, "names": ["pn"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00080000, "names": ["clflush"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00200000, "names": ["ds"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00400000, "names": ["acpi"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00800000, "names": ["mmx"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x01000000, "names": ["fxsr"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x02000000, "names": ["sse"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x04000000, "names": ["sse2"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x08000000, "names": ["ss"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x10000000, "names": ["ht"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x20000000, "names": ["tm"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x40000000, "names": ["ia64"]}, + {"in_eax": 0x00000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x80000000, "names": ["pbe"]}, + {"in_eax": 0x00000006, "in_ecx": 0, "eax": 0x00000004, "ebx": 0, "ecx"= : 0, "edx": 0, "names": ["arat"]}, + {"in_eax": 0x00000007, "in_ecx": 0, "eax": 0, "ebx": 0x00000001, "ecx"= : 0, "edx": 0, "names": ["fsgsbase"]}, + {"in_eax": 0x00000007, "in_ecx": 0, "eax": 0, "ebx": 0x00000002, "ecx"= : 0, "edx": 0, "names": ["tsc-adjust", "tsc_adjust"]}, + {"in_eax": 0x00000007, "in_ecx": 0, "eax": 0, "ebx": 0x00000008, "ecx"= : 0, "edx": 0, "names": ["bmi1"]}, + {"in_eax": 0x00000007, "in_ecx": 0, "eax": 0, "ebx": 0x00000010, "ecx"= : 0, "edx": 0, "names": ["hle"]}, + {"in_eax": 0x00000007, "in_ecx": 0, "eax": 0, "ebx": 0x00000020, "ecx"= : 0, "edx": 0, "names": ["avx2"]}, + {"in_eax": 0x00000007, "in_ecx": 0, "eax": 0, "ebx": 0x00000080, "ecx"= : 0, "edx": 0, "names": ["smep"]}, + {"in_eax": 0x00000007, "in_ecx": 0, "eax": 0, "ebx": 0x00000100, "ecx"= : 0, "edx": 0, "names": ["bmi2"]}, + {"in_eax": 0x00000007, "in_ecx": 0, "eax": 0, "ebx": 0x00000200, "ecx"= : 0, "edx": 0, "names": ["erms"]}, + {"in_eax": 0x00000007, "in_ecx": 0, "eax": 0, "ebx": 0x00000400, "ecx"= : 0, "edx": 0, "names": ["invpcid"]}, + {"in_eax": 0x00000007, "in_ecx": 0, "eax": 0, "ebx": 0x00000800, "ecx"= : 0, "edx": 0, "names": ["rtm"]}, + {"in_eax": 0x00000007, "in_ecx": 0, "eax": 0, "ebx": 0x00004000, "ecx"= : 0, "edx": 0, "names": ["mpx"]}, + {"in_eax": 0x00000007, "in_ecx": 0, "eax": 0, "ebx": 0x00010000, "ecx"= : 0, "edx": 0, "names": ["avx512f"]}, + {"in_eax": 0x00000007, "in_ecx": 0, "eax": 0, "ebx": 0x00020000, "ecx"= : 0, "edx": 0, "names": ["avx512dq"]}, + {"in_eax": 0x00000007, "in_ecx": 0, "eax": 0, "ebx": 0x00040000, "ecx"= : 0, "edx": 0, "names": ["rdseed"]}, + {"in_eax": 0x00000007, "in_ecx": 0, "eax": 0, "ebx": 0x00080000, "ecx"= : 0, "edx": 0, "names": ["adx"]}, + {"in_eax": 0x00000007, "in_ecx": 0, "eax": 0, "ebx": 0x00100000, "ecx"= : 0, "edx": 0, "names": ["smap"]}, + {"in_eax": 0x00000007, "in_ecx": 0, "eax": 0, "ebx": 0x00200000, "ecx"= : 0, "edx": 0, "names": ["avx512ifma"]}, + {"in_eax": 0x00000007, "in_ecx": 0, "eax": 0, "ebx": 0x00400000, "ecx"= : 0, "edx": 0, "names": ["pcommit"]}, + {"in_eax": 0x00000007, "in_ecx": 0, "eax": 0, "ebx": 0x00800000, "ecx"= : 0, "edx": 0, "names": ["clflushopt"]}, + {"in_eax": 0x00000007, "in_ecx": 0, "eax": 0, "ebx": 0x01000000, "ecx"= : 0, "edx": 0, "names": ["clwb"]}, + {"in_eax": 0x00000007, "in_ecx": 0, "eax": 0, "ebx": 0x04000000, "ecx"= : 0, "edx": 0, "names": ["avx512pf"]}, + {"in_eax": 0x00000007, "in_ecx": 0, "eax": 0, "ebx": 0x08000000, "ecx"= : 0, "edx": 0, "names": ["avx512er"]}, + {"in_eax": 0x00000007, "in_ecx": 0, "eax": 0, "ebx": 0x10000000, "ecx"= : 0, "edx": 0, "names": ["avx512cd"]}, + {"in_eax": 0x00000007, "in_ecx": 0, "eax": 0, "ebx": 0x20000000, "ecx"= : 0, "edx": 0, "names": ["sha-ni"]}, + {"in_eax": 0x00000007, "in_ecx": 0, "eax": 0, "ebx": 0x40000000, "ecx"= : 0, "edx": 0, "names": ["avx512bw"]}, + {"in_eax": 0x00000007, "in_ecx": 0, "eax": 0, "ebx": 0x80000000, "ecx"= : 0, "edx": 0, "names": ["avx512vl"]}, + {"in_eax": 0x00000007, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00000= 002, "edx": 0, "names": ["avx512vbmi"]}, + {"in_eax": 0x00000007, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00000= 004, "edx": 0, "names": ["umip"]}, + {"in_eax": 0x00000007, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00000= 008, "edx": 0, "names": ["pku"]}, + {"in_eax": 0x00000007, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00000= 010, "edx": 0, "names": ["ospke"]}, + {"in_eax": 0x00000007, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00004= 000, "edx": 0, "names": ["avx512-vpopcntdq"]}, + {"in_eax": 0x00000007, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00010= 000, "edx": 0, "names": ["la57"]}, + {"in_eax": 0x00000007, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00400= 000, "edx": 0, "names": ["rdpid"]}, + {"in_eax": 0x00000007, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00000004, "names": ["avx512-4vnniw"]}, + {"in_eax": 0x00000007, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00000008, "names": ["avx512-4fmaps"]}, + {"in_eax": 0x0000000d, "in_ecx": 1, "eax": 0x00000001, "ebx": 0, "ecx"= : 0, "edx": 0, "names": ["xsaveopt"]}, + {"in_eax": 0x0000000d, "in_ecx": 1, "eax": 0x00000002, "ebx": 0, "ecx"= : 0, "edx": 0, "names": ["xsavec"]}, + {"in_eax": 0x0000000d, "in_ecx": 1, "eax": 0x00000004, "ebx": 0, "ecx"= : 0, "edx": 0, "names": ["xgetbv1"]}, + {"in_eax": 0x0000000d, "in_ecx": 1, "eax": 0x00000008, "ebx": 0, "ecx"= : 0, "edx": 0, "names": ["xsaves"]}, + {"in_eax": 0x40000001, "in_ecx": 0, "eax": 0x00000001, "ebx": 0, "ecx"= : 0, "edx": 0, "names": ["kvmclock"]}, + {"in_eax": 0x40000001, "in_ecx": 0, "eax": 0x00000002, "ebx": 0, "ecx"= : 0, "edx": 0, "names": ["kvm-nopiodelay", "kvm_nopiodelay"]}, + {"in_eax": 0x40000001, "in_ecx": 0, "eax": 0x00000004, "ebx": 0, "ecx"= : 0, "edx": 0, "names": ["kvm-mmu", "kvm_mmu"]}, + {"in_eax": 0x40000001, "in_ecx": 0, "eax": 0x00000008, "ebx": 0, "ecx"= : 0, "edx": 0, "names": ["kvmclock"]}, + {"in_eax": 0x40000001, "in_ecx": 0, "eax": 0x00000010, "ebx": 0, "ecx"= : 0, "edx": 0, "names": ["kvm-asyncpf", "kvm_asyncpf"]}, + {"in_eax": 0x40000001, "in_ecx": 0, "eax": 0x00000020, "ebx": 0, "ecx"= : 0, "edx": 0, "names": ["kvm-steal-time", "kvm_steal_time"]}, + {"in_eax": 0x40000001, "in_ecx": 0, "eax": 0x00000040, "ebx": 0, "ecx"= : 0, "edx": 0, "names": ["kvm-pv-eoi", "kvm_pv_eoi"]}, + {"in_eax": 0x40000001, "in_ecx": 0, "eax": 0x00000080, "ebx": 0, "ecx"= : 0, "edx": 0, "names": ["kvm-pv-unhalt", "kvm_pv_unhalt"]}, + {"in_eax": 0x40000001, "in_ecx": 0, "eax": 0x01000000, "ebx": 0, "ecx"= : 0, "edx": 0, "names": ["kvmclock-stable-bit"]}, + {"in_eax": 0x80000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00000= 001, "edx": 0, "names": ["lahf-lm", "lahf_lm"]}, + {"in_eax": 0x80000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00000= 002, "edx": 0, "names": ["cmp-legacy", "cmp_legacy"]}, + {"in_eax": 0x80000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00000= 004, "edx": 0, "names": ["svm"]}, + {"in_eax": 0x80000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00000= 008, "edx": 0, "names": ["extapic"]}, + {"in_eax": 0x80000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00000= 010, "edx": 0, "names": ["cr8legacy"]}, + {"in_eax": 0x80000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00000= 020, "edx": 0, "names": ["abm"]}, + {"in_eax": 0x80000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00000= 040, "edx": 0, "names": ["sse4a"]}, + {"in_eax": 0x80000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00000= 080, "edx": 0, "names": ["misalignsse"]}, + {"in_eax": 0x80000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00000= 100, "edx": 0, "names": ["3dnowprefetch"]}, + {"in_eax": 0x80000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00000= 200, "edx": 0, "names": ["osvw"]}, + {"in_eax": 0x80000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00000= 400, "edx": 0, "names": ["ibs"]}, + {"in_eax": 0x80000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00000= 800, "edx": 0, "names": ["xop"]}, + {"in_eax": 0x80000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00001= 000, "edx": 0, "names": ["skinit"]}, + {"in_eax": 0x80000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00002= 000, "edx": 0, "names": ["wdt"]}, + {"in_eax": 0x80000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00008= 000, "edx": 0, "names": ["lwp"]}, + {"in_eax": 0x80000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00010= 000, "edx": 0, "names": ["fma4"]}, + {"in_eax": 0x80000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00020= 000, "edx": 0, "names": ["tce"]}, + {"in_eax": 0x80000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00080= 000, "edx": 0, "names": ["nodeid-msr", "nodeid_msr"]}, + {"in_eax": 0x80000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00200= 000, "edx": 0, "names": ["tbm"]}, + {"in_eax": 0x80000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00400= 000, "edx": 0, "names": ["topoext"]}, + {"in_eax": 0x80000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x00800= 000, "edx": 0, "names": ["perfctr-core", "perfctr_core"]}, + {"in_eax": 0x80000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0x01000= 000, "edx": 0, "names": ["perfctr-nb", "perfctr_nb"]}, + {"in_eax": 0x80000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00000800, "names": ["syscall"]}, + {"in_eax": 0x80000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00100000, "names": ["nx", "xd"]}, + {"in_eax": 0x80000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00400000, "names": ["mmxext"]}, + {"in_eax": 0x80000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x02000000, "names": ["fxsr-opt", "ffxsr", "fxsr_opt"]}, + {"in_eax": 0x80000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x04000000, "names": ["pdpe1gb"]}, + {"in_eax": 0x80000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x08000000, "names": ["rdtscp"]}, + {"in_eax": 0x80000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x20000000, "names": ["lm", "i64"]}, + {"in_eax": 0x80000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x40000000, "names": ["3dnowext"]}, + {"in_eax": 0x80000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x80000000, "names": ["3dnow"]}, + {"in_eax": 0x80000007, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00000100, "names": ["invtsc"]}, + {"in_eax": 0x8000000A, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00000001, "names": ["npt"]}, + {"in_eax": 0x8000000A, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00000002, "names": ["lbrv"]}, + {"in_eax": 0x8000000A, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00000004, "names": ["svm-lock", "svm_lock"]}, + {"in_eax": 0x8000000A, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00000008, "names": ["nrip-save", "nrip_save"]}, + {"in_eax": 0x8000000A, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00000010, "names": ["tsc-scale", "tsc_scale"]}, + {"in_eax": 0x8000000A, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00000020, "names": ["vmcb-clean", "vmcb_clean"]}, + {"in_eax": 0x8000000A, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00000040, "names": ["flushbyasid"]}, + {"in_eax": 0x8000000A, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00000080, "names": ["decodeassists"]}, + {"in_eax": 0x8000000A, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00000400, "names": ["pause-filter", "pause_filter"]}, + {"in_eax": 0x8000000A, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00001000, "names": ["pfthreshold"]}, + {"in_eax": 0xC0000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00000004, "names": ["xstore"]}, + {"in_eax": 0xC0000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00000008, "names": ["xstore-en"]}, + {"in_eax": 0xC0000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00000040, "names": ["xcrypt"]}, + {"in_eax": 0xC0000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00000080, "names": ["xcrypt-en"]}, + {"in_eax": 0xC0000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00000100, "names": ["ace2"]}, + {"in_eax": 0xC0000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00000200, "names": ["ace2-en"]}, + {"in_eax": 0xC0000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00000400, "names": ["phe"]}, + {"in_eax": 0xC0000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00000800, "names": ["phe-en"]}, + {"in_eax": 0xC0000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00001000, "names": ["pmm"]}, + {"in_eax": 0xC0000001, "in_ecx": 0, "eax": 0, "ebx": 0, "ecx": 0, "edx= ": 0x00002000, "names": ["pmm-en"]}, +] + + +def parseFeatureWords(path): + features =3D None + + with open(path, "r") as f: + s =3D f.read() + + props =3D {} + for i in range(5): + (data, pos) =3D dec.raw_decode(s) + if i =3D=3D 0: + features =3D data["return"] + else: + keys =3D ["family", "model", "stepping", "model-id"] + props[keys[i - 1]] =3D data["return"] + + while pos < len(s) and s[pos] !=3D "{": + pos +=3D 1 + s =3D s[pos:] + + cpuid =3D {} + for feat in features: + in_eax =3D feat["cpuid-input-eax"] + in_ecx =3D 0 + if "cpuid-input-ecx" in feat: + in_ecx =3D feat["cpuid-input-ecx"] + + if in_eax not in cpuid: + cpuid[in_eax] =3D {} + leaf =3D cpuid[in_eax] + + if in_ecx not in leaf: + leaf[in_ecx] =3D {"eax": 0, "ebx": 0, "ecx": 0, "edx": 0} + leaf =3D leaf[in_ecx] + + leaf[feat["cpuid-register"].lower()] =3D feat["features"] + + return props, cpuid + + +def propAdd(props, feature, value): + for name in feature["names"]: + props[name] =3D value + + +dec =3D json.JSONDecoder() + +for path in sys.argv[1:]: + props, cpuid =3D parseFeatureWords(path) + + for feature in cpuidMap: + in_eax =3D feature["in_eax"] + in_ecx =3D feature["in_ecx"] + eax =3D feature["eax"] + ebx =3D feature["ebx"] + ecx =3D feature["ecx"] + edx =3D feature["edx"] + + if in_eax not in cpuid or in_ecx not in cpuid[in_eax]: + propAdd(props, feature, False) + else: + leaf =3D cpuid[in_eax][in_ecx] + propAdd(props, feature, ((eax > 0 and leaf["eax"] & eax > 0) or + (ebx > 0 and leaf["ebx"] & ebx > 0) or + (ecx > 0 and leaf["ecx"] & ecx > 0) or + (edx > 0 and leaf["edx"] & edx > 0))) + + with open(path, "w") as f: + json.dump({"return": {"model": {"name": "base", "props": props}}, + "id": "model-expansion"}, + f, indent =3D 2, separators =3D (',', ': ')) + f.write("\n") diff --git a/tests/cputestdata/cpu-gather.sh b/tests/cputestdata/cpu-gather= .sh index c8439a661..83963557e 100755 --- a/tests/cputestdata/cpu-gather.sh +++ b/tests/cputestdata/cpu-gather.sh @@ -24,12 +24,39 @@ qom_get() '"property":"'$1'"},"id":"'$1'"}' } =20 -$qemu -machine accel=3Dkvm -cpu host -nodefaults -nographic -qmp stdio <$fname.json if [[ -s $fname.json ]]; then echo $fname.json + if ! grep -q model-expansion $fname.json; then + $(dirname $0)/cpu-convert.py $fname.json + fi else rm $fname.new.json fi --=20 2.11.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list