Files
mkrtos-real/mkrtos_knl/arch/aarch64/spinlock_arch.c
2024-03-31 16:06:11 +00:00

29 lines
645 B
C

#include <types.h>
#include <spinlock.h>
void spinlock_lock_arch(spinlock_t *lock)
{
mword_t dummy;
mword_t tmp;
asm volatile(
"sevl\n"
"prfm pstl1keep, [%[lock]]\n"
"1: wfe\n"
"ldaxr %x[dummy],[%[lock]]\n"
"cbnz %x[dummy],1b\n"
"orr %x[tmp],%x[dummy],#1\n"
"stxr %w[dummy], %x[tmp], [%[lock]]\n"
"cbnz %w[dummy],1b\n"
: [dummy] "=&r"(dummy), [tmp] "=&r"(tmp), "+m"(lock->val)
: [lock] "r"(&lock->val)
: "cc");
}
void spinlock_unlock_arch(spinlock_t *lock)
{
asm volatile(
"stlr wzr, %[lock]"
: [lock] "=Q"(lock->val));
}