|
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