From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LXEw4-0000RH-Pe for qemu-devel@nongnu.org; Wed, 11 Feb 2009 08:15:28 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LXEw4-0000Pv-2Y for qemu-devel@nongnu.org; Wed, 11 Feb 2009 08:15:28 -0500 Received: from [199.232.76.173] (port=42024 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LXEw3-0000Pa-QF for qemu-devel@nongnu.org; Wed, 11 Feb 2009 08:15:27 -0500 Received: from mx2.redhat.com ([66.187.237.31]:58458) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1LXEw3-0002pT-BR for qemu-devel@nongnu.org; Wed, 11 Feb 2009 08:15:27 -0500 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n1BDFQoE007785 for ; Wed, 11 Feb 2009 08:15:26 -0500 From: Amit Shah Date: Wed, 11 Feb 2009 18:45:14 +0530 Message-Id: <1234358114-23390-5-git-send-email-amit.shah@redhat.com> In-Reply-To: <1234358114-23390-4-git-send-email-amit.shah@redhat.com> References: <1234358114-23390-1-git-send-email-amit.shah@redhat.com> <1234358114-23390-2-git-send-email-amit.shah@redhat.com> <1234358114-23390-3-git-send-email-amit.shah@redhat.com> <1234358114-23390-4-git-send-email-amit.shah@redhat.com> Subject: [Qemu-devel] [PATCH 4/4] Support for cpudef files placed in the share/ directory Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Amit Shah 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 --- 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