^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /* bitops.S: Sparc64 atomic bit operations.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (C) 2000, 2007 David S. Miller (davem@davemloft.net)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <linux/linkage.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <asm/asi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <asm/backoff.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <asm/export.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) .text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) ENTRY(test_and_set_bit) /* %o0=nr, %o1=addr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) BACKOFF_SETUP(%o3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) srlx %o0, 6, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) mov 1, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) sllx %g1, 3, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) and %o0, 63, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) sllx %o2, %g2, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) add %o1, %g3, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) 1: ldx [%o1], %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) or %g7, %o2, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) casx [%o1], %g7, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) cmp %g7, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) and %g7, %o2, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) clr %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) movrne %g2, 1, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) 2: BACKOFF_SPIN(%o3, %o4, 1b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) ENDPROC(test_and_set_bit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) EXPORT_SYMBOL(test_and_set_bit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) ENTRY(test_and_clear_bit) /* %o0=nr, %o1=addr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) BACKOFF_SETUP(%o3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) srlx %o0, 6, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) mov 1, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) sllx %g1, 3, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) and %o0, 63, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) sllx %o2, %g2, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) add %o1, %g3, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) 1: ldx [%o1], %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) andn %g7, %o2, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) casx [%o1], %g7, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) cmp %g7, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) and %g7, %o2, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) clr %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) movrne %g2, 1, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) 2: BACKOFF_SPIN(%o3, %o4, 1b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) ENDPROC(test_and_clear_bit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) EXPORT_SYMBOL(test_and_clear_bit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) ENTRY(test_and_change_bit) /* %o0=nr, %o1=addr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) BACKOFF_SETUP(%o3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) srlx %o0, 6, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) mov 1, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) sllx %g1, 3, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) and %o0, 63, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) sllx %o2, %g2, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) add %o1, %g3, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) 1: ldx [%o1], %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) xor %g7, %o2, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) casx [%o1], %g7, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) cmp %g7, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) and %g7, %o2, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) clr %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) movrne %g2, 1, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) 2: BACKOFF_SPIN(%o3, %o4, 1b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) ENDPROC(test_and_change_bit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) EXPORT_SYMBOL(test_and_change_bit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) ENTRY(set_bit) /* %o0=nr, %o1=addr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) BACKOFF_SETUP(%o3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) srlx %o0, 6, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) mov 1, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) sllx %g1, 3, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) and %o0, 63, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) sllx %o2, %g2, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) add %o1, %g3, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) 1: ldx [%o1], %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) or %g7, %o2, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) casx [%o1], %g7, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) cmp %g7, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) 2: BACKOFF_SPIN(%o3, %o4, 1b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) ENDPROC(set_bit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) EXPORT_SYMBOL(set_bit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) ENTRY(clear_bit) /* %o0=nr, %o1=addr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) BACKOFF_SETUP(%o3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) srlx %o0, 6, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) mov 1, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) sllx %g1, 3, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) and %o0, 63, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) sllx %o2, %g2, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) add %o1, %g3, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 1: ldx [%o1], %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) andn %g7, %o2, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) casx [%o1], %g7, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) cmp %g7, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 2: BACKOFF_SPIN(%o3, %o4, 1b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) ENDPROC(clear_bit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) EXPORT_SYMBOL(clear_bit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) ENTRY(change_bit) /* %o0=nr, %o1=addr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) BACKOFF_SETUP(%o3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) srlx %o0, 6, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) mov 1, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) sllx %g1, 3, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) and %o0, 63, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) sllx %o2, %g2, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) add %o1, %g3, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 1: ldx [%o1], %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) xor %g7, %o2, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) casx [%o1], %g7, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) cmp %g7, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 2: BACKOFF_SPIN(%o3, %o4, 1b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) ENDPROC(change_bit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) EXPORT_SYMBOL(change_bit)