|
@@ -103,8 +103,10 @@ static inline bool __down_read_trylock(struct rw_semaphore *sem)
|
|
({ \
|
|
({ \
|
|
long tmp; \
|
|
long tmp; \
|
|
struct rw_semaphore* ret; \
|
|
struct rw_semaphore* ret; \
|
|
|
|
+ register void *__sp asm(_ASM_SP); \
|
|
|
|
+ \
|
|
asm volatile("# beginning down_write\n\t" \
|
|
asm volatile("# beginning down_write\n\t" \
|
|
- LOCK_PREFIX " xadd %1,(%3)\n\t" \
|
|
|
|
|
|
+ LOCK_PREFIX " xadd %1,(%4)\n\t" \
|
|
/* adds 0xffff0001, returns the old value */ \
|
|
/* adds 0xffff0001, returns the old value */ \
|
|
" test " __ASM_SEL(%w1,%k1) "," __ASM_SEL(%w1,%k1) "\n\t" \
|
|
" test " __ASM_SEL(%w1,%k1) "," __ASM_SEL(%w1,%k1) "\n\t" \
|
|
/* was the active mask 0 before? */\
|
|
/* was the active mask 0 before? */\
|
|
@@ -112,7 +114,7 @@ static inline bool __down_read_trylock(struct rw_semaphore *sem)
|
|
" call " slow_path "\n" \
|
|
" call " slow_path "\n" \
|
|
"1:\n" \
|
|
"1:\n" \
|
|
"# ending down_write" \
|
|
"# ending down_write" \
|
|
- : "+m" (sem->count), "=d" (tmp), "=a" (ret) \
|
|
|
|
|
|
+ : "+m" (sem->count), "=d" (tmp), "=a" (ret), "+r" (__sp) \
|
|
: "a" (sem), "1" (RWSEM_ACTIVE_WRITE_BIAS) \
|
|
: "a" (sem), "1" (RWSEM_ACTIVE_WRITE_BIAS) \
|
|
: "memory", "cc"); \
|
|
: "memory", "cc"); \
|
|
ret; \
|
|
ret; \
|