rwlock_64.S 646 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. /* Slow paths of read/write spinlocks. */
  2. #include <linux/linkage.h>
  3. #include <asm/rwlock.h>
  4. #include <asm/alternative-asm.h>
  5. #include <asm/dwarf2.h>
  6. /* rdi: pointer to rwlock_t */
  7. ENTRY(__write_lock_failed)
  8. CFI_STARTPROC
  9. LOCK_PREFIX
  10. addl $RW_LOCK_BIAS,(%rdi)
  11. 1: rep
  12. nop
  13. cmpl $RW_LOCK_BIAS,(%rdi)
  14. jne 1b
  15. LOCK_PREFIX
  16. subl $RW_LOCK_BIAS,(%rdi)
  17. jnz __write_lock_failed
  18. ret
  19. CFI_ENDPROC
  20. END(__write_lock_failed)
  21. /* rdi: pointer to rwlock_t */
  22. ENTRY(__read_lock_failed)
  23. CFI_STARTPROC
  24. LOCK_PREFIX
  25. incl (%rdi)
  26. 1: rep
  27. nop
  28. cmpl $1,(%rdi)
  29. js 1b
  30. LOCK_PREFIX
  31. decl (%rdi)
  32. js __read_lock_failed
  33. ret
  34. CFI_ENDPROC
  35. END(__read_lock_failed)