From: Amit Shah <amit.shah@redhat.com>
To: qemu-devel@nongnu.org
Cc: Amit Shah <amit.shah@redhat.com>
Subject: [Qemu-devel] [PATCH 4/4] Support for cpudef files placed in the share/ directory
Date: Wed, 11 Feb 2009 18:45:14 +0530 [thread overview]
Message-ID: <1234358114-23390-5-git-send-email-amit.shah@redhat.com> (raw)
In-Reply-To: <1234358114-23390-4-git-send-email-amit.shah@redhat.com>
This patch adds support to use cpudefs placed in the
$(PREFIX)/share/qemu/cpudefs directory.
The various cpu definitions in the code can now be placed there, making
things simpler.
Signed-off-by: Amit Shah <amit.shah@redhat.com>
---
qemu/target-i386/helper.c | 172 +++++++++++++++++++++++++++++++++-----------
1 files changed, 129 insertions(+), 43 deletions(-)
diff --git a/qemu/target-i386/helper.c b/qemu/target-i386/helper.c
index 7152dc4..ececb32 100644
--- a/qemu/target-i386/helper.c
+++ b/qemu/target-i386/helper.c
@@ -28,6 +28,7 @@
#include "cpu.h"
#include "exec-all.h"
#include "qemu-common.h"
+#include "sysemu.h"
#include "kvm.h"
//#define DEBUG_MMU
@@ -164,27 +165,6 @@ static x86_def_t x86_defs[] = {
.xlevel = 0x8000001A,
.model_id = "AMD Phenom(tm) 9550 Quad-Core Processor"
},
- {
- .name = "core2duo",
- .level = 10,
- .family = 6,
- .model = 15,
- .stepping = 11,
- /* The original CPU also implements these features:
- CPUID_VME, CPUID_DTS, CPUID_ACPI, CPUID_SS, CPUID_HT,
- CPUID_TM, CPUID_PBE */
- .features = PPRO_FEATURES |
- CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
- CPUID_PSE36,
- /* The original CPU also implements these ext features:
- CPUID_EXT_DTES64, CPUID_EXT_DSCPL, CPUID_EXT_VMX, CPUID_EXT_EST,
- CPUID_EXT_TM2, CPUID_EXT_CX16, CPUID_EXT_XTPR, CPUID_EXT_PDCM */
- .ext_features = CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_SSSE3,
- .ext2_features = CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
- /* Missing: .ext3_features = CPUID_EXT3_LAHF_LM */
- .xlevel = 0x80000008,
- .model_id = "Intel(R) Core(TM)2 Duo CPU T7700 @ 2.40GHz",
- },
#endif
{
.name = "qemu32",
@@ -198,25 +178,6 @@ static x86_def_t x86_defs[] = {
.model_id = "QEMU Virtual CPU version " QEMU_VERSION,
},
{
- .name = "coreduo",
- .level = 10,
- .family = 6,
- .model = 14,
- .stepping = 8,
- /* The original CPU also implements these features:
- CPUID_DTS, CPUID_ACPI, CPUID_SS, CPUID_HT,
- CPUID_TM, CPUID_PBE */
- .features = PPRO_FEATURES | CPUID_VME |
- CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA,
- /* The original CPU also implements these ext features:
- CPUID_EXT_VMX, CPUID_EXT_EST, CPUID_EXT_TM2, CPUID_EXT_XTPR,
- CPUID_EXT_PDCM */
- .ext_features = CPUID_EXT_SSE3 | CPUID_EXT_MONITOR,
- .ext2_features = CPUID_EXT2_NX,
- .xlevel = 0x80000008,
- .model_id = "Genuine Intel(R) CPU T2600 @ 2.16GHz",
- },
- {
.name = "486",
.level = 0,
.family = 4,
@@ -290,6 +251,127 @@ static x86_def_t x86_defs[] = {
},
};
+static long get_cpudef_value(char *line, int base)
+{
+ char *string;
+
+ string = strchr(line, ' ');
+ if (!string)
+ return -1;
+ return strtol(string, NULL, base);
+}
+
+static int get_cpudef_from_file(x86_def_t *x86_cpu_def, const char *cpu_model)
+{
+ char cpudef_path[1024], line[1024];
+ FILE *fp;
+
+ snprintf(cpudef_path, sizeof(cpudef_path), "%s/cpudefs/%s",
+ get_datafile_dir(), cpu_model);
+
+ fp = fopen(cpudef_path, "r");
+ if (!fp)
+ return -1;
+
+ x86_cpu_def->features = x86_cpu_def->ext_features = 0;
+ x86_cpu_def->ext2_features = x86_cpu_def->ext3_features = 0;
+
+ for(;;) {
+ if (fgets(line, 1024, fp) == NULL)
+ break;
+ if (line[0] == '#')
+ continue;
+ if (!strncmp(line, "level ", 6)) {
+ x86_cpu_def->level = get_cpudef_value(line, 10);
+ continue;
+ }
+ if (!strncmp(line, "family ", 7)) {
+ x86_cpu_def->family = get_cpudef_value(line, 10);
+ continue;
+ }
+ if (!strncmp(line, "model ", 6)) {
+ x86_cpu_def->model = get_cpudef_value(line, 10);
+ continue;
+ }
+ if (!strncmp(line, "stepping ", 9)) {
+ x86_cpu_def->stepping = get_cpudef_value(line, 10);
+ continue;
+ }
+ if (!strncmp(line, "xlevel ", 7)) {
+ x86_cpu_def->xlevel = get_cpudef_value(line, 16);
+ continue;
+ }
+ if (!strncmp(line, "model_id ", 9)) {
+ char *substr = strchr(line, ' ');
+ int i = 0;
+
+ while (*substr) {
+ if (*substr == '\n')
+ break;
+
+ /* Skip to first quote mark */
+ if (*substr != '\"') {
+ substr++;
+ continue;
+ }
+ substr++;
+ while (i < 48 && *substr && *substr != '\"'
+ && *substr != '\n')
+ x86_cpu_def->model_id[i++] = *substr++;
+
+ break;
+ }
+ continue;
+ }
+ if (!strncmp(line, "features ", 9)) {
+ char *substr = strchr(line, ' ');
+ char feat[20];
+
+ while (*substr) {
+ int i;
+
+ if (*substr == '\n')
+ break;
+ /* Skip to next feature string */
+ else if (!isalnum(*substr)) {
+ substr++;
+ continue;
+ }
+
+ i = 0;
+ /*
+ * Features only have alphanumeric values (and
+ * underscores, in some cases). Only allow these
+ * values.
+ */
+ while (*substr && (isalnum(*substr) || *substr == '_'))
+ feat[i++] = *substr++;
+ feat[i] = 0;
+
+ if (!strncmp(feat, "i486_features", 13))
+ x86_cpu_def->features |= I486_FEATURES;
+ else if (!strncmp(feat, "pentium_features", 16))
+ x86_cpu_def->features |= PENTIUM_FEATURES;
+ else if (!strncmp(feat, "pentium2_features", 17))
+ x86_cpu_def->features |= PENTIUM2_FEATURES;
+ else if (!strncmp(feat, "pentium3_features", 18))
+ x86_cpu_def->features |= PENTIUM3_FEATURES;
+ else if (!strncmp(feat, "ppro_features", 13)) {
+ x86_cpu_def->features |= PPRO_FEATURES;
+ x86_cpu_def->ext_features |=
+ PPRO_FEATURES & 0x0183F3FF;
+ } else
+ add_flagname_to_bitmaps(feat, &x86_cpu_def->features,
+ &x86_cpu_def->ext_features,
+ &x86_cpu_def->ext2_features,
+ &x86_cpu_def->ext3_features);
+ }
+ }
+ continue;
+ }
+ return 0;
+}
+
static int cpu_x86_find_by_name(x86_def_t *x86_cpu_def, const char *cpu_model)
{
unsigned int i;
@@ -308,9 +390,13 @@ static int cpu_x86_find_by_name(x86_def_t *x86_cpu_def, const char *cpu_model)
break;
}
}
- if (!def)
- goto error;
- memcpy(x86_cpu_def, def, sizeof(*def));
+ if (!def) {
+ int r;
+ r = get_cpudef_from_file(x86_cpu_def, cpu_model);
+ if (r < 0)
+ goto error;
+ } else
+ memcpy(x86_cpu_def, def, sizeof(*def));
featurestr = strtok(NULL, ",");
--
1.6.0.6
next prev parent reply other threads:[~2009-02-11 13:15 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-02-11 13:15 [Qemu-devel] Support for out-of-code cpu definitions Amit Shah
2009-02-11 13:15 ` [Qemu-devel] [PATCH 1/4] Introduce get_datafile_dir() to replace bios_dir Amit Shah
2009-02-11 13:15 ` [Qemu-devel] [PATCH 2/4] Add independent cpu definitions for the coreduo and core2duo cpu types Amit Shah
2009-02-11 13:15 ` [Qemu-devel] [PATCH 3/4] Update Makefile to copy the cpudef files to install location Amit Shah
2009-02-11 13:15 ` Amit Shah [this message]
2009-02-11 15:11 ` [Qemu-devel] Support for out-of-code cpu definitions Blue Swirl
2009-02-11 15:21 ` Anthony Liguori
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=1234358114-23390-5-git-send-email-amit.shah@redhat.com \
--to=amit.shah@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).