spinlock.c 462 B

123456789101112131415161718192021222324252627
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * ARM64 Spinlock support
  4. */
  5. #include <stdint.h>
  6. #include "spinlock.h"
  7. void spin_lock(struct spinlock *lock)
  8. {
  9. int val, res;
  10. asm volatile(
  11. "1: ldaxr %w0, [%2]\n"
  12. " cbnz %w0, 1b\n"
  13. " mov %w0, #1\n"
  14. " stxr %w1, %w0, [%2]\n"
  15. " cbnz %w1, 1b\n"
  16. : "=&r" (val), "=&r" (res)
  17. : "r" (&lock->v)
  18. : "memory");
  19. }
  20. void spin_unlock(struct spinlock *lock)
  21. {
  22. asm volatile("stlr wzr, [%0]\n" : : "r" (&lock->v) : "memory");
  23. }