]> xenbits.xensource.com Git - libvirt.git/commitdiff
cpu: Add recently added cpu feature flags.
authorPeter Krempa <pkrempa@redhat.com>
Wed, 24 Oct 2012 13:10:51 +0000 (15:10 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Wed, 24 Oct 2012 15:36:03 +0000 (17:36 +0200)
Qemu has added some new feature flags. This patch adds them to libvirt.

The new features are for the cpuid function 0x7 that takes an argument
in the ecx register. Currently only 0x0 is used as the argument so I was
lazy and I just clear the registers to 0 before calling cpuid. In future
when there maybe will be some other possible arguments, we will need to
improve the cpu detection code to take this into account.

src/cpu/cpu_map.xml
src/cpu/cpu_x86.c

index affcce35efdcbd9904e6b4f239297ccfb236296d..d059e2036b27bae85c5f400180775fe2c2fc8b84 100644 (file)
     <feature name='pdcm'>
       <cpuid function='0x00000001' ecx='0x00008000'/>
     </feature>
+    <feature name='pcid'>
+      <cpuid function='0x00000001' ecx='0x00020000'/>
+    </feature>
     <feature name='dca'> <!-- CPUID_EXT_DCA -->
       <cpuid function='0x00000001' ecx='0x00040000'/>
     </feature>
       <cpuid function='0x80000001' ecx='0x00080000'/>
     </feature>
 
+    <!-- cpuid function 0x7 ecx 0x0 features -->
+    <!-- We support only ecx 0x0 now as it's done by a workaround -->
+    <feature name='smep'>
+      <cpuid function='0x00000007' ebx='0x00000080'/>
+    </feature>
+    <feature name='smap'>
+      <cpuid function='0x00000007' ebx='0x00080000'/>
+    </feature>
+
     <!-- models -->
     <model name='486'>
       <feature name='fpu'/>
index 7cd67b8f7754ce37243e11ec5738ea23a2b1cca3..e691c04a27f428656b9a9f7fde6173ef53a2f57f 100644 (file)
@@ -1539,7 +1539,10 @@ static inline void
 cpuidCall(struct cpuX86cpuid *cpuid)
 {
 # if __x86_64__
-    asm("cpuid"
+    asm("xor %%ebx, %%ebx;" /* clear the other registers as some cpuid */
+        "xor %%ecx, %%ecx;" /* functions may use them as additional */
+        "xor %%edx, %%edx;" /* arguments */
+        "cpuid;"
         : "=a" (cpuid->eax),
           "=b" (cpuid->ebx),
           "=c" (cpuid->ecx),
@@ -1550,6 +1553,9 @@ cpuidCall(struct cpuX86cpuid *cpuid)
      * for global offset table on i386 with -fPIC
      */
     asm("push %%ebx;"
+        "xor %%ebx, %%ebx;" /* clear the other registers as some cpuid */
+        "xor %%ecx, %%ecx;" /* functions may use them as additional */
+        "xor %%edx, %%edx;" /* arguments */
         "cpuid;"
         "mov %%ebx, %1;"
         "pop %%ebx;"