summaryrefslogtreecommitdiffstats
path: root/arch/arm/kernel/semaphore.c
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>2000-06-19 22:45:37 +0000
committerRalf Baechle <ralf@linux-mips.org>2000-06-19 22:45:37 +0000
commit6d403070f28cd44860fdb3a53be5da0275c65cf4 (patch)
tree0d0e7fe7b5fb7568d19e11d7d862b77a866ce081 /arch/arm/kernel/semaphore.c
parentecf1bf5f6c2e668d03b0a9fb026db7aa41e292e1 (diff)
Merge with 2.4.0-test1-ac21 + pile of MIPS cleanups to make merging
possible. Chainsawed RM200 kernel to compile again. Jazz machine status unknown.
Diffstat (limited to 'arch/arm/kernel/semaphore.c')
-rw-r--r--arch/arm/kernel/semaphore.c75
1 files changed, 51 insertions, 24 deletions
diff --git a/arch/arm/kernel/semaphore.c b/arch/arm/kernel/semaphore.c
index a2ec71526..93a370f2d 100644
--- a/arch/arm/kernel/semaphore.c
+++ b/arch/arm/kernel/semaphore.c
@@ -290,68 +290,95 @@ struct rw_semaphore *rwsem_wake_writer(struct rw_semaphore *sem)
* need to convert that sequence back into the C sequence when
* there is contention on the semaphore.
*
- * r0 contains the semaphore pointer on entry. Save the C-clobbered
- * registers (r0 to r3, ip and lr) except r0 in the cases where it
- * is used as a return value..
+ * ip contains the semaphore pointer on entry. Save the C-clobbered
+ * registers (r0 to r3 and lr), but not ip, as we use it as a return
+ * value in some cases..
*/
asm(" .section .text.lock, \"ax\"
.align 5
.globl __down_failed
__down_failed:
- stmfd sp!, {r0 - r3, ip, lr}
+ stmfd sp!, {r0 - r3, lr}
+ mov r0, ip
bl __down
- ldmfd sp!, {r0 - r3, ip, pc}
+ ldmfd sp!, {r0 - r3, pc}
.align 5
.globl __down_interruptible_failed
__down_interruptible_failed:
- stmfd sp!, {r1 - r3, ip, lr}
+ stmfd sp!, {r0 - r3, lr}
+ mov r0, ip
bl __down_interruptible
- ldmfd sp!, {r1 - r3, ip, pc}
+ mov ip, r0
+ ldmfd sp!, {r0 - r3, pc}
.align 5
.globl __down_trylock_failed
__down_trylock_failed:
- stmfd sp!, {r1 - r3, ip, lr}
+ stmfd sp!, {r0 - r3, lr}
+ mov r0, ip
bl __down_trylock
- ldmfd sp!, {r1 - r3, ip, pc}
+ mov ip, r0
+ ldmfd sp!, {r0 - r3, pc}
.align 5
.globl __up_wakeup
__up_wakeup:
- stmfd sp!, {r0 - r3, ip, lr}
+ stmfd sp!, {r0 - r3, lr}
+ mov r0, ip
bl __up
- ldmfd sp!, {r0 - r3, ip, pc}
+ ldmfd sp!, {r0 - r3, pc}
.align 5
.globl __down_read_failed
__down_read_failed:
- stmfd sp!, {r0 - r3, ip, lr}
+ stmfd sp!, {r0 - r3, lr}
+ mov r0, ip
bcc 1f
- bl down_read_failed_biased
- ldmfd sp!, {r0 - r3, ip, pc}
-1: bl down_read_failed
- /***/
+1: bl down_read_failed_biased
+ ldmfd sp!, {r0 - r3, pc}
+2: bl down_read_failed
+ mrs r1, cpsr
+ orr r2, r1, #128
+ msr cpsr_c, r2
+ ldr r3, [r0]
+ subs r3, r3, #1
+ str r3, [r0]
+ msr cpsr_c, r1
+ ldmplfd sp!, {r0 - r3, pc}
+ bcc 2b
+ b 1b
.align 5
.globl __down_write_failed
__down_write_failed:
- stmfd sp!, {r0 - r3, ip, lr}
+ stmfd sp!, {r0 - r3, lr}
+ mov r0, ip
bcc 1f
- bl down_write_failed_biased
- ldmfd sp!, {r0 - r3, ip, pc}
-1: bl down_write_failed
- /***/
+1: bl down_write_failed_biased
+ ldmfd sp!, {r0 - r3, pc}
+2: bl down_write_failed
+ mrs r1, cpsr
+ orr r2, r1, #128
+ msr cpsr_c, r2
+ ldr r3, [r0]
+ subs r3, r3, #"RW_LOCK_BIAS_STR"
+ str r3, [r0]
+ msr cpsr_c, r1
+ ldmeqfd sp!, {r0 - r3, pc}
+ bcc 2b
+ b 1b
.align 5
.globl __rwsem_wake
__rwsem_wake:
- stmfd sp!, {r0 - r3, ip, lr}
+ stmfd sp!, {r0 - r3, lr}
+ mov r0, ip
beq 1f
bl rwsem_wake_readers
- ldmfd sp!, {r0 - r3, ip, pc}
+ ldmfd sp!, {r0 - r3, pc}
1: bl rwsem_wake_writer
- ldmfd sp!, {r0 - r3, ip, pc}
+ ldmfd sp!, {r0 - r3, pc}
.previous
");