Received: by 2002:a05:6358:4e97:b0:b3:742d:4702 with SMTP id ce23csp3792295rwb; Tue, 16 Aug 2022 08:51:03 -0700 (PDT) X-Google-Smtp-Source: AA6agR6OquKFDycFWSyn27H72DfS83y3QMH6eupz8vnWJzji+zCNsk+qSDANKULi5cjCUs3q7Ama X-Received: by 2002:a17:907:6d18:b0:731:219a:49a0 with SMTP id sa24-20020a1709076d1800b00731219a49a0mr14038385ejc.406.1660665063332; Tue, 16 Aug 2022 08:51:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1660665063; cv=none; d=google.com; s=arc-20160816; b=DdascuTpZpU/ZmYYOzgCxJajF52J2dmm4YCeEkOf+/BR5MCjWILEGBXtZR2Mvfstvq WvD2kUeMPTZ8j6C+T9YHSx2+aTXkLTy5Kgd8bt+vDhd5UfeAOuEwjB1PUp3wZmd8cDye aZs2PPJ11TsRJtEwYgBl/SC5wFr5p2nmJ5mtt802sMhAwN2IFZfMSQwN0wLN0UiWA0+B hyyPvu+CYXG6pvZ2Rw4vY6lkJH22f4mqobILvxMcQA1Abr/e58Wtk8z3xHPpZFu+iK2l Zswzzi4EJ7f3zoH2UVlcX06HCR6bGRFrM/RXY950znBEueO5kQ8T5KhjivBCqaW7G10/ kadw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:dkim-signature:date; bh=Aj7QNjiAa4TRtSqJaIkRtDOVofo5d+a6cLuJbjuJqLk=; b=KWcxqbKD5C3YD/abnubwsFtETgOfjDqvzd53cVtdRnUOYzQthPDOzc9aVeIYaKNKDL Wzew6Vj//8eWF/dRx/CSZMOV9uwWpgR09VhTRXUCTQmKyVANiPJy10vef5iPVeST8NL5 CssoZHfBqgTsYKkKz9Md5HdhiK3Fe7NwJ58kOMKia9F1MesvLru1sR7cZegK1hSVRL4u 6sK+c0A2tvK4GdfChVp/8njunmXgR3q2+Pj485qdxihiSzQ9UMxy2h2aVwa+nz4/Xzts yXy2DLP5zwMqKdSEBIJxua90yqudBpd9xqQq31QLlDtbH7474HWIC+A7hizl3ZhyFDAb E0gg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linux.dev header.s=key1 header.b=NEGRKiNT; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linux.dev Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id si10-20020a170906ceca00b0072c534aff20si7902309ejb.93.2022.08.16.08.50.36; Tue, 16 Aug 2022 08:51:03 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linux.dev header.s=key1 header.b=NEGRKiNT; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linux.dev Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235643AbiHPP0m (ORCPT + 99 others); Tue, 16 Aug 2022 11:26:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42464 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234947AbiHPP0l (ORCPT ); Tue, 16 Aug 2022 11:26:41 -0400 Received: from out0.migadu.com (out0.migadu.com [IPv6:2001:41d0:2:267::]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1A037631F; Tue, 16 Aug 2022 08:26:38 -0700 (PDT) Date: Tue, 16 Aug 2022 17:26:35 +0200 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1660663596; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=Aj7QNjiAa4TRtSqJaIkRtDOVofo5d+a6cLuJbjuJqLk=; b=NEGRKiNTv0437MIF+Pzn3S2HJGCj0QDU/ORm9e1udfwAz5hxW+nuxQxhZYOIjM9gS8MvJU DguQqJiycUBkUIAFYTJFjB91I4DTQtOMnrMCRwhwqTmbaK8obodxUhgiYwudtYCmGM8rYv Xf6AshSn9n/oTzEiAuzjsEc8B5AFVho= X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. From: Andrew Jones To: Peter Gonda Cc: kvm@vger.kernel.org, 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, vannapurve@google.com, Colton Lewis , Andrew Jones Subject: Re: [V3 06/11] KVM: selftests: Consolidate common code for popuplating Message-ID: <20220816152635.jtplzx3bzipaogbp@kamzik> References: <20220810152033.946942-1-pgonda@google.com> <20220810152033.946942-7-pgonda@google.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20220810152033.946942-7-pgonda@google.com> X-Migadu-Flow: FLOW_OUT X-Migadu-Auth-User: linux.dev X-Spam-Status: No, score=-2.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_LOW,SPF_HELO_PASS, SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Aug 10, 2022 at 08:20:28AM -0700, Peter Gonda wrote: > 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 > --- > 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 += lib/perf_test_util.c > LIBKVM += lib/rbtree.c > LIBKVM += lib/sparsebit.c > LIBKVM += lib/test_util.c > +LIBKVM += lib/ucall_common.c > > LIBKVM_x86_64 += lib/x86_64/apic.c > LIBKVM_x86_64 += lib/x86_64/handlers.S > diff --git a/tools/testing/selftests/kvm/include/ucall_common.h b/tools/testing/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]; > }; > > -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); > +} > > #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/testing/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; > } > > -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"); > } > > -void ucall_uninit(struct kvm_vm *vm) > +void ucall_arch_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, ...) > +void ucall_arch_do_ucall(vm_vaddr_t uc) > { > - struct ucall uc = {}; > - va_list va; > - int i; > - > - WRITE_ONCE(uc.cmd, cmd); > - nargs = min(nargs, UCALL_MAX_ARGS); > - > - va_start(va, nargs); > - for (i = 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); ^ should just be uc > } > > -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 = vcpu->run; > struct ucall ucall = {}; > 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" > > -void ucall_init(struct kvm_vm *vm, void *arg) > +void ucall_arch_init(struct kvm_vm *vm, void *arg) > { > } > > -void ucall_uninit(struct kvm_vm *vm) > +void ucall_arch_uninit(struct kvm_vm *vm) > { > } > > @@ -44,27 +44,14 @@ struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0, > return ret; > } > > -void ucall(uint64_t cmd, int nargs, ...) > +void ucall_arch_do_ucall(vm_vaddr_t uc) > { > - struct ucall uc = { > - .cmd = cmd, > - }; > - va_list va; > - int i; > - > - nargs = min(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); > - > 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); > } > > -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 = vcpu->run; > struct ucall ucall = {}; > 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" > > -void ucall_init(struct kvm_vm *vm, void *arg) > +void ucall_arch_init(struct kvm_vm *vm, void *arg) > { > } > > -void ucall_uninit(struct kvm_vm *vm) > +void ucall_arch_uninit(struct kvm_vm *vm) > { > } > > -void ucall(uint64_t cmd, int nargs, ...) > +void ucall_arch_do_ucall(vm_vaddr_t uc) > { > - struct ucall uc = { > - .cmd = cmd, > - }; > - va_list va; > - int i; > - > - nargs = min(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); > - > /* 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"); > } > > -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 = vcpu->run; > struct ucall ucall = {}; > 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 = {}; > + va_list va; > + int i; > + > + WRITE_ONCE(uc.cmd, cmd); > + > + nargs = min(nargs, UCALL_MAX_ARGS); > + > + va_start(va, nargs); > + for (i = 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 @@ > > #define UCALL_PIO_PORT ((uint16_t)0x1000) > > -void ucall_init(struct kvm_vm *vm, void *arg) > +void ucall_arch_init(struct kvm_vm *vm, void *arg) > { > } > > -void ucall_uninit(struct kvm_vm *vm) > +void ucall_arch_uninit(struct kvm_vm *vm) > { > } > > -void ucall(uint64_t cmd, int nargs, ...) > +void ucall_arch_do_ucall(vm_vaddr_t uc) > { > - struct ucall uc = { > - .cmd = cmd, > - }; > - va_list va; > - int i; > - > - nargs = min(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); > - > asm volatile("in %[port], %%al" > - : : [port] "d" (UCALL_PIO_PORT), "D" (&uc) : "rax", "memory"); > + : : [port] "d" (UCALL_PIO_PORT), "D" (uc) : "rax", "memory"); > } > > -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 = vcpu->run; > struct ucall ucall = {}; > -- > 2.37.1.559.g78731f0fdb-goog > Otherwise, Reviewed-by: Andrew Jones