]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - include/asm-i386/tsc.h
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394...
[linux-2.6-omap-h63xx.git] / include / asm-i386 / tsc.h
index 84016ff481b9d2e5df72a2e8bb7411088d971d53..62c091ffcccc46f8940feb9eff7e4c1277cfea85 100644 (file)
@@ -35,8 +35,18 @@ static inline cycles_t get_cycles(void)
 static __always_inline cycles_t get_cycles_sync(void)
 {
        unsigned long long ret;
-#ifdef X86_FEATURE_SYNC_RDTSC
-       unsigned eax;
+       unsigned eax, edx;
+
+       /*
+        * Use RDTSCP if possible; it is guaranteed to be synchronous
+        * and doesn't cause a VMEXIT on Hypervisors
+        */
+       alternative_io(ASM_NOP3, ".byte 0x0f,0x01,0xf9", X86_FEATURE_RDTSCP,
+                      ASM_OUTPUT2("=a" (eax), "=d" (edx)),
+                      "a" (0U), "d" (0U) : "ecx", "memory");
+       ret = (((unsigned long long)edx) << 32) | ((unsigned long long)eax);
+       if (ret)
+               return ret;
 
        /*
         * Don't do an additional sync on CPUs where we know
@@ -44,16 +54,13 @@ static __always_inline cycles_t get_cycles_sync(void)
         */
        alternative_io("cpuid", ASM_NOP2, X86_FEATURE_SYNC_RDTSC,
                          "=a" (eax), "0" (1) : "ebx","ecx","edx","memory");
-#else
-       sync_core();
-#endif
        rdtscll(ret);
 
        return ret;
 }
 
 extern void tsc_init(void);
-extern void mark_tsc_unstable(void);
+extern void mark_tsc_unstable(char *reason);
 extern int unsynchronized_tsc(void);
 extern void init_tsc_clocksource(void);