Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | #ifndef __ARCH_S390_PERCPU__ |
| 2 | #define __ARCH_S390_PERCPU__ |
| 3 | |
| 4 | #include <linux/compiler.h> |
| 5 | #include <asm/lowcore.h> |
| 6 | |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 | |
travis@sgi.com | f034347 | 2008-01-30 23:27:58 +0100 | [diff] [blame] | 16 | #define SHIFT_PERCPU_PTR(ptr,offset) (({ \ |
Jan Blunck | a666ecf | 2006-10-06 00:43:58 -0700 | [diff] [blame] | 17 | extern int simple_identifier_##var(void); \ |
Jan Blunck | 632bbfe | 2006-09-25 23:30:53 -0700 | [diff] [blame] | 18 | unsigned long *__ptr; \ |
travis@sgi.com | f034347 | 2008-01-30 23:27:58 +0100 | [diff] [blame] | 19 | asm ( "larl %0, %1@GOTENT" \ |
| 20 | : "=a" (__ptr) : "X" (ptr) ); \ |
| 21 | (typeof(ptr))((*__ptr) + (offset)); })) |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 22 | |
| 23 | #else |
| 24 | |
travis@sgi.com | f034347 | 2008-01-30 23:27:58 +0100 | [diff] [blame] | 25 | #define SHIFT_PERCPU_PTR(ptr, offset) (({ \ |
Jan Blunck | a666ecf | 2006-10-06 00:43:58 -0700 | [diff] [blame] | 26 | extern int simple_identifier_##var(void); \ |
Jan Blunck | 632bbfe | 2006-09-25 23:30:53 -0700 | [diff] [blame] | 27 | unsigned long __ptr; \ |
travis@sgi.com | f034347 | 2008-01-30 23:27:58 +0100 | [diff] [blame] | 28 | asm ( "" : "=a" (__ptr) : "0" (ptr) ); \ |
| 29 | (typeof(ptr)) (__ptr + (offset)); })) |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 30 | |
| 31 | #endif |
| 32 | |
travis@sgi.com | f034347 | 2008-01-30 23:27:58 +0100 | [diff] [blame] | 33 | #define __my_cpu_offset S390_lowcore.percpu_offset |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 34 | |
travis@sgi.com | f034347 | 2008-01-30 23:27:58 +0100 | [diff] [blame] | 35 | #include <asm-generic/percpu.h> |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 36 | |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 37 | #endif /* __ARCH_S390_PERCPU__ */ |