|
18 | 18 |
|
19 | 19 | #include <linux/linkage.h> |
20 | 20 | #include <asm/assembler.h> |
| 21 | +#include <asm/lse.h> |
21 | 22 |
|
22 | 23 | /* |
23 | 24 | * x0: bits 5:0 bit offset |
24 | 25 | * bits 31:6 word offset |
25 | 26 | * x1: address |
26 | 27 | */ |
27 | | - .macro bitop, name, instr |
| 28 | + .macro bitop, name, llsc, lse |
28 | 29 | ENTRY( \name ) |
29 | 30 | and w3, w0, #63 // Get bit offset |
30 | 31 | eor w0, w0, w3 // Clear low bits |
31 | 32 | mov x2, #1 |
32 | 33 | add x1, x1, x0, lsr #3 // Get word offset |
33 | 34 | lsl x3, x2, x3 // Create mask |
34 | | -1: ldxr x2, [x1] |
35 | | - \instr x2, x2, x3 |
36 | | - stxr w0, x2, [x1] |
37 | | - cbnz w0, 1b |
| 35 | + |
| 36 | +alt_lse "1: ldxr x2, [x1]", "\lse x3, [x1]" |
| 37 | +alt_lse " \llsc x2, x2, x3", "nop" |
| 38 | +alt_lse " stxr w0, x2, [x1]", "nop" |
| 39 | +alt_lse " cbnz w0, 1b", "nop" |
| 40 | + |
38 | 41 | ret |
39 | 42 | ENDPROC(\name ) |
40 | 43 | .endm |
41 | 44 |
|
42 | | - .macro testop, name, instr |
| 45 | + .macro testop, name, llsc, lse |
43 | 46 | ENTRY( \name ) |
44 | 47 | and w3, w0, #63 // Get bit offset |
45 | 48 | eor w0, w0, w3 // Clear low bits |
46 | 49 | mov x2, #1 |
47 | 50 | add x1, x1, x0, lsr #3 // Get word offset |
48 | 51 | lsl x4, x2, x3 // Create mask |
49 | | -1: ldxr x2, [x1] |
50 | | - lsr x0, x2, x3 // Save old value of bit |
51 | | - \instr x2, x2, x4 // toggle bit |
52 | | - stlxr w5, x2, [x1] |
53 | | - cbnz w5, 1b |
54 | | - dmb ish |
| 52 | + |
| 53 | +alt_lse "1: ldxr x2, [x1]", "\lse x4, x2, [x1]" |
| 54 | + lsr x0, x2, x3 |
| 55 | +alt_lse " \llsc x2, x2, x4", "nop" |
| 56 | +alt_lse " stlxr w5, x2, [x1]", "nop" |
| 57 | +alt_lse " cbnz w5, 1b", "nop" |
| 58 | +alt_lse " dmb ish", "nop" |
| 59 | + |
55 | 60 | and x0, x0, #1 |
56 | | -3: ret |
| 61 | + ret |
57 | 62 | ENDPROC(\name ) |
58 | 63 | .endm |
59 | 64 |
|
60 | 65 | /* |
61 | 66 | * Atomic bit operations. |
62 | 67 | */ |
63 | | - bitop change_bit, eor |
64 | | - bitop clear_bit, bic |
65 | | - bitop set_bit, orr |
| 68 | + bitop change_bit, eor, steor |
| 69 | + bitop clear_bit, bic, stclr |
| 70 | + bitop set_bit, orr, stset |
66 | 71 |
|
67 | | - testop test_and_change_bit, eor |
68 | | - testop test_and_clear_bit, bic |
69 | | - testop test_and_set_bit, orr |
| 72 | + testop test_and_change_bit, eor, ldeoral |
| 73 | + testop test_and_clear_bit, bic, ldclral |
| 74 | + testop test_and_set_bit, orr, ldsetal |
0 commit comments