Add a simpler version of spinlock support for ARM64 for the guests to use. The implementation is loosely based on the spinlock implementation in kvm-unit-tests. Signed-off-by: Raghavendra Rao Ananta <rananta@google.com> Reviewed-by: Oliver Upton <oupton@google.com> Reviewed-by: Andrew Jones <drjones@redhat.com> Signed-off-by: Marc Zyngier <maz@kernel.org> Link: https://lore.kernel.org/r/20211007233439.1826892-12-rananta@google.com
27 lines
462 B
C
27 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");
|
|
}
|