patch-2.4.0-test2 linux/arch/arm/kernel/semaphore.c

Next file: linux/arch/arm/kernel/setup.c
Previous file: linux/arch/arm/kernel/ptrace.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.4.0-test1/linux/arch/arm/kernel/semaphore.c linux/arch/arm/kernel/semaphore.c
@@ -290,68 +290,95 @@
  * 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
 	");

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)