ChangeSet 1.2181.24.6, 2005/03/24 17:59:43-08:00, [EMAIL PROTECTED]
[SPARC64]: Move rwsem helpers into asm file.
They were all purely inline asm statements anyways.
Signed-off-by: David S. Miller <[EMAIL PROTECTED]>
arch/sparc64/lib/rwsem.c | 222 ----------------------------------
b/arch/sparc64/kernel/sparc64_ksyms.c | 10 +
b/arch/sparc64/lib/rwsem.S | 165 +++++++++++++++++++++++++
b/include/asm-sparc64/rwsem-const.h | 12 +
b/include/asm-sparc64/rwsem.h | 7 -
5 files changed, 188 insertions(+), 228 deletions(-)
diff -Nru a/arch/sparc64/kernel/sparc64_ksyms.c
b/arch/sparc64/kernel/sparc64_ksyms.c
--- a/arch/sparc64/kernel/sparc64_ksyms.c 2005-04-03 21:12:20 -07:00
+++ b/arch/sparc64/kernel/sparc64_ksyms.c 2005-04-03 21:12:20 -07:00
@@ -59,6 +59,7 @@
#include <asm/ns87303.h>
#include <asm/timer.h>
#include <asm/cpudata.h>
+#include <asm/rwsem.h>
struct poll {
int fd;
@@ -170,6 +171,15 @@
EXPORT_SYMBOL(down_trylock);
EXPORT_SYMBOL(down_interruptible);
EXPORT_SYMBOL(up);
+
+/* RW semaphores */
+EXPORT_SYMBOL(__down_read);
+EXPORT_SYMBOL(__down_read_trylock);
+EXPORT_SYMBOL(__down_write);
+EXPORT_SYMBOL(__down_write_trylock);
+EXPORT_SYMBOL(__up_read);
+EXPORT_SYMBOL(__up_write);
+EXPORT_SYMBOL(__downgrade_write);
/* Atomic counter implementation. */
EXPORT_SYMBOL(atomic_add);
diff -Nru a/arch/sparc64/lib/rwsem.S b/arch/sparc64/lib/rwsem.S
--- /dev/null Wed Dec 31 16:00:00 196900
+++ b/arch/sparc64/lib/rwsem.S 2005-04-03 21:12:20 -07:00
@@ -0,0 +1,165 @@
+/* rwsem.S: RW semaphore assembler.
+ *
+ * Written by David S. Miller ([email protected]), 2001.
+ * Derived from asm-i386/rwsem.h
+ */
+
+#include <asm/rwsem-const.h>
+
+ .section .sched.text
+
+ .globl __down_read
+__down_read:
+1: lduw [%o0], %g1
+ add %g1, 1, %g7
+ cas [%o0], %g1, %g7
+ cmp %g1, %g7
+ bne,pn %icc, 1b
+ add %g7, 1, %g7
+ cmp %g7, 0
+ bl,pn %icc, 3f
+ membar #StoreLoad | #StoreStore
+2:
+ retl
+ nop
+3:
+ save %sp, -192, %sp
+ call rwsem_down_read_failed
+ mov %i0, %o0
+ ret
+ restore
+ .size __down_read, .-__down_read
+
+ .globl __down_read_trylock
+__down_read_trylock:
+1: lduw [%o0], %g1
+ add %g1, 1, %g7
+ cmp %g7, 0
+ bl,pn %icc, 2f
+ mov 0, %o1
+ cas [%o0], %g1, %g7
+ cmp %g1, %g7
+ bne,pn %icc, 1b
+ mov 1, %o1
+ membar #StoreLoad | #StoreStore
+2: retl
+ mov %o1, %o0
+ .size __down_read_trylock, .-__down_read_trylock
+
+ .globl __down_write
+__down_write:
+ sethi %hi(RWSEM_ACTIVE_WRITE_BIAS), %g1
+ or %g1, %lo(RWSEM_ACTIVE_WRITE_BIAS), %g1
+1:
+ lduw [%o0], %g3
+ add %g3, %g1, %g7
+ cas [%o0], %g3, %g7
+ cmp %g3, %g7
+ bne,pn %icc, 1b
+ cmp %g7, 0
+ bne,pn %icc, 3f
+ membar #StoreLoad | #StoreStore
+2: retl
+ nop
+3:
+ save %sp, -192, %sp
+ call rwsem_down_write_failed
+ mov %i0, %o0
+ ret
+ restore
+ .size __down_write, .-__down_write
+
+ .globl __down_write_trylock
+__down_write_trylock:
+ sethi %hi(RWSEM_ACTIVE_WRITE_BIAS), %g1
+ or %g1, %lo(RWSEM_ACTIVE_WRITE_BIAS), %g1
+1:
+ lduw [%o0], %g3
+ cmp %g3, 0
+ bne,pn %icc, 2f
+ mov 0, %o1
+ add %g3, %g1, %g7
+ cas [%o0], %g3, %g7
+ cmp %g3, %g7
+ bne,pn %icc, 1b
+ mov 1, %o1
+ membar #StoreLoad | #StoreStore
+2: retl
+ mov %o1, %o0
+ .size __down_write_trylock, .-__down_write_trylock
+
+ .globl __up_read
+__up_read:
+1:
+ lduw [%o0], %g1
+ sub %g1, 1, %g7
+ cas [%o0], %g1, %g7
+ cmp %g1, %g7
+ bne,pn %icc, 1b
+ cmp %g7, 0
+ bl,pn %icc, 3f
+ membar #StoreLoad | #StoreStore
+2: retl
+ nop
+3: sethi %hi(RWSEM_ACTIVE_MASK), %g1
+ sub %g7, 1, %g7
+ or %g1, %lo(RWSEM_ACTIVE_MASK), %g1
+ andcc %g7, %g1, %g0
+ bne,pn %icc, 2b
+ nop
+ save %sp, -192, %sp
+ call rwsem_wake
+ mov %i0, %o0
+ ret
+ restore
+ .size __up_read, .-__up_read
+
+ .globl __up_write
+__up_write:
+ sethi %hi(RWSEM_ACTIVE_WRITE_BIAS), %g1
+ or %g1, %lo(RWSEM_ACTIVE_WRITE_BIAS), %g1
+1:
+ lduw [%o0], %g3
+ sub %g3, %g1, %g7
+ cas [%o0], %g3, %g7
+ cmp %g3, %g7
+ bne,pn %icc, 1b
+ sub %g7, %g1, %g7
+ cmp %g7, 0
+ bl,pn %icc, 3f
+ membar #StoreLoad | #StoreStore
+2:
+ retl
+ nop
+3:
+ save %sp, -192, %sp
+ call rwsem_wake
+ mov %i0, %o0
+ ret
+ restore
+ .size __up_write, .-__up_write
+
+ .globl __downgrade_write
+__downgrade_write:
+ sethi %hi(RWSEM_WAITING_BIAS), %g1
+ or %g1, %lo(RWSEM_WAITING_BIAS), %g1
+1:
+ lduw [%o0], %g3
+ sub %g3, %g1, %g7
+ cas [%o0], %g3, %g7
+ cmp %g3, %g7
+ bne,pn %icc, 1b
+ sub %g7, %g1, %g7
+ cmp %g7, 0
+ bl,pn %icc, 3f
+ membar #StoreLoad | #StoreStore
+2:
+ retl
+ nop
+3:
+ save %sp, -192, %sp
+ call rwsem_downgrade_wake
+ mov %i0, %o0
+ ret
+ restore
+ .size __downgrade_write, .-__downgrade_write
diff -Nru a/arch/sparc64/lib/rwsem.c b/arch/sparc64/lib/rwsem.c
--- a/arch/sparc64/lib/rwsem.c 2005-04-03 21:12:20 -07:00
+++ /dev/null Wed Dec 31 16:00:00 196900
@@ -1,222 +0,0 @@
-/* rwsem.c: Don't inline expand these suckers all over the place.
- *
- * Written by David S. Miller ([email protected]), 2001.
- * Derived from asm-i386/rwsem.h
- */
-
-#include <linux/kernel.h>
-#include <linux/rwsem.h>
-#include <linux/init.h>
-#include <linux/module.h>
-
-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
*));
-
-void __sched __down_read(struct rw_semaphore *sem)
-{
- __asm__ __volatile__(
- "! beginning __down_read\n"
- "1:\tlduw [%0], %%g1\n\t"
- "add %%g1, 1, %%g7\n\t"
- "cas [%0], %%g1, %%g7\n\t"
- "cmp %%g1, %%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, %%g1\n\t"
- "save %%sp, -160, %%sp\n\t"
- "call %1\n\t"
- " mov %%g1, %%o0\n\t"
- "ba,pt %%xcc, 2b\n\t"
- " restore\n\t"
- ".previous\n\t"
- "! ending __down_read"
- : : "r" (sem), "i" (rwsem_down_read_failed)
- : "g1", "g2", "g3", "g5", "g7", "memory", "cc");
-}
-EXPORT_SYMBOL(__down_read);
-
-int __down_read_trylock(struct rw_semaphore *sem)
-{
- int result;
-
- __asm__ __volatile__(
- "! beginning __down_read_trylock\n"
- "1:\tlduw [%1], %%g1\n\t"
- "add %%g1, 1, %%g7\n\t"
- "cmp %%g7, 0\n\t"
- "bl,pn %%icc, 2f\n\t"
- " mov 0, %0\n\t"
- "cas [%1], %%g1, %%g7\n\t"
- "cmp %%g1, %%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)
- : "g1", "g7", "memory", "cc");
-
- return result;
-}
-EXPORT_SYMBOL(__down_read_trylock);
-
-void __sched __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], %%g3\n\t"
- "add %%g3, %%g1, %%g7\n\t"
- "cas [%0], %%g3, %%g7\n\t"
- "cmp %%g3, %%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, %%g1\n\t"
- "save %%sp, -160, %%sp\n\t"
- "call %1\n\t"
- " mov %%g1, %%o0\n\t"
- "ba,pt %%xcc, 2b\n\t"
- " restore\n\t"
- ".previous\n\t"
- "! ending __down_write"
- : : "r" (sem), "i" (rwsem_down_write_failed),
- "i" (RWSEM_ACTIVE_WRITE_BIAS)
- : "g1", "g2", "g3", "g5", "g7", "memory", "cc");
-}
-EXPORT_SYMBOL(__down_write);
-
-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], %%g3\n\t"
- "cmp %%g3, 0\n\t"
- "bne,pn %%icc, 2f\n\t"
- " mov 0, %0\n\t"
- "add %%g3, %%g1, %%g7\n\t"
- "cas [%1], %%g3, %%g7\n\t"
- "cmp %%g3, %%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", "g3", "g7", "memory", "cc");
-
- return result;
-}
-EXPORT_SYMBOL(__down_write_trylock);
-
-void __up_read(struct rw_semaphore *sem)
-{
- __asm__ __volatile__(
- "! beginning __up_read\n\t"
- "1:\tlduw [%0], %%g1\n\t"
- "sub %%g1, 1, %%g7\n\t"
- "cas [%0], %%g1, %%g7\n\t"
- "cmp %%g1, %%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, %%g1\n\t"
- "save %%sp, -160, %%sp\n\t"
- "call %1\n\t"
- " mov %%g1, %%o0\n\t"
- "ba,pt %%xcc, 2b\n\t"
- " restore\n\t"
- ".previous\n\t"
- "! ending __up_read"
- : : "r" (sem), "i" (rwsem_wake),
- "i" (RWSEM_ACTIVE_MASK)
- : "g1", "g2", "g3", "g5", "g7", "memory", "cc");
-}
-EXPORT_SYMBOL(__up_read);
-
-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], %%g3\n\t"
- "sub %%g3, %%g1, %%g7\n\t"
- "cas [%0], %%g3, %%g7\n\t"
- "cmp %%g3, %%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, %%g1\n\t"
- "save %%sp, -160, %%sp\n\t"
- "call %1\n\t"
- " mov %%g1, %%o0\n\t"
- "ba,pt %%xcc, 2b\n\t"
- " restore\n\t"
- ".previous\n\t"
- "! ending __up_write"
- : : "r" (sem), "i" (rwsem_wake),
- "i" (RWSEM_ACTIVE_WRITE_BIAS)
- : "g1", "g2", "g3", "g5", "g7", "memory", "cc");
-}
-EXPORT_SYMBOL(__up_write);
-
-void __downgrade_write(struct rw_semaphore *sem)
-{
- __asm__ __volatile__(
- "! beginning __downgrade_write\n\t"
- "sethi %%hi(%2), %%g1\n\t"
- "or %%g1, %%lo(%2), %%g1\n"
- "1:\tlduw [%0], %%g3\n\t"
- "sub %%g3, %%g1, %%g7\n\t"
- "cas [%0], %%g3, %%g7\n\t"
- "cmp %%g3, %%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, %%g1\n\t"
- "save %%sp, -160, %%sp\n\t"
- "call %1\n\t"
- " mov %%g1, %%o0\n\t"
- "ba,pt %%xcc, 2b\n\t"
- " restore\n\t"
- ".previous\n\t"
- "! ending __up_write"
- : : "r" (sem), "i" (rwsem_downgrade_wake),
- "i" (RWSEM_WAITING_BIAS)
- : "g1", "g2", "g3", "g5", "g7", "memory", "cc");
-}
-EXPORT_SYMBOL(__downgrade_write);
diff -Nru a/include/asm-sparc64/rwsem-const.h
b/include/asm-sparc64/rwsem-const.h
--- /dev/null Wed Dec 31 16:00:00 196900
+++ b/include/asm-sparc64/rwsem-const.h 2005-04-03 21:12:20 -07:00
@@ -0,0 +1,12 @@
+/* rwsem-const.h: RW semaphore counter constants. */
+#ifndef _SPARC64_RWSEM_CONST_H
+#define _SPARC64_RWSEM_CONST_H
+
+#define RWSEM_UNLOCKED_VALUE 0x00000000
+#define RWSEM_ACTIVE_BIAS 0x00000001
+#define RWSEM_ACTIVE_MASK 0x0000ffff
+#define RWSEM_WAITING_BIAS 0xffff0000
+#define RWSEM_ACTIVE_READ_BIAS RWSEM_ACTIVE_BIAS
+#define RWSEM_ACTIVE_WRITE_BIAS (RWSEM_WAITING_BIAS +
RWSEM_ACTIVE_BIAS)
+
+#endif /* _SPARC64_RWSEM_CONST_H */
diff -Nru a/include/asm-sparc64/rwsem.h b/include/asm-sparc64/rwsem.h
--- a/include/asm-sparc64/rwsem.h 2005-04-03 21:12:20 -07:00
+++ b/include/asm-sparc64/rwsem.h 2005-04-03 21:12:20 -07:00
@@ -15,17 +15,12 @@
#include <linux/list.h>
#include <linux/spinlock.h>
+#include <asm/rwsem-const.h>
struct rwsem_waiter;
struct rw_semaphore {
signed int count;
-#define RWSEM_UNLOCKED_VALUE 0x00000000
-#define RWSEM_ACTIVE_BIAS 0x00000001
-#define RWSEM_ACTIVE_MASK 0x0000ffff
-#define RWSEM_WAITING_BIAS 0xffff0000
-#define RWSEM_ACTIVE_READ_BIAS RWSEM_ACTIVE_BIAS
-#define RWSEM_ACTIVE_WRITE_BIAS (RWSEM_WAITING_BIAS +
RWSEM_ACTIVE_BIAS)
spinlock_t wait_lock;
struct list_head wait_list;
};
-
To unsubscribe from this list: send the line "unsubscribe bk-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html