Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */ 2 : : #ifndef _ASM_FSGSBASE_H 3 : : #define _ASM_FSGSBASE_H 4 : : 5 : : #ifndef __ASSEMBLY__ 6 : : 7 : : #ifdef CONFIG_X86_64 8 : : 9 : : #include <asm/msr-index.h> 10 : : 11 : : /* 12 : : * Read/write a task's FSBASE or GSBASE. This returns the value that 13 : : * the FS/GS base would have (if the task were to be resumed). These 14 : : * work on the current task or on a non-running (typically stopped 15 : : * ptrace child) task. 16 : : */ 17 : : extern unsigned long x86_fsbase_read_task(struct task_struct *task); 18 : : extern unsigned long x86_gsbase_read_task(struct task_struct *task); 19 : : extern void x86_fsbase_write_task(struct task_struct *task, unsigned long fsbase); 20 : : extern void x86_gsbase_write_task(struct task_struct *task, unsigned long gsbase); 21 : : 22 : : /* Helper functions for reading/writing FS/GS base */ 23 : : 24 : 0 : static inline unsigned long x86_fsbase_read_cpu(void) 25 : : { 26 : 0 : unsigned long fsbase; 27 : : 28 : 0 : rdmsrl(MSR_FS_BASE, fsbase); 29 : : 30 : 0 : return fsbase; 31 : : } 32 : : 33 : 0 : static inline unsigned long x86_gsbase_read_cpu_inactive(void) 34 : : { 35 : 0 : unsigned long gsbase; 36 : : 37 : 0 : rdmsrl(MSR_KERNEL_GS_BASE, gsbase); 38 : : 39 : 0 : return gsbase; 40 : : } 41 : : 42 : 14877 : static inline void x86_fsbase_write_cpu(unsigned long fsbase) 43 : : { 44 : 14877 : wrmsrl(MSR_FS_BASE, fsbase); 45 : : } 46 : : 47 : 0 : static inline void x86_gsbase_write_cpu_inactive(unsigned long gsbase) 48 : : { 49 : 0 : wrmsrl(MSR_KERNEL_GS_BASE, gsbase); 50 : : } 51 : : 52 : : #endif /* CONFIG_X86_64 */ 53 : : 54 : : #endif /* __ASSEMBLY__ */ 55 : : 56 : : #endif /* _ASM_FSGSBASE_H */