Would you consider the following patch, that allows users to set two important x86 cpu options from the command line? (the vendor and model_id strings)
Every once in a while I am resending this little patch. It had generated a lot of interest when it included silly bugs, but now it seems to be largely ignored. However, it is important if one would like qemu to impersonate a cpu closely as possible. Regards, Dan. commit 04433bad959a7a4c1b8a0c22bd50eab9bf181b32 Author: Dan Kenigsberg <[EMAIL PROTECTED]> Date: Thu Dec 20 15:43:15 2007 +0200 Change vendor string and model id from the -cpu command line option diff --git a/target-i386/helper2.c b/target-i386/helper2.c index 551a0d8..b59bf92 100644 --- a/target-i386/helper2.c +++ b/target-i386/helper2.c @@ -121,6 +121,7 @@ typedef struct x86_def_t { const char *name; uint32_t level; uint32_t vendor1, vendor2, vendor3; + char model_id[48]; int family; int model; int stepping; @@ -262,7 +263,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; @@ -323,13 +338,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)); } }