xref: /linux/arch/x86/include/asm/current.h (revision 1e525507)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _ASM_X86_CURRENT_H
3 #define _ASM_X86_CURRENT_H
4 
5 #include <linux/build_bug.h>
6 #include <linux/compiler.h>
7 
8 #ifndef __ASSEMBLY__
9 
10 #include <linux/cache.h>
11 #include <asm/percpu.h>
12 
13 struct task_struct;
14 
15 struct pcpu_hot {
16 	union {
17 		struct {
18 			struct task_struct	*current_task;
19 			int			preempt_count;
20 			int			cpu_number;
21 #ifdef CONFIG_MITIGATION_CALL_DEPTH_TRACKING
22 			u64			call_depth;
23 #endif
24 			unsigned long		top_of_stack;
25 			void			*hardirq_stack_ptr;
26 			u16			softirq_pending;
27 #ifdef CONFIG_X86_64
28 			bool			hardirq_stack_inuse;
29 #else
30 			void			*softirq_stack_ptr;
31 #endif
32 		};
33 		u8	pad[64];
34 	};
35 };
36 static_assert(sizeof(struct pcpu_hot) == 64);
37 
38 DECLARE_PER_CPU_ALIGNED(struct pcpu_hot, pcpu_hot);
39 
40 /* const-qualified alias to pcpu_hot, aliased by linker. */
41 DECLARE_PER_CPU_ALIGNED(const struct pcpu_hot __percpu_seg_override,
42 			const_pcpu_hot);
43 
44 static __always_inline struct task_struct *get_current(void)
45 {
46 	if (IS_ENABLED(CONFIG_USE_X86_SEG_SUPPORT))
47 		return this_cpu_read_const(const_pcpu_hot.current_task);
48 
49 	return this_cpu_read_stable(pcpu_hot.current_task);
50 }
51 
52 #define current get_current()
53 
54 #endif /* __ASSEMBLY__ */
55 
56 #endif /* _ASM_X86_CURRENT_H */
57