Ver Fonte

[PATCH] ARM: Convert bitops to use ARMv6 ldrex/strex instructions

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Russell King há 20 anos atrás
pai
commit
54ea06f6af
1 ficheiros alterados com 31 adições e 0 exclusões
  1. 31 0
      arch/arm/lib/bitops.h

+ 31 - 0
arch/arm/lib/bitops.h

@@ -1,3 +1,33 @@
+#if __LINUX_ARM_ARCH__ >= 6
+	.macro	bitop, instr
+	mov	r2, #1
+	and	r3, r0, #7		@ Get bit offset
+	add	r1, r1, r0, lsr #3	@ Get byte offset
+	mov	r3, r2, lsl r3
+1:	ldrexb	r2, [r1]
+	\instr	r2, r2, r3
+	strexb	r0, r2, [r1]
+	cmpne	r0, #0
+	bne	1b
+	mov	pc, lr
+	.endm
+
+	.macro	testop, instr, store
+	and	r3, r0, #7		@ Get bit offset
+	mov	r2, #1
+	add	r1, r1, r0, lsr #3	@ Get byte offset
+	mov	r3, r2, lsl r3		@ create mask
+1:	ldrexb	r2, [r1]
+	ands	r0, r2, r3		@ save old value of bit
+	\instr	ip, r2, r3			@ toggle bit
+	strexb	r2, ip, [r1]
+	cmp	r2, #0
+	bne	1b
+	cmp	r0, #0
+	movne	r0, #1
+2:	mov	pc, lr
+	.endm
+#else
 	.macro	bitop, instr
 	and	r2, r0, #7
 	mov	r3, #1
@@ -31,3 +61,4 @@
 	moveq	r0, #0
 	mov	pc, lr
 	.endm
+#endif