summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorDavid S. Miller <davem@nuts.ninka.net>2003-03-24 15:04:02 -0800
committerDavid S. Miller <davem@nuts.ninka.net>2003-03-24 15:04:02 -0800
commit431ec6ac1e320fca6af8c44b3b9feb32c3f40f5e (patch)
tree3e6410eddd99eede469d6a35e77a0a50c1354283 /include
parent855fb09556d2db5934a854f5de835715ccf7aeb3 (diff)
[SPARC64]: Uninline rwsem assembler.
Diffstat (limited to 'include')
-rw-r--r--include/asm-sparc64/rwsem.h228
1 files changed, 7 insertions, 221 deletions
diff --git a/include/asm-sparc64/rwsem.h b/include/asm-sparc64/rwsem.h
index 7d3e788980e1..82fffac5b0b8 100644
--- a/include/asm-sparc64/rwsem.h
+++ b/include/asm-sparc64/rwsem.h
@@ -18,11 +18,6 @@
struct rwsem_waiter;
-extern struct rw_semaphore *FASTCALL(rwsem_down_read_failed(struct rw_semaphore *sem));
-extern struct rw_semaphore *FASTCALL(rwsem_down_write_failed(struct rw_semaphore *sem));
-extern struct rw_semaphore *FASTCALL(rwsem_wake(struct rw_semaphore *));
-extern struct rw_semaphore *FASTCALL(rwsem_downgrade_wake(struct rw_semaphore *));
-
struct rw_semaphore {
signed int count;
#define RWSEM_UNLOCKED_VALUE 0x00000000
@@ -48,222 +43,13 @@ static __inline__ void init_rwsem(struct rw_semaphore *sem)
INIT_LIST_HEAD(&sem->wait_list);
}
-static __inline__ void __down_read(struct rw_semaphore *sem)
-{
- __asm__ __volatile__(
- "! beginning __down_read\n"
- "1:\tlduw [%0], %%g5\n\t"
- "add %%g5, 1, %%g7\n\t"
- "cas [%0], %%g5, %%g7\n\t"
- "cmp %%g5, %%g7\n\t"
- "bne,pn %%icc, 1b\n\t"
- " add %%g7, 1, %%g7\n\t"
- "cmp %%g7, 0\n\t"
- "bl,pn %%icc, 3f\n\t"
- " membar #StoreLoad | #StoreStore\n"
- "2:\n\t"
- ".subsection 2\n"
- "3:\tmov %0, %%g5\n\t"
- "save %%sp, -160, %%sp\n\t"
- "mov %%g1, %%l1\n\t"
- "mov %%g2, %%l2\n\t"
- "mov %%g3, %%l3\n\t"
- "call %1\n\t"
- " mov %%g5, %%o0\n\t"
- "mov %%l1, %%g1\n\t"
- "mov %%l2, %%g2\n\t"
- "ba,pt %%xcc, 2b\n\t"
- " restore %%l3, %%g0, %%g3\n\t"
- ".previous\n\t"
- "! ending __down_read"
- : : "r" (sem), "i" (rwsem_down_read_failed)
- : "g5", "g7", "memory", "cc");
-}
-
-static __inline__ int __down_read_trylock(struct rw_semaphore *sem)
-{
- int result;
-
- __asm__ __volatile__(
- "! beginning __down_read_trylock\n"
- "1:\tlduw [%1], %%g5\n\t"
- "add %%g5, 1, %%g7\n\t"
- "cmp %%g7, 0\n\t"
- "bl,pn %%icc, 2f\n\t"
- " mov 0, %0\n\t"
- "cas [%1], %%g5, %%g7\n\t"
- "cmp %%g5, %%g7\n\t"
- "bne,pn %%icc, 1b\n\t"
- " mov 1, %0\n\t"
- "membar #StoreLoad | #StoreStore\n"
- "2:\n\t"
- "! ending __down_read_trylock"
- : "=&r" (result)
- : "r" (sem)
- : "g5", "g7", "memory", "cc");
-
- return result;
-}
-
-static __inline__ void __down_write(struct rw_semaphore *sem)
-{
- __asm__ __volatile__(
- "! beginning __down_write\n\t"
- "sethi %%hi(%2), %%g1\n\t"
- "or %%g1, %%lo(%2), %%g1\n"
- "1:\tlduw [%0], %%g5\n\t"
- "add %%g5, %%g1, %%g7\n\t"
- "cas [%0], %%g5, %%g7\n\t"
- "cmp %%g5, %%g7\n\t"
- "bne,pn %%icc, 1b\n\t"
- " cmp %%g7, 0\n\t"
- "bne,pn %%icc, 3f\n\t"
- " membar #StoreLoad | #StoreStore\n"
- "2:\n\t"
- ".subsection 2\n"
- "3:\tmov %0, %%g5\n\t"
- "save %%sp, -160, %%sp\n\t"
- "mov %%g2, %%l2\n\t"
- "mov %%g3, %%l3\n\t"
- "call %1\n\t"
- " mov %%g5, %%o0\n\t"
- "mov %%l2, %%g2\n\t"
- "ba,pt %%xcc, 2b\n\t"
- " restore %%l3, %%g0, %%g3\n\t"
- ".previous\n\t"
- "! ending __down_write"
- : : "r" (sem), "i" (rwsem_down_write_failed),
- "i" (RWSEM_ACTIVE_WRITE_BIAS)
- : "g1", "g5", "g7", "memory", "cc");
-}
-
-static __inline__ int __down_write_trylock(struct rw_semaphore *sem)
-{
- int result;
-
- __asm__ __volatile__(
- "! beginning __down_write_trylock\n\t"
- "sethi %%hi(%2), %%g1\n\t"
- "or %%g1, %%lo(%2), %%g1\n"
- "1:\tlduw [%1], %%g5\n\t"
- "cmp %%g5, 0\n\t"
- "bne,pn %%icc, 2f\n\t"
- " mov 0, %0\n\t"
- "add %%g5, %%g1, %%g7\n\t"
- "cas [%1], %%g5, %%g7\n\t"
- "cmp %%g5, %%g7\n\t"
- "bne,pn %%icc, 1b\n\t"
- " mov 1, %0\n\t"
- "membar #StoreLoad | #StoreStore\n"
- "2:\n\t"
- "! ending __down_write_trylock"
- : "=&r" (result)
- : "r" (sem), "i" (RWSEM_ACTIVE_WRITE_BIAS)
- : "g1", "g5", "g7", "memory", "cc");
-
- return result;
-}
-
-static __inline__ void __up_read(struct rw_semaphore *sem)
-{
- __asm__ __volatile__(
- "! beginning __up_read\n\t"
- "1:\tlduw [%0], %%g5\n\t"
- "sub %%g5, 1, %%g7\n\t"
- "cas [%0], %%g5, %%g7\n\t"
- "cmp %%g5, %%g7\n\t"
- "bne,pn %%icc, 1b\n\t"
- " cmp %%g7, 0\n\t"
- "bl,pn %%icc, 3f\n\t"
- " membar #StoreLoad | #StoreStore\n"
- "2:\n\t"
- ".subsection 2\n"
- "3:\tsethi %%hi(%2), %%g1\n\t"
- "sub %%g7, 1, %%g7\n\t"
- "or %%g1, %%lo(%2), %%g1\n\t"
- "andcc %%g7, %%g1, %%g0\n\t"
- "bne,pn %%icc, 2b\n\t"
- " mov %0, %%g5\n\t"
- "save %%sp, -160, %%sp\n\t"
- "mov %%g2, %%l2\n\t"
- "mov %%g3, %%l3\n\t"
- "call %1\n\t"
- " mov %%g5, %%o0\n\t"
- "mov %%l2, %%g2\n\t"
- "ba,pt %%xcc, 2b\n\t"
- " restore %%l3, %%g0, %%g3\n\t"
- ".previous\n\t"
- "! ending __up_read"
- : : "r" (sem), "i" (rwsem_wake),
- "i" (RWSEM_ACTIVE_MASK)
- : "g1", "g5", "g7", "memory", "cc");
-}
-
-static __inline__ void __up_write(struct rw_semaphore *sem)
-{
- __asm__ __volatile__(
- "! beginning __up_write\n\t"
- "sethi %%hi(%2), %%g1\n\t"
- "or %%g1, %%lo(%2), %%g1\n"
- "1:\tlduw [%0], %%g5\n\t"
- "sub %%g5, %%g1, %%g7\n\t"
- "cas [%0], %%g5, %%g7\n\t"
- "cmp %%g5, %%g7\n\t"
- "bne,pn %%icc, 1b\n\t"
- " sub %%g7, %%g1, %%g7\n\t"
- "cmp %%g7, 0\n\t"
- "bl,pn %%icc, 3f\n\t"
- " membar #StoreLoad | #StoreStore\n"
- "2:\n\t"
- ".subsection 2\n"
- "3:\tmov %0, %%g5\n\t"
- "save %%sp, -160, %%sp\n\t"
- "mov %%g2, %%l2\n\t"
- "mov %%g3, %%l3\n\t"
- "call %1\n\t"
- " mov %%g5, %%o0\n\t"
- "mov %%l2, %%g2\n\t"
- "ba,pt %%xcc, 2b\n\t"
- " restore %%l3, %%g0, %%g3\n\t"
- ".previous\n\t"
- "! ending __up_write"
- : : "r" (sem), "i" (rwsem_wake),
- "i" (RWSEM_ACTIVE_WRITE_BIAS)
- : "g1", "g5", "g7", "memory", "cc");
-}
-
-static __inline__ void __downgrade_write(struct rw_semaphore *sem)
-{
- __asm__ __volatile__(
- "! beginning __up_write\n\t"
- "sethi %%hi(%2), %%g1\n\t"
- "or %%g1, %%lo(%2), %%g1\n"
- "1:\tlduw [%0], %%g5\n\t"
- "sub %%g5, %%g1, %%g7\n\t"
- "cas [%0], %%g5, %%g7\n\t"
- "cmp %%g5, %%g7\n\t"
- "bne,pn %%icc, 1b\n\t"
- " sub %%g7, %%g1, %%g7\n\t"
- "cmp %%g7, 0\n\t"
- "bl,pn %%icc, 3f\n\t"
- " membar #StoreLoad | #StoreStore\n"
- "2:\n\t"
- ".subsection 2\n"
- "3:\tmov %0, %%g5\n\t"
- "save %%sp, -160, %%sp\n\t"
- "mov %%g2, %%l2\n\t"
- "mov %%g3, %%l3\n\t"
- "call %1\n\t"
- " mov %%g5, %%o0\n\t"
- "mov %%l2, %%g2\n\t"
- "ba,pt %%xcc, 2b\n\t"
- " restore %%l3, %%g0, %%g3\n\t"
- ".previous\n\t"
- "! ending __up_write"
- : : "r" (sem), "i" (rwsem_downgrade_wake),
- "i" (RWSEM_WAITING_BIAS)
- : "g1", "g5", "g7", "memory", "cc");
-}
+extern void __down_read(struct rw_semaphore *sem);
+extern int __down_read_trylock(struct rw_semaphore *sem);
+extern void __down_write(struct rw_semaphore *sem);
+extern int __down_write_trylock(struct rw_semaphore *sem);
+extern void __up_read(struct rw_semaphore *sem);
+extern void __up_write(struct rw_semaphore *sem);
+extern void __downgrade_write(struct rw_semaphore *sem);
static __inline__ int rwsem_atomic_update(int delta, struct rw_semaphore *sem)
{