28 lines
462 B
C
28 lines
462 B
C
|
// 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");
|
||
|
}
|