// 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"); | |
} |