From: Glauber de Oliveira Costa <gcosta@redhat.com> To: linux-kernel@vger.kernel.org Cc: akpm@linux-foundation.org, glommer@gmail.com, tglx@linutronix.de, mingo@elte.hu, ehabkost@redhat.com, jeremy@goop.org, avi@qumranet.com, anthony@codemonkey.ws, virtualization@lists.linux-foundation.org, rusty@rustcorp.com.au, ak@suse.de, chrisw@sous-sol.org, rostedt@goodmis.org, hpa@zytor.com, Glauber de Oliveira Costa <gcosta@redhat.com> Subject: [PATCH 6/10] introduce native_read_tscp Date: Tue, 4 Dec 2007 09:10:00 -0200 [thread overview] Message-ID: <11967666351395-git-send-email-gcosta@redhat.com> (raw) In-Reply-To: <11967666303321-git-send-email-gcosta@redhat.com> 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> --- arch/x86/kernel/vsyscall_64.c | 4 ++-- arch/x86/vdso/vgetcpu.c | 4 ++-- include/asm-x86/msr.h | 29 +++++++++++++++++++++-------- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/arch/x86/kernel/vsyscall_64.c b/arch/x86/kernel/vsyscall_64.c index ad4005c..1425d02 100644 --- a/arch/x86/kernel/vsyscall_64.c +++ b/arch/x86/kernel/vsyscall_64.c @@ -190,7 +190,7 @@ time_t __vsyscall(1) vtime(time_t *t) long __vsyscall(2) vgetcpu(unsigned *cpu, unsigned *node, struct getcpu_cache *tcache) { - unsigned int dummy, p; + unsigned int p; unsigned long j = 0; /* Fast cache - only recompute value once per jiffies and avoid @@ -205,7 +205,7 @@ vgetcpu(unsigned *cpu, unsigned *node, struct getcpu_cache *tcache) p = tcache->blob[1]; } else if (__vgetcpu_mode == VGETCPU_RDTSCP) { /* Load per CPU data from RDTSCP */ - rdtscp(dummy, dummy, p); + native_read_tscp(&p); } else { /* Load per CPU data from GDT */ asm("lsl %1,%0" : "=r" (p) : "r" (__PER_CPU_SEG)); diff --git a/arch/x86/vdso/vgetcpu.c b/arch/x86/vdso/vgetcpu.c index 3b1ae1a..c8097f1 100644 --- a/arch/x86/vdso/vgetcpu.c +++ b/arch/x86/vdso/vgetcpu.c @@ -15,11 +15,11 @@ long __vdso_getcpu(unsigned *cpu, unsigned *node, struct getcpu_cache *unused) { - unsigned int dummy, p; + unsigned int p; if (*vdso_vgetcpu_mode == VGETCPU_RDTSCP) { /* Load per CPU data from RDTSCP */ - rdtscp(dummy, dummy, p); + native_read_tscp(&p); } else { /* Load per CPU data from GDT */ asm("lsl %1,%0" : "=r" (p) : "r" (__PER_CPU_SEG)); diff --git a/include/asm-x86/msr.h b/include/asm-x86/msr.h index 5fa30bd..0296358 100644 --- a/include/asm-x86/msr.h +++ b/include/asm-x86/msr.h @@ -3,6 +3,27 @@ #include <asm/msr-index.h> +#ifdef __KERNEL__ +#ifndef __ASSEMBLY__ +static inline unsigned long long native_read_tscp(int *aux) +{ + unsigned long low, high; + asm volatile (".byte 0x0f,0x01,0xf9" + : "=a" (low), "=d" (high), "=c" (*aux)); + return low | ((u64)high >> 32); +} + +#define rdtscp(low, high, aux) \ + do { \ + unsigned long long _val = native_read_tscp(&(aux)); \ + (low) = (u32)_val; \ + (high) = (u32)(_val >> 32); \ + } while (0) + +#define rdtscpll(val, aux) (val) = native_read_tscp(&(aux)) +#endif +#endif + #ifdef __i386__ #ifdef __KERNEL__ @@ -206,8 +227,6 @@ static inline int wrmsr_safe(u32 __msr, u32 __low, u32 __high) #define rdtscl(low) \ __asm__ __volatile__ ("rdtsc" : "=a" (low) : : "edx") -#define rdtscp(low,high,aux) \ - asm volatile (".byte 0x0f,0x01,0xf9" : "=a" (low), "=d" (high), "=c" (aux)) #define rdtscll(val) do { \ unsigned int __a,__d; \ @@ -215,12 +234,6 @@ static inline int wrmsr_safe(u32 __msr, u32 __low, u32 __high) (val) = ((unsigned long)__a) | (((unsigned long)__d)<<32); \ } while(0) -#define rdtscpll(val, aux) do { \ - unsigned long __a, __d; \ - asm volatile (".byte 0x0f,0x01,0xf9" : "=a" (__a), "=d" (__d), "=c" (aux)); \ - (val) = (__d << 32) | __a; \ -} while (0) - #define write_tsc(val1,val2) wrmsr(0x10, val1, val2) #define write_rdtscp_aux(val) wrmsr(0xc0000103, val, 0) -- 1.4.4.2
WARNING: multiple messages have this Message-ID (diff)
From: Glauber de Oliveira Costa <gcosta@redhat.com> To: linux-kernel@vger.kernel.org Cc: ehabkost@redhat.com, ak@suse.de, virtualization@lists.linux-foundation.org, chrisw@sous-sol.org, tglx@linutronix.de, anthony@codemonkey.ws, hpa@zytor.com, akpm@linux-foundation.org, Glauber de Oliveira Costa <gcosta@redhat.com>, mingo@elte.hu Subject: [PATCH 6/10] introduce native_read_tscp Date: Tue, 4 Dec 2007 09:10:00 -0200 [thread overview] Message-ID: <11967666351395-git-send-email-gcosta@redhat.com> (raw) In-Reply-To: <11967666303321-git-send-email-gcosta@redhat.com> 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> --- arch/x86/kernel/vsyscall_64.c | 4 ++-- arch/x86/vdso/vgetcpu.c | 4 ++-- include/asm-x86/msr.h | 29 +++++++++++++++++++++-------- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/arch/x86/kernel/vsyscall_64.c b/arch/x86/kernel/vsyscall_64.c index ad4005c..1425d02 100644 --- a/arch/x86/kernel/vsyscall_64.c +++ b/arch/x86/kernel/vsyscall_64.c @@ -190,7 +190,7 @@ time_t __vsyscall(1) vtime(time_t *t) long __vsyscall(2) vgetcpu(unsigned *cpu, unsigned *node, struct getcpu_cache *tcache) { - unsigned int dummy, p; + unsigned int p; unsigned long j = 0; /* Fast cache - only recompute value once per jiffies and avoid @@ -205,7 +205,7 @@ vgetcpu(unsigned *cpu, unsigned *node, struct getcpu_cache *tcache) p = tcache->blob[1]; } else if (__vgetcpu_mode == VGETCPU_RDTSCP) { /* Load per CPU data from RDTSCP */ - rdtscp(dummy, dummy, p); + native_read_tscp(&p); } else { /* Load per CPU data from GDT */ asm("lsl %1,%0" : "=r" (p) : "r" (__PER_CPU_SEG)); diff --git a/arch/x86/vdso/vgetcpu.c b/arch/x86/vdso/vgetcpu.c index 3b1ae1a..c8097f1 100644 --- a/arch/x86/vdso/vgetcpu.c +++ b/arch/x86/vdso/vgetcpu.c @@ -15,11 +15,11 @@ long __vdso_getcpu(unsigned *cpu, unsigned *node, struct getcpu_cache *unused) { - unsigned int dummy, p; + unsigned int p; if (*vdso_vgetcpu_mode == VGETCPU_RDTSCP) { /* Load per CPU data from RDTSCP */ - rdtscp(dummy, dummy, p); + native_read_tscp(&p); } else { /* Load per CPU data from GDT */ asm("lsl %1,%0" : "=r" (p) : "r" (__PER_CPU_SEG)); diff --git a/include/asm-x86/msr.h b/include/asm-x86/msr.h index 5fa30bd..0296358 100644 --- a/include/asm-x86/msr.h +++ b/include/asm-x86/msr.h @@ -3,6 +3,27 @@ #include <asm/msr-index.h> +#ifdef __KERNEL__ +#ifndef __ASSEMBLY__ +static inline unsigned long long native_read_tscp(int *aux) +{ + unsigned long low, high; + asm volatile (".byte 0x0f,0x01,0xf9" + : "=a" (low), "=d" (high), "=c" (*aux)); + return low | ((u64)high >> 32); +} + +#define rdtscp(low, high, aux) \ + do { \ + unsigned long long _val = native_read_tscp(&(aux)); \ + (low) = (u32)_val; \ + (high) = (u32)(_val >> 32); \ + } while (0) + +#define rdtscpll(val, aux) (val) = native_read_tscp(&(aux)) +#endif +#endif + #ifdef __i386__ #ifdef __KERNEL__ @@ -206,8 +227,6 @@ static inline int wrmsr_safe(u32 __msr, u32 __low, u32 __high) #define rdtscl(low) \ __asm__ __volatile__ ("rdtsc" : "=a" (low) : : "edx") -#define rdtscp(low,high,aux) \ - asm volatile (".byte 0x0f,0x01,0xf9" : "=a" (low), "=d" (high), "=c" (aux)) #define rdtscll(val) do { \ unsigned int __a,__d; \ @@ -215,12 +234,6 @@ static inline int wrmsr_safe(u32 __msr, u32 __low, u32 __high) (val) = ((unsigned long)__a) | (((unsigned long)__d)<<32); \ } while(0) -#define rdtscpll(val, aux) do { \ - unsigned long __a, __d; \ - asm volatile (".byte 0x0f,0x01,0xf9" : "=a" (__a), "=d" (__d), "=c" (aux)); \ - (val) = (__d << 32) | __a; \ -} while (0) - #define write_tsc(val1,val2) wrmsr(0x10, val1, val2) #define write_rdtscp_aux(val) wrmsr(0xc0000103, val, 0) -- 1.4.4.2
next prev parent reply other threads:[~2007-12-04 13:56 UTC|newest] Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top 2007-12-04 11:09 [PATCH 0/10] Integrate msr.h Glauber de Oliveira Costa 2007-12-04 11:09 ` [PATCH 1/10] Wipe out traditional opt from x86_64 Makefile Glauber de Oliveira Costa 2007-12-04 11:09 ` Glauber de Oliveira Costa 2007-12-04 11:09 ` [PATCH 2/10] unify msr smp funcs Glauber de Oliveira Costa 2007-12-04 11:09 ` Glauber de Oliveira Costa 2007-12-04 11:09 ` [PATCH 3/10] allow sched clock to be overridden by paravirt Glauber de Oliveira Costa 2007-12-04 11:09 ` Glauber de Oliveira Costa 2007-12-04 11:09 ` [PATCH 4/10] split get_cycles_sync Glauber de Oliveira Costa 2007-12-04 11:09 ` [PATCH 5/10] unify cpuid functions Glauber de Oliveira Costa 2007-12-04 11:09 ` Glauber de Oliveira Costa 2007-12-04 11:10 ` Glauber de Oliveira Costa [this message] 2007-12-04 11:10 ` [PATCH 6/10] introduce native_read_tscp Glauber de Oliveira Costa 2007-12-04 11:10 ` [PATCH 7/10] change rdpmc interface Glauber de Oliveira Costa 2007-12-04 11:10 ` Glauber de Oliveira Costa 2007-12-04 11:10 ` [PATCH 8/10] change write msr functions interface Glauber de Oliveira Costa 2007-12-04 11:10 ` Glauber de Oliveira Costa 2007-12-04 11:10 ` [PATCH 9/10] make fixups wordsize agnostic Glauber de Oliveira Costa 2007-12-04 11:10 ` Glauber de Oliveira Costa 2007-12-04 11:10 ` [PATCH 10/10] integrate i386 and x86_64 code in msr.h Glauber de Oliveira Costa 2007-12-04 11:10 ` Glauber de Oliveira Costa 2007-12-04 11:09 ` [PATCH 4/10] split get_cycles_sync Glauber de Oliveira Costa 2007-12-04 13:56 ` [PATCH 3/10] allow sched clock to be overridden by paravirt Andi Kleen 2007-12-04 13:56 ` Andi Kleen 2007-12-04 14:09 ` [PATCH 0/10] Integrate msr.h Ingo Molnar 2007-12-04 15:47 ` Glauber de Oliveira Costa 2007-12-04 15:47 ` Glauber de Oliveira Costa 2007-12-04 14:09 ` Ingo Molnar 2007-12-04 16:03 [PATCH 0/10 - V2] msr.h integration - fixups Glauber de Oliveira Costa 2007-12-04 16:03 ` [PATCH 1/10] Wipe out traditional opt from x86_64 Makefile Glauber de Oliveira Costa 2007-12-04 16:03 ` [PATCH 2/10] unify msr smp funcs Glauber de Oliveira Costa 2007-12-04 16:03 ` [PATCH 3/10] allow sched clock to be overridden by paravirt Glauber de Oliveira Costa 2007-12-04 16:03 ` [PATCH 4/10] split get_cycles_sync Glauber de Oliveira Costa 2007-12-04 16:03 ` [PATCH 5/10] unify cpuid functions Glauber de Oliveira Costa 2007-12-04 16:03 ` [PATCH 6/10] introduce native_read_tscp Glauber de Oliveira Costa 2007-12-04 16:03 ` Glauber de Oliveira Costa
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=11967666351395-git-send-email-gcosta@redhat.com \ --to=gcosta@redhat.com \ --cc=ak@suse.de \ --cc=akpm@linux-foundation.org \ --cc=anthony@codemonkey.ws \ --cc=avi@qumranet.com \ --cc=chrisw@sous-sol.org \ --cc=ehabkost@redhat.com \ --cc=glommer@gmail.com \ --cc=hpa@zytor.com \ --cc=jeremy@goop.org \ --cc=linux-kernel@vger.kernel.org \ --cc=mingo@elte.hu \ --cc=rostedt@goodmis.org \ --cc=rusty@rustcorp.com.au \ --cc=tglx@linutronix.de \ --cc=virtualization@lists.linux-foundation.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.