rwlock.S 783 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. /* Slow paths of read/write spinlocks. */
  2. #include <linux/linkage.h>
  3. #include <asm/alternative-asm.h>
  4. #include <asm/frame.h>
  5. #include <asm/rwlock.h>
  6. #ifdef CONFIG_X86_32
  7. # define __lock_ptr eax
  8. #else
  9. # define __lock_ptr rdi
  10. #endif
  11. ENTRY(__write_lock_failed)
  12. CFI_STARTPROC
  13. FRAME
  14. 0: LOCK_PREFIX
  15. WRITE_LOCK_ADD($RW_LOCK_BIAS) (%__lock_ptr)
  16. 1: rep; nop
  17. cmpl $WRITE_LOCK_CMP, (%__lock_ptr)
  18. jne 1b
  19. LOCK_PREFIX
  20. WRITE_LOCK_SUB($RW_LOCK_BIAS) (%__lock_ptr)
  21. jnz 0b
  22. ENDFRAME
  23. ret
  24. CFI_ENDPROC
  25. END(__write_lock_failed)
  26. ENTRY(__read_lock_failed)
  27. CFI_STARTPROC
  28. FRAME
  29. 0: LOCK_PREFIX
  30. READ_LOCK_SIZE(inc) (%__lock_ptr)
  31. 1: rep; nop
  32. READ_LOCK_SIZE(cmp) $1, (%__lock_ptr)
  33. js 1b
  34. LOCK_PREFIX
  35. READ_LOCK_SIZE(dec) (%__lock_ptr)
  36. js 0b
  37. ENDFRAME
  38. ret
  39. CFI_ENDPROC
  40. END(__read_lock_failed)