xref: /openbmc/linux/arch/s390/include/asm/percpu.h (revision 8fa5723aa7e053d498336b48448b292fc2e0458b)
1 #ifndef __ARCH_S390_PERCPU__
2 #define __ARCH_S390_PERCPU__
3 
4 #include <linux/compiler.h>
5 #include <asm/lowcore.h>
6 
7 /*
8  * s390 uses its own implementation for per cpu data, the offset of
9  * the cpu local data area is cached in the cpu's lowcore memory.
10  * For 64 bit module code s390 forces the use of a GOT slot for the
11  * address of the per cpu variable. This is needed because the module
12  * may be more than 4G above the per cpu area.
13  */
14 #if defined(__s390x__) && defined(MODULE)
15 
16 #define SHIFT_PERCPU_PTR(ptr,offset) (({			\
17 	extern int simple_identifier_##var(void);	\
18 	unsigned long *__ptr;				\
19 	asm ( "larl %0, %1@GOTENT"		\
20 	    : "=a" (__ptr) : "X" (ptr) );		\
21 	(typeof(ptr))((*__ptr) + (offset));	}))
22 
23 #else
24 
25 #define SHIFT_PERCPU_PTR(ptr, offset) (({				\
26 	extern int simple_identifier_##var(void);		\
27 	unsigned long __ptr;					\
28 	asm ( "" : "=a" (__ptr) : "0" (ptr) );			\
29 	(typeof(ptr)) (__ptr + (offset)); }))
30 
31 #endif
32 
33 #define __my_cpu_offset S390_lowcore.percpu_offset
34 
35 #include <asm-generic/percpu.h>
36 
37 #endif /* __ARCH_S390_PERCPU__ */
38