From nobody Fri May 3 12:47:30 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1493994612848532.6651435379268; Fri, 5 May 2017 07:30:12 -0700 (PDT) Received: from localhost ([::1]:47298 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d6eFG-0008UA-Ip for importer@patchew.org; Fri, 05 May 2017 10:30:10 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50641) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d6eD7-0007Am-SS for qemu-devel@nongnu.org; Fri, 05 May 2017 10:28:01 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d6eD6-0000OE-6z for qemu-devel@nongnu.org; Fri, 05 May 2017 10:27:57 -0400 Received: from mx1.redhat.com ([209.132.183.28]:46076) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1d6eD6-0000Nt-1B for qemu-devel@nongnu.org; Fri, 05 May 2017 10:27:56 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E17A680C08; Fri, 5 May 2017 14:27:54 +0000 (UTC) Received: from t460.redhat.com (ovpn-117-5.ams2.redhat.com [10.36.117.5]) by smtp.corp.redhat.com (Postfix) with ESMTP id C76BC777EA; Fri, 5 May 2017 14:27:48 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com E17A680C08 Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=berrange@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com E17A680C08 From: "Daniel P. Berrange" To: qemu-devel@nongnu.org Date: Fri, 5 May 2017 15:27:42 +0100 Message-Id: <20170505142743.19849-2-berrange@redhat.com> In-Reply-To: <20170505142743.19849-1-berrange@redhat.com> References: <20170505142743.19849-1-berrange@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Fri, 05 May 2017 14:27:55 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v2 1/2] i386: rewrite way CPUID index is validated X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Paolo Bonzini , Eduardo Habkost , Richard Henderson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Change the nested if statements into a flat switch, to make it clearer what validation / capping is being performed on different CPUID index values. Signed-off-by: Daniel P. Berrange --- target/i386/cpu.c | 43 +++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 13c0985..3d5903c 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -2628,26 +2628,33 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index= , uint32_t count, uint32_t pkg_offset; =20 /* test if maximum index reached */ - if (index & 0x80000000) { + switch (index & 0xF0000000) { + case 0: + /* Intel documentation states that invalid EAX input will + * return the same information as EAX=3Dcpuid_level + * (Intel SDM Vol. 2A - Instruction Set Reference - CPUID) + */ + if (index > env->cpuid_level) { + index =3D env->cpuid_level; + } + break; + case 0x80000000: if (index > env->cpuid_xlevel) { - if (env->cpuid_xlevel2 > 0) { - /* Handle the Centaur's CPUID instruction. */ - if (index > env->cpuid_xlevel2) { - index =3D env->cpuid_xlevel2; - } else if (index < 0xC0000000) { - index =3D env->cpuid_xlevel; - } - } else { - /* Intel documentation states that invalid EAX input will - * return the same information as EAX=3Dcpuid_level - * (Intel SDM Vol. 2A - Instruction Set Reference - CPUID) - */ - index =3D env->cpuid_level; - } + index =3D env->cpuid_xlevel; } - } else { - if (index > env->cpuid_level) - index =3D env->cpuid_level; + break; + case 0xC0000000: + if (index > env->cpuid_xlevel2) { + index =3D env->cpuid_xlevel2; + } + break; + default: + /* Intel documentation states that invalid EAX input will + * return the same information as EAX=3Dcpuid_level + * (Intel SDM Vol. 2A - Instruction Set Reference - CPUID) + */ + index =3D env->cpuid_level; + break; } =20 switch(index) { --=20 2.9.3 From nobody Fri May 3 12:47:30 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1493994553955385.2467742862191; Fri, 5 May 2017 07:29:13 -0700 (PDT) Received: from localhost ([::1]:47295 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d6eEK-0007pC-Gh for importer@patchew.org; Fri, 05 May 2017 10:29:12 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50680) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d6eDE-0007Eb-Ce for qemu-devel@nongnu.org; Fri, 05 May 2017 10:28:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d6eDD-0000VK-AC for qemu-devel@nongnu.org; Fri, 05 May 2017 10:28:04 -0400 Received: from mx1.redhat.com ([209.132.183.28]:41438) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1d6eDD-0000V7-1b for qemu-devel@nongnu.org; Fri, 05 May 2017 10:28:03 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 03716C056790; Fri, 5 May 2017 14:28:02 +0000 (UTC) Received: from t460.redhat.com (ovpn-117-5.ams2.redhat.com [10.36.117.5]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7B82E788FA; Fri, 5 May 2017 14:27:55 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 03716C056790 Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=berrange@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 03716C056790 From: "Daniel P. Berrange" To: qemu-devel@nongnu.org Date: Fri, 5 May 2017 15:27:43 +0100 Message-Id: <20170505142743.19849-3-berrange@redhat.com> In-Reply-To: <20170505142743.19849-1-berrange@redhat.com> References: <20170505142743.19849-1-berrange@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Fri, 05 May 2017 14:28:02 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v2 2/2] i386: expose "TCGTCGTCGTCG" in the 0x40000000 CPUID leaf X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Paolo Bonzini , Eduardo Habkost , Richard Henderson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Currently when running KVM, we expose "KVMKVMKVM\0\0\0" in the 0x40000000 CPUID leaf. Other hypervisors (VMWare, HyperV, Xen, BHyve) all do the same thing, which leaves TCG as the odd one out. The CPUID signature is used by software to detect which virtual environment they are running in and (potentially) change behaviour in certain ways. For example, systemd supports a ConditionVirtualization=3D setting in unit files. The virt-what command can also report the virt type it is running on Currently both these apps have to resort to custom hacks like looking for 'fw-cfg' entry in the /proc/device-tree file to identify TCG. This change thus proposes a signature "TCGTCGTCGTCG" to be reported when running under TCG. To hide this, the -cpu option tcg-cpuid=3Doff can be used. Signed-off-by: Daniel P. Berrange --- include/hw/i386/pc.h | 5 +++++ target/i386/cpu.c | 30 ++++++++++++++++++++++++++++++ target/i386/cpu.h | 1 + 3 files changed, 36 insertions(+) diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h index f278b3a..3aec60f 100644 --- a/include/hw/i386/pc.h +++ b/include/hw/i386/pc.h @@ -376,6 +376,11 @@ bool e820_get_entry(int, uint32_t, uint64_t *, uint64_= t *); #define PC_COMPAT_2_8 \ HW_COMPAT_2_8 \ {\ + .driver =3D TYPE_X86_CPU,\ + .property =3D "tcg-cpuid",\ + .value =3D "off",\ + },\ + {\ .driver =3D "kvmclock",\ .property =3D "x-mach-use-reliable-get-clock",\ .value =3D "off",\ diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 3d5903c..aa8e14c 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -2626,6 +2626,7 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, = uint32_t count, X86CPU *cpu =3D x86_env_get_cpu(env); CPUState *cs =3D CPU(cpu); uint32_t pkg_offset; + uint32_t signature[3]; =20 /* test if maximum index reached */ switch (index & 0xF0000000) { @@ -2638,6 +2639,16 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index,= uint32_t count, index =3D env->cpuid_level; } break; + case 0x40000000: + /* Not sure what we should do here. Intel and KVM + * documentation is not explicit about it, but it + * looks like KVM will return the highest _basic_ + * leaf (env->cpuid_level) on that case. + */ + if (index > 0x40000001) { + index =3D env->cpuid_level; + } + break; case 0x80000000: if (index > env->cpuid_xlevel) { index =3D env->cpuid_xlevel; @@ -2879,6 +2890,24 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index,= uint32_t count, } break; } + case 0x40000000: + /* + * CPUID code in kvm_arch_init_vcpu() ignores stuff + * set here, but we restrict to TCG none the less. + */ + if (tcg_enabled() && cpu->expose_tcg) { + memcpy(signature, "TCGTCGTCGTCG", 12); + *eax =3D 0; + *ebx =3D signature[0]; + *ecx =3D signature[1]; + *edx =3D signature[2]; + } else { + *eax =3D 0; + *ebx =3D 0; + *ecx =3D 0; + *edx =3D 0; + } + break; case 0x80000000: *eax =3D env->cpuid_xlevel; *ebx =3D env->cpuid_vendor1; @@ -4020,6 +4049,7 @@ static Property x86_cpu_properties[] =3D { DEFINE_PROP_BOOL("kvm-no-smi-migration", X86CPU, kvm_no_smi_migration, false), DEFINE_PROP_BOOL("vmware-cpuid-freq", X86CPU, vmware_cpuid_freq, true), + DEFINE_PROP_BOOL("tcg-cpuid", X86CPU, expose_tcg, true), DEFINE_PROP_END_OF_LIST() }; =20 diff --git a/target/i386/cpu.h b/target/i386/cpu.h index c4602ca..c25f0ce 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -1216,6 +1216,7 @@ struct X86CPU { bool check_cpuid; bool enforce_cpuid; bool expose_kvm; + bool expose_tcg; bool migratable; bool max_features; /* Enable all supported features automatically */ uint32_t apic_id; --=20 2.9.3