diff options
author | Michael Sevakis <jethead71@rockbox.org> | 2017-01-24 10:15:53 -0500 |
---|---|---|
committer | Michael Sevakis <jethead71@rockbox.org> | 2017-10-30 21:43:15 -0400 |
commit | f728559bf951b515be39d61f3ffd0eaae64b2b0d (patch) | |
tree | bacc0461d0fac54af57fe5938457998babab9323 /firmware/target/arm | |
parent | 65e7617ab645b1680a31fbc6d8f231ca7408f05e (diff) | |
download | rockbox-f728559bf951b515be39d61f3ffd0eaae64b2b0d.tar.gz rockbox-f728559bf951b515be39d61f3ffd0eaae64b2b0d.zip |
Make atomic bit modification functions return previous value.
Change-Id: I19a94cf946735e1d9e51c3207cd82198fd4dfc1a
Diffstat (limited to 'firmware/target/arm')
-rw-r--r-- | firmware/target/arm/bits-armv4.S | 78 | ||||
-rw-r--r-- | firmware/target/arm/bits-armv6.S | 30 |
2 files changed, 60 insertions, 48 deletions
diff --git a/firmware/target/arm/bits-armv4.S b/firmware/target/arm/bits-armv4.S index fdfc9f3227..33a1508c2c 100644 --- a/firmware/target/arm/bits-armv4.S +++ b/firmware/target/arm/bits-armv4.S | |||
@@ -20,7 +20,7 @@ | |||
20 | ****************************************************************************/ | 20 | ****************************************************************************/ |
21 | 21 | ||
22 | /*************************************************************************** | 22 | /*************************************************************************** |
23 | * void bitmod32(volatile uint32_t *addr, uint32_t bits, uint32_t mask) | 23 | * uint32_t bitmod32(volatile uint32_t *addr, uint32_t bits, uint32_t mask) |
24 | */ | 24 | */ |
25 | .section .text.bitmod32, "ax", %progbits | 25 | .section .text.bitmod32, "ax", %progbits |
26 | .align 2 | 26 | .align 2 |
@@ -30,54 +30,59 @@ bitmod32: | |||
30 | mrs r12, cpsr | 30 | mrs r12, cpsr |
31 | orr r3, r12, #0xc0 | 31 | orr r3, r12, #0xc0 |
32 | msr cpsr_c, r3 | 32 | msr cpsr_c, r3 |
33 | ldr r3, [r0] | 33 | mov r3, r0 |
34 | ldr r0, [r3] | ||
34 | and r1, r1, r2 @ Only allow mod of bits in 'mask' | 35 | and r1, r1, r2 @ Only allow mod of bits in 'mask' |
35 | bic r3, r3, r2 @ Clear mask bits | 36 | bic r2, r0, r2 @ Clear mask bits |
36 | orr r3, r3, r1 @ Set according to 'bits' | 37 | orr r1, r2, r1 @ Set according to 'bits' |
37 | str r3, [r0] | 38 | str r1, [r3] |
38 | msr cpsr_c, r12 | 39 | msr cpsr_c, r12 |
39 | bx lr | 40 | bx lr |
40 | .size bitmod32, .-bitmod32 | 41 | .size bitmod32, .-bitmod32 |
41 | 42 | ||
43 | |||
42 | /*************************************************************************** | 44 | /*************************************************************************** |
43 | * void bitset32(volatile uint32_t *addr, uint32_t mask) | 45 | * uint32_t bitset32(volatile uint32_t *addr, uint32_t mask) |
44 | */ | 46 | */ |
45 | .section .text.bitset32, "ax", %progbits | 47 | .section .text.bitset32, "ax", %progbits |
46 | .align 2 | 48 | .align 2 |
47 | .global bitset32 | 49 | .global bitset32 |
48 | .type bitset32, %function | 50 | .type bitset32, %function |
49 | bitset32: | 51 | bitset32: |
52 | mov r2, r0 | ||
50 | mrs r12, cpsr | 53 | mrs r12, cpsr |
51 | orr r2, r12, #0xc0 | 54 | orr r3, r12, #0xc0 |
52 | msr cpsr_c, r2 | 55 | msr cpsr_c, r3 |
53 | ldr r2, [r0] | 56 | ldr r0, [r2] |
54 | orr r2, r2, r1 | 57 | orr r1, r0, r1 |
55 | str r2, [r0] | 58 | str r1, [r2] |
56 | msr cpsr_c, r12 | 59 | msr cpsr_c, r12 |
57 | bx lr | 60 | bx lr |
58 | .size bitset32, .-bitset32 | 61 | .size bitset32, .-bitset32 |
59 | 62 | ||
60 | 63 | ||
61 | /*************************************************************************** | 64 | /*************************************************************************** |
62 | * void bitclr32(volatile uint32_t *addr, uint32_t mask) | 65 | * uint32_t bitclr32(volatile uint32_t *addr, uint32_t mask) |
63 | */ | 66 | */ |
64 | .section .text.bitclr32, "ax", %progbits | 67 | .section .text.bitclr32, "ax", %progbits |
65 | .align 2 | 68 | .align 2 |
66 | .global bitclr32 | 69 | .global bitclr32 |
67 | .type bitclr32, %function | 70 | .type bitclr32, %function |
68 | bitclr32: | 71 | bitclr32: |
72 | mov r2, r0 | ||
69 | mrs r12, cpsr | 73 | mrs r12, cpsr |
70 | orr r2, r12, #0xc0 | 74 | orr r3, r12, #0xc0 |
71 | msr cpsr_c, r2 | 75 | msr cpsr_c, r3 |
72 | ldr r2, [r0] | 76 | ldr r0, [r2] |
73 | bic r2, r2, r1 | 77 | bic r1, r0, r1 |
74 | str r2, [r0] | 78 | str r1, [r2] |
75 | msr cpsr_c, r12 | 79 | msr cpsr_c, r12 |
76 | bx lr | 80 | bx lr |
77 | .size bitclr32, .-bitclr32 | 81 | .size bitclr32, .-bitclr32 |
78 | 82 | ||
83 | |||
79 | /*************************************************************************** | 84 | /*************************************************************************** |
80 | * void bitmod16(volatile uint16_t *addr, uint16_t bits, uint16_t mask) | 85 | * uint16_t bitmod16(volatile uint16_t *addr, uint16_t bits, uint16_t mask) |
81 | */ | 86 | */ |
82 | .section .text.bitmod16, "ax", %progbits | 87 | .section .text.bitmod16, "ax", %progbits |
83 | .align 2 | 88 | .align 2 |
@@ -87,49 +92,52 @@ bitmod16: | |||
87 | mrs r12, cpsr | 92 | mrs r12, cpsr |
88 | orr r3, r12, #0xc0 | 93 | orr r3, r12, #0xc0 |
89 | msr cpsr_c, r3 | 94 | msr cpsr_c, r3 |
90 | ldrh r3, [r0] | 95 | mov r3, r0 |
96 | ldrh r0, [r3] | ||
91 | and r1, r1, r2 @ Only allow mod of bits in 'mask' | 97 | and r1, r1, r2 @ Only allow mod of bits in 'mask' |
92 | bic r3, r3, r2 @ Clear mask bits | 98 | bic r2, r0, r2 @ Clear mask bits |
93 | orr r3, r3, r1 @ Set according to 'bits' | 99 | orr r1, r2, r1 @ Set according to 'bits' |
94 | strh r3, [r0] | 100 | strh r1, [r3] |
95 | msr cpsr_c, r12 | 101 | msr cpsr_c, r12 |
96 | bx lr | 102 | bx lr |
97 | .size bitmod16, .-bitmod16 | 103 | .size bitmod16, .-bitmod16 |
98 | 104 | ||
105 | |||
99 | /*************************************************************************** | 106 | /*************************************************************************** |
100 | * void bitset16(volatile uint16_t *addr, uint16_t mask) | 107 | * uint16_t bitset16(volatile uint16_t *addr, uint16_t mask) |
101 | */ | 108 | */ |
102 | .section .text.bitset16, "ax", %progbits | 109 | .section .text.bitset16, "ax", %progbits |
103 | .align 2 | 110 | .align 2 |
104 | .global bitset16 | 111 | .global bitset16 |
105 | .type bitset16, %function | 112 | .type bitset16, %function |
106 | bitset16: | 113 | bitset16: |
114 | mov r2, r0 | ||
107 | mrs r12, cpsr | 115 | mrs r12, cpsr |
108 | orr r2, r12, #0xc0 | 116 | orr r3, r12, #0xc0 |
109 | msr cpsr_c, r2 | 117 | msr cpsr_c, r3 |
110 | ldrh r2, [r0] | 118 | ldrh r0, [r2] |
111 | orr r2, r2, r1 | 119 | orr r1, r0, r1 |
112 | strh r2, [r0] | 120 | strh r1, [r2] |
113 | msr cpsr_c, r12 | 121 | msr cpsr_c, r12 |
114 | bx lr | 122 | bx lr |
115 | .size bitset16, .-bitset16 | 123 | .size bitset16, .-bitset16 |
116 | 124 | ||
117 | 125 | ||
118 | /*************************************************************************** | 126 | /*************************************************************************** |
119 | * void bitclr16(volatile uint16_t *addr, uint16_t mask) | 127 | * uint16_t bitclr16(volatile uint16_t *addr, uint16_t mask) |
120 | */ | 128 | */ |
121 | .section .text.bitclr16, "ax", %progbits | 129 | .section .text.bitclr16, "ax", %progbits |
122 | .align 2 | 130 | .align 2 |
123 | .global bitclr16 | 131 | .global bitclr16 |
124 | .type bitclr16, %function | 132 | .type bitclr16, %function |
125 | bitclr16: | 133 | bitclr16: |
134 | mov r2, r0 | ||
126 | mrs r12, cpsr | 135 | mrs r12, cpsr |
127 | orr r2, r12, #0xc0 | 136 | orr r3, r12, #0xc0 |
128 | msr cpsr_c, r2 | 137 | msr cpsr_c, r3 |
129 | ldrh r2, [r0] | 138 | ldrh r0, [r2] |
130 | bic r2, r2, r1 | 139 | bic r1, r0, r1 |
131 | strh r2, [r0] | 140 | strh r1, [r2] |
132 | msr cpsr_c, r12 | 141 | msr cpsr_c, r12 |
133 | bx lr | 142 | bx lr |
134 | .size bitclr16, .-bitclr16 | 143 | .size bitclr16, .-bitclr16 |
135 | |||
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 @@ | |||
20 | ****************************************************************************/ | 20 | ****************************************************************************/ |
21 | 21 | ||
22 | /*************************************************************************** | 22 | /*************************************************************************** |
23 | * void bitmod32(volatile uint32_t *addr, uint32_t bits, uint32_t mask) | 23 | * uint32_t bitmod32(volatile uint32_t *addr, uint32_t bits, uint32_t mask) |
24 | */ | 24 | */ |
25 | .section .text.bitmod32, "ax", %progbits | 25 | .section .text.bitmod32, "ax", %progbits |
26 | .align 2 | 26 | .align 2 |
27 | .global bitmod32 | 27 | .global bitmod32 |
28 | .type bitmod32, %function | 28 | .type bitmod32, %function |
29 | bitmod32: | 29 | bitmod32: |
30 | mov r3, r0 | ||
30 | mrs r12, cpsr | 31 | mrs r12, cpsr |
31 | cpsid if | 32 | cpsid if |
32 | ldr r3, [r0] | 33 | ldr r0, [r3] |
33 | and r1, r1, r2 @ Only allow mod of bits in 'mask' | 34 | and r1, r1, r2 @ Only allow mod of bits in 'mask' |
34 | bic r3, r3, r2 @ Clear mask bits | 35 | bic r2, r0, r2 @ Clear mask bits |
35 | orr r3, r3, r1 @ Set according to 'bits' | 36 | orr r1, r2, r1 @ Set according to 'bits' |
36 | str r3, [r0] | 37 | str r1, [r3] |
37 | msr cpsr_c, r12 | 38 | msr cpsr_c, r12 |
38 | bx lr | 39 | bx lr |
39 | .size bitmod32, .-bitmod32 | 40 | .size bitmod32, .-bitmod32 |
40 | 41 | ||
42 | |||
41 | /*************************************************************************** | 43 | /*************************************************************************** |
42 | * void bitset32(volatile uint32_t *addr, uint32_t mask) | 44 | * uint32_t bitset32(volatile uint32_t *addr, uint32_t mask) |
43 | */ | 45 | */ |
44 | .section .text.bitset32, "ax", %progbits | 46 | .section .text.bitset32, "ax", %progbits |
45 | .align 2 | 47 | .align 2 |
46 | .global bitset32 | 48 | .global bitset32 |
47 | .type bitset32, %function | 49 | .type bitset32, %function |
48 | bitset32: | 50 | bitset32: |
51 | mov r2, r0 | ||
49 | mrs r12, cpsr | 52 | mrs r12, cpsr |
50 | cpsid if | 53 | cpsid if |
51 | ldr r2, [r0] | 54 | ldr r0, [r2] |
52 | orr r2, r2, r1 | 55 | orr r1, r0, r1 |
53 | str r2, [r0] | 56 | str r1, [r2] |
54 | msr cpsr_c, r12 | 57 | msr cpsr_c, r12 |
55 | bx lr | 58 | bx lr |
56 | .size bitset32, .-bitset32 | 59 | .size bitset32, .-bitset32 |
57 | 60 | ||
58 | 61 | ||
59 | /*************************************************************************** | 62 | /*************************************************************************** |
60 | * void bitclr32(volatile uint32_t *addr, uint32_t mask) | 63 | * uint32_t bitclr32(volatile uint32_t *addr, uint32_t mask) |
61 | */ | 64 | */ |
62 | .section .text.bitclr32, "ax", %progbits | 65 | .section .text.bitclr32, "ax", %progbits |
63 | .align 2 | 66 | .align 2 |
64 | .global bitclr32 | 67 | .global bitclr32 |
65 | .type bitclr32, %function | 68 | .type bitclr32, %function |
66 | bitclr32: | 69 | bitclr32: |
70 | mov r2, r0 | ||
67 | mrs r12, cpsr | 71 | mrs r12, cpsr |
68 | cpsid if | 72 | cpsid if |
69 | ldr r2, [r0] | 73 | ldr r0, [r2] |
70 | bic r2, r2, r1 | 74 | bic r1, r0, r1 |
71 | str r2, [r0] | 75 | str r1, [r2] |
72 | msr cpsr_c, r12 | 76 | msr cpsr_c, r12 |
73 | bx lr | 77 | bx lr |
74 | .size bitclr32, .-bitclr32 | 78 | .size bitclr32, .-bitclr32 |