qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH] x86 CPUID extended family/model


From: Andre Przywara
Subject: [Qemu-devel] [PATCH] x86 CPUID extended family/model
Date: Thu, 6 Nov 2008 14:33:12 +0100
User-agent: Thunderbird 2.0.0.14 (X11/20080508)

Hi,

(at least) AMD CPUs feature extended family/model bits in CPUID leaf 0000_0001|EAX. Refer to page 10 in:
http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/25481.pdf

Those bits are necessary to model newer AMD CPUs:
-cpu qemu64,family=15,model=65,stepping=3 or
-cpu qemu64,family=16,model=4,stepping=2

Attached patch introduces support for specifying those bits on the command line and passing them to the guest.
(Patch applies against qemu-svn and kvm-userspace)

Signed-off-by: Andre Przywara <address@hidden>

Regards,
Andre.

P.S. I heard of a way to propagate the host CPUID bits to the guest, like -cpu=host, but couldn't find any code. Did I miss something?

--
Andre Przywara
AMD-Operating System Research Center (OSRC), Dresden, Germany
Tel: +49 351 277-84917
----to satisfy European Law for business letters:
AMD Saxony Limited Liability Company & Co. KG,
Wilschdorfer Landstr. 101, 01109 Dresden, Germany
Register Court Dresden: HRA 4896, General Partner authorized
to represent: AMD Saxony LLC (Wilmington, Delaware, US)
General Manager of AMD Saxony LLC: Dr. Hans-R. Deppe, Thomas McCoy
Index: target-i386/helper.c
===================================================================
--- target-i386/helper.c        (revision 5639)
+++ target-i386/helper.c        (working copy)
@@ -337,7 +337,7 @@
             } else if (!strcmp(featurestr, "model")) {
                 char *err;
                 model = strtol(val, &err, 10);
-                if (!*val || *err || model < 0 || model > 0xf) {
+                if (!*val || *err || model < 0 || model > 0xff) {
                     fprintf(stderr, "bad numerical value %s\n", val);
                     goto error;
                 }
@@ -416,7 +416,12 @@
         env->cpuid_vendor3 = CPUID_VENDOR_INTEL_3;
     }
     env->cpuid_level = def->level;
-    env->cpuid_version = (def->family << 8) | (def->model << 4) | 
def->stepping;
+    if (def->family > 0x0F)
+        env->cpuid_version = 0xF00 | (def->family - 0x0F)<<20;
+    else
+        env->cpuid_version = def->family << 8;
+    env->cpuid_version |= (def->model & 0x0F) << 4;
+    env->cpuid_version |= def->stepping | (def->model>>4)<<16;
     env->cpuid_features = def->features;
     env->pat = 0x0007040600070406ULL;
     env->cpuid_ext_features = def->ext_features;

reply via email to

[Prev in Thread] Current Thread [Next in Thread]