diff options
Diffstat (limited to 'include/asm-i386/spinlock.h')
-rw-r--r-- | include/asm-i386/spinlock.h | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/include/asm-i386/spinlock.h b/include/asm-i386/spinlock.h index dea60709db29..d3bcebed60ca 100644 --- a/include/asm-i386/spinlock.h +++ b/include/asm-i386/spinlock.h | |||
@@ -12,6 +12,8 @@ | |||
12 | #else | 12 | #else |
13 | #define CLI_STRING "cli" | 13 | #define CLI_STRING "cli" |
14 | #define STI_STRING "sti" | 14 | #define STI_STRING "sti" |
15 | #define CLI_STI_CLOBBERS | ||
16 | #define CLI_STI_INPUT_ARGS | ||
15 | #endif /* CONFIG_PARAVIRT */ | 17 | #endif /* CONFIG_PARAVIRT */ |
16 | 18 | ||
17 | /* | 19 | /* |
@@ -57,25 +59,28 @@ static inline void __raw_spin_lock_flags(raw_spinlock_t *lock, unsigned long fla | |||
57 | { | 59 | { |
58 | asm volatile( | 60 | asm volatile( |
59 | "\n1:\t" | 61 | "\n1:\t" |
60 | LOCK_PREFIX " ; decb %0\n\t" | 62 | LOCK_PREFIX " ; decb %[slock]\n\t" |
61 | "jns 5f\n" | 63 | "jns 5f\n" |
62 | "2:\t" | 64 | "2:\t" |
63 | "testl $0x200, %1\n\t" | 65 | "testl $0x200, %[flags]\n\t" |
64 | "jz 4f\n\t" | 66 | "jz 4f\n\t" |
65 | STI_STRING "\n" | 67 | STI_STRING "\n" |
66 | "3:\t" | 68 | "3:\t" |
67 | "rep;nop\n\t" | 69 | "rep;nop\n\t" |
68 | "cmpb $0, %0\n\t" | 70 | "cmpb $0, %[slock]\n\t" |
69 | "jle 3b\n\t" | 71 | "jle 3b\n\t" |
70 | CLI_STRING "\n\t" | 72 | CLI_STRING "\n\t" |
71 | "jmp 1b\n" | 73 | "jmp 1b\n" |
72 | "4:\t" | 74 | "4:\t" |
73 | "rep;nop\n\t" | 75 | "rep;nop\n\t" |
74 | "cmpb $0, %0\n\t" | 76 | "cmpb $0, %[slock]\n\t" |
75 | "jg 1b\n\t" | 77 | "jg 1b\n\t" |
76 | "jmp 4b\n" | 78 | "jmp 4b\n" |
77 | "5:\n\t" | 79 | "5:\n\t" |
78 | : "+m" (lock->slock) : "r" (flags) : "memory"); | 80 | : [slock] "+m" (lock->slock) |
81 | : [flags] "r" (flags) | ||
82 | CLI_STI_INPUT_ARGS | ||
83 | : "memory" CLI_STI_CLOBBERS); | ||
79 | } | 84 | } |
80 | #endif | 85 | #endif |
81 | 86 | ||