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