Index: version_info.c
===================================================================
--- version_info.c	(revision 47492)
+++ version_info.c	(working copy)
@@ -607,20 +607,38 @@
 /*
  * Get the CPU info, and append it to the GString
  */
+
+#if defined(_WIN32)
+static void
+do_cpuid(int *CPUInfo, guint32 selector){
+	__cpuid(CPUInfo, selector);
+}
+#else
+static inline void
+do_cpuid(guint32 *CPUInfo, int selector)
+{
+			__asm__ __volatile__("cpuid"
+								: "=a" (CPUInfo[0]),
+								  "=b" (CPUInfo[1]),
+								  "=c" (CPUInfo[2]),
+								  "=d" (CPUInfo[3])
+								: "a"(selector));
+}
+#endif
+
 void get_cpu_info(GString *str _U_)
 {
-#if defined(_WIN32)
 	int CPUInfo[4];
 	char CPUBrandString[0x40];
 	unsigned    nExIds;
-
+#if defined(_WIN32)
 	MEMORYSTATUSEX statex;
-
+#endif
 	/* http://msdn.microsoft.com/en-us/library/hskdteyh(v=vs.100).aspx */
 
 	/* Calling __cpuid with 0x80000000 as the InfoType argument*/
     /* gets the number of valid extended IDs.*/
-    __cpuid(CPUInfo, 0x80000000);
+    do_cpuid(CPUInfo, 0x80000000);
     nExIds = CPUInfo[0];
 
 	if( nExIds<0x80000005)
@@ -628,22 +646,21 @@
     memset(CPUBrandString, 0, sizeof(CPUBrandString));
 
     /* Interpret CPU brand string.*/
-    __cpuid(CPUInfo, 0x80000002);
+    do_cpuid(CPUInfo, 0x80000002);
     memcpy(CPUBrandString, CPUInfo, sizeof(CPUInfo));
-    __cpuid(CPUInfo, 0x80000003);
+    do_cpuid(CPUInfo, 0x80000003);
     memcpy(CPUBrandString + 16, CPUInfo, sizeof(CPUInfo));
-    __cpuid(CPUInfo, 0x80000004);
+    do_cpuid(CPUInfo, 0x80000004);
     memcpy(CPUBrandString + 32, CPUInfo, sizeof(CPUInfo));
 
 	g_string_append_printf(str, "\n%s", CPUBrandString);
 
+#if defined(_WIN32)
 	statex.dwLength = sizeof (statex);
 	
 	if(GlobalMemoryStatusEx (&statex))
 		g_string_append_printf(str, ", with ""%" G_GINT64_MODIFIER "d" "MB of physical memory.\n", statex.ullTotalPhys/(1024*1024));
-
 #endif
-
 }
 
 /*
