i386: improve and correct inline asm memory constraints
Use "+m" rather than a combination of "=m" and "m" for improved clarity and consistency. This also fixes some inlines that incorrectly didn't tell the compiler that they read the old value at all, potentially causing the compiler to generate bogus code. It appear that all of those potential bugs were hidden by the use of extra "volatile" specifiers on the data structures in question, though. Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
@@ -107,7 +107,7 @@ static inline void down(struct semaphore * sem)
|
||||
"call __down_failed\n\t"
|
||||
"jmp 1b\n"
|
||||
LOCK_SECTION_END
|
||||
:"=m" (sem->count)
|
||||
:"+m" (sem->count)
|
||||
:
|
||||
:"memory","ax");
|
||||
}
|
||||
@@ -132,7 +132,7 @@ static inline int down_interruptible(struct semaphore * sem)
|
||||
"call __down_failed_interruptible\n\t"
|
||||
"jmp 1b\n"
|
||||
LOCK_SECTION_END
|
||||
:"=a" (result), "=m" (sem->count)
|
||||
:"=a" (result), "+m" (sem->count)
|
||||
:
|
||||
:"memory");
|
||||
return result;
|
||||
@@ -157,7 +157,7 @@ static inline int down_trylock(struct semaphore * sem)
|
||||
"call __down_failed_trylock\n\t"
|
||||
"jmp 1b\n"
|
||||
LOCK_SECTION_END
|
||||
:"=a" (result), "=m" (sem->count)
|
||||
:"=a" (result), "+m" (sem->count)
|
||||
:
|
||||
:"memory");
|
||||
return result;
|
||||
@@ -182,7 +182,7 @@ static inline void up(struct semaphore * sem)
|
||||
"jmp 1b\n"
|
||||
LOCK_SECTION_END
|
||||
".subsection 0\n"
|
||||
:"=m" (sem->count)
|
||||
:"+m" (sem->count)
|
||||
:
|
||||
:"memory","ax");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user