[Libva] [PATCH 1/2] Use the inline CPUID assembly to obtain CPUID string instead of /proc/cpuinfo

Zhao Yakui yakui.zhao at intel.com
Wed Sep 24 00:13:52 PDT 2014


On some systems there is no access to /proc/cpuinfo. So the inline assembly
is used directly to detect the CPUID string.

Signed-off-by: Zhao Yakui <yakui.zhao at intel.com>
---
 src/i965_device_info.c |   46 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 46 insertions(+)

diff --git a/src/i965_device_info.c b/src/i965_device_info.c
index 5ebea2a..4ffba61 100755
--- a/src/i965_device_info.c
+++ b/src/i965_device_info.c
@@ -378,6 +378,7 @@ i965_get_device_info(int devid)
     }
 }
 
+#if 0
 static int intel_driver_detect_cpustring(char *model_id)
 {
     FILE *fp;
@@ -416,7 +417,52 @@ static int intel_driver_detect_cpustring(char *model_id)
     else
         return -EINVAL;
 }
+#else
+static inline void cpuid(unsigned int op,
+                         unsigned int *eax, unsigned int *ebx,
+                         unsigned int *ecx, unsigned int *edx)
+{
+        *eax = op;
+        *ecx = 0;
+        /* ecx is often an input as well as an output. */
+        asm volatile("cpuid"
+            : "=a" (*eax),
+              "=b" (*ebx),
+              "=c" (*ecx),
+              "=d" (*edx)
+            : "0" (*eax), "2" (*ecx)
+		:"memory");
+}
+
+/*
+ * This function doesn't check the length. And the caller should
+ * assure that the length of input string should be greater than 48.
+ */
+static int intel_driver_detect_cpustring(char *model_id)
+{
+    unsigned int *rdata;
 
+    if (model_id == NULL)
+        return -EINVAL;
+
+    rdata = (unsigned int *)model_id;
+
+    /* obtain the max supported extended CPUID info */
+    cpuid(0x80000000, &rdata[0], &rdata[1], &rdata[2], &rdata[3]);
+
+    /* If the max extended CPUID info is less than 0x80000004, fail */
+    if (rdata[0] < 0x80000004)
+	return -EINVAL;
+
+    /* obtain the CPUID string */
+    cpuid(0x80000002, &rdata[0], &rdata[1], &rdata[2], &rdata[3]);
+    cpuid(0x80000003, &rdata[4], &rdata[5], &rdata[6], &rdata[7]);
+    cpuid(0x80000004, &rdata[8], &rdata[9], &rdata[10], &rdata[11]);
+
+    *(model_id + 48) = '\0';
+    return 0;
+}
+#endif
 /*
  * the hook_list for HSW.
  * It is captured by /proc/cpuinfo and the space character is stripped.
-- 
1.7.10.1



More information about the Libva mailing list