Messages in this thread Patch in this message | | | From | Andi Kleen <> | Subject | [PATCH 3/7] x86: Add C intrinsics for new rd/wr fs/gs base instructions | Date | Mon, 28 Apr 2014 15:12:37 -0700 |
| |
From: Andi Kleen <ak@linux.intel.com>
Plus for swapgs.
Very straight forward. Used in followon patch.
Signed-off-by: Andi Kleen <ak@linux.intel.com> --- arch/x86/include/asm/fsgs.h | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 arch/x86/include/asm/fsgs.h
diff --git a/arch/x86/include/asm/fsgs.h b/arch/x86/include/asm/fsgs.h new file mode 100644 index 0000000..a3a5cd3 --- /dev/null +++ b/arch/x86/include/asm/fsgs.h @@ -0,0 +1,43 @@ +#ifndef _ASM_FSGS_H +#define _ASM_FSGS_H 1 + +static inline void swapgs(void) +{ + asm volatile("swapgs" ::: "memory"); +} + +/* Must be protected by X86_FEATURE_FSGSBASE check. */ + +static inline unsigned long rdgsbase(void) +{ + unsigned long gs; + asm volatile(".byte 0xf3,0x48,0x0f,0xae,0xc8 # rdgsbaseq %%rax" + : "=a" (gs) + :: "memory"); + return gs; +} + +static inline unsigned long rdfsbase(void) +{ + unsigned long fs; + asm volatile(".byte 0xf3,0x48,0x0f,0xae,0xc0 # rdfsbaseq %%rax" + : "=a" (fs) + :: "memory"); + return fs; +} + +static inline void wrgsbase(unsigned long gs) +{ + asm volatile(".byte 0xf3,0x48,0x0f,0xae,0xd8 # wrgsbaseq %%rax" + :: "a" (gs) + : "memory"); +} + +static inline void wrfsbase(unsigned long fs) +{ + asm volatile(".byte 0xf3,0x48,0x0f,0xae,0xd0 # wrfsbaseq %%rax" + :: "a" (fs) + : "memory"); +} + +#endif -- 1.9.0
| |