atomic.S 894 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  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. ENTRY(csky_cmpxchg)
  13. USPTOKSP
  14. RD_MEH a3
  15. WR_MEH a3
  16. mfcr a3, epc
  17. addi a3, TRAP0_SIZE
  18. subi sp, 16
  19. stw a3, (sp, 0)
  20. mfcr a3, epsr
  21. stw a3, (sp, 4)
  22. mfcr a3, usp
  23. stw a3, (sp, 8)
  24. psrset ee
  25. #ifdef CONFIG_CPU_HAS_LDSTEX
  26. 1:
  27. ldex a3, (a2)
  28. cmpne a0, a3
  29. bt16 2f
  30. mov a3, a1
  31. stex a3, (a2)
  32. bez a3, 1b
  33. 2:
  34. sync.is
  35. #else
  36. GLOBAL(csky_cmpxchg_ldw)
  37. ldw a3, (a2)
  38. cmpne a0, a3
  39. bt16 3f
  40. GLOBAL(csky_cmpxchg_stw)
  41. stw a1, (a2)
  42. 3:
  43. #endif
  44. mvc a0
  45. ldw a3, (sp, 0)
  46. mtcr a3, epc
  47. ldw a3, (sp, 4)
  48. mtcr a3, epsr
  49. ldw a3, (sp, 8)
  50. mtcr a3, usp
  51. addi sp, 16
  52. KSPTOUSP
  53. rte
  54. END(csky_cmpxchg)