rwlock.S 716 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  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. addl $RW_LOCK_BIAS, (%__lock_ptr)
  16. 1: rep; nop
  17. cmpl $RW_LOCK_BIAS, (%__lock_ptr)
  18. jne 1b
  19. LOCK_PREFIX
  20. subl $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. incl (%__lock_ptr)
  31. 1: rep; nop
  32. cmpl $1, (%__lock_ptr)
  33. js 1b
  34. LOCK_PREFIX
  35. decl (%__lock_ptr)
  36. js 0b
  37. ENDFRAME
  38. ret
  39. CFI_ENDPROC
  40. END(__read_lock_failed)