From 2aedbbcdd0743d22166afbd07561d58b60bd6d99 Mon Sep 17 00:00:00 2001 From: Andi Kleen Date: Wed, 30 Jan 2008 13:32:38 +0100 Subject: [PATCH] --- yaml --- r: 80152 b: refs/heads/master c: fde1b3fa947c2512e3715962ebb1d3a6a9b9bb7d h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/include/asm-x86/system.h | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index cbb0aa00e2bc..7cf68559acc3 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 2a10e7c41254941cac87be1eccdcb6379ce097f5 +refs/heads/master: fde1b3fa947c2512e3715962ebb1d3a6a9b9bb7d diff --git a/trunk/include/asm-x86/system.h b/trunk/include/asm-x86/system.h index 6c7d1fda4995..39474f2957a3 100644 --- a/trunk/include/asm-x86/system.h +++ b/trunk/include/asm-x86/system.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -395,5 +396,17 @@ void default_idle(void); #define set_mb(var, value) do { var = value; barrier(); } while (0) #endif +/* + * Stop RDTSC speculation. This is needed when you need to use RDTSC + * (or get_cycles or vread that possibly accesses the TSC) in a defined + * code region. + * + * (Could use an alternative three way for this if there was one.) + */ +static inline void rdtsc_barrier(void) +{ + alternative(ASM_NOP3, "mfence", X86_FEATURE_MFENCE_RDTSC); + alternative(ASM_NOP3, "lfence", X86_FEATURE_LFENCE_RDTSC); +} #endif