atomic.S 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. // Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
  3. #include <linux/linkage.h>
  4. #include <abi/entry.h>
  5. .text
  6. /*
  7. * int csky_cmpxchg(int oldval, int newval, int *ptr)
  8. *
  9. * If *ptr != oldval && return 1,
  10. * else *ptr = newval return 0.
  11. */
  12. #ifdef CONFIG_CPU_HAS_LDSTEX
  13. ENTRY(csky_cmpxchg)
  14. USPTOKSP
  15. mfcr a3, epc
  16. INCTRAP a3
  17. subi sp, 8
  18. stw a3, (sp, 0)
  19. mfcr a3, epsr
  20. stw a3, (sp, 4)
  21. psrset ee
  22. 1:
  23. ldex a3, (a2)
  24. cmpne a0, a3
  25. bt16 2f
  26. mov a3, a1
  27. stex a3, (a2)
  28. bez a3, 1b
  29. 2:
  30. sync.is
  31. mvc a0
  32. ldw a3, (sp, 0)
  33. mtcr a3, epc
  34. ldw a3, (sp, 4)
  35. mtcr a3, epsr
  36. addi sp, 8
  37. KSPTOUSP
  38. rte
  39. END(csky_cmpxchg)
  40. #else
  41. ENTRY(csky_cmpxchg)
  42. USPTOKSP
  43. mfcr a3, epc
  44. INCTRAP a3
  45. subi sp, 8
  46. stw a3, (sp, 0)
  47. mfcr a3, epsr
  48. stw a3, (sp, 4)
  49. psrset ee
  50. 1:
  51. ldw a3, (a2)
  52. cmpne a0, a3
  53. bt16 3f
  54. 2:
  55. stw a1, (a2)
  56. 3:
  57. mvc a0
  58. ldw a3, (sp, 0)
  59. mtcr a3, epc
  60. ldw a3, (sp, 4)
  61. mtcr a3, epsr
  62. addi sp, 8
  63. KSPTOUSP
  64. rte
  65. END(csky_cmpxchg)
  66. /*
  67. * Called from tlbmodified exception
  68. */
  69. ENTRY(csky_cmpxchg_fixup)
  70. mfcr a0, epc
  71. lrw a1, 2b
  72. cmpne a1, a0
  73. bt 1f
  74. subi a1, (2b - 1b)
  75. stw a1, (sp, LSAVE_PC)
  76. 1:
  77. rts
  78. END(csky_cmpxchg_fixup)
  79. #endif