[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 18/37] target-i386: Remove vendor_override field fro
From: |
Andreas Färber |
Subject: |
[Qemu-devel] [PATCH 18/37] target-i386: Remove vendor_override field from CPUX86State |
Date: |
Mon, 28 Jan 2013 17:18:35 +0100 |
From: Igor Mammedov <address@hidden>
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 semantics 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 semantics
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 is no need for vendor_override field anymore, remove it.
Signed-off-by: Igor Mammedov <address@hidden>
Signed-off-by: Andreas Färber <address@hidden>
---
target-i386/cpu.c | 27 ++++++++++++---------------
target-i386/cpu.h | 1 -
2 Dateien geändert, 12 Zeilen hinzugefügt(+), 16 Zeilen entfernt(-)
diff --git a/target-i386/cpu.c b/target-i386/cpu.c
index 043a21d..b11fe30 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -359,7 +359,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;
@@ -927,7 +926,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)) {
@@ -1194,7 +1192,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)
@@ -1282,6 +1279,18 @@ static int cpu_x86_find_by_name(x86_def_t *x86_cpu_def,
const char *name)
def = &builtin_x86_defs[i];
if (strcmp(name, def->name) == 0) {
memcpy(x86_cpu_def, def, sizeof(*def));
+ /* sysenter isn't supported in 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);
+ x86_cpu_vendor_words2str(x86_cpu_def->vendor, ebx, edx, ecx);
+ }
return 0;
}
}
@@ -1357,7 +1366,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);
@@ -1558,7 +1566,6 @@ int cpu_x86_register(X86CPU *cpu, const char *cpu_model)
goto out;
}
object_property_set_str(OBJECT(cpu), def->vendor, "vendor", &error);
- env->cpuid_vendor_override = def->vendor_override;
object_property_set_int(OBJECT(cpu), def->level, "level", &error);
object_property_set_int(OBJECT(cpu), def->family, "family", &error);
object_property_set_int(OBJECT(cpu), def->model, "model", &error);
@@ -1627,16 +1634,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 3833e6f..62508dc 100644
--- a/target-i386/cpu.h
+++ b/target-i386/cpu.h
@@ -835,7 +835,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.10.4
- [Qemu-devel] [PATCH 06/37] kvm: Create kvm_arch_vcpu_id() function, (continued)
- [Qemu-devel] [PATCH 06/37] kvm: Create kvm_arch_vcpu_id() function, Andreas Färber, 2013/01/28
- [Qemu-devel] [PATCH 04/37] target-i386: Don't set any KVM flag by default if KVM is disabled, Andreas Färber, 2013/01/28
- [Qemu-devel] [PATCH 11/37] pc: Set fw_cfg data based on APIC ID calculation, Andreas Färber, 2013/01/28
- [Qemu-devel] [PATCH 05/37] pc: Reverse pc_init_pci() compatibility logic, Andreas Färber, 2013/01/28
- [Qemu-devel] [PATCH 09/37] fw_cfg: Remove FW_CFG_MAX_CPUS from fw_cfg_init(), Andreas Färber, 2013/01/28
- [Qemu-devel] [PATCH 03/37] kvm: Add fake KVM_FEATURE_CLOCKSOURCE_STABLE_BIT for builds without KVM, Andreas Färber, 2013/01/28
- [Qemu-devel] [PATCH 10/37] cpus.h: Make constant smp_cores/smp_threads available on *-user, Andreas Färber, 2013/01/28
- [Qemu-devel] [PATCH 07/37] target-i386: kvm: Set vcpu_id to APIC ID instead of CPU index, Andreas Färber, 2013/01/28
- [Qemu-devel] [PATCH 08/37] target-i386: Introduce x86_cpu_apic_id_from_index() function, Andreas Färber, 2013/01/28
- [Qemu-devel] [PATCH 02/37] target-openrisc: Clean up triple QOM casts, Andreas Färber, 2013/01/28
- [Qemu-devel] [PATCH 18/37] target-i386: Remove vendor_override field from CPUX86State,
Andreas Färber <=
- [Qemu-devel] [PATCH 21/37] cpu: Add model resolution support to CPUClass, Andreas Färber, 2013/01/28
- [Qemu-devel] [PATCH 13/37] pc: Generate APIC IDs according to CPU topology, Andreas Färber, 2013/01/28
- [Qemu-devel] [PATCH 14/37] target-i386: Simplify cpu_x86_find_by_name(), Andreas Färber, 2013/01/28
- [Qemu-devel] [PATCH 19/37] target-i386: Set custom features/properties without intermediate x86_def_t, Andreas Färber, 2013/01/28
- [Qemu-devel] [PATCH 12/37] target-i386: Topology & APIC ID utility functions, Andreas Färber, 2013/01/28
- [Qemu-devel] [PATCH 16/37] target-i386: Print deprecation warning if xlevel < 0x80000000, Andreas Färber, 2013/01/28
- [Qemu-devel] [PATCH 15/37] target-i386: Drop redundant list of CPU definitions, Andreas Färber, 2013/01/28
- [Qemu-devel] [PATCH 17/37] target-i386: Replace uint32_t vendor fields by vendor string in x86_def_t, Andreas Färber, 2013/01/28
- [Qemu-devel] [PATCH 25/37] target-openrisc: Detect attempt to instantiate non-CPU type in cpu_init(), Andreas Färber, 2013/01/28
- [Qemu-devel] [PATCH 22/37] target-arm: Detect attempt to instantiate non-CPU type in cpu_init(), Andreas Färber, 2013/01/28