From nobody Mon Apr 13 13:30:25 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 584ACC25B07 for ; Wed, 10 Aug 2022 15:21:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233291AbiHJPVN (ORCPT ); Wed, 10 Aug 2022 11:21:13 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37340 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233125AbiHJPUu (ORCPT ); Wed, 10 Aug 2022 11:20:50 -0400 Received: from mail-yb1-xb49.google.com (mail-yb1-xb49.google.com [IPv6:2607:f8b0:4864:20::b49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B558B55091 for ; Wed, 10 Aug 2022 08:20:48 -0700 (PDT) Received: by mail-yb1-xb49.google.com with SMTP id z7-20020a25ba47000000b00677405b2d2dso12434333ybj.13 for ; Wed, 10 Aug 2022 08:20:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:from:to:cc; bh=f1sWvGdk1uxiMKqJEu787yRUpub80oX121BOUSyrpTM=; b=Jyfvx6uQ+DfrGWA4dNLLyjf+2ZcoVhCDALg8yyauB4KByGLFKs3uNWtqgHcEVcu1SK jetksmgnx/td+h1uuXKYjHp8WofNgWxoey2s+ucAEGD1ugazKXitJrwG6gsDdncFft9Q U6mlVDXyNRPEIACGKUDVVmyi1agFs8cwcTqyjC+440XD3g/xNFbodLIUBov0Sx0z+MTq 9OjOhvabPbv0Ey3f7jn7aFYMoUVjt4Qm1EaEehsDVLCzRrYmqhBfGcHLFbZ7104Q+ECM FEIaye+3bF85NKzeSwYn8GHtLBjVSZUwMIMZrckcCXRHXya3H8Q0qbkKcsShjRpBC3mk v0Wg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:references:mime-version:message-id:in-reply-to :date:x-gm-message-state:from:to:cc; bh=f1sWvGdk1uxiMKqJEu787yRUpub80oX121BOUSyrpTM=; b=Ect/RGUozwyug1It/Cvy1DfXqtVQSmeFVfLVzBsEdpCsbxMTxLp3S46rQF8hzb56H2 +4v953uet9IUmJkzxAxETBbBYzHEs+Tq1BJtYIWe1wxaZ2wpqTmBh9qcupSOymgDr6w5 CggmUrzvffFGQaJNa+d3kmRpk31i5mnExt8b67yzkXIodPuDkC6hrfiPPbz8vaK0JT/u iXJPGUCKVPzxUAExpiKBZoNicTQTZtYoNaOHu2bMnCDcf5ya3pgcS9+lgBSlsTxFbNED pLRGUmFiuMl6tKnXpnkAm4bp1n695BIVfYQ/YYnQ7zYBQufVgBJy8PyxH5ZYP8o0gHel Kbvg== X-Gm-Message-State: ACgBeo3hwN5KSdRxs1NR2F0aY/JvvHcJYVljXFtPSVdb+0wl/PvI8e2i EC2AweR0DHEqxnDhRrzTRy8VE2idY6M= X-Google-Smtp-Source: AA6agR7Q1FAtKjiwgud9zSYzbsYCta3I5UV8laQEmEG9abJ/Ot9U1uHnBW7PKd+nmql4tasaTlNbq0Zspmo= X-Received: from pgonda1.kir.corp.google.com ([2620:15c:29:203:b185:1827:5b23:bbe2]) (user=pgonda job=sendgmr) by 2002:a81:52c1:0:b0:329:da4b:bd4c with SMTP id g184-20020a8152c1000000b00329da4bbd4cmr12158869ywb.471.1660144847904; Wed, 10 Aug 2022 08:20:47 -0700 (PDT) Date: Wed, 10 Aug 2022 08:20:28 -0700 In-Reply-To: <20220810152033.946942-1-pgonda@google.com> Message-Id: <20220810152033.946942-7-pgonda@google.com> Mime-Version: 1.0 References: <20220810152033.946942-1-pgonda@google.com> X-Mailer: git-send-email 2.37.1.559.g78731f0fdb-goog Subject: [V3 06/11] KVM: selftests: Consolidate common code for popuplating From: Peter Gonda To: kvm@vger.kernel.org Cc: linux-kernel@vger.kernel.org, marcorr@google.com, seanjc@google.com, michael.roth@amd.com, thomas.lendacky@amd.com, joro@8bytes.org, mizhang@google.com, pbonzini@redhat.com, andrew.jones@linux.dev, vannapurve@google.com, Colton Lewis , Andrew Jones , Peter Gonda Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Sean Christopherson Make ucall() a common helper that populates struct ucall, and only calls into arch code to make the actually call out to userspace. Rename all arch-specific helpers to make it clear they're arch-specific, and to avoid collisions with common helpers (one more on its way...) Add WRITE_ONCE() to stores in ucall() code to as already done to aarch64 code in commit 9e2f6498efbb ("selftests: KVM: Handle compiler optimizations in ucall") to prevent clang optimizations breaking ucalls. Cc: Colton Lewis Cc: Andrew Jones Signed-off-by: Sean Christopherson Signed-off-by: Peter Gonda Reviewed-by: Andrew Jones --- tools/testing/selftests/kvm/Makefile | 1 + .../selftests/kvm/include/ucall_common.h | 23 ++++++++++++++++--- .../testing/selftests/kvm/lib/aarch64/ucall.c | 20 ++++------------ tools/testing/selftests/kvm/lib/riscv/ucall.c | 23 ++++--------------- tools/testing/selftests/kvm/lib/s390x/ucall.c | 23 ++++--------------- .../testing/selftests/kvm/lib/ucall_common.c | 20 ++++++++++++++++ .../testing/selftests/kvm/lib/x86_64/ucall.c | 23 ++++--------------- 7 files changed, 60 insertions(+), 73 deletions(-) create mode 100644 tools/testing/selftests/kvm/lib/ucall_common.c diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests= /kvm/Makefile index 690b499c3471..39fc5e8e5594 100644 --- a/tools/testing/selftests/kvm/Makefile +++ b/tools/testing/selftests/kvm/Makefile @@ -46,6 +46,7 @@ LIBKVM +=3D lib/perf_test_util.c LIBKVM +=3D lib/rbtree.c LIBKVM +=3D lib/sparsebit.c LIBKVM +=3D lib/test_util.c +LIBKVM +=3D lib/ucall_common.c =20 LIBKVM_x86_64 +=3D lib/x86_64/apic.c LIBKVM_x86_64 +=3D lib/x86_64/handlers.S diff --git a/tools/testing/selftests/kvm/include/ucall_common.h b/tools/tes= ting/selftests/kvm/include/ucall_common.h index ee79d180e07e..5a85f5318bbe 100644 --- a/tools/testing/selftests/kvm/include/ucall_common.h +++ b/tools/testing/selftests/kvm/include/ucall_common.h @@ -24,10 +24,27 @@ struct ucall { uint64_t args[UCALL_MAX_ARGS]; }; =20 -void ucall_init(struct kvm_vm *vm, void *arg); -void ucall_uninit(struct kvm_vm *vm); +void ucall_arch_init(struct kvm_vm *vm, void *arg); +void ucall_arch_uninit(struct kvm_vm *vm); +void ucall_arch_do_ucall(vm_vaddr_t uc); +uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc); + void ucall(uint64_t cmd, int nargs, ...); -uint64_t get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc); + +static inline void ucall_init(struct kvm_vm *vm, void *arg) +{ + ucall_arch_init(vm, arg); +} + +static inline void ucall_uninit(struct kvm_vm *vm) +{ + ucall_arch_uninit(vm); +} + +static inline uint64_t get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) +{ + return ucall_arch_get_ucall(vcpu, uc); +} =20 #define GUEST_SYNC_ARGS(stage, arg1, arg2, arg3, arg4) \ ucall(UCALL_SYNC, 6, "hello", stage, arg1, arg2, arg3, arg4) diff --git a/tools/testing/selftests/kvm/lib/aarch64/ucall.c b/tools/testin= g/selftests/kvm/lib/aarch64/ucall.c index ed237b744690..1c81a6a5c1f2 100644 --- a/tools/testing/selftests/kvm/lib/aarch64/ucall.c +++ b/tools/testing/selftests/kvm/lib/aarch64/ucall.c @@ -21,7 +21,7 @@ static bool ucall_mmio_init(struct kvm_vm *vm, vm_paddr_t= gpa) return true; } =20 -void ucall_init(struct kvm_vm *vm, void *arg) +void ucall_arch_init(struct kvm_vm *vm, void *arg) { vm_paddr_t gpa, start, end, step, offset; unsigned int bits; @@ -64,30 +64,18 @@ void ucall_init(struct kvm_vm *vm, void *arg) TEST_FAIL("Can't find a ucall mmio address"); } =20 -void ucall_uninit(struct kvm_vm *vm) +void ucall_arch_uninit(struct kvm_vm *vm) { ucall_exit_mmio_addr =3D 0; sync_global_to_guest(vm, ucall_exit_mmio_addr); } =20 -void ucall(uint64_t cmd, int nargs, ...) +void ucall_arch_do_ucall(vm_vaddr_t uc) { - struct ucall uc =3D {}; - va_list va; - int i; - - WRITE_ONCE(uc.cmd, cmd); - nargs =3D min(nargs, UCALL_MAX_ARGS); - - va_start(va, nargs); - for (i =3D 0; i < nargs; ++i) - WRITE_ONCE(uc.args[i], va_arg(va, uint64_t)); - va_end(va); - WRITE_ONCE(*ucall_exit_mmio_addr, (vm_vaddr_t)&uc); } =20 -uint64_t get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) +uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) { struct kvm_run *run =3D vcpu->run; struct ucall ucall =3D {}; diff --git a/tools/testing/selftests/kvm/lib/riscv/ucall.c b/tools/testing/= selftests/kvm/lib/riscv/ucall.c index 087b9740bc8f..b1598f418c1f 100644 --- a/tools/testing/selftests/kvm/lib/riscv/ucall.c +++ b/tools/testing/selftests/kvm/lib/riscv/ucall.c @@ -10,11 +10,11 @@ #include "kvm_util.h" #include "processor.h" =20 -void ucall_init(struct kvm_vm *vm, void *arg) +void ucall_arch_init(struct kvm_vm *vm, void *arg) { } =20 -void ucall_uninit(struct kvm_vm *vm) +void ucall_arch_uninit(struct kvm_vm *vm) { } =20 @@ -44,27 +44,14 @@ struct sbiret sbi_ecall(int ext, int fid, unsigned long= arg0, return ret; } =20 -void ucall(uint64_t cmd, int nargs, ...) +void ucall_arch_do_ucall(vm_vaddr_t uc) { - struct ucall uc =3D { - .cmd =3D cmd, - }; - va_list va; - int i; - - nargs =3D min(nargs, UCALL_MAX_ARGS); - - va_start(va, nargs); - for (i =3D 0; i < nargs; ++i) - uc.args[i] =3D va_arg(va, uint64_t); - va_end(va); - sbi_ecall(KVM_RISCV_SELFTESTS_SBI_EXT, KVM_RISCV_SELFTESTS_SBI_UCALL, - (vm_vaddr_t)&uc, 0, 0, 0, 0, 0); + uc, 0, 0, 0, 0, 0); } =20 -uint64_t get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) +uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) { struct kvm_run *run =3D vcpu->run; struct ucall ucall =3D {}; diff --git a/tools/testing/selftests/kvm/lib/s390x/ucall.c b/tools/testing/= selftests/kvm/lib/s390x/ucall.c index 73dc4e21190f..114cb4af295f 100644 --- a/tools/testing/selftests/kvm/lib/s390x/ucall.c +++ b/tools/testing/selftests/kvm/lib/s390x/ucall.c @@ -6,34 +6,21 @@ */ #include "kvm_util.h" =20 -void ucall_init(struct kvm_vm *vm, void *arg) +void ucall_arch_init(struct kvm_vm *vm, void *arg) { } =20 -void ucall_uninit(struct kvm_vm *vm) +void ucall_arch_uninit(struct kvm_vm *vm) { } =20 -void ucall(uint64_t cmd, int nargs, ...) +void ucall_arch_do_ucall(vm_vaddr_t uc) { - struct ucall uc =3D { - .cmd =3D cmd, - }; - va_list va; - int i; - - nargs =3D min(nargs, UCALL_MAX_ARGS); - - va_start(va, nargs); - for (i =3D 0; i < nargs; ++i) - uc.args[i] =3D va_arg(va, uint64_t); - va_end(va); - /* Exit via DIAGNOSE 0x501 (normally used for breakpoints) */ - asm volatile ("diag 0,%0,0x501" : : "a"(&uc) : "memory"); + asm volatile ("diag 0,%0,0x501" : : "a"(uc) : "memory"); } =20 -uint64_t get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) +uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) { struct kvm_run *run =3D vcpu->run; struct ucall ucall =3D {}; diff --git a/tools/testing/selftests/kvm/lib/ucall_common.c b/tools/testing= /selftests/kvm/lib/ucall_common.c new file mode 100644 index 000000000000..2395c7f1d543 --- /dev/null +++ b/tools/testing/selftests/kvm/lib/ucall_common.c @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: GPL-2.0-only +#include "kvm_util.h" + +void ucall(uint64_t cmd, int nargs, ...) +{ + struct ucall uc =3D {}; + va_list va; + int i; + + WRITE_ONCE(uc.cmd, cmd); + + nargs =3D min(nargs, UCALL_MAX_ARGS); + + va_start(va, nargs); + for (i =3D 0; i < nargs; ++i) + WRITE_ONCE(uc.args[i], va_arg(va, uint64_t)); + va_end(va); + + ucall_arch_do_ucall((vm_vaddr_t)&uc); +} diff --git a/tools/testing/selftests/kvm/lib/x86_64/ucall.c b/tools/testing= /selftests/kvm/lib/x86_64/ucall.c index e5f0f9e0d3ee..9f532dba1003 100644 --- a/tools/testing/selftests/kvm/lib/x86_64/ucall.c +++ b/tools/testing/selftests/kvm/lib/x86_64/ucall.c @@ -8,34 +8,21 @@ =20 #define UCALL_PIO_PORT ((uint16_t)0x1000) =20 -void ucall_init(struct kvm_vm *vm, void *arg) +void ucall_arch_init(struct kvm_vm *vm, void *arg) { } =20 -void ucall_uninit(struct kvm_vm *vm) +void ucall_arch_uninit(struct kvm_vm *vm) { } =20 -void ucall(uint64_t cmd, int nargs, ...) +void ucall_arch_do_ucall(vm_vaddr_t uc) { - struct ucall uc =3D { - .cmd =3D cmd, - }; - va_list va; - int i; - - nargs =3D min(nargs, UCALL_MAX_ARGS); - - va_start(va, nargs); - for (i =3D 0; i < nargs; ++i) - uc.args[i] =3D va_arg(va, uint64_t); - va_end(va); - asm volatile("in %[port], %%al" - : : [port] "d" (UCALL_PIO_PORT), "D" (&uc) : "rax", "memory"); + : : [port] "d" (UCALL_PIO_PORT), "D" (uc) : "rax", "memory"); } =20 -uint64_t get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) +uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) { struct kvm_run *run =3D vcpu->run; struct ucall ucall =3D {}; --=20 2.37.1.559.g78731f0fdb-goog