Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2) #ifndef _ASM_FSGSBASE_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3) #define _ASM_FSGSBASE_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5) #ifndef __ASSEMBLY__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7) #ifdef CONFIG_X86_64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9) #include <asm/msr-index.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)  * Read/write a task's FSBASE or GSBASE. This returns the value that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)  * the FS/GS base would have (if the task were to be resumed). These
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)  * work on the current task or on a non-running (typically stopped
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)  * ptrace child) task.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) extern unsigned long x86_fsbase_read_task(struct task_struct *task);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) extern unsigned long x86_gsbase_read_task(struct task_struct *task);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) extern void x86_fsbase_write_task(struct task_struct *task, unsigned long fsbase);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) extern void x86_gsbase_write_task(struct task_struct *task, unsigned long gsbase);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) /* Must be protected by X86_FEATURE_FSGSBASE check. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) static __always_inline unsigned long rdfsbase(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) 	unsigned long fsbase;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) 	asm volatile("rdfsbase %0" : "=r" (fsbase) :: "memory");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) 	return fsbase;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) static __always_inline unsigned long rdgsbase(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) 	unsigned long gsbase;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) 	asm volatile("rdgsbase %0" : "=r" (gsbase) :: "memory");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) 	return gsbase;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) static __always_inline void wrfsbase(unsigned long fsbase)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) 	asm volatile("wrfsbase %0" :: "r" (fsbase) : "memory");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) static __always_inline void wrgsbase(unsigned long gsbase)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) 	asm volatile("wrgsbase %0" :: "r" (gsbase) : "memory");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #include <asm/cpufeature.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) /* Helper functions for reading/writing FS/GS base */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) static inline unsigned long x86_fsbase_read_cpu(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) 	unsigned long fsbase;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) 	if (boot_cpu_has(X86_FEATURE_FSGSBASE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) 		fsbase = rdfsbase();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) 		rdmsrl(MSR_FS_BASE, fsbase);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) 	return fsbase;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) static inline void x86_fsbase_write_cpu(unsigned long fsbase)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) 	if (boot_cpu_has(X86_FEATURE_FSGSBASE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) 		wrfsbase(fsbase);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) 		wrmsrl(MSR_FS_BASE, fsbase);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) extern unsigned long x86_gsbase_read_cpu_inactive(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) extern void x86_gsbase_write_cpu_inactive(unsigned long gsbase);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) extern unsigned long x86_fsgsbase_read_task(struct task_struct *task,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) 					    unsigned short selector);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #endif /* CONFIG_X86_64 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) #endif /* __ASSEMBLY__ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) #endif /* _ASM_FSGSBASE_H */