[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 10/20] target-i386: replace uint32_t vendor fiel
From: |
Eduardo Habkost |
Subject: |
Re: [Qemu-devel] [PATCH 10/20] target-i386: replace uint32_t vendor fields by vendor string in x86_def_t |
Date: |
Fri, 28 Dec 2012 18:50:06 -0200 |
User-agent: |
Mutt/1.5.21 (2010-09-15) |
On Fri, Dec 28, 2012 at 09:01:25PM +0100, Igor Mammedov wrote:
> Vendor property setter takes string as vendor value but cpudefs
> use uint32_t vendor[123] fields to define vendor value. It makes it
> difficult to unify and use property setter for values from cpudefs.
>
> Simplify code by using vendor property setter, vendor[123] fields
> are converted into vendor[13] array to keep its value. And vendor
> property setter is used to access/set value on CPU.
>
> Signed-off-by: Igor Mammedov <address@hidden>
> Signed-off-by: Eduardo Habkost <address@hidden>
Reviewed-by: Eduardo Habkost <address@hidden>
> ---
> v2:
> - restore deleted host_cpuid() call in kvm_cpu_fill_host()
> Spotted-By: Eduardo Habkost <address@hidden>
> ---
> target-i386/cpu.c | 126
> +++++++++++++----------------------------------------
> target-i386/cpu.h | 6 +-
> 2 files changed, 33 insertions(+), 99 deletions(-)
>
> diff --git a/target-i386/cpu.c b/target-i386/cpu.c
> index 935bc42..4c483a7 100644
> --- a/target-i386/cpu.c
> +++ b/target-i386/cpu.c
> @@ -275,7 +275,7 @@ typedef struct x86_def_t {
> struct x86_def_t *next;
> const char *name;
> uint32_t level;
> - uint32_t vendor1, vendor2, vendor3;
> + char vendor[CPUID_VENDOR_SZ + 1];
> int family;
> int model;
> int stepping;
> @@ -340,9 +340,7 @@ static x86_def_t builtin_x86_defs[] = {
> {
> .name = "qemu64",
> .level = 4,
> - .vendor1 = CPUID_VENDOR_AMD_1,
> - .vendor2 = CPUID_VENDOR_AMD_2,
> - .vendor3 = CPUID_VENDOR_AMD_3,
> + .vendor = CPUID_VENDOR_AMD,
> .family = 6,
> .model = 2,
> .stepping = 3,
> @@ -359,9 +357,7 @@ static x86_def_t builtin_x86_defs[] = {
> {
> .name = "phenom",
> .level = 5,
> - .vendor1 = CPUID_VENDOR_AMD_1,
> - .vendor2 = CPUID_VENDOR_AMD_2,
> - .vendor3 = CPUID_VENDOR_AMD_3,
> + .vendor = CPUID_VENDOR_AMD,
> .family = 16,
> .model = 2,
> .stepping = 3,
> @@ -387,9 +383,7 @@ static x86_def_t builtin_x86_defs[] = {
> {
> .name = "core2duo",
> .level = 10,
> - .vendor1 = CPUID_VENDOR_INTEL_1,
> - .vendor2 = CPUID_VENDOR_INTEL_2,
> - .vendor3 = CPUID_VENDOR_INTEL_3,
> + .vendor = CPUID_VENDOR_INTEL,
> .family = 6,
> .model = 15,
> .stepping = 11,
> @@ -408,9 +402,7 @@ static x86_def_t builtin_x86_defs[] = {
> {
> .name = "kvm64",
> .level = 5,
> - .vendor1 = CPUID_VENDOR_INTEL_1,
> - .vendor2 = CPUID_VENDOR_INTEL_2,
> - .vendor3 = CPUID_VENDOR_INTEL_3,
> + .vendor = CPUID_VENDOR_INTEL,
> .family = 15,
> .model = 6,
> .stepping = 1,
> @@ -434,9 +426,7 @@ static x86_def_t builtin_x86_defs[] = {
> {
> .name = "qemu32",
> .level = 4,
> - .vendor1 = CPUID_VENDOR_INTEL_1,
> - .vendor2 = CPUID_VENDOR_INTEL_2,
> - .vendor3 = CPUID_VENDOR_INTEL_3,
> + .vendor = CPUID_VENDOR_INTEL,
> .family = 6,
> .model = 3,
> .stepping = 3,
> @@ -447,9 +437,7 @@ static x86_def_t builtin_x86_defs[] = {
> {
> .name = "kvm32",
> .level = 5,
> - .vendor1 = CPUID_VENDOR_INTEL_1,
> - .vendor2 = CPUID_VENDOR_INTEL_2,
> - .vendor3 = CPUID_VENDOR_INTEL_3,
> + .vendor = CPUID_VENDOR_INTEL,
> .family = 15,
> .model = 6,
> .stepping = 1,
> @@ -464,9 +452,7 @@ static x86_def_t builtin_x86_defs[] = {
> {
> .name = "coreduo",
> .level = 10,
> - .vendor1 = CPUID_VENDOR_INTEL_1,
> - .vendor2 = CPUID_VENDOR_INTEL_2,
> - .vendor3 = CPUID_VENDOR_INTEL_3,
> + .vendor = CPUID_VENDOR_INTEL,
> .family = 6,
> .model = 14,
> .stepping = 8,
> @@ -482,9 +468,7 @@ static x86_def_t builtin_x86_defs[] = {
> {
> .name = "486",
> .level = 1,
> - .vendor1 = CPUID_VENDOR_INTEL_1,
> - .vendor2 = CPUID_VENDOR_INTEL_2,
> - .vendor3 = CPUID_VENDOR_INTEL_3,
> + .vendor = CPUID_VENDOR_INTEL,
> .family = 4,
> .model = 0,
> .stepping = 0,
> @@ -494,9 +478,7 @@ static x86_def_t builtin_x86_defs[] = {
> {
> .name = "pentium",
> .level = 1,
> - .vendor1 = CPUID_VENDOR_INTEL_1,
> - .vendor2 = CPUID_VENDOR_INTEL_2,
> - .vendor3 = CPUID_VENDOR_INTEL_3,
> + .vendor = CPUID_VENDOR_INTEL,
> .family = 5,
> .model = 4,
> .stepping = 3,
> @@ -506,9 +488,7 @@ static x86_def_t builtin_x86_defs[] = {
> {
> .name = "pentium2",
> .level = 2,
> - .vendor1 = CPUID_VENDOR_INTEL_1,
> - .vendor2 = CPUID_VENDOR_INTEL_2,
> - .vendor3 = CPUID_VENDOR_INTEL_3,
> + .vendor = CPUID_VENDOR_INTEL,
> .family = 6,
> .model = 5,
> .stepping = 2,
> @@ -518,9 +498,7 @@ static x86_def_t builtin_x86_defs[] = {
> {
> .name = "pentium3",
> .level = 2,
> - .vendor1 = CPUID_VENDOR_INTEL_1,
> - .vendor2 = CPUID_VENDOR_INTEL_2,
> - .vendor3 = CPUID_VENDOR_INTEL_3,
> + .vendor = CPUID_VENDOR_INTEL,
> .family = 6,
> .model = 7,
> .stepping = 3,
> @@ -530,9 +508,7 @@ static x86_def_t builtin_x86_defs[] = {
> {
> .name = "athlon",
> .level = 2,
> - .vendor1 = CPUID_VENDOR_AMD_1,
> - .vendor2 = CPUID_VENDOR_AMD_2,
> - .vendor3 = CPUID_VENDOR_AMD_3,
> + .vendor = CPUID_VENDOR_AMD,
> .family = 6,
> .model = 2,
> .stepping = 3,
> @@ -546,9 +522,7 @@ static x86_def_t builtin_x86_defs[] = {
> .name = "n270",
> /* original is on level 10 */
> .level = 5,
> - .vendor1 = CPUID_VENDOR_INTEL_1,
> - .vendor2 = CPUID_VENDOR_INTEL_2,
> - .vendor3 = CPUID_VENDOR_INTEL_3,
> + .vendor = CPUID_VENDOR_INTEL,
> .family = 6,
> .model = 28,
> .stepping = 2,
> @@ -567,9 +541,7 @@ static x86_def_t builtin_x86_defs[] = {
> {
> .name = "Conroe",
> .level = 2,
> - .vendor1 = CPUID_VENDOR_INTEL_1,
> - .vendor2 = CPUID_VENDOR_INTEL_2,
> - .vendor3 = CPUID_VENDOR_INTEL_3,
> + .vendor = CPUID_VENDOR_INTEL,
> .family = 6,
> .model = 2,
> .stepping = 3,
> @@ -587,9 +559,7 @@ static x86_def_t builtin_x86_defs[] = {
> {
> .name = "Penryn",
> .level = 2,
> - .vendor1 = CPUID_VENDOR_INTEL_1,
> - .vendor2 = CPUID_VENDOR_INTEL_2,
> - .vendor3 = CPUID_VENDOR_INTEL_3,
> + .vendor = CPUID_VENDOR_INTEL,
> .family = 6,
> .model = 2,
> .stepping = 3,
> @@ -608,9 +578,7 @@ static x86_def_t builtin_x86_defs[] = {
> {
> .name = "Nehalem",
> .level = 2,
> - .vendor1 = CPUID_VENDOR_INTEL_1,
> - .vendor2 = CPUID_VENDOR_INTEL_2,
> - .vendor3 = CPUID_VENDOR_INTEL_3,
> + .vendor = CPUID_VENDOR_INTEL,
> .family = 6,
> .model = 2,
> .stepping = 3,
> @@ -629,9 +597,7 @@ static x86_def_t builtin_x86_defs[] = {
> {
> .name = "Westmere",
> .level = 11,
> - .vendor1 = CPUID_VENDOR_INTEL_1,
> - .vendor2 = CPUID_VENDOR_INTEL_2,
> - .vendor3 = CPUID_VENDOR_INTEL_3,
> + .vendor = CPUID_VENDOR_INTEL,
> .family = 6,
> .model = 44,
> .stepping = 1,
> @@ -651,9 +617,7 @@ static x86_def_t builtin_x86_defs[] = {
> {
> .name = "SandyBridge",
> .level = 0xd,
> - .vendor1 = CPUID_VENDOR_INTEL_1,
> - .vendor2 = CPUID_VENDOR_INTEL_2,
> - .vendor3 = CPUID_VENDOR_INTEL_3,
> + .vendor = CPUID_VENDOR_INTEL,
> .family = 6,
> .model = 42,
> .stepping = 1,
> @@ -676,9 +640,7 @@ static x86_def_t builtin_x86_defs[] = {
> {
> .name = "Haswell",
> .level = 0xd,
> - .vendor1 = CPUID_VENDOR_INTEL_1,
> - .vendor2 = CPUID_VENDOR_INTEL_2,
> - .vendor3 = CPUID_VENDOR_INTEL_3,
> + .vendor = CPUID_VENDOR_INTEL,
> .family = 6,
> .model = 60,
> .stepping = 1,
> @@ -706,9 +668,7 @@ static x86_def_t builtin_x86_defs[] = {
> {
> .name = "Opteron_G1",
> .level = 5,
> - .vendor1 = CPUID_VENDOR_AMD_1,
> - .vendor2 = CPUID_VENDOR_AMD_2,
> - .vendor3 = CPUID_VENDOR_AMD_3,
> + .vendor = CPUID_VENDOR_AMD,
> .family = 15,
> .model = 6,
> .stepping = 1,
> @@ -730,9 +690,7 @@ static x86_def_t builtin_x86_defs[] = {
> {
> .name = "Opteron_G2",
> .level = 5,
> - .vendor1 = CPUID_VENDOR_AMD_1,
> - .vendor2 = CPUID_VENDOR_AMD_2,
> - .vendor3 = CPUID_VENDOR_AMD_3,
> + .vendor = CPUID_VENDOR_AMD,
> .family = 15,
> .model = 6,
> .stepping = 1,
> @@ -756,9 +714,7 @@ static x86_def_t builtin_x86_defs[] = {
> {
> .name = "Opteron_G3",
> .level = 5,
> - .vendor1 = CPUID_VENDOR_AMD_1,
> - .vendor2 = CPUID_VENDOR_AMD_2,
> - .vendor3 = CPUID_VENDOR_AMD_3,
> + .vendor = CPUID_VENDOR_AMD,
> .family = 15,
> .model = 6,
> .stepping = 1,
> @@ -784,9 +740,7 @@ static x86_def_t builtin_x86_defs[] = {
> {
> .name = "Opteron_G4",
> .level = 0xd,
> - .vendor1 = CPUID_VENDOR_AMD_1,
> - .vendor2 = CPUID_VENDOR_AMD_2,
> - .vendor3 = CPUID_VENDOR_AMD_3,
> + .vendor = CPUID_VENDOR_AMD,
> .family = 21,
> .model = 1,
> .stepping = 2,
> @@ -816,9 +770,7 @@ static x86_def_t builtin_x86_defs[] = {
> {
> .name = "Opteron_G5",
> .level = 0xd,
> - .vendor1 = CPUID_VENDOR_AMD_1,
> - .vendor2 = CPUID_VENDOR_AMD_2,
> - .vendor3 = CPUID_VENDOR_AMD_3,
> + .vendor = CPUID_VENDOR_AMD,
> .family = 21,
> .model = 2,
> .stepping = 0,
> @@ -889,9 +841,7 @@ static void kvm_cpu_fill_host(x86_def_t *x86_cpu_def)
>
> x86_cpu_def->name = "host";
> host_cpuid(0x0, 0, &eax, &ebx, &ecx, &edx);
> - x86_cpu_def->vendor1 = ebx;
> - x86_cpu_def->vendor2 = edx;
> - x86_cpu_def->vendor3 = ecx;
> + x86cpu_vendor_words2str(x86_cpu_def->vendor, ebx, edx, ecx);
>
> host_cpuid(0x1, 0, &eax, &ebx, &ecx, &edx);
> x86_cpu_def->family = ((eax >> 8) & 0x0F) + ((eax >> 20) & 0xFF);
> @@ -919,9 +869,7 @@ static void kvm_cpu_fill_host(x86_def_t *x86_cpu_def)
> x86_cpu_def->vendor_override = 0;
>
> /* Call Centaur's CPUID instruction. */
> - if (x86_cpu_def->vendor1 == CPUID_VENDOR_VIA_1 &&
> - x86_cpu_def->vendor2 == CPUID_VENDOR_VIA_2 &&
> - x86_cpu_def->vendor3 == CPUID_VENDOR_VIA_3) {
> + if (!strcmp(x86_cpu_def->vendor, CPUID_VENDOR_VIA)) {
> host_cpuid(0xC0000000, 0, &eax, &ebx, &ecx, &edx);
> eax = kvm_arch_get_supported_cpuid(s, 0xC0000000, 0, R_EAX);
> if (eax >= 0xC0000001) {
> @@ -1245,10 +1193,8 @@ static void cpudef_2_x86_cpu(X86CPU *cpu, x86_def_t
> *def, Error **errp)
> {
> CPUX86State *env = &cpu->env;
>
> - assert(def->vendor1);
> - env->cpuid_vendor1 = def->vendor1;
> - env->cpuid_vendor2 = def->vendor2;
> - env->cpuid_vendor3 = def->vendor3;
> + 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);
> @@ -1295,7 +1241,6 @@ static int cpu_x86_find_by_name(x86_def_t *x86_cpu_def,
> const char *name)
> */
> static int cpu_x86_parse_featurestr(x86_def_t *x86_cpu_def, char *features)
> {
> - unsigned int i;
> char *featurestr; /* Single 'key=value" string being parsed */
> /* Features to be added */
> uint32_t plus_features = 0, plus_ext_features = 0;
> @@ -1369,18 +1314,7 @@ static int cpu_x86_parse_featurestr(x86_def_t
> *x86_cpu_def, char *features)
> }
> x86_cpu_def->xlevel = numvalue;
> } else if (!strcmp(featurestr, "vendor")) {
> - if (strlen(val) != 12) {
> - fprintf(stderr, "vendor string must be 12 chars long\n");
> - goto error;
> - }
> - x86_cpu_def->vendor1 = 0;
> - x86_cpu_def->vendor2 = 0;
> - x86_cpu_def->vendor3 = 0;
> - for(i = 0; i < 4; i++) {
> - x86_cpu_def->vendor1 |= ((uint8_t)val[i ]) << (8 * i);
> - x86_cpu_def->vendor2 |= ((uint8_t)val[i + 4]) << (8 * i);
> - x86_cpu_def->vendor3 |= ((uint8_t)val[i + 8]) << (8 * i);
> - }
> + 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),
> diff --git a/target-i386/cpu.h b/target-i386/cpu.h
> index 386c4f6..fbbe730 100644
> --- a/target-i386/cpu.h
> +++ b/target-i386/cpu.h
> @@ -515,14 +515,14 @@
> #define CPUID_VENDOR_INTEL_1 0x756e6547 /* "Genu" */
> #define CPUID_VENDOR_INTEL_2 0x49656e69 /* "ineI" */
> #define CPUID_VENDOR_INTEL_3 0x6c65746e /* "ntel" */
> +#define CPUID_VENDOR_INTEL "GenuineIntel"
>
> #define CPUID_VENDOR_AMD_1 0x68747541 /* "Auth" */
> #define CPUID_VENDOR_AMD_2 0x69746e65 /* "enti" */
> #define CPUID_VENDOR_AMD_3 0x444d4163 /* "cAMD" */
> +#define CPUID_VENDOR_AMD "AuthenticAMD"
>
> -#define CPUID_VENDOR_VIA_1 0x746e6543 /* "Cent" */
> -#define CPUID_VENDOR_VIA_2 0x48727561 /* "aurH" */
> -#define CPUID_VENDOR_VIA_3 0x736c7561 /* "auls" */
> +#define CPUID_VENDOR_VIA "CentaurHauls"
>
> #define CPUID_MWAIT_IBE (1 << 1) /* Interrupts can exit capability */
> #define CPUID_MWAIT_EMX (1 << 0) /* enumeration supported */
> --
> 1.7.1
>
--
Eduardo
- [Qemu-devel] [PATCH 03/20] target-i386: explicitly set vendor for each built-in cpudef, (continued)
- [Qemu-devel] [PATCH 03/20] target-i386: explicitly set vendor for each built-in cpudef, Igor Mammedov, 2012/12/28
- [Qemu-devel] [PATCH 06/20] target-i386: move out CPU features initialization in separate func, Igor Mammedov, 2012/12/28
- [Qemu-devel] [PATCH 08/20] target-i386: move kvm_check_features_against_host() check to realize time, Igor Mammedov, 2012/12/28
- [Qemu-devel] [PATCH 05/20] target-i386: move setting defaults out of cpu_x86_parse_featurestr(), Igor Mammedov, 2012/12/28
- [Qemu-devel] [PATCH 07/20] target-i386: cpu_x86_register() consolidate freeing resources, Igor Mammedov, 2012/12/28
- [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/28
- [Qemu-devel] [PATCH 09/20] target-i386: add x86cpu_vendor_words2str(), Igor Mammedov, 2012/12/28
- [Qemu-devel] [PATCH 13/20] target-i386: set custom 'vendor' without intermediate x86_def_t, Igor Mammedov, 2012/12/28
- [Qemu-devel] [PATCH 16/20] target-i386: set custom 'level' without intermediate x86_def_t, Igor Mammedov, 2012/12/28
- [Qemu-devel] [PATCH 10/20] target-i386: replace uint32_t vendor fields by vendor string in x86_def_t, Igor Mammedov, 2012/12/28
- Re: [Qemu-devel] [PATCH 10/20] target-i386: replace uint32_t vendor fields by vendor string in x86_def_t,
Eduardo Habkost <=
- [Qemu-devel] [PATCH 15/20] target-i386: set custom 'xlevel' without intermediate x86_def_t, Igor Mammedov, 2012/12/28
- [Qemu-devel] [PATCH 11/20] target-i386: remove vendor_override field from CPUX86State, Igor Mammedov, 2012/12/28
- [Qemu-devel] [PATCH 14/20] target-i386: print deprecated warning if xlevel < 0x80000000, Igor Mammedov, 2012/12/28
- [Qemu-devel] [PATCH 17/20] target-i386: set custom 'model-id' without intermediate x86_def_t, Igor Mammedov, 2012/12/28
- [Qemu-devel] [PATCH 19/20] target-i386: set custom 'model' without intermediate x86_def_t, Igor Mammedov, 2012/12/28
- [Qemu-devel] [PATCH 18/20] target-i386: set custom 'stepping' without intermediate x86_def_t, Igor Mammedov, 2012/12/28
- [Qemu-devel] [PATCH 20/20] target-i386: set custom 'family' without intermediate x86_def_t, Igor Mammedov, 2012/12/28