| // SPDX-License-Identifier: GPL-2.0 | |
| /* | |
| * ARM64 Spinlock support | |
| */ | |
| #include <stdint.h> | |
| #include "spinlock.h" | |
| void spin_lock(struct spinlock *lock) | |
| { | |
| int val, res; | |
| asm volatile( | |
| "1: ldaxr %w0, [%2]\n" | |
| " cbnz %w0, 1b\n" | |
| " mov %w0, #1\n" | |
| " stxr %w1, %w0, [%2]\n" | |
| " cbnz %w1, 1b\n" | |
| : "=&r" (val), "=&r" (res) | |
| : "r" (&lock->v) | |
| : "memory"); | |
| } | |
| void spin_unlock(struct spinlock *lock) | |
| { | |
| asm volatile("stlr wzr, [%0]\n" : : "r" (&lock->v) : "memory"); | |
| } |