forked from Minki/linux
KVM: arm64: selftests: Add light-weight spinlock support
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
This commit is contained in:
parent
17229bdc86
commit
414de89df1
@ -35,7 +35,7 @@ endif
|
||||
|
||||
LIBKVM = lib/assert.c lib/elf.c lib/io.c lib/kvm_util.c lib/rbtree.c lib/sparsebit.c lib/test_util.c lib/guest_modes.c lib/perf_test_util.c
|
||||
LIBKVM_x86_64 = lib/x86_64/apic.c lib/x86_64/processor.c lib/x86_64/vmx.c lib/x86_64/svm.c lib/x86_64/ucall.c lib/x86_64/handlers.S
|
||||
LIBKVM_aarch64 = lib/aarch64/processor.c lib/aarch64/ucall.c lib/aarch64/handlers.S
|
||||
LIBKVM_aarch64 = lib/aarch64/processor.c lib/aarch64/ucall.c lib/aarch64/handlers.S lib/aarch64/spinlock.c
|
||||
LIBKVM_s390x = lib/s390x/processor.c lib/s390x/ucall.c lib/s390x/diag318_test_handler.c
|
||||
|
||||
TEST_GEN_PROGS_x86_64 = x86_64/cr4_cpuid_sync_test
|
||||
|
13
tools/testing/selftests/kvm/include/aarch64/spinlock.h
Normal file
13
tools/testing/selftests/kvm/include/aarch64/spinlock.h
Normal file
@ -0,0 +1,13 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
|
||||
#ifndef SELFTEST_KVM_ARM64_SPINLOCK_H
|
||||
#define SELFTEST_KVM_ARM64_SPINLOCK_H
|
||||
|
||||
struct spinlock {
|
||||
int v;
|
||||
};
|
||||
|
||||
extern void spin_lock(struct spinlock *lock);
|
||||
extern void spin_unlock(struct spinlock *lock);
|
||||
|
||||
#endif /* SELFTEST_KVM_ARM64_SPINLOCK_H */
|
27
tools/testing/selftests/kvm/lib/aarch64/spinlock.c
Normal file
27
tools/testing/selftests/kvm/lib/aarch64/spinlock.c
Normal file
@ -0,0 +1,27 @@
|
||||
// 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");
|
||||
}
|
Loading…
Reference in New Issue
Block a user