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 10/10] integrate i386 and x86_64 code in msr.h Date: Tue, 4 Dec 2007 09:10:04 -0200 [thread overview] Message-ID: <11967666533444-git-send-email-gcosta@redhat.com> (raw) In-Reply-To: <11967666483411-git-send-email-gcosta@redhat.com> This patches proceeds with the integration of msr.h, making the code unified, instead of having a version for each architecture. We stick with the native_* functions, and then paravirt comes for free. Signed-off-by: Glauber de Oliveira Costa <gcosta@redhat.com> --- include/asm-x86/msr.h | 161 ++++++++++++++----------------------------------- 1 files changed, 46 insertions(+), 115 deletions(-) diff --git a/include/asm-x86/msr.h b/include/asm-x86/msr.h index f3a01ca..84116fa 100644 --- a/include/asm-x86/msr.h +++ b/include/asm-x86/msr.h @@ -5,6 +5,10 @@ #ifdef __KERNEL__ #ifndef __ASSEMBLY__ + +#include <asm/asm.h> +#include <asm/errno.h> + static inline unsigned long long native_read_tscp(int *aux) { unsigned long low, high; @@ -13,37 +17,36 @@ static inline unsigned long long native_read_tscp(int *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 +/* + * i386 calling convention returns 64-bit value in edx:eax, while + * x86_64 returns at rax. Also, the "A" constraint does not really + * mean rdx:rax in x86_64, so we need specialized behaviour for each + * architecture + */ +#ifdef CONFIG_X86_64 +#define DECLARE_ARGS(val, low, high) unsigned low, high +#define EAX_EDX_VAL(val, low, high) (low | ((u64)(high) << 32)) +#define EAX_EDX_ARGS(val, low, high) "a" (low), "d" (high) +#define EAX_EDX_RET(val, low, high) "=a" (low), "=d" (high) +#else +#define DECLARE_ARGS(val, low, high) unsigned long long val +#define EAX_EDX_VAL(val, low, high) (val) +#define EAX_EDX_ARGS(val, low, high) "A" (val) +#define EAX_EDX_RET(val, low, high) "=A" (val) #endif -#ifdef __i386__ - -#ifdef __KERNEL__ -#ifndef __ASSEMBLY__ - -#include <asm/asm.h> -#include <asm/errno.h> - static inline unsigned long long native_read_msr(unsigned int msr) { - unsigned long long val; + DECLARE_ARGS(val, low, high); - asm volatile("rdmsr" : "=A" (val) : "c" (msr)); - return val; + asm volatile("rdmsr" : EAX_EDX_RET(val, low, high) : "c" (msr)); + return EAX_EDX_VAL(val, low, high); } static inline unsigned long long native_read_msr_safe(unsigned int msr, int *err) { - unsigned long long val; + DECLARE_ARGS(val, low, high); asm volatile("2: rdmsr ; xor %0,%0\n" "1:\n\t" @@ -54,10 +57,9 @@ static inline unsigned long long native_read_msr_safe(unsigned int msr, _ASM_ALIGN "\n\t" _ASM_PTR " 2b,3b\n\t" ".previous" - : "=r" (*err), "=A" (val) + : "=r" (*err), EAX_EDX_RET(val, low, high) : "c" (msr), "i" (-EFAULT)); - - return val; + return EAX_EDX_VAL(val, low, high); } static inline void native_write_msr(unsigned int msr, @@ -87,16 +89,18 @@ static inline int native_write_msr_safe(unsigned int msr, static inline unsigned long long native_read_tsc(void) { - unsigned long long val; - asm volatile("rdtsc" : "=A" (val)); - return val; + DECLARE_ARGS(val, low, high); + + asm volatile("rdtsc" : EAX_EDX_RET(val, low, high)); + return EAX_EDX_VAL(val, low, high); } static inline unsigned long long native_read_pmc(int counter) { - unsigned long long val; - asm volatile("rdpmc" : "=A" (val) : "c" (counter)); - return val; + DECLARE_ARGS(val, low, high); + + asm volatile("rdpmc" : EAX_EDX_RET(val, low, high) : "c" (counter)); + return EAX_EDX_VAL(val, low, high); } #ifdef CONFIG_PARAVIRT @@ -124,7 +128,8 @@ static inline void wrmsr(unsigned msr, unsigned low, unsigned high) #define rdmsrl(msr,val) \ ((val) = native_read_msr(msr)) -#define wrmsrl(msr,val) native_write_msr(msr, (u32)val, (u32)(val >> 32)) +#define wrmsrl(msr,val) \ + native_write_msr(msr, (u32)((u64)(val)), (u32)((u64)(val) >> 32)) /* wrmsr with exception handling */ static inline int wrmsr_safe(unsigned msr, unsigned low, unsigned high) @@ -156,101 +161,25 @@ static inline int wrmsr_safe(unsigned msr, unsigned low, unsigned high) (low) = (u32)_l; \ (high) = (u32)(_l >> 32); \ } while(0) -#endif /* !CONFIG_PARAVIRT */ - -#endif /* ! __ASSEMBLY__ */ -#endif /* __KERNEL__ */ -#else /* __i386__ */ - -#ifndef __ASSEMBLY__ -#include <linux/errno.h> -/* - * Access to machine-specific registers (available on 586 and better only) - * Note: the rd* operations modify the parameters directly (without using - * pointer indirection), this allows gcc to optimize better - */ - -#define rdmsr(msr,val1,val2) \ - __asm__ __volatile__("rdmsr" \ - : "=a" (val1), "=d" (val2) \ - : "c" (msr)) - - -#define rdmsrl(msr,val) do { unsigned long a__,b__; \ - __asm__ __volatile__("rdmsr" \ - : "=a" (a__), "=d" (b__) \ - : "c" (msr)); \ - val = a__ | (b__<<32); \ -} while(0) +#define rdtscp(low, high, aux) \ + do { \ + unsigned long long _val = native_read_tscp(&(aux)); \ + (low) = (u32)_val; \ + (high) = (u32)(_val >> 32); \ + } while (0) -#define wrmsr(msr,val1,val2) \ - __asm__ __volatile__("wrmsr" \ - : /* no outputs */ \ - : "c" (msr), "a" (val1), "d" (val2)) +#define rdtscpll(val, aux) (val) = native_read_tscp(&(aux)) -#define wrmsrl(msr,val) wrmsr(msr,(__u32)((__u64)(val)),((__u64)(val))>>32) +#endif /* !CONFIG_PARAVIRT */ -/* wrmsr with exception handling */ -#define wrmsr_safe(msr,a,b) ({ int ret__; \ - asm volatile("2: wrmsr ; xorl %0,%0\n" \ - "1:\n\t" \ - ".section .fixup,\"ax\"\n\t" \ - "3: movl %4,%0 ; jmp 1b\n\t" \ - ".previous\n\t" \ - ".section __ex_table,\"a\"\n" \ - " .align 8\n\t" \ - " .quad 2b,3b\n\t" \ - ".previous" \ - : "=a" (ret__) \ - : "c" (msr), "0" (a), "d" (b), "i" (-EFAULT)); \ - ret__; }) #define checking_wrmsrl(msr,val) wrmsr_safe(msr,(u32)(val),(u32)((val)>>32)) -#define rdmsr_safe(msr,a,b) \ - ({ int ret__; \ - asm volatile ("1: rdmsr\n" \ - "2:\n" \ - ".section .fixup,\"ax\"\n" \ - "3: movl %4,%0\n" \ - " jmp 2b\n" \ - ".previous\n" \ - ".section __ex_table,\"a\"\n" \ - " .align 8\n" \ - " .quad 1b,3b\n" \ - ".previous":"=&bDS" (ret__), "=a"(*(a)), "=d"(*(b)) \ - :"c"(msr), "i"(-EIO), "0"(0)); \ - ret__; }) - -#define rdtsc(low,high) \ - __asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high)) - -#define rdtscl(low) \ - __asm__ __volatile__ ("rdtsc" : "=a" (low) : : "edx") - - -#define rdtscll(val) do { \ - unsigned int __a,__d; \ - asm volatile("rdtsc" : "=a" (__a), "=d" (__d)); \ - (val) = ((unsigned long)__a) | (((unsigned long)__d)<<32); \ -} while(0) - #define write_tsc(val1,val2) wrmsr(0x10, val1, val2) #define write_rdtscp_aux(val) wrmsr(0xc0000103, val, 0) -#define rdpmc(counter,low,high) \ - __asm__ __volatile__("rdpmc" \ - : "=a" (low), "=d" (high) \ - : "c" (counter)) - -#endif /* __ASSEMBLY__ */ - -#endif /* !__i386__ */ - -#ifndef __ASSEMBLY__ - #ifdef CONFIG_SMP void rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h); void wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h); @@ -275,5 +204,7 @@ static inline int wrmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h) } #endif /* CONFIG_SMP */ #endif /* __ASSEMBLY__ */ +#endif /* __KERNEL__ */ + #endif -- 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 10/10] integrate i386 and x86_64 code in msr.h Date: Tue, 4 Dec 2007 09:10:04 -0200 [thread overview] Message-ID: <11967666533444-git-send-email-gcosta@redhat.com> (raw) In-Reply-To: <11967666483411-git-send-email-gcosta@redhat.com> This patches proceeds with the integration of msr.h, making the code unified, instead of having a version for each architecture. We stick with the native_* functions, and then paravirt comes for free. Signed-off-by: Glauber de Oliveira Costa <gcosta@redhat.com> --- include/asm-x86/msr.h | 161 ++++++++++++++----------------------------------- 1 files changed, 46 insertions(+), 115 deletions(-) diff --git a/include/asm-x86/msr.h b/include/asm-x86/msr.h index f3a01ca..84116fa 100644 --- a/include/asm-x86/msr.h +++ b/include/asm-x86/msr.h @@ -5,6 +5,10 @@ #ifdef __KERNEL__ #ifndef __ASSEMBLY__ + +#include <asm/asm.h> +#include <asm/errno.h> + static inline unsigned long long native_read_tscp(int *aux) { unsigned long low, high; @@ -13,37 +17,36 @@ static inline unsigned long long native_read_tscp(int *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 +/* + * i386 calling convention returns 64-bit value in edx:eax, while + * x86_64 returns at rax. Also, the "A" constraint does not really + * mean rdx:rax in x86_64, so we need specialized behaviour for each + * architecture + */ +#ifdef CONFIG_X86_64 +#define DECLARE_ARGS(val, low, high) unsigned low, high +#define EAX_EDX_VAL(val, low, high) (low | ((u64)(high) << 32)) +#define EAX_EDX_ARGS(val, low, high) "a" (low), "d" (high) +#define EAX_EDX_RET(val, low, high) "=a" (low), "=d" (high) +#else +#define DECLARE_ARGS(val, low, high) unsigned long long val +#define EAX_EDX_VAL(val, low, high) (val) +#define EAX_EDX_ARGS(val, low, high) "A" (val) +#define EAX_EDX_RET(val, low, high) "=A" (val) #endif -#ifdef __i386__ - -#ifdef __KERNEL__ -#ifndef __ASSEMBLY__ - -#include <asm/asm.h> -#include <asm/errno.h> - static inline unsigned long long native_read_msr(unsigned int msr) { - unsigned long long val; + DECLARE_ARGS(val, low, high); - asm volatile("rdmsr" : "=A" (val) : "c" (msr)); - return val; + asm volatile("rdmsr" : EAX_EDX_RET(val, low, high) : "c" (msr)); + return EAX_EDX_VAL(val, low, high); } static inline unsigned long long native_read_msr_safe(unsigned int msr, int *err) { - unsigned long long val; + DECLARE_ARGS(val, low, high); asm volatile("2: rdmsr ; xor %0,%0\n" "1:\n\t" @@ -54,10 +57,9 @@ static inline unsigned long long native_read_msr_safe(unsigned int msr, _ASM_ALIGN "\n\t" _ASM_PTR " 2b,3b\n\t" ".previous" - : "=r" (*err), "=A" (val) + : "=r" (*err), EAX_EDX_RET(val, low, high) : "c" (msr), "i" (-EFAULT)); - - return val; + return EAX_EDX_VAL(val, low, high); } static inline void native_write_msr(unsigned int msr, @@ -87,16 +89,18 @@ static inline int native_write_msr_safe(unsigned int msr, static inline unsigned long long native_read_tsc(void) { - unsigned long long val; - asm volatile("rdtsc" : "=A" (val)); - return val; + DECLARE_ARGS(val, low, high); + + asm volatile("rdtsc" : EAX_EDX_RET(val, low, high)); + return EAX_EDX_VAL(val, low, high); } static inline unsigned long long native_read_pmc(int counter) { - unsigned long long val; - asm volatile("rdpmc" : "=A" (val) : "c" (counter)); - return val; + DECLARE_ARGS(val, low, high); + + asm volatile("rdpmc" : EAX_EDX_RET(val, low, high) : "c" (counter)); + return EAX_EDX_VAL(val, low, high); } #ifdef CONFIG_PARAVIRT @@ -124,7 +128,8 @@ static inline void wrmsr(unsigned msr, unsigned low, unsigned high) #define rdmsrl(msr,val) \ ((val) = native_read_msr(msr)) -#define wrmsrl(msr,val) native_write_msr(msr, (u32)val, (u32)(val >> 32)) +#define wrmsrl(msr,val) \ + native_write_msr(msr, (u32)((u64)(val)), (u32)((u64)(val) >> 32)) /* wrmsr with exception handling */ static inline int wrmsr_safe(unsigned msr, unsigned low, unsigned high) @@ -156,101 +161,25 @@ static inline int wrmsr_safe(unsigned msr, unsigned low, unsigned high) (low) = (u32)_l; \ (high) = (u32)(_l >> 32); \ } while(0) -#endif /* !CONFIG_PARAVIRT */ - -#endif /* ! __ASSEMBLY__ */ -#endif /* __KERNEL__ */ -#else /* __i386__ */ - -#ifndef __ASSEMBLY__ -#include <linux/errno.h> -/* - * Access to machine-specific registers (available on 586 and better only) - * Note: the rd* operations modify the parameters directly (without using - * pointer indirection), this allows gcc to optimize better - */ - -#define rdmsr(msr,val1,val2) \ - __asm__ __volatile__("rdmsr" \ - : "=a" (val1), "=d" (val2) \ - : "c" (msr)) - - -#define rdmsrl(msr,val) do { unsigned long a__,b__; \ - __asm__ __volatile__("rdmsr" \ - : "=a" (a__), "=d" (b__) \ - : "c" (msr)); \ - val = a__ | (b__<<32); \ -} while(0) +#define rdtscp(low, high, aux) \ + do { \ + unsigned long long _val = native_read_tscp(&(aux)); \ + (low) = (u32)_val; \ + (high) = (u32)(_val >> 32); \ + } while (0) -#define wrmsr(msr,val1,val2) \ - __asm__ __volatile__("wrmsr" \ - : /* no outputs */ \ - : "c" (msr), "a" (val1), "d" (val2)) +#define rdtscpll(val, aux) (val) = native_read_tscp(&(aux)) -#define wrmsrl(msr,val) wrmsr(msr,(__u32)((__u64)(val)),((__u64)(val))>>32) +#endif /* !CONFIG_PARAVIRT */ -/* wrmsr with exception handling */ -#define wrmsr_safe(msr,a,b) ({ int ret__; \ - asm volatile("2: wrmsr ; xorl %0,%0\n" \ - "1:\n\t" \ - ".section .fixup,\"ax\"\n\t" \ - "3: movl %4,%0 ; jmp 1b\n\t" \ - ".previous\n\t" \ - ".section __ex_table,\"a\"\n" \ - " .align 8\n\t" \ - " .quad 2b,3b\n\t" \ - ".previous" \ - : "=a" (ret__) \ - : "c" (msr), "0" (a), "d" (b), "i" (-EFAULT)); \ - ret__; }) #define checking_wrmsrl(msr,val) wrmsr_safe(msr,(u32)(val),(u32)((val)>>32)) -#define rdmsr_safe(msr,a,b) \ - ({ int ret__; \ - asm volatile ("1: rdmsr\n" \ - "2:\n" \ - ".section .fixup,\"ax\"\n" \ - "3: movl %4,%0\n" \ - " jmp 2b\n" \ - ".previous\n" \ - ".section __ex_table,\"a\"\n" \ - " .align 8\n" \ - " .quad 1b,3b\n" \ - ".previous":"=&bDS" (ret__), "=a"(*(a)), "=d"(*(b)) \ - :"c"(msr), "i"(-EIO), "0"(0)); \ - ret__; }) - -#define rdtsc(low,high) \ - __asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high)) - -#define rdtscl(low) \ - __asm__ __volatile__ ("rdtsc" : "=a" (low) : : "edx") - - -#define rdtscll(val) do { \ - unsigned int __a,__d; \ - asm volatile("rdtsc" : "=a" (__a), "=d" (__d)); \ - (val) = ((unsigned long)__a) | (((unsigned long)__d)<<32); \ -} while(0) - #define write_tsc(val1,val2) wrmsr(0x10, val1, val2) #define write_rdtscp_aux(val) wrmsr(0xc0000103, val, 0) -#define rdpmc(counter,low,high) \ - __asm__ __volatile__("rdpmc" \ - : "=a" (low), "=d" (high) \ - : "c" (counter)) - -#endif /* __ASSEMBLY__ */ - -#endif /* !__i386__ */ - -#ifndef __ASSEMBLY__ - #ifdef CONFIG_SMP void rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h); void wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h); @@ -275,5 +204,7 @@ static inline int wrmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h) } #endif /* CONFIG_SMP */ #endif /* __ASSEMBLY__ */ +#endif /* __KERNEL__ */ + #endif -- 1.4.4.2
next prev parent reply other threads:[~2007-12-04 13:58 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 ` [PATCH 6/10] introduce native_read_tscp Glauber de Oliveira Costa 2007-12-04 11:10 ` 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 ` Glauber de Oliveira Costa [this message] 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: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 ` [PATCH 7/10] change rdpmc interface Glauber de Oliveira Costa 2007-12-04 16:03 ` [PATCH 8/10] change write msr functions interface Glauber de Oliveira Costa 2007-12-04 16:03 ` [PATCH 9/10] make fixups wordsize agnostic Glauber de Oliveira Costa 2007-12-04 16:04 ` [PATCH 10/10] integrate i386 and x86_64 code in msr.h Glauber de Oliveira Costa 2007-12-04 16:04 ` 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=11967666533444-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.