diff options
Diffstat (limited to 'arch/sparc64/lib/bitops.S')
| -rw-r--r-- | arch/sparc64/lib/bitops.S | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/arch/sparc64/lib/bitops.S b/arch/sparc64/lib/bitops.S index 886dcd2b376a..31afbfe6c1e8 100644 --- a/arch/sparc64/lib/bitops.S +++ b/arch/sparc64/lib/bitops.S | |||
| @@ -7,20 +7,26 @@ | |||
| 7 | #include <linux/config.h> | 7 | #include <linux/config.h> |
| 8 | #include <asm/asi.h> | 8 | #include <asm/asi.h> |
| 9 | 9 | ||
| 10 | .text | ||
| 11 | |||
| 10 | /* On SMP we need to use memory barriers to ensure | 12 | /* On SMP we need to use memory barriers to ensure |
| 11 | * correct memory operation ordering, nop these out | 13 | * correct memory operation ordering, nop these out |
| 12 | * for uniprocessor. | 14 | * for uniprocessor. |
| 13 | */ | 15 | */ |
| 16 | |||
| 14 | #ifdef CONFIG_SMP | 17 | #ifdef CONFIG_SMP |
| 15 | #define BITOP_PRE_BARRIER membar #StoreLoad | #LoadLoad | 18 | #define BITOP_PRE_BARRIER membar #StoreLoad | #LoadLoad |
| 16 | #define BITOP_POST_BARRIER membar #StoreLoad | #StoreStore | 19 | #define BITOP_POST_BARRIER \ |
| 20 | ba,pt %xcc, 80b; \ | ||
| 21 | membar #StoreLoad | #StoreStore | ||
| 22 | |||
| 23 | 80: retl | ||
| 24 | nop | ||
| 17 | #else | 25 | #else |
| 18 | #define BITOP_PRE_BARRIER nop | 26 | #define BITOP_PRE_BARRIER |
| 19 | #define BITOP_POST_BARRIER nop | 27 | #define BITOP_POST_BARRIER |
| 20 | #endif | 28 | #endif |
| 21 | 29 | ||
| 22 | .text | ||
| 23 | |||
| 24 | .globl test_and_set_bit | 30 | .globl test_and_set_bit |
| 25 | .type test_and_set_bit,#function | 31 | .type test_and_set_bit,#function |
| 26 | test_and_set_bit: /* %o0=nr, %o1=addr */ | 32 | test_and_set_bit: /* %o0=nr, %o1=addr */ |
| @@ -37,10 +43,11 @@ test_and_set_bit: /* %o0=nr, %o1=addr */ | |||
| 37 | cmp %g7, %g1 | 43 | cmp %g7, %g1 |
| 38 | bne,pn %xcc, 1b | 44 | bne,pn %xcc, 1b |
| 39 | and %g7, %o2, %g2 | 45 | and %g7, %o2, %g2 |
| 40 | BITOP_POST_BARRIER | ||
| 41 | clr %o0 | 46 | clr %o0 |
| 47 | movrne %g2, 1, %o0 | ||
| 48 | BITOP_POST_BARRIER | ||
| 42 | retl | 49 | retl |
| 43 | movrne %g2, 1, %o0 | 50 | nop |
| 44 | .size test_and_set_bit, .-test_and_set_bit | 51 | .size test_and_set_bit, .-test_and_set_bit |
| 45 | 52 | ||
| 46 | .globl test_and_clear_bit | 53 | .globl test_and_clear_bit |
| @@ -59,10 +66,11 @@ test_and_clear_bit: /* %o0=nr, %o1=addr */ | |||
| 59 | cmp %g7, %g1 | 66 | cmp %g7, %g1 |
| 60 | bne,pn %xcc, 1b | 67 | bne,pn %xcc, 1b |
| 61 | and %g7, %o2, %g2 | 68 | and %g7, %o2, %g2 |
| 62 | BITOP_POST_BARRIER | ||
| 63 | clr %o0 | 69 | clr %o0 |
| 70 | movrne %g2, 1, %o0 | ||
| 71 | BITOP_POST_BARRIER | ||
| 64 | retl | 72 | retl |
| 65 | movrne %g2, 1, %o0 | 73 | nop |
| 66 | .size test_and_clear_bit, .-test_and_clear_bit | 74 | .size test_and_clear_bit, .-test_and_clear_bit |
| 67 | 75 | ||
| 68 | .globl test_and_change_bit | 76 | .globl test_and_change_bit |
| @@ -81,10 +89,11 @@ test_and_change_bit: /* %o0=nr, %o1=addr */ | |||
| 81 | cmp %g7, %g1 | 89 | cmp %g7, %g1 |
| 82 | bne,pn %xcc, 1b | 90 | bne,pn %xcc, 1b |
| 83 | and %g7, %o2, %g2 | 91 | and %g7, %o2, %g2 |
| 84 | BITOP_POST_BARRIER | ||
| 85 | clr %o0 | 92 | clr %o0 |
| 93 | movrne %g2, 1, %o0 | ||
| 94 | BITOP_POST_BARRIER | ||
| 86 | retl | 95 | retl |
| 87 | movrne %g2, 1, %o0 | 96 | nop |
| 88 | .size test_and_change_bit, .-test_and_change_bit | 97 | .size test_and_change_bit, .-test_and_change_bit |
| 89 | 98 | ||
| 90 | .globl set_bit | 99 | .globl set_bit |
