From f728559bf951b515be39d61f3ffd0eaae64b2b0d Mon Sep 17 00:00:00 2001 From: Michael Sevakis Date: Tue, 24 Jan 2017 10:15:53 -0500 Subject: Make atomic bit modification functions return previous value. Change-Id: I19a94cf946735e1d9e51c3207cd82198fd4dfc1a --- firmware/target/arm/bits-armv6.S | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) (limited to 'firmware/target/arm/bits-armv6.S') diff --git a/firmware/target/arm/bits-armv6.S b/firmware/target/arm/bits-armv6.S index fbac7f9cf9..d0e48477ed 100644 --- a/firmware/target/arm/bits-armv6.S +++ b/firmware/target/arm/bits-armv6.S @@ -20,55 +20,59 @@ ****************************************************************************/ /*************************************************************************** - * void bitmod32(volatile uint32_t *addr, uint32_t bits, uint32_t mask) + * uint32_t bitmod32(volatile uint32_t *addr, uint32_t bits, uint32_t mask) */ .section .text.bitmod32, "ax", %progbits .align 2 .global bitmod32 .type bitmod32, %function bitmod32: + mov r3, r0 mrs r12, cpsr cpsid if - ldr r3, [r0] + ldr r0, [r3] and r1, r1, r2 @ Only allow mod of bits in 'mask' - bic r3, r3, r2 @ Clear mask bits - orr r3, r3, r1 @ Set according to 'bits' - str r3, [r0] + bic r2, r0, r2 @ Clear mask bits + orr r1, r2, r1 @ Set according to 'bits' + str r1, [r3] msr cpsr_c, r12 bx lr .size bitmod32, .-bitmod32 + /*************************************************************************** - * void bitset32(volatile uint32_t *addr, uint32_t mask) + * uint32_t bitset32(volatile uint32_t *addr, uint32_t mask) */ .section .text.bitset32, "ax", %progbits .align 2 .global bitset32 .type bitset32, %function bitset32: + mov r2, r0 mrs r12, cpsr cpsid if - ldr r2, [r0] - orr r2, r2, r1 - str r2, [r0] + ldr r0, [r2] + orr r1, r0, r1 + str r1, [r2] msr cpsr_c, r12 bx lr .size bitset32, .-bitset32 /*************************************************************************** - * void bitclr32(volatile uint32_t *addr, uint32_t mask) + * uint32_t bitclr32(volatile uint32_t *addr, uint32_t mask) */ .section .text.bitclr32, "ax", %progbits .align 2 .global bitclr32 .type bitclr32, %function bitclr32: + mov r2, r0 mrs r12, cpsr cpsid if - ldr r2, [r0] - bic r2, r2, r1 - str r2, [r0] + ldr r0, [r2] + bic r1, r0, r1 + str r1, [r2] msr cpsr_c, r12 bx lr .size bitclr32, .-bitclr32 -- cgit v1.2.3