diff options
author | Glauber de Oliveira Costa <gcosta@redhat.com> | 2008-01-30 07:32:05 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-01-30 07:32:05 -0500 |
commit | e5aaac443635c7c6f842f0bf8169f71f3236d574 (patch) | |
tree | 6be4f1a7cd3e0b1614ea2bbeefcea42d9b1fffc9 /include/asm-x86/paravirt.h | |
parent | f72a9ef979c5a828c64deb88ebba743f7d899907 (diff) |
x86: provide paravirtualized hook for rdtscp
This patch adds a field in pv_cpu_ops for a paravirtualized hook
for rdtscp, needed for x86_64.
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/paravirt.h')
-rw-r--r-- | include/asm-x86/paravirt.h | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/include/asm-x86/paravirt.h b/include/asm-x86/paravirt.h index 66290f58e939..8f7984319c30 100644 --- a/include/asm-x86/paravirt.h +++ b/include/asm-x86/paravirt.h | |||
@@ -120,6 +120,7 @@ struct pv_cpu_ops { | |||
120 | 120 | ||
121 | u64 (*read_tsc)(void); | 121 | u64 (*read_tsc)(void); |
122 | u64 (*read_pmc)(int counter); | 122 | u64 (*read_pmc)(int counter); |
123 | unsigned long long (*read_tscp)(unsigned int *aux); | ||
123 | 124 | ||
124 | /* These two are jmp to, not actually called. */ | 125 | /* These two are jmp to, not actually called. */ |
125 | void (*irq_enable_syscall_ret)(void); | 126 | void (*irq_enable_syscall_ret)(void); |
@@ -668,6 +669,27 @@ static inline unsigned long long paravirt_read_pmc(int counter) | |||
668 | high = _l >> 32; \ | 669 | high = _l >> 32; \ |
669 | } while(0) | 670 | } while(0) |
670 | 671 | ||
672 | static inline unsigned long long paravirt_rdtscp(unsigned int *aux) | ||
673 | { | ||
674 | return PVOP_CALL1(u64, pv_cpu_ops.read_tscp, aux); | ||
675 | } | ||
676 | |||
677 | #define rdtscp(low, high, aux) \ | ||
678 | do { \ | ||
679 | int __aux; \ | ||
680 | unsigned long __val = paravirt_rdtscp(&__aux); \ | ||
681 | (low) = (u32)__val; \ | ||
682 | (high) = (u32)(__val >> 32); \ | ||
683 | (aux) = __aux; \ | ||
684 | } while (0) | ||
685 | |||
686 | #define rdtscpll(val, aux) \ | ||
687 | do { \ | ||
688 | unsigned long __aux; \ | ||
689 | val = paravirt_rdtscp(&__aux); \ | ||
690 | (aux) = __aux; \ | ||
691 | } while (0) | ||
692 | |||
671 | static inline void load_TR_desc(void) | 693 | static inline void load_TR_desc(void) |
672 | { | 694 | { |
673 | PVOP_VCALL0(pv_cpu_ops.load_tr_desc); | 695 | PVOP_VCALL0(pv_cpu_ops.load_tr_desc); |