lkml.org 
[lkml]   [2021]   [Dec]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH RFC 04/10] kvm: arm64: selftests: use ucall_ops to define default ucall implementation
    Date
    As with x86, switch the default ucall implementation to using the new
    ucall_ops infrastructure. With this change ucall_init/ucall_uninit are
    no longer arch-specific and can now be dropped in favor of the ones in
    ucall_common.c.

    Signed-off-by: Michael Roth <michael.roth@amd.com>
    ---
    tools/testing/selftests/kvm/Makefile | 2 +-
    .../selftests/kvm/include/aarch64/ucall.h | 18 ++++++++
    .../testing/selftests/kvm/include/kvm_util.h | 2 +-
    .../testing/selftests/kvm/lib/aarch64/ucall.c | 43 +++++++++----------
    4 files changed, 40 insertions(+), 25 deletions(-)
    create mode 100644 tools/testing/selftests/kvm/include/aarch64/ucall.h

    diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile
    index 05bff4039890..2d4299961d0e 100644
    --- a/tools/testing/selftests/kvm/Makefile
    +++ b/tools/testing/selftests/kvm/Makefile
    @@ -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 lib/ucall_common.c
    -LIBKVM_aarch64 = lib/aarch64/processor.c lib/aarch64/ucall.c lib/aarch64/handlers.S lib/aarch64/spinlock.c lib/aarch64/gic.c lib/aarch64/gic_v3.c lib/aarch64/vgic.c
    +LIBKVM_aarch64 = lib/aarch64/processor.c lib/aarch64/ucall.c lib/aarch64/handlers.S lib/aarch64/spinlock.c lib/aarch64/gic.c lib/aarch64/gic_v3.c lib/aarch64/vgic.c lib/ucall_common.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
    diff --git a/tools/testing/selftests/kvm/include/aarch64/ucall.h b/tools/testing/selftests/kvm/include/aarch64/ucall.h
    new file mode 100644
    index 000000000000..d3189d0a4d68
    --- /dev/null
    +++ b/tools/testing/selftests/kvm/include/aarch64/ucall.h
    @@ -0,0 +1,18 @@
    +/* SPDX-License-Identifier: GPL-2.0-only */
    +/*
    + * Arch-specific ucall implementations.
    + *
    + * A ucall is a "hypercall to userspace".
    + *
    + * Copyright (C) 2021 Advanced Micro Devices
    + */
    +#ifndef SELFTEST_KVM_UCALL_H
    +#define SELFTEST_KVM_UCALL_H
    +
    +#include "ucall_common.h"
    +
    +extern const struct ucall_ops ucall_ops_mmio;
    +
    +extern const struct ucall_ops ucall_ops_default;
    +
    +#endif /* SELFTEST_KVM_UCALL_H */
    diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing/selftests/kvm/include/kvm_util.h
    index 2701bf98c0db..16ec8c53cd81 100644
    --- a/tools/testing/selftests/kvm/include/kvm_util.h
    +++ b/tools/testing/selftests/kvm/include/kvm_util.h
    @@ -14,7 +14,7 @@
    * new header. Once all archs implement the new header the #include for
    * ucall_common.h can be dropped.
    */
    -#ifdef __x86_64__
    +#if defined(__x86_64__) || defined (__aarch64__)
    #include "ucall.h"
    #else
    #include "ucall_common.h"
    diff --git a/tools/testing/selftests/kvm/lib/aarch64/ucall.c b/tools/testing/selftests/kvm/lib/aarch64/ucall.c
    index e0b0164e9af8..ab052ab5d5de 100644
    --- a/tools/testing/selftests/kvm/lib/aarch64/ucall.c
    +++ b/tools/testing/selftests/kvm/lib/aarch64/ucall.c
    @@ -1,11 +1,14 @@
    // SPDX-License-Identifier: GPL-2.0
    /*
    - * ucall support. A ucall is a "hypercall to userspace".
    + * Arch-specific ucall implementations.
    + *
    + * A ucall is a "hypercall to userspace".
    *
    * Copyright (C) 2018, Red Hat, Inc.
    */
    -#include "kvm_util.h"
    +#include "kvm_util_base.h"
    #include "../kvm_util_internal.h"
    +#include "ucall.h"

    static vm_vaddr_t *ucall_exit_mmio_addr;

    @@ -22,7 +25,7 @@ static bool ucall_mmio_init(struct kvm_vm *vm, vm_paddr_t gpa)
    return true;
    }

    -void ucall_init(struct kvm_vm *vm, void *arg)
    +static void ucall_ops_mmio_init(struct kvm_vm *vm, void *arg)
    {
    vm_paddr_t gpa, start, end, step, offset;
    unsigned int bits;
    @@ -65,38 +68,22 @@ void ucall_init(struct kvm_vm *vm, void *arg)
    TEST_FAIL("Can't find a ucall mmio address");
    }

    -void ucall_uninit(struct kvm_vm *vm)
    +static void ucall_ops_mmio_uninit(struct kvm_vm *vm)
    {
    ucall_exit_mmio_addr = 0;
    sync_global_to_guest(vm, ucall_exit_mmio_addr);
    }

    -void ucall(uint64_t cmd, int nargs, ...)
    +static void ucall_ops_mmio_send_cmd(struct ucall *uc)
    {
    - struct ucall uc = {
    - .cmd = cmd,
    - };
    - va_list va;
    - int i;
    -
    - nargs = nargs <= UCALL_MAX_ARGS ? nargs : UCALL_MAX_ARGS;
    -
    - va_start(va, nargs);
    - for (i = 0; i < nargs; ++i)
    - uc.args[i] = va_arg(va, uint64_t);
    - va_end(va);
    -
    - *ucall_exit_mmio_addr = (vm_vaddr_t)&uc;
    + *ucall_exit_mmio_addr = (vm_vaddr_t)uc;
    }

    -uint64_t get_ucall(struct kvm_vm *vm, uint32_t vcpu_id, struct ucall *uc)
    +static uint64_t ucall_ops_mmio_recv_cmd(struct kvm_vm *vm, uint32_t vcpu_id, struct ucall *uc)
    {
    struct kvm_run *run = vcpu_state(vm, vcpu_id);
    struct ucall ucall = {};

    - if (uc)
    - memset(uc, 0, sizeof(*uc));
    -
    if (run->exit_reason == KVM_EXIT_MMIO &&
    run->mmio.phys_addr == (uint64_t)ucall_exit_mmio_addr) {
    vm_vaddr_t gva;
    @@ -113,3 +100,13 @@ uint64_t get_ucall(struct kvm_vm *vm, uint32_t vcpu_id, struct ucall *uc)

    return ucall.cmd;
    }
    +
    +const struct ucall_ops ucall_ops_mmio = {
    + .name = "MMIO",
    + .init = ucall_ops_mmio_init,
    + .uninit = ucall_ops_mmio_uninit,
    + .send_cmd = ucall_ops_mmio_send_cmd,
    + .recv_cmd = ucall_ops_mmio_recv_cmd,
    +};
    +
    +const struct ucall_ops ucall_ops_default = ucall_ops_mmio;
    --
    2.25.1
    \
     
     \ /
      Last update: 2021-12-10 17:50    [W:3.085 / U:0.636 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site