diff options
Diffstat (limited to 'include/asm-x86/percpu.h')
-rw-r--r-- | include/asm-x86/percpu.h | 104 |
1 files changed, 54 insertions, 50 deletions
diff --git a/include/asm-x86/percpu.h b/include/asm-x86/percpu.h index 0dec00f27eb4..736fc3bb8e1e 100644 --- a/include/asm-x86/percpu.h +++ b/include/asm-x86/percpu.h | |||
@@ -85,58 +85,62 @@ DECLARE_PER_CPU(unsigned long, this_cpu_off); | |||
85 | * don't give an lvalue though). */ | 85 | * don't give an lvalue though). */ |
86 | extern void __bad_percpu_size(void); | 86 | extern void __bad_percpu_size(void); |
87 | 87 | ||
88 | #define percpu_to_op(op,var,val) \ | 88 | #define percpu_to_op(op, var, val) \ |
89 | do { \ | 89 | do { \ |
90 | typedef typeof(var) T__; \ | 90 | typedef typeof(var) T__; \ |
91 | if (0) { T__ tmp__; tmp__ = (val); } \ | 91 | if (0) { \ |
92 | switch (sizeof(var)) { \ | 92 | T__ tmp__; \ |
93 | case 1: \ | 93 | tmp__ = (val); \ |
94 | asm(op "b %1,"__percpu_seg"%0" \ | 94 | } \ |
95 | : "+m" (var) \ | 95 | switch (sizeof(var)) { \ |
96 | :"ri" ((T__)val)); \ | 96 | case 1: \ |
97 | break; \ | 97 | asm(op "b %1,"__percpu_seg"%0" \ |
98 | case 2: \ | 98 | : "+m" (var) \ |
99 | asm(op "w %1,"__percpu_seg"%0" \ | 99 | : "ri" ((T__)val)); \ |
100 | : "+m" (var) \ | 100 | break; \ |
101 | :"ri" ((T__)val)); \ | 101 | case 2: \ |
102 | break; \ | 102 | asm(op "w %1,"__percpu_seg"%0" \ |
103 | case 4: \ | 103 | : "+m" (var) \ |
104 | asm(op "l %1,"__percpu_seg"%0" \ | 104 | : "ri" ((T__)val)); \ |
105 | : "+m" (var) \ | 105 | break; \ |
106 | :"ri" ((T__)val)); \ | 106 | case 4: \ |
107 | break; \ | 107 | asm(op "l %1,"__percpu_seg"%0" \ |
108 | default: __bad_percpu_size(); \ | 108 | : "+m" (var) \ |
109 | } \ | 109 | : "ri" ((T__)val)); \ |
110 | } while (0) | 110 | break; \ |
111 | 111 | default: __bad_percpu_size(); \ | |
112 | #define percpu_from_op(op,var) \ | 112 | } \ |
113 | ({ \ | 113 | } while (0) |
114 | typeof(var) ret__; \ | 114 | |
115 | switch (sizeof(var)) { \ | 115 | #define percpu_from_op(op, var) \ |
116 | case 1: \ | 116 | ({ \ |
117 | asm(op "b "__percpu_seg"%1,%0" \ | 117 | typeof(var) ret__; \ |
118 | : "=r" (ret__) \ | 118 | switch (sizeof(var)) { \ |
119 | : "m" (var)); \ | 119 | case 1: \ |
120 | break; \ | 120 | asm(op "b "__percpu_seg"%1,%0" \ |
121 | case 2: \ | 121 | : "=r" (ret__) \ |
122 | asm(op "w "__percpu_seg"%1,%0" \ | 122 | : "m" (var)); \ |
123 | : "=r" (ret__) \ | 123 | break; \ |
124 | : "m" (var)); \ | 124 | case 2: \ |
125 | break; \ | 125 | asm(op "w "__percpu_seg"%1,%0" \ |
126 | case 4: \ | 126 | : "=r" (ret__) \ |
127 | asm(op "l "__percpu_seg"%1,%0" \ | 127 | : "m" (var)); \ |
128 | : "=r" (ret__) \ | 128 | break; \ |
129 | : "m" (var)); \ | 129 | case 4: \ |
130 | break; \ | 130 | asm(op "l "__percpu_seg"%1,%0" \ |
131 | default: __bad_percpu_size(); \ | 131 | : "=r" (ret__) \ |
132 | } \ | 132 | : "m" (var)); \ |
133 | ret__; }) | 133 | break; \ |
134 | default: __bad_percpu_size(); \ | ||
135 | } \ | ||
136 | ret__; \ | ||
137 | }) | ||
134 | 138 | ||
135 | #define x86_read_percpu(var) percpu_from_op("mov", per_cpu__##var) | 139 | #define x86_read_percpu(var) percpu_from_op("mov", per_cpu__##var) |
136 | #define x86_write_percpu(var,val) percpu_to_op("mov", per_cpu__##var, val) | 140 | #define x86_write_percpu(var, val) percpu_to_op("mov", per_cpu__##var, val) |
137 | #define x86_add_percpu(var,val) percpu_to_op("add", per_cpu__##var, val) | 141 | #define x86_add_percpu(var, val) percpu_to_op("add", per_cpu__##var, val) |
138 | #define x86_sub_percpu(var,val) percpu_to_op("sub", per_cpu__##var, val) | 142 | #define x86_sub_percpu(var, val) percpu_to_op("sub", per_cpu__##var, val) |
139 | #define x86_or_percpu(var,val) percpu_to_op("or", per_cpu__##var, val) | 143 | #define x86_or_percpu(var, val) percpu_to_op("or", per_cpu__##var, val) |
140 | #endif /* !__ASSEMBLY__ */ | 144 | #endif /* !__ASSEMBLY__ */ |
141 | #endif /* !CONFIG_X86_64 */ | 145 | #endif /* !CONFIG_X86_64 */ |
142 | #endif /* _ASM_X86_PERCPU_H_ */ | 146 | #endif /* _ASM_X86_PERCPU_H_ */ |