]> xenbits.xensource.com Git - libvirt.git/commitdiff
util: pull CPUID helper function out of CPU driver
authorDaniel P. Berrangé <berrange@redhat.com>
Fri, 10 Dec 2021 16:14:49 +0000 (16:14 +0000)
committerDaniel P. Berrangé <berrange@redhat.com>
Tue, 14 Dec 2021 16:04:17 +0000 (16:04 +0000)
This will be needed directly in the QEMU driver in a later patch.

Reviewed-by: Peter Krempa <pkrempa@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
src/cpu/cpu_x86.c
src/libvirt_private.syms
src/util/virhostcpu.c
src/util/virhostcpu.h

index 0b2ff82d4078b1f100ad617d6c6a72ad2199651b..5cb9caef8a248b731716b3f6d8b5e6b8212417ed 100644 (file)
@@ -2377,34 +2377,12 @@ virCPUx86DataCheckFeature(const virCPUData *data,
 static inline void
 cpuidCall(virCPUx86CPUID *cpuid)
 {
-# if __x86_64__
-    asm("xor %%ebx, %%ebx;" /* clear the other registers as some cpuid */
-        "xor %%edx, %%edx;" /* functions may use them as additional arguments */
-        "cpuid;"
-        : "=a" (cpuid->eax),
-          "=b" (cpuid->ebx),
-          "=c" (cpuid->ecx),
-          "=d" (cpuid->edx)
-        : "a" (cpuid->eax_in),
-          "c" (cpuid->ecx_in));
-# else
-    /* we need to avoid direct use of ebx for CPUID output as it is used
-     * for global offset table on i386 with -fPIC
-     */
-    asm("push %%ebx;"
-        "xor %%ebx, %%ebx;" /* clear the other registers as some cpuid */
-        "xor %%edx, %%edx;" /* functions may use them as additional arguments */
-        "cpuid;"
-        "mov %%ebx, %1;"
-        "pop %%ebx;"
-        : "=a" (cpuid->eax),
-          "=r" (cpuid->ebx),
-          "=c" (cpuid->ecx),
-          "=d" (cpuid->edx)
-        : "a" (cpuid->eax_in),
-          "c" (cpuid->ecx_in)
-        : "cc");
-# endif
+    virHostCPUX86GetCPUID(cpuid->eax_in,
+                          cpuid->ecx_in,
+                          &cpuid->eax,
+                          &cpuid->ebx,
+                          &cpuid->ecx,
+                          &cpuid->edx);
 }
 
 
index 4e9b616621b98e49aab14043d045548adda87f6e..f5a816b002fcbd854485f4433beee18a0ec818be 100644 (file)
@@ -2416,6 +2416,7 @@ virHostCPUGetThreadsPerSubcore;
 virHostCPUHasBitmap;
 virHostCPUReadSignature;
 virHostCPUStatsAssign;
+virHostCPUX86GetCPUID;
 
 
 # util/virhostmem.h
index 54e2462a952e0a179407d26683773700e816febe..a07c00a0e9ca3bc407166501b95933aeb67bd5b0 100644 (file)
@@ -1583,3 +1583,61 @@ virHostCPUGetHaltPollTime(pid_t pid,
 
     return 0;
 }
+
+void
+virHostCPUX86GetCPUID(uint32_t leaf G_GNUC_UNUSED,
+                      uint32_t extended G_GNUC_UNUSED,
+                      uint32_t *eax,
+                      uint32_t *ebx,
+                      uint32_t *ecx,
+                      uint32_t *edx)
+{
+#if defined(__i386__) || defined(__x86_64__)
+    uint32_t out[4];
+# if __x86_64__
+    asm("xor %%ebx, %%ebx;" /* clear the other registers as some cpuid */
+        "xor %%edx, %%edx;" /* functions may use them as additional arguments */
+        "cpuid;"
+        : "=a" (out[0]),
+          "=b" (out[1]),
+          "=c" (out[2]),
+          "=d" (out[3])
+        : "a" (leaf),
+          "c" (extended));
+# else
+    /* we need to avoid direct use of ebx for CPUID output as it is used
+     * for global offset table on i386 with -fPIC
+     */
+    asm("push %%ebx;"
+        "xor %%ebx, %%ebx;" /* clear the other registers as some cpuid */
+        "xor %%edx, %%edx;" /* functions may use them as additional arguments */
+        "cpuid;"
+        "mov %%ebx, %1;"
+        "pop %%ebx;"
+        : "=a" (out[0]),
+          "=r" (out[1]),
+          "=c" (out[2]),
+          "=d" (out[3])
+        : "a" (leaf),
+          "c" (extended)
+        : "cc");
+# endif
+    if (eax)
+        *eax = out[0];
+    if (ebx)
+        *ebx = out[1];
+    if (ecx)
+        *ecx = out[2];
+    if (edx)
+        *edx = out[3];
+#else
+    if (eax)
+        *eax = 0;
+    if (ebx)
+        *ebx = 0;
+    if (ecx)
+        *ecx = 0;
+    if (edx)
+        *edx = 0;
+#endif
+}
index a96dd5afbaa342c84326db2fc612555a64cba288..86a231daa29fe9e2a6ac4f47df824d64bb7f9ec6 100644 (file)
@@ -89,3 +89,10 @@ int virHostCPUGetSignature(char **signature);
 int virHostCPUGetHaltPollTime(pid_t pid,
                               unsigned long long *haltPollSuccess,
                               unsigned long long *haltPollFail);
+
+void virHostCPUX86GetCPUID(uint32_t leaf,
+                           uint32_t extended,
+                           uint32_t *eax,
+                           uint32_t *ebx,
+                           uint32_t *ecx,
+                           uint32_t *edx);