Skip to content

Commit

Permalink
KVM: selftests: Add arch ucall.h and inline simple arch hooks
Browse files Browse the repository at this point in the history
Add an architecture specific ucall.h and inline the simple arch hooks,
e.g. the init hook for everything except ARM, and the actual "do ucall"
hook for everything except x86 (which should be simple, but temporarily
isn't due to carrying a workaround).

Having a per-arch ucall header will allow adding a #define for the
expected KVM exit reason for a ucall that is colocated (for everything
except x86) with the ucall itself.

Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Link: https://lore.kernel.org/r/20230731203026.1192091-2-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
  • Loading branch information
sean-jc committed Aug 2, 2023
1 parent 289c2b4 commit b35f4c7
Show file tree
Hide file tree
Showing 9 changed files with 66 additions and 35 deletions.
18 changes: 18 additions & 0 deletions tools/testing/selftests/kvm/include/aarch64/ucall.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef SELFTEST_KVM_UCALL_H
#define SELFTEST_KVM_UCALL_H

#include "kvm_util_base.h"

/*
* ucall_exit_mmio_addr holds per-VM values (global data is duplicated by each
* VM), it must not be accessed from host code.
*/
extern vm_vaddr_t *ucall_exit_mmio_addr;

static inline void ucall_arch_do_ucall(vm_vaddr_t uc)
{
WRITE_ONCE(*ucall_exit_mmio_addr, uc);
}

#endif
18 changes: 18 additions & 0 deletions tools/testing/selftests/kvm/include/riscv/ucall.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef SELFTEST_KVM_UCALL_H
#define SELFTEST_KVM_UCALL_H

#include "processor.h"

static inline void ucall_arch_init(struct kvm_vm *vm, vm_paddr_t mmio_gpa)
{
}

static inline void ucall_arch_do_ucall(vm_vaddr_t uc)
{
sbi_ecall(KVM_RISCV_SELFTESTS_SBI_EXT,
KVM_RISCV_SELFTESTS_SBI_UCALL,
uc, 0, 0, 0, 0, 0);
}

#endif
17 changes: 17 additions & 0 deletions tools/testing/selftests/kvm/include/s390x/ucall.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef SELFTEST_KVM_UCALL_H
#define SELFTEST_KVM_UCALL_H

#include "kvm_util_base.h"

static inline void ucall_arch_init(struct kvm_vm *vm, vm_paddr_t mmio_gpa)
{
}

static inline void ucall_arch_do_ucall(vm_vaddr_t uc)
{
/* Exit via DIAGNOSE 0x501 (normally used for breakpoints) */
asm volatile ("diag 0,%0,0x501" : : "a"(uc) : "memory");
}

#endif
1 change: 1 addition & 0 deletions tools/testing/selftests/kvm/include/ucall_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#ifndef SELFTEST_KVM_UCALL_COMMON_H
#define SELFTEST_KVM_UCALL_COMMON_H
#include "test_util.h"
#include "ucall.h"

/* Common ucalls */
enum {
Expand Down
11 changes: 11 additions & 0 deletions tools/testing/selftests/kvm/include/x86_64/ucall.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef SELFTEST_KVM_UCALL_H
#define SELFTEST_KVM_UCALL_H

#include "kvm_util_base.h"

static inline void ucall_arch_init(struct kvm_vm *vm, vm_paddr_t mmio_gpa)
{
}

#endif
11 changes: 1 addition & 10 deletions tools/testing/selftests/kvm/lib/aarch64/ucall.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,7 @@
*/
#include "kvm_util.h"

/*
* ucall_exit_mmio_addr holds per-VM values (global data is duplicated by each
* VM), it must not be accessed from host code.
*/
static vm_vaddr_t *ucall_exit_mmio_addr;
vm_vaddr_t *ucall_exit_mmio_addr;

void ucall_arch_init(struct kvm_vm *vm, vm_paddr_t mmio_gpa)
{
Expand All @@ -23,11 +19,6 @@ void ucall_arch_init(struct kvm_vm *vm, vm_paddr_t mmio_gpa)
write_guest_global(vm, ucall_exit_mmio_addr, (vm_vaddr_t *)mmio_gva);
}

void ucall_arch_do_ucall(vm_vaddr_t uc)
{
WRITE_ONCE(*ucall_exit_mmio_addr, uc);
}

void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu)
{
struct kvm_run *run = vcpu->run;
Expand Down
11 changes: 0 additions & 11 deletions tools/testing/selftests/kvm/lib/riscv/ucall.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,6 @@
#include "kvm_util.h"
#include "processor.h"

void ucall_arch_init(struct kvm_vm *vm, vm_paddr_t mmio_gpa)
{
}

struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0,
unsigned long arg1, unsigned long arg2,
unsigned long arg3, unsigned long arg4,
Expand All @@ -40,13 +36,6 @@ struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0,
return ret;
}

void ucall_arch_do_ucall(vm_vaddr_t uc)
{
sbi_ecall(KVM_RISCV_SELFTESTS_SBI_EXT,
KVM_RISCV_SELFTESTS_SBI_UCALL,
uc, 0, 0, 0, 0, 0);
}

void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu)
{
struct kvm_run *run = vcpu->run;
Expand Down
10 changes: 0 additions & 10 deletions tools/testing/selftests/kvm/lib/s390x/ucall.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,6 @@
*/
#include "kvm_util.h"

void ucall_arch_init(struct kvm_vm *vm, vm_paddr_t mmio_gpa)
{
}

void ucall_arch_do_ucall(vm_vaddr_t uc)
{
/* Exit via DIAGNOSE 0x501 (normally used for breakpoints) */
asm volatile ("diag 0,%0,0x501" : : "a"(uc) : "memory");
}

void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu)
{
struct kvm_run *run = vcpu->run;
Expand Down
4 changes: 0 additions & 4 deletions tools/testing/selftests/kvm/lib/x86_64/ucall.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,6 @@

#define UCALL_PIO_PORT ((uint16_t)0x1000)

void ucall_arch_init(struct kvm_vm *vm, vm_paddr_t mmio_gpa)
{
}

void ucall_arch_do_ucall(vm_vaddr_t uc)
{
/*
Expand Down

0 comments on commit b35f4c7

Please sign in to comment.