|
@@ -107,12 +107,9 @@ static inline void down(struct semaphore * sem)
|
|
__asm__ __volatile__(
|
|
__asm__ __volatile__(
|
|
"# atomic down operation\n\t"
|
|
"# atomic down operation\n\t"
|
|
LOCK_PREFIX "decl %0\n\t" /* --sem->count */
|
|
LOCK_PREFIX "decl %0\n\t" /* --sem->count */
|
|
- "js 2f\n"
|
|
|
|
- "1:\n"
|
|
|
|
- LOCK_SECTION_START("")
|
|
|
|
- "2:\tcall __down_failed\n\t"
|
|
|
|
- "jmp 1b\n"
|
|
|
|
- LOCK_SECTION_END
|
|
|
|
|
|
+ "jns 1f\n\t"
|
|
|
|
+ "call __down_failed\n"
|
|
|
|
+ "1:"
|
|
:"=m" (sem->count)
|
|
:"=m" (sem->count)
|
|
:"D" (sem)
|
|
:"D" (sem)
|
|
:"memory");
|
|
:"memory");
|
|
@@ -130,14 +127,11 @@ static inline int down_interruptible(struct semaphore * sem)
|
|
|
|
|
|
__asm__ __volatile__(
|
|
__asm__ __volatile__(
|
|
"# atomic interruptible down operation\n\t"
|
|
"# atomic interruptible down operation\n\t"
|
|
|
|
+ "xorl %0,%0\n\t"
|
|
LOCK_PREFIX "decl %1\n\t" /* --sem->count */
|
|
LOCK_PREFIX "decl %1\n\t" /* --sem->count */
|
|
- "js 2f\n\t"
|
|
|
|
- "xorl %0,%0\n"
|
|
|
|
- "1:\n"
|
|
|
|
- LOCK_SECTION_START("")
|
|
|
|
- "2:\tcall __down_failed_interruptible\n\t"
|
|
|
|
- "jmp 1b\n"
|
|
|
|
- LOCK_SECTION_END
|
|
|
|
|
|
+ "jns 2f\n\t"
|
|
|
|
+ "call __down_failed_interruptible\n"
|
|
|
|
+ "2:\n"
|
|
:"=a" (result), "=m" (sem->count)
|
|
:"=a" (result), "=m" (sem->count)
|
|
:"D" (sem)
|
|
:"D" (sem)
|
|
:"memory");
|
|
:"memory");
|
|
@@ -154,14 +148,11 @@ static inline int down_trylock(struct semaphore * sem)
|
|
|
|
|
|
__asm__ __volatile__(
|
|
__asm__ __volatile__(
|
|
"# atomic interruptible down operation\n\t"
|
|
"# atomic interruptible down operation\n\t"
|
|
|
|
+ "xorl %0,%0\n\t"
|
|
LOCK_PREFIX "decl %1\n\t" /* --sem->count */
|
|
LOCK_PREFIX "decl %1\n\t" /* --sem->count */
|
|
- "js 2f\n\t"
|
|
|
|
- "xorl %0,%0\n"
|
|
|
|
- "1:\n"
|
|
|
|
- LOCK_SECTION_START("")
|
|
|
|
- "2:\tcall __down_failed_trylock\n\t"
|
|
|
|
- "jmp 1b\n"
|
|
|
|
- LOCK_SECTION_END
|
|
|
|
|
|
+ "jns 2f\n\t"
|
|
|
|
+ "call __down_failed_trylock\n\t"
|
|
|
|
+ "2:\n"
|
|
:"=a" (result), "=m" (sem->count)
|
|
:"=a" (result), "=m" (sem->count)
|
|
:"D" (sem)
|
|
:"D" (sem)
|
|
:"memory","cc");
|
|
:"memory","cc");
|
|
@@ -179,12 +170,9 @@ static inline void up(struct semaphore * sem)
|
|
__asm__ __volatile__(
|
|
__asm__ __volatile__(
|
|
"# atomic up operation\n\t"
|
|
"# atomic up operation\n\t"
|
|
LOCK_PREFIX "incl %0\n\t" /* ++sem->count */
|
|
LOCK_PREFIX "incl %0\n\t" /* ++sem->count */
|
|
- "jle 2f\n"
|
|
|
|
- "1:\n"
|
|
|
|
- LOCK_SECTION_START("")
|
|
|
|
- "2:\tcall __up_wakeup\n\t"
|
|
|
|
- "jmp 1b\n"
|
|
|
|
- LOCK_SECTION_END
|
|
|
|
|
|
+ "jg 1f\n\t"
|
|
|
|
+ "call __up_wakeup\n"
|
|
|
|
+ "1:"
|
|
:"=m" (sem->count)
|
|
:"=m" (sem->count)
|
|
:"D" (sem)
|
|
:"D" (sem)
|
|
:"memory");
|
|
:"memory");
|