Blame view

include/asm-s390/percpu.h 2.22 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  #ifndef __ARCH_S390_PERCPU__
  #define __ARCH_S390_PERCPU__
  
  #include <linux/compiler.h>
  #include <asm/lowcore.h>
  
  #define __GENERIC_PER_CPU
  
  /*
   * s390 uses its own implementation for per cpu data, the offset of
   * the cpu local data area is cached in the cpu's lowcore memory.
   * For 64 bit module code s390 forces the use of a GOT slot for the
   * address of the per cpu variable. This is needed because the module
   * may be more than 4G above the per cpu area.
   */
  #if defined(__s390x__) && defined(MODULE)
632bbfeee   Jan Blunck   [PATCH] trigger a...
17
  #define __reloc_hide(var,offset) (*({			\
a666ecfbf   Jan Blunck   [PATCH] Fix typo ...
18
  	extern int simple_identifier_##var(void);	\
632bbfeee   Jan Blunck   [PATCH] trigger a...
19
20
21
22
  	unsigned long *__ptr;				\
  	asm ( "larl %0,per_cpu__"#var"@GOTENT"		\
  	    : "=a" (__ptr) : "X" (per_cpu__##var) );	\
  	(typeof(&per_cpu__##var))((*__ptr) + (offset));	}))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
23
24
  
  #else
632bbfeee   Jan Blunck   [PATCH] trigger a...
25
  #define __reloc_hide(var, offset) (*({				\
a666ecfbf   Jan Blunck   [PATCH] Fix typo ...
26
  	extern int simple_identifier_##var(void);		\
632bbfeee   Jan Blunck   [PATCH] trigger a...
27
28
29
  	unsigned long __ptr;					\
  	asm ( "" : "=a" (__ptr) : "0" (&per_cpu__##var) );	\
  	(typeof(&per_cpu__##var)) (__ptr + (offset)); }))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
30
31
32
33
34
35
36
37
38
39
40
41
42
  
  #endif
  
  #ifdef CONFIG_SMP
  
  extern unsigned long __per_cpu_offset[NR_CPUS];
  
  /* Separate out the type, so (int[3], foo) works. */
  #define DEFINE_PER_CPU(type, name) \
      __attribute__((__section__(".data.percpu"))) \
      __typeof__(type) per_cpu__##name
  
  #define __get_cpu_var(var) __reloc_hide(var,S390_lowcore.percpu_offset)
bfe5d8341   Paul Mackerras   [PATCH] Define __...
43
  #define __raw_get_cpu_var(var) __reloc_hide(var,S390_lowcore.percpu_offset)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
44
  #define per_cpu(var,cpu) __reloc_hide(var,__per_cpu_offset[cpu])
a875a69f8   Ingo Molnar   [PATCH] lockdep: ...
45
  #define per_cpu_offset(x) (__per_cpu_offset[x])
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
46
47
48
49
50
  
  /* A macro to avoid #include hell... */
  #define percpu_modcopy(pcpudst, src, size)			\
  do {								\
  	unsigned int __i;					\
97db7fbfc   KAMEZAWA Hiroyuki   [PATCH] for_each_...
51
  	for_each_possible_cpu(__i)				\
394e3902c   Andrew Morton   [PATCH] more for_...
52
53
  		memcpy((pcpudst)+__per_cpu_offset[__i],		\
  		       (src), (size));				\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
54
55
56
57
58
59
60
61
  } while (0)
  
  #else /* ! SMP */
  
  #define DEFINE_PER_CPU(type, name) \
      __typeof__(type) per_cpu__##name
  
  #define __get_cpu_var(var) __reloc_hide(var,0)
bfe5d8341   Paul Mackerras   [PATCH] Define __...
62
  #define __raw_get_cpu_var(var) __reloc_hide(var,0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
63
64
65
66
67
68
69
70
71
72
  #define per_cpu(var,cpu) __reloc_hide(var,0)
  
  #endif /* SMP */
  
  #define DECLARE_PER_CPU(type, name) extern __typeof__(type) per_cpu__##name
  
  #define EXPORT_PER_CPU_SYMBOL(var) EXPORT_SYMBOL(per_cpu__##var)
  #define EXPORT_PER_CPU_SYMBOL_GPL(var) EXPORT_SYMBOL_GPL(per_cpu__##var)
  
  #endif /* __ARCH_S390_PERCPU__ */