blob: 37cab6eefcf519bbe8ea2686a301a34f685b6b3c [file] [log] [blame]
/*
* SPDX-License-Identifier: BSD-3-Clause
* SPDX-FileCopyrightText: Copyright TF-RMM Contributors.
*/
#ifndef SPINLOCK_H
#define SPINLOCK_H
/*
* A trivial spinlock implementation, per ARM DDI 0487D.a, section K11.3.4.
*/
typedef struct {
unsigned int val;
} spinlock_t;
static inline void spinlock_acquire(spinlock_t *l)
{
unsigned int tmp;
asm volatile(
" sevl\n"
" prfm pstl1keep, %[lock]\n"
"1:\n"
" wfe\n"
" ldaxr %w[tmp], %[lock]\n"
" cbnz %w[tmp], 1b\n"
" stxr %w[tmp], %w[one], %[lock]\n"
" cbnz %w[tmp], 1b\n"
: [lock] "+Q" (l->val),
[tmp] "=&r" (tmp)
: [one] "r" (1)
: "memory"
);
}
static inline void spinlock_release(spinlock_t *l)
{
asm volatile(
" stlr wzr, %[lock]\n"
: [lock] "+Q" (l->val)
:
: "memory"
);
}
#endif /* SPINLOCK_H */