Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1J5eiL-0006cd-P3 for qemu-devel@nongnu.org; Fri, 21 Dec 2007 05:02:45 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1J5eiK-0006Zb-Ct for qemu-devel@nongnu.org; Fri, 21 Dec 2007 05:02:44 -0500 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1J5eiK-0006Z9-0Q for qemu-devel@nongnu.org; Fri, 21 Dec 2007 05:02:44 -0500 Received: from il.qumranet.com ([82.166.9.18]) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1J5eiJ-0007Wq-5e for qemu-devel@nongnu.org; Fri, 21 Dec 2007 05:02:43 -0500 Received: from localhost (karma.qumranet.com [10.0.50.239]) by il.qumranet.com (Postfix) with ESMTP id 5B3E3A010E for ; Thu, 20 Dec 2007 18:40:33 +0200 (IST) Date: Thu, 20 Dec 2007 18:40:33 +0200 From: Dan Kenigsberg Message-ID: <20071220164033.GA17722@karma.qumranet.com> References: <20071125132334.GA9555@karma.qumranet.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20071125132334.GA9555@karma.qumranet.com> Subject: [Qemu-devel] [PATCH] Allow setting the vendor and model_id strings with x86's -cpu option 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 Having AuthenticAMD hard-coded is nice, but allowing the user to impersonate whatever CPU she wants is even nicer. Hopefully it would now work on big endian host and with non-ASCII characters. Dan. diff --git a/target-i386/helper2.c b/target-i386/helper2.c index 6d40c64..b9b3093 100644 --- a/target-i386/helper2.c +++ b/target-i386/helper2.c @@ -120,6 +120,7 @@ CPUX86State *cpu_x86_init(const char *cpu_model) typedef struct x86_def_t { const char *name; uint32_t vendor1, vendor2, vendor3; + char model_id[48]; int family; int model; int stepping; @@ -255,7 +256,21 @@ static int cpu_x86_find_by_name(x86_def_t *x86_cpu_def, const char *cpu_model) goto error; } x86_cpu_def->stepping = stepping; - } else { + } else if (!strcmp(featurestr, "vendor")) { + if (strlen(val) != 12) { + fprintf(stderr, "vendor string must be 12 chars long\n"); + x86_cpu_def = 0; + goto error; + } + x86_cpu_def->vendor1 = x86_cpu_def->vendor2 = x86_cpu_def->vendor3 = 0; + for(i = 0; i < 4; i++) { + x86_cpu_def->vendor1 |= ((unsigned char)val[i ]) << (8 * i); + x86_cpu_def->vendor2 |= ((unsigned char)val[i + 4]) << (8 * i); + x86_cpu_def->vendor3 |= ((unsigned char)val[i + 8]) << (8 * i); + } + } else if (!strcmp(featurestr, "model_id")) + strncpy(x86_cpu_def->model_id, val, 48); + else { fprintf(stderr, "unrecognized feature %s\n", featurestr); x86_cpu_def = 0; goto error; @@ -316,13 +331,14 @@ static int cpu_x86_register (CPUX86State *env, const char *cpu_model) env->cpuid_ext3_features = def->ext3_features; { const char *model_id = "QEMU Virtual CPU version " QEMU_VERSION; - int c, len, i; - len = strlen(model_id); + int c = -1, i; + + if (def->model_id[0] != '\0') + model_id = def->model_id; + for(i = 0; i < 48; i++) { - if (i >= len) - c = '\0'; - else - c = model_id[i]; + if (c != '\0') + c = (unsigned char)model_id[i]; env->cpuid_model[i >> 2] |= c << (8 * (i & 3)); } }