| 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__ */ |