From: Igor Mammedov <imammedo@redhat.com>
To: qemu-devel@nongnu.org
Cc: ehabkost@redhat.com, afaerber@suse.de
Subject: [Qemu-devel] [PATCH 11/20] target-i386: remove vendor_override field from CPUX86State
Date: Thu, 27 Dec 2012 15:59:27 +0100 [thread overview]
Message-ID: <1356620376-23501-12-git-send-email-imammedo@redhat.com> (raw)
In-Reply-To: <1356620376-23501-1-git-send-email-imammedo@redhat.com>
commit 8935499831312 makes cpuid return to guest host's vendor value
instead of built-in one by default if kvm_enabled() == true and allows
to override this behavior if 'vendor' is specified on -cpu command line.
But every time guest calls cpuid to get 'vendor' value, host's value is
read again and again in default case.
It complicates semantic of vendor property and makes it harder to use.
Instead of reading 'vendor' value from host every time cpuid[vendor] is
called, override 'vendor' value only once in cpu_x86_find_by_name(), when
built-in CPU model is found and if(kvm_enabled() == true).
It provides the same default semantic
if (kvm_enabled() == true) vendor = host's vendor
else vendor = built-in vendor
and then later:
if (custom vendor) vendor = custom vendor
'vendor' value is overridden when user provides it on -cpu command line,
and there isn't need in vendor_override field anymore, remove it.
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
target-i386/cpu.c | 27 ++++++++++++---------------
target-i386/cpu.h | 1 -
2 files changed, 12 insertions(+), 16 deletions(-)
diff --git a/target-i386/cpu.c b/target-i386/cpu.c
index 6cce311..c223599 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -284,7 +284,6 @@ typedef struct x86_def_t {
uint32_t kvm_features, svm_features;
uint32_t xlevel;
char model_id[48];
- int vendor_override;
/* Store the results of Centaur's CPUID instructions */
uint32_t ext4_features;
uint32_t xlevel2;
@@ -865,7 +864,6 @@ static void kvm_cpu_fill_host(x86_def_t *x86_cpu_def)
kvm_arch_get_supported_cpuid(s, 0x80000001, 0, R_ECX);
cpu_x86_fill_model_id(x86_cpu_def->model_id);
- x86_cpu_def->vendor_override = 0;
/* Call Centaur's CPUID instruction. */
if (!strcmp(x86_cpu_def->vendor, CPUID_VENDOR_VIA)) {
@@ -1117,7 +1115,6 @@ static void x86_cpuid_set_vendor(Object *obj, const char *value,
env->cpuid_vendor2 |= ((uint8_t)value[i + 4]) << (8 * i);
env->cpuid_vendor3 |= ((uint8_t)value[i + 8]) << (8 * i);
}
- env->cpuid_vendor_override = 1;
}
static char *x86_cpuid_get_model_id(Object *obj, Error **errp)
@@ -1194,7 +1191,6 @@ static void cpudef_2_x86_cpu(X86CPU *cpu, x86_def_t *def, Error **errp)
assert(def->vendor[0]);
object_property_set_str(OBJECT(cpu), def->vendor, "vendor", errp);
- env->cpuid_vendor_override = def->vendor_override;
object_property_set_int(OBJECT(cpu), def->level, "level", errp);
object_property_set_int(OBJECT(cpu), def->family, "family", errp);
object_property_set_int(OBJECT(cpu), def->model, "model", errp);
@@ -1231,6 +1227,18 @@ static int cpu_x86_find_by_name(x86_def_t *x86_cpu_def, const char *name)
return -1;
} else {
memcpy(x86_cpu_def, def, sizeof(*def));
+ /* sysenter isn't supported on compatibility mode on AMD, syscall
+ * isn't supported in compatibility mode on Intel.
+ * Normally we advertise the actual cpu vendor, but you can override
+ * this using the 'vendor' property if you want to use KVM's
+ * sysenter/syscall emulation in compatibility mode and when doing
+ * cross vendor migration
+ */
+ if (kvm_enabled()) {
+ uint32_t ebx = 0, ecx = 0, edx = 0;
+ host_cpuid(0, 0, NULL, &ebx, &ecx, &edx);
+ x86cpu_vendor_words2str(x86_cpu_def->vendor, ebx, edx, ecx);
+ }
}
return 0;
@@ -1314,7 +1322,6 @@ static int cpu_x86_parse_featurestr(x86_def_t *x86_cpu_def, char *features)
x86_cpu_def->xlevel = numvalue;
} else if (!strcmp(featurestr, "vendor")) {
pstrcpy(x86_cpu_def->vendor, sizeof(x86_cpu_def->vendor), val);
- x86_cpu_def->vendor_override = 1;
} else if (!strcmp(featurestr, "model_id")) {
pstrcpy(x86_cpu_def->model_id, sizeof(x86_cpu_def->model_id),
val);
@@ -1563,16 +1570,6 @@ static void get_cpuid_vendor(CPUX86State *env, uint32_t *ebx,
*ebx = env->cpuid_vendor1;
*edx = env->cpuid_vendor2;
*ecx = env->cpuid_vendor3;
-
- /* sysenter isn't supported on compatibility mode on AMD, syscall
- * isn't supported in compatibility mode on Intel.
- * Normally we advertise the actual cpu vendor, but you can override
- * this if you want to use KVM's sysenter/syscall emulation
- * in compatibility mode and when doing cross vendor migration
- */
- if (kvm_enabled() && ! env->cpuid_vendor_override) {
- host_cpuid(0, 0, NULL, ebx, ecx, edx);
- }
}
void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
diff --git a/target-i386/cpu.h b/target-i386/cpu.h
index fbbe730..a15a09e 100644
--- a/target-i386/cpu.h
+++ b/target-i386/cpu.h
@@ -812,7 +812,6 @@ typedef struct CPUX86State {
uint32_t cpuid_ext2_features;
uint32_t cpuid_ext3_features;
uint32_t cpuid_apic_id;
- int cpuid_vendor_override;
/* Store the results of Centaur's CPUID instructions */
uint32_t cpuid_xlevel2;
uint32_t cpuid_ext4_features;
--
1.7.1
next prev parent reply other threads:[~2012-12-27 15:01 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-12-27 14:59 [Qemu-devel] [PATCH 00/20 v3] x86 CPU cleanup (wave 2) Igor Mammedov
2012-12-27 14:59 ` [Qemu-devel] [PATCH 01/20] target-i386: filter out not TCG features if running without kvm at realize time Igor Mammedov
2012-12-27 18:41 ` Eduardo Habkost
2012-12-27 19:15 ` Igor Mammedov
2012-12-27 19:36 ` Eduardo Habkost
2012-12-27 14:59 ` [Qemu-devel] [PATCH 02/20] target-i386: sanitize AMD's ext2_features " Igor Mammedov
2012-12-27 18:42 ` Eduardo Habkost
2012-12-27 14:59 ` [Qemu-devel] [PATCH 03/20] target-i386: explicitly set vendor for each built-in cpudef Igor Mammedov
2012-12-27 18:42 ` Eduardo Habkost
2012-12-27 14:59 ` [Qemu-devel] [PATCH 04/20] target-i386: setting default 'vendor' is obsolete, remove it Igor Mammedov
2012-12-27 18:42 ` Eduardo Habkost
2012-12-27 14:59 ` [Qemu-devel] [PATCH 05/20] target-i386: move setting defaults out of cpu_x86_parse_featurestr() Igor Mammedov
2012-12-27 18:43 ` Eduardo Habkost
2012-12-27 14:59 ` [Qemu-devel] [PATCH 06/20] target-i386: move out CPU features initialization in separate func Igor Mammedov
2012-12-27 18:44 ` Eduardo Habkost
2012-12-27 14:59 ` [Qemu-devel] [PATCH 07/20] target-i386: cpu_x86_register() consolidate freeing resources Igor Mammedov
2012-12-27 18:45 ` Eduardo Habkost
2012-12-27 14:59 ` [Qemu-devel] [PATCH 08/20] target-i386: move kvm_check_features_against_host() check to realize time Igor Mammedov
2012-12-27 18:55 ` Eduardo Habkost
2012-12-27 14:59 ` [Qemu-devel] [PATCH 09/20] target-i386: add x86cpu_vendor_words2str() Igor Mammedov
2012-12-27 18:56 ` Eduardo Habkost
2012-12-27 14:59 ` [Qemu-devel] [PATCH 10/20] target-i386: replace uint32_t vendor fields by vendor string in x86_def_t Igor Mammedov
2012-12-27 18:57 ` Eduardo Habkost
2012-12-28 17:39 ` Eduardo Habkost
2012-12-28 20:01 ` Igor Mammedov
2012-12-27 14:59 ` Igor Mammedov [this message]
2012-12-27 19:00 ` [Qemu-devel] [PATCH 11/20] target-i386: remove vendor_override field from CPUX86State Eduardo Habkost
2012-12-27 14:59 ` [Qemu-devel] [PATCH 12/20] target-i386: prepare cpu_x86_parse_featurestr() to return a set of key, value property pairs Igor Mammedov
2012-12-27 19:16 ` Eduardo Habkost
2012-12-27 14:59 ` [Qemu-devel] [PATCH 13/20] target-i386: set custom 'vendor' without intermediate x86_def_t Igor Mammedov
2012-12-27 19:22 ` Eduardo Habkost
2012-12-27 14:59 ` [Qemu-devel] [PATCH 14/20] target-i386: print depricated warning if xlevel < 0x80000000 Igor Mammedov
2012-12-27 19:09 ` Eduardo Habkost
2012-12-27 19:18 ` Igor Mammedov
2012-12-27 14:59 ` [Qemu-devel] [PATCH 15/20] target-i386: set custom 'xlevel' without intermediate x86_def_t Igor Mammedov
2012-12-27 19:30 ` Eduardo Habkost
2012-12-27 14:59 ` [Qemu-devel] [PATCH 16/20] target-i386: set custom 'level' " Igor Mammedov
2012-12-27 19:32 ` Eduardo Habkost
2012-12-27 14:59 ` [Qemu-devel] [PATCH 17/20] target-i386: set custom 'model-id' " Igor Mammedov
2012-12-27 19:34 ` Eduardo Habkost
2012-12-27 14:59 ` [Qemu-devel] [PATCH 18/20] target-i386: set custom 'stepping' " Igor Mammedov
2012-12-27 19:34 ` Eduardo Habkost
2012-12-27 14:59 ` [Qemu-devel] [PATCH 19/20] target-i386: set custom 'model' " Igor Mammedov
2012-12-27 19:35 ` Eduardo Habkost
2012-12-27 14:59 ` [Qemu-devel] [PATCH 20/20] target-i386: set custom 'family' " Igor Mammedov
2012-12-27 19:36 ` Eduardo Habkost
-- strict thread matches above, loose matches on Subject: below --
2012-12-28 20:01 [Qemu-devel] [PATCH 00/20 v4] x86 CPU cleanup (wave 2) Igor Mammedov
2012-12-28 20:01 ` [Qemu-devel] [PATCH 11/20] target-i386: remove vendor_override field from CPUX86State Igor Mammedov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1356620376-23501-12-git-send-email-imammedo@redhat.com \
--to=imammedo@redhat.com \
--cc=afaerber@suse.de \
--cc=ehabkost@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).