lock.hpp 510 B

123456789101112131415161718192021222324252627
  1. #pragma once
  2. #include <types/stdint.h>
  3. inline void spin_lock(uint32_t volatile* lock_addr)
  4. {
  5. asm volatile(
  6. "0:\n\t\
  7. movl $1, %%eax\n\t\
  8. xchgl %%eax, (%0)\n\t\
  9. test $0, %%eax\n\t\
  10. jne 0\n\t\
  11. "
  12. :
  13. : "r"(lock_addr)
  14. : "eax", "memory");
  15. }
  16. inline void spin_unlock(uint32_t volatile* lock_addr)
  17. {
  18. asm volatile(
  19. "movl $0, %%eax\n\
  20. xchgl %%eax, (%0)"
  21. :
  22. : "r"(lock_addr)
  23. : "eax", "memory");
  24. }