diff options
author | David S. Miller <davem@davemloft.net> | 2005-07-24 22:36:26 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2005-07-24 22:36:26 -0400 |
commit | db7d9a4eb700be766cc9f29241483dbb1e748832 (patch) | |
tree | 48848384df15d9404ceab05867d7f4ef6b1a4bbe /include/asm-sparc64/system.h | |
parent | cdd5186f753b23ab51f86679bdc4cc698ab0b893 (diff) |
[SPARC64]: Move syscall success and newchild state out of thread flags.
These two bits were accesses non-atomically from assembler
code. So, in order to eliminate any potential races resulting
from that, move these pieces of state into two bytes elsewhere
in struct thread_info.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/asm-sparc64/system.h')
-rw-r--r-- | include/asm-sparc64/system.h | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/include/asm-sparc64/system.h b/include/asm-sparc64/system.h index f9be2c5b4dc9..ee4bdfc6b88f 100644 --- a/include/asm-sparc64/system.h +++ b/include/asm-sparc64/system.h | |||
@@ -190,24 +190,23 @@ do { if (test_thread_flag(TIF_PERFCTR)) { \ | |||
190 | "wrpr %%g1, %%cwp\n\t" \ | 190 | "wrpr %%g1, %%cwp\n\t" \ |
191 | "ldx [%%g6 + %3], %%o6\n\t" \ | 191 | "ldx [%%g6 + %3], %%o6\n\t" \ |
192 | "ldub [%%g6 + %2], %%o5\n\t" \ | 192 | "ldub [%%g6 + %2], %%o5\n\t" \ |
193 | "ldx [%%g6 + %4], %%o7\n\t" \ | 193 | "ldub [%%g6 + %4], %%o7\n\t" \ |
194 | "mov %%g6, %%l2\n\t" \ | 194 | "mov %%g6, %%l2\n\t" \ |
195 | "wrpr %%o5, 0x0, %%wstate\n\t" \ | 195 | "wrpr %%o5, 0x0, %%wstate\n\t" \ |
196 | "ldx [%%sp + 2047 + 0x70], %%i6\n\t" \ | 196 | "ldx [%%sp + 2047 + 0x70], %%i6\n\t" \ |
197 | "ldx [%%sp + 2047 + 0x78], %%i7\n\t" \ | 197 | "ldx [%%sp + 2047 + 0x78], %%i7\n\t" \ |
198 | "wrpr %%g0, 0x94, %%pstate\n\t" \ | 198 | "wrpr %%g0, 0x94, %%pstate\n\t" \ |
199 | "mov %%l2, %%g6\n\t" \ | 199 | "mov %%l2, %%g6\n\t" \ |
200 | "ldx [%%g6 + %7], %%g4\n\t" \ | 200 | "ldx [%%g6 + %6], %%g4\n\t" \ |
201 | "wrpr %%g0, 0x96, %%pstate\n\t" \ | 201 | "wrpr %%g0, 0x96, %%pstate\n\t" \ |
202 | "andcc %%o7, %6, %%g0\n\t" \ | 202 | "brz,pt %%o7, 1f\n\t" \ |
203 | "beq,pt %%icc, 1f\n\t" \ | ||
204 | " mov %%g7, %0\n\t" \ | 203 | " mov %%g7, %0\n\t" \ |
205 | "b,a ret_from_syscall\n\t" \ | 204 | "b,a ret_from_syscall\n\t" \ |
206 | "1:\n\t" \ | 205 | "1:\n\t" \ |
207 | : "=&r" (last) \ | 206 | : "=&r" (last) \ |
208 | : "0" (next->thread_info), \ | 207 | : "0" (next->thread_info), \ |
209 | "i" (TI_WSTATE), "i" (TI_KSP), "i" (TI_FLAGS), "i" (TI_CWP), \ | 208 | "i" (TI_WSTATE), "i" (TI_KSP), "i" (TI_NEW_CHILD), \ |
210 | "i" (_TIF_NEWCHILD), "i" (TI_TASK) \ | 209 | "i" (TI_CWP), "i" (TI_TASK) \ |
211 | : "cc", \ | 210 | : "cc", \ |
212 | "g1", "g2", "g3", "g7", \ | 211 | "g1", "g2", "g3", "g7", \ |
213 | "l2", "l3", "l4", "l5", "l6", "l7", \ | 212 | "l2", "l3", "l4", "l5", "l6", "l7", \ |