diff options
author | Glauber de Oliveira Costa <gcosta@redhat.com> | 2008-01-30 07:31:06 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-01-30 07:31:06 -0500 |
commit | 8f12dea6135d0a55b151dcb4c6bbe211f5f8d35d (patch) | |
tree | 3c4c486ffb318aa90e0bf75402d22348f7ae1525 /include/asm-x86/msr.h | |
parent | c758ecf62ad94ddfeb4e7d8a5498bdcb2e3c85db (diff) |
x86: introduce native_read_tscp
Targetting paravirt, this patch introduces native_read_tscp, in
place of rdtscp() macro. When in a paravirt guest, this will
involve a function call, and thus, cannot be done in the vdso area.
These users then have to call the native version directly
Signed-off-by: Glauber de Oliveira Costa <gcosta@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'include/asm-x86/msr.h')
-rw-r--r-- | include/asm-x86/msr.h | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/include/asm-x86/msr.h b/include/asm-x86/msr.h index 0648b2d57a38..b6262e99fc8e 100644 --- a/include/asm-x86/msr.h +++ b/include/asm-x86/msr.h | |||
@@ -7,6 +7,27 @@ | |||
7 | # include <linux/types.h> | 7 | # include <linux/types.h> |
8 | #endif | 8 | #endif |
9 | 9 | ||
10 | #ifdef __KERNEL__ | ||
11 | #ifndef __ASSEMBLY__ | ||
12 | static inline unsigned long long native_read_tscp(int *aux) | ||
13 | { | ||
14 | unsigned long low, high; | ||
15 | asm volatile (".byte 0x0f,0x01,0xf9" | ||
16 | : "=a" (low), "=d" (high), "=c" (*aux)); | ||
17 | return low | ((u64)high >> 32); | ||
18 | } | ||
19 | |||
20 | #define rdtscp(low, high, aux) \ | ||
21 | do { \ | ||
22 | unsigned long long _val = native_read_tscp(&(aux)); \ | ||
23 | (low) = (u32)_val; \ | ||
24 | (high) = (u32)(_val >> 32); \ | ||
25 | } while (0) | ||
26 | |||
27 | #define rdtscpll(val, aux) (val) = native_read_tscp(&(aux)) | ||
28 | #endif | ||
29 | #endif | ||
30 | |||
10 | #ifdef __i386__ | 31 | #ifdef __i386__ |
11 | 32 | ||
12 | #ifdef __KERNEL__ | 33 | #ifdef __KERNEL__ |
@@ -178,8 +199,6 @@ static inline int wrmsr_safe(u32 __msr, u32 __low, u32 __high) | |||
178 | #define rdtscl(low) \ | 199 | #define rdtscl(low) \ |
179 | __asm__ __volatile__ ("rdtsc" : "=a" (low) : : "edx") | 200 | __asm__ __volatile__ ("rdtsc" : "=a" (low) : : "edx") |
180 | 201 | ||
181 | #define rdtscp(low,high,aux) \ | ||
182 | __asm__ __volatile__ (".byte 0x0f,0x01,0xf9" : "=a" (low), "=d" (high), "=c" (aux)) | ||
183 | 202 | ||
184 | #define rdtscll(val) do { \ | 203 | #define rdtscll(val) do { \ |
185 | unsigned int __a,__d; \ | 204 | unsigned int __a,__d; \ |
@@ -187,12 +206,6 @@ static inline int wrmsr_safe(u32 __msr, u32 __low, u32 __high) | |||
187 | (val) = ((unsigned long)__a) | (((unsigned long)__d)<<32); \ | 206 | (val) = ((unsigned long)__a) | (((unsigned long)__d)<<32); \ |
188 | } while(0) | 207 | } while(0) |
189 | 208 | ||
190 | #define rdtscpll(val, aux) do { \ | ||
191 | unsigned long __a, __d; \ | ||
192 | __asm__ __volatile__ (".byte 0x0f,0x01,0xf9" : "=a" (__a), "=d" (__d), "=c" (aux)); \ | ||
193 | (val) = (__d << 32) | __a; \ | ||
194 | } while (0) | ||
195 | |||
196 | #define write_tsc(val1,val2) wrmsr(0x10, val1, val2) | 209 | #define write_tsc(val1,val2) wrmsr(0x10, val1, val2) |
197 | 210 | ||
198 | #define write_rdtscp_aux(val) wrmsr(0xc0000103, val, 0) | 211 | #define write_rdtscp_aux(val) wrmsr(0xc0000103, val, 0) |