From: Igor Mammedov <imammedo@redhat.com>
To: qemu-devel@nongnu.org
Cc: aliguori@us.ibm.com, stefanha@linux.vnet.ibm.com,
gleb@redhat.com, vijaymohan.pandarathil@hp.com,
jan.kiszka@siemens.com, mtosatti@redhat.com,
mdroth@linux.vnet.ibm.com, blauwirbel@gmail.com, avi@redhat.com,
pbonzini@redhat.com, akong@redhat.com, lersek@redhat.com,
afaerber@suse.de, ehabkost@redhat.com
Subject: [Qemu-devel] [PATCH 16/21] target-i386: replace uint32_t vendor fields by vendor string in x86_def_t
Date: Wed, 15 Aug 2012 18:13:36 +0200 [thread overview]
Message-ID: <1345047221-26898-17-git-send-email-imammedo@redhat.com> (raw)
In-Reply-To: <1345047221-26898-1-git-send-email-imammedo@redhat.com>
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.
To allow 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 <imammedo@redhat.com>
---
target-i386/cpu.c | 76 +++++++++++++------------------------------------------
target-i386/cpu.h | 10 +++-----
2 files changed, 20 insertions(+), 66 deletions(-)
diff --git a/target-i386/cpu.c b/target-i386/cpu.c
index af6c9a3..d24ef84 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -227,7 +227,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;
@@ -293,9 +293,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,
@@ -312,9 +310,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,
@@ -358,9 +354,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,
@@ -459,9 +453,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,
@@ -507,13 +499,16 @@ static int cpu_x86_fill_model_id(char *str)
static int cpu_x86_fill_host(x86_def_t *x86_cpu_def)
{
uint32_t eax = 0, ebx = 0, ecx = 0, edx = 0;
+ int i;
x86_cpu_def->name = "host";
host_cpuid(0x0, 0, &eax, &ebx, &ecx, &edx);
x86_cpu_def->level = eax;
- x86_cpu_def->vendor1 = ebx;
- x86_cpu_def->vendor2 = edx;
- x86_cpu_def->vendor3 = ecx;
+ for (i = 0; i < 4; i++) {
+ x86_cpu_def->vendor[i] = ebx >> (8 * i);
+ x86_cpu_def->vendor[i + 4] = edx >> (8 * i);
+ x86_cpu_def->vendor[i + 8] = ecx >> (8 * i);
+ }
host_cpuid(0x1, 0, &eax, &ebx, &ecx, &edx);
x86_cpu_def->family = ((eax >> 8) & 0x0F) + ((eax >> 20) & 0xFF);
@@ -538,9 +533,7 @@ static int cpu_x86_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);
if (eax >= 0xC0000001) {
/* Support VIA max extended level */
@@ -1095,15 +1088,8 @@ static void cpudef_2_x86_cpu(X86CPU *cpu, x86_def_t *def, Error **errp)
{
CPUX86State *env = &cpu->env;
- if (def->vendor1) {
- env->cpuid_vendor1 = def->vendor1;
- env->cpuid_vendor2 = def->vendor2;
- env->cpuid_vendor3 = def->vendor3;
- } else {
- env->cpuid_vendor1 = CPUID_VENDOR_INTEL_1;
- env->cpuid_vendor2 = CPUID_VENDOR_INTEL_2;
- env->cpuid_vendor3 = CPUID_VENDOR_INTEL_3;
- }
+ object_property_set_str(OBJECT(cpu), def->vendor[0] ?
+ def->vendor : CPUID_VENDOR_INTEL, "vendor", errp);
object_property_set_bool(OBJECT(cpu), true, "vendor-override", errp);
object_property_set_int(OBJECT(cpu), def->level, "level", errp);
object_property_set_int(OBJECT(cpu), def->family, "family", errp);
@@ -1127,7 +1113,6 @@ static void cpudef_2_x86_cpu(X86CPU *cpu, x86_def_t *def, Error **errp)
static int cpu_x86_find_by_name(X86CPU *cpu, x86_def_t *x86_cpu_def,
const char *cpu_model, Error **errp)
{
- unsigned int i;
x86_def_t *def;
char *s = g_strdup(cpu_model);
@@ -1216,18 +1201,7 @@ static int cpu_x86_find_by_name(X86CPU *cpu, x86_def_t *x86_cpu_def,
}
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),
@@ -1361,10 +1335,7 @@ void x86_cpu_list(FILE *f, fprintf_function cpu_fprintf, const char *optarg)
(*cpu_fprintf)(f, "x86 %16s\n", buf);
}
if (dump) {
- memcpy(buf, &def->vendor1, sizeof (def->vendor1));
- memcpy(buf + 4, &def->vendor2, sizeof (def->vendor2));
- memcpy(buf + 8, &def->vendor3, sizeof (def->vendor3));
- buf[12] = '\0';
+ pstrcpy(buf, sizeof(def->vendor), def->vendor);
(*cpu_fprintf)(f,
" family %d model %d stepping %d level %d xlevel 0x%x"
" vendor \"%s\"\n",
@@ -1437,17 +1408,6 @@ out:
}
#if !defined(CONFIG_USER_ONLY)
-/* copy vendor id string to 32 bit register, nul pad as needed
- */
-static void cpyid(const char *s, uint32_t *id)
-{
- char *d = (char *)id;
- char i;
-
- for (i = sizeof (*id); i--; )
- *d++ = *s ? *s++ : '\0';
-}
-
/* interpret radix and convert from string to arbitrary scalar,
* otherwise flag failure
*/
@@ -1499,9 +1459,7 @@ static int cpudef_setfield(const char *name, const char *str, void *opaque)
} else if (!strcmp(name, "level")) {
setscalar(&def->level, str, &err)
} else if (!strcmp(name, "vendor")) {
- cpyid(&str[0], &def->vendor1);
- cpyid(&str[4], &def->vendor2);
- cpyid(&str[8], &def->vendor3);
+ pstrcpy(def->vendor, sizeof(def->vendor), str);
} else if (!strcmp(name, "family")) {
setscalar(&def->family, str, &err)
} else if (!strcmp(name, "model")) {
diff --git a/target-i386/cpu.h b/target-i386/cpu.h
index 5c75704..5543496 100644
--- a/target-i386/cpu.h
+++ b/target-i386/cpu.h
@@ -445,14 +445,10 @@
#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_VIA_1 0x746e6543 /* "Cent" */
-#define CPUID_VENDOR_VIA_2 0x48727561 /* "aurH" */
-#define CPUID_VENDOR_VIA_3 0x736c7561 /* "auls" */
+#define CPUID_VENDOR_AMD "AuthenticAMD"
+#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.11.2
next prev parent reply other threads:[~2012-08-15 16:15 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-15 16:13 [Qemu-devel] [PATCH 00/21] target-i386: convert CPU features into properties Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 01/21] target-i386: return Error from cpu_x86_find_by_name() Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 02/21] target-i386: cpu_x86_register(): report error from property setter Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 03/21] target-i386: if x86_cpu_realize() failed report error and do cleanup Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 04/21] target-i386: filter out not TCG features if running without kvm at realize time Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 05/21] target-i386: move out CPU features initialization in separate func Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 06/21] target-i386: xlevel should be more than 0x80000000, move fixup into setter Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 07/21] target-i386: convert cpuid features into properties Igor Mammedov
2012-08-16 18:10 ` Eduardo Habkost
2012-08-17 17:32 ` Eduardo Habkost
2012-08-20 12:16 ` Igor Mammedov
2012-08-20 12:34 ` Eduardo Habkost
2012-08-15 16:13 ` [Qemu-devel] [PATCH 08/21] target-i386: convert 'hv_spinlocks' feature into property Igor Mammedov
2012-08-15 20:43 ` Eduardo Habkost
2012-08-15 21:32 ` Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 09/21] target-i386: convert 'hv_relaxed' " Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 10/21] target-i386: convert 'hv_vapic' " Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 11/21] target-i386: convert 'check' and 'enforce' features into properties Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 12/21] add visitor for parsing hz[KMG] input string Igor Mammedov
2012-08-15 16:44 ` Andreas Färber
2012-08-15 17:08 ` Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 13/21] target-i386: use visit_type_hz to parse tsc_freq property value Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 14/21] target-i386: introduce vendor-override property Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 15/21] target-i386: use define for cpuid vendor string size Igor Mammedov
2012-08-15 16:13 ` Igor Mammedov [this message]
2012-08-15 16:13 ` [Qemu-devel] [PATCH 17/21] target-i386: parse cpu_model string into set of stringified properties Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 18/21] target-i386: use properties to set/unset user specified features on CPU Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 19/21] target-i386: move init of "hypervisor" feature into CPU initializer from cpudef Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 20/21] target-i386: move default init of cpuid_kvm_features bitmap " Igor Mammedov
2012-08-15 16:13 ` [Qemu-devel] [PATCH 21/21] target-i386: cleanup cpu_x86_find_by_name(), only fill x86_def_t in it Igor Mammedov
2012-08-16 3:02 ` [Qemu-devel] [PATCH 00/21] target-i386: convert CPU features into properties Eduardo Habkost
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=1345047221-26898-17-git-send-email-imammedo@redhat.com \
--to=imammedo@redhat.com \
--cc=afaerber@suse.de \
--cc=akong@redhat.com \
--cc=aliguori@us.ibm.com \
--cc=avi@redhat.com \
--cc=blauwirbel@gmail.com \
--cc=ehabkost@redhat.com \
--cc=gleb@redhat.com \
--cc=jan.kiszka@siemens.com \
--cc=lersek@redhat.com \
--cc=mdroth@linux.vnet.ibm.com \
--cc=mtosatti@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@linux.vnet.ibm.com \
--cc=vijaymohan.pandarathil@hp.com \
/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).