lock.h 696 B

1234567891011121314151617181920212223242526272829303132333435
  1. #pragma once
  2. #include <types/stdint.h>
  3. #ifdef __cplusplus
  4. extern "C" {
  5. #endif
  6. static inline void spin_lock(uint32_t volatile* lock_addr)
  7. {
  8. asm volatile(
  9. "_spin:\n\t\
  10. movl $1, %%eax\n\t\
  11. xchgl %%eax, (%0)\n\t\
  12. test $0, %%eax\n\t\
  13. jne _spin\n\t\
  14. "
  15. : "=r" (lock_addr)
  16. : "0" (lock_addr)
  17. : "eax", "memory"
  18. );
  19. }
  20. static inline void spin_unlock(uint32_t volatile* lock_addr)
  21. {
  22. asm volatile("movl $0, %%eax\nxchgl %%eax, (%0)"
  23. :
  24. : "r" (lock_addr)
  25. : "eax", "memory"
  26. );
  27. }
  28. #ifdef __cplusplus
  29. }
  30. #endif