Merge git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6
[linux-2.6] / include / asm-s390 / percpu.h
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__ */