1 #ifndef __X86_PERCPU_H__
2 #define __X86_PERCPU_H__
3 
4 #ifndef __ASSEMBLY__
5 extern char __per_cpu_start[], __per_cpu_data_end[];
6 extern unsigned long __per_cpu_offset[NR_CPUS];
7 void percpu_init_areas(void);
8 #endif
9 
10 /* Separate out the type, so (int[3], foo) works. */
11 #define __DEFINE_PER_CPU(type, name, suffix)                    \
12     __section(".bss.percpu" #suffix)                            \
13     __typeof__(type) per_cpu_##name
14 
15 /* var is in discarded region: offset to particular copy we want */
16 #define per_cpu(var, cpu)  \
17     (*RELOC_HIDE(&per_cpu__##var, __per_cpu_offset[cpu]))
18 #define __get_cpu_var(var) \
19     (*RELOC_HIDE(&per_cpu__##var, get_cpu_info()->per_cpu_offset))
20 
21 #define DECLARE_PER_CPU(type, name) extern __typeof__(type) per_cpu__##name
22 
23 #define __get_cpu_ptr(var) \
24     (*RELOC_HIDE(var, get_cpu_info()->per_cpu_offset))
25 
26 #define per_cpu_ptr(var, cpu)  \
27     (*RELOC_HIDE(var, __per_cpu_offset[cpu]))
28 
29 #endif /* __X86_PERCPU_H__ */
30