* [PATCH 0/3] KVM: selftests: Consolidate ucall code @ 2022-06-18 0:16 ` Sean Christopherson 0 siblings, 0 replies; 44+ messages in thread From: Sean Christopherson @ 2022-06-18 0:16 UTC (permalink / raw) To: Paolo Bonzini, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda Cc: James Morse, Alexandru Elisei, Suzuki K Poulose, Atish Patra, David Hildenbrand, kvm, linux-arm-kernel, kvmarm, kvm-riscv, linux-riscv, linux-kernel, Colton Lewis, Andrew Jones, Sean Christopherson Consolidate the code for making and getting ucalls. All architectures pass the ucall struct via memory, so filling and copying the struct is 100% generic. The only per-arch code is sending and receiving the address of said struct. Tested on x86 and arm, compile tested on s390 and RISC-V. Sean Christopherson (3): KVM: selftests: Consolidate common code for popuplating ucall struct KVM: selftests: Consolidate boilerplate code in get_ucall() KVM: selftest: Add __weak stubs for ucall_arch_(un)init() tools/testing/selftests/kvm/Makefile | 1 + .../selftests/kvm/include/ucall_common.h | 17 ++++++- .../testing/selftests/kvm/lib/aarch64/ucall.c | 36 +++----------- tools/testing/selftests/kvm/lib/riscv/ucall.c | 44 ++--------------- tools/testing/selftests/kvm/lib/s390x/ucall.c | 41 ++-------------- .../testing/selftests/kvm/lib/ucall_common.c | 49 +++++++++++++++++++ .../testing/selftests/kvm/lib/x86_64/ucall.c | 41 ++-------------- 7 files changed, 87 insertions(+), 142 deletions(-) create mode 100644 tools/testing/selftests/kvm/lib/ucall_common.c base-commit: 8baacf67c76c560fed954ac972b63e6e59a6fba0 -- 2.37.0.rc0.104.g0611611a94-goog ^ permalink raw reply [flat|nested] 44+ messages in thread
* [PATCH 0/3] KVM: selftests: Consolidate ucall code @ 2022-06-18 0:16 ` Sean Christopherson 0 siblings, 0 replies; 44+ messages in thread From: Sean Christopherson @ 2022-06-18 0:16 UTC (permalink / raw) To: Paolo Bonzini, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda Cc: James Morse, Alexandru Elisei, Suzuki K Poulose, Atish Patra, David Hildenbrand, kvm, linux-arm-kernel, kvmarm, kvm-riscv, linux-riscv, linux-kernel, Colton Lewis, Andrew Jones, Sean Christopherson Consolidate the code for making and getting ucalls. All architectures pass the ucall struct via memory, so filling and copying the struct is 100% generic. The only per-arch code is sending and receiving the address of said struct. Tested on x86 and arm, compile tested on s390 and RISC-V. Sean Christopherson (3): KVM: selftests: Consolidate common code for popuplating ucall struct KVM: selftests: Consolidate boilerplate code in get_ucall() KVM: selftest: Add __weak stubs for ucall_arch_(un)init() tools/testing/selftests/kvm/Makefile | 1 + .../selftests/kvm/include/ucall_common.h | 17 ++++++- .../testing/selftests/kvm/lib/aarch64/ucall.c | 36 +++----------- tools/testing/selftests/kvm/lib/riscv/ucall.c | 44 ++--------------- tools/testing/selftests/kvm/lib/s390x/ucall.c | 41 ++-------------- .../testing/selftests/kvm/lib/ucall_common.c | 49 +++++++++++++++++++ .../testing/selftests/kvm/lib/x86_64/ucall.c | 41 ++-------------- 7 files changed, 87 insertions(+), 142 deletions(-) create mode 100644 tools/testing/selftests/kvm/lib/ucall_common.c base-commit: 8baacf67c76c560fed954ac972b63e6e59a6fba0 -- 2.37.0.rc0.104.g0611611a94-goog _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 44+ messages in thread
* [PATCH 0/3] KVM: selftests: Consolidate ucall code @ 2022-06-18 0:16 ` Sean Christopherson 0 siblings, 0 replies; 44+ messages in thread From: Sean Christopherson @ 2022-06-18 0:16 UTC (permalink / raw) To: Paolo Bonzini, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda Cc: kvm, David Hildenbrand, linux-kernel, Colton Lewis, kvm-riscv, Atish Patra, linux-riscv, kvmarm, linux-arm-kernel Consolidate the code for making and getting ucalls. All architectures pass the ucall struct via memory, so filling and copying the struct is 100% generic. The only per-arch code is sending and receiving the address of said struct. Tested on x86 and arm, compile tested on s390 and RISC-V. Sean Christopherson (3): KVM: selftests: Consolidate common code for popuplating ucall struct KVM: selftests: Consolidate boilerplate code in get_ucall() KVM: selftest: Add __weak stubs for ucall_arch_(un)init() tools/testing/selftests/kvm/Makefile | 1 + .../selftests/kvm/include/ucall_common.h | 17 ++++++- .../testing/selftests/kvm/lib/aarch64/ucall.c | 36 +++----------- tools/testing/selftests/kvm/lib/riscv/ucall.c | 44 ++--------------- tools/testing/selftests/kvm/lib/s390x/ucall.c | 41 ++-------------- .../testing/selftests/kvm/lib/ucall_common.c | 49 +++++++++++++++++++ .../testing/selftests/kvm/lib/x86_64/ucall.c | 41 ++-------------- 7 files changed, 87 insertions(+), 142 deletions(-) create mode 100644 tools/testing/selftests/kvm/lib/ucall_common.c base-commit: 8baacf67c76c560fed954ac972b63e6e59a6fba0 -- 2.37.0.rc0.104.g0611611a94-goog _______________________________________________ kvmarm mailing list kvmarm@lists.cs.columbia.edu https://lists.cs.columbia.edu/mailman/listinfo/kvmarm ^ permalink raw reply [flat|nested] 44+ messages in thread
* [PATCH 0/3] KVM: selftests: Consolidate ucall code @ 2022-06-18 0:16 ` Sean Christopherson 0 siblings, 0 replies; 44+ messages in thread From: Sean Christopherson @ 2022-06-18 0:16 UTC (permalink / raw) To: Paolo Bonzini, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda Cc: James Morse, Alexandru Elisei, Suzuki K Poulose, Atish Patra, David Hildenbrand, kvm, linux-arm-kernel, kvmarm, kvm-riscv, linux-riscv, linux-kernel, Colton Lewis, Andrew Jones, Sean Christopherson Consolidate the code for making and getting ucalls. All architectures pass the ucall struct via memory, so filling and copying the struct is 100% generic. The only per-arch code is sending and receiving the address of said struct. Tested on x86 and arm, compile tested on s390 and RISC-V. Sean Christopherson (3): KVM: selftests: Consolidate common code for popuplating ucall struct KVM: selftests: Consolidate boilerplate code in get_ucall() KVM: selftest: Add __weak stubs for ucall_arch_(un)init() tools/testing/selftests/kvm/Makefile | 1 + .../selftests/kvm/include/ucall_common.h | 17 ++++++- .../testing/selftests/kvm/lib/aarch64/ucall.c | 36 +++----------- tools/testing/selftests/kvm/lib/riscv/ucall.c | 44 ++--------------- tools/testing/selftests/kvm/lib/s390x/ucall.c | 41 ++-------------- .../testing/selftests/kvm/lib/ucall_common.c | 49 +++++++++++++++++++ .../testing/selftests/kvm/lib/x86_64/ucall.c | 41 ++-------------- 7 files changed, 87 insertions(+), 142 deletions(-) create mode 100644 tools/testing/selftests/kvm/lib/ucall_common.c base-commit: 8baacf67c76c560fed954ac972b63e6e59a6fba0 -- 2.37.0.rc0.104.g0611611a94-goog _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply [flat|nested] 44+ messages in thread
* [PATCH 1/3] KVM: selftests: Consolidate common code for popuplating ucall struct 2022-06-18 0:16 ` Sean Christopherson (?) (?) @ 2022-06-18 0:16 ` Sean Christopherson -1 siblings, 0 replies; 44+ messages in thread From: Sean Christopherson @ 2022-06-18 0:16 UTC (permalink / raw) To: Paolo Bonzini, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda Cc: James Morse, Alexandru Elisei, Suzuki K Poulose, Atish Patra, David Hildenbrand, kvm, linux-arm-kernel, kvmarm, kvm-riscv, linux-riscv, linux-kernel, Colton Lewis, Andrew Jones, 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...) No functional change intended. Cc: Colton Lewis <coltonlewis@google.com> Cc: Andrew Jones <drjones@redhat.com> Signed-off-by: Sean Christopherson <seanjc@google.com> --- tools/testing/selftests/kvm/Makefile | 1 + .../selftests/kvm/include/ucall_common.h | 23 ++++++++++++++++--- .../testing/selftests/kvm/lib/aarch64/ucall.c | 23 ++++--------------- 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, 61 insertions(+), 75 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 b52c130f7b2f..bc2aee2af66c 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 98562f685151..c6a4fd7fe443 100644 --- a/tools/testing/selftests/kvm/include/ucall_common.h +++ b/tools/testing/selftests/kvm/include/ucall_common.h @@ -23,10 +23,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 0b949ee06b5e..2de9fdd34159 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,31 +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 = { - .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); - - *ucall_exit_mmio_addr = (vm_vaddr_t)&uc; + *ucall_exit_mmio_addr = 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..749ffdf23855 --- /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 = { + .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); + + 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.0.rc0.104.g0611611a94-goog ^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 1/3] KVM: selftests: Consolidate common code for popuplating ucall struct @ 2022-06-18 0:16 ` Sean Christopherson 0 siblings, 0 replies; 44+ messages in thread From: Sean Christopherson @ 2022-06-18 0:16 UTC (permalink / raw) To: Paolo Bonzini, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda Cc: James Morse, Alexandru Elisei, Suzuki K Poulose, Atish Patra, David Hildenbrand, kvm, linux-arm-kernel, kvmarm, kvm-riscv, linux-riscv, linux-kernel, Colton Lewis, Andrew Jones, 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...) No functional change intended. Cc: Colton Lewis <coltonlewis@google.com> Cc: Andrew Jones <drjones@redhat.com> Signed-off-by: Sean Christopherson <seanjc@google.com> --- tools/testing/selftests/kvm/Makefile | 1 + .../selftests/kvm/include/ucall_common.h | 23 ++++++++++++++++--- .../testing/selftests/kvm/lib/aarch64/ucall.c | 23 ++++--------------- 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, 61 insertions(+), 75 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 b52c130f7b2f..bc2aee2af66c 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 98562f685151..c6a4fd7fe443 100644 --- a/tools/testing/selftests/kvm/include/ucall_common.h +++ b/tools/testing/selftests/kvm/include/ucall_common.h @@ -23,10 +23,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 0b949ee06b5e..2de9fdd34159 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,31 +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 = { - .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); - - *ucall_exit_mmio_addr = (vm_vaddr_t)&uc; + *ucall_exit_mmio_addr = 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..749ffdf23855 --- /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 = { + .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); + + 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.0.rc0.104.g0611611a94-goog _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 1/3] KVM: selftests: Consolidate common code for popuplating ucall struct @ 2022-06-18 0:16 ` Sean Christopherson 0 siblings, 0 replies; 44+ messages in thread From: Sean Christopherson @ 2022-06-18 0:16 UTC (permalink / raw) To: Paolo Bonzini, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda Cc: kvm, David Hildenbrand, linux-kernel, Colton Lewis, kvm-riscv, Atish Patra, linux-riscv, kvmarm, linux-arm-kernel 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...) No functional change intended. Cc: Colton Lewis <coltonlewis@google.com> Cc: Andrew Jones <drjones@redhat.com> Signed-off-by: Sean Christopherson <seanjc@google.com> --- tools/testing/selftests/kvm/Makefile | 1 + .../selftests/kvm/include/ucall_common.h | 23 ++++++++++++++++--- .../testing/selftests/kvm/lib/aarch64/ucall.c | 23 ++++--------------- 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, 61 insertions(+), 75 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 b52c130f7b2f..bc2aee2af66c 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 98562f685151..c6a4fd7fe443 100644 --- a/tools/testing/selftests/kvm/include/ucall_common.h +++ b/tools/testing/selftests/kvm/include/ucall_common.h @@ -23,10 +23,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 0b949ee06b5e..2de9fdd34159 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,31 +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 = { - .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); - - *ucall_exit_mmio_addr = (vm_vaddr_t)&uc; + *ucall_exit_mmio_addr = 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..749ffdf23855 --- /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 = { + .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); + + 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.0.rc0.104.g0611611a94-goog _______________________________________________ kvmarm mailing list kvmarm@lists.cs.columbia.edu https://lists.cs.columbia.edu/mailman/listinfo/kvmarm ^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 1/3] KVM: selftests: Consolidate common code for popuplating ucall struct @ 2022-06-18 0:16 ` Sean Christopherson 0 siblings, 0 replies; 44+ messages in thread From: Sean Christopherson @ 2022-06-18 0:16 UTC (permalink / raw) To: Paolo Bonzini, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda Cc: James Morse, Alexandru Elisei, Suzuki K Poulose, Atish Patra, David Hildenbrand, kvm, linux-arm-kernel, kvmarm, kvm-riscv, linux-riscv, linux-kernel, Colton Lewis, Andrew Jones, 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...) No functional change intended. Cc: Colton Lewis <coltonlewis@google.com> Cc: Andrew Jones <drjones@redhat.com> Signed-off-by: Sean Christopherson <seanjc@google.com> --- tools/testing/selftests/kvm/Makefile | 1 + .../selftests/kvm/include/ucall_common.h | 23 ++++++++++++++++--- .../testing/selftests/kvm/lib/aarch64/ucall.c | 23 ++++--------------- 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, 61 insertions(+), 75 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 b52c130f7b2f..bc2aee2af66c 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 98562f685151..c6a4fd7fe443 100644 --- a/tools/testing/selftests/kvm/include/ucall_common.h +++ b/tools/testing/selftests/kvm/include/ucall_common.h @@ -23,10 +23,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 0b949ee06b5e..2de9fdd34159 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,31 +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 = { - .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); - - *ucall_exit_mmio_addr = (vm_vaddr_t)&uc; + *ucall_exit_mmio_addr = 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..749ffdf23855 --- /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 = { + .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); + + 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.0.rc0.104.g0611611a94-goog _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply related [flat|nested] 44+ messages in thread
* Re: [PATCH 1/3] KVM: selftests: Consolidate common code for popuplating ucall struct 2022-06-18 0:16 ` Sean Christopherson (?) (?) @ 2022-06-20 7:39 ` Christian Borntraeger -1 siblings, 0 replies; 44+ messages in thread From: Christian Borntraeger @ 2022-06-20 7:39 UTC (permalink / raw) To: Sean Christopherson, Paolo Bonzini, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Janosch Frank, Claudio Imbrenda Cc: James Morse, Alexandru Elisei, Suzuki K Poulose, Atish Patra, David Hildenbrand, kvm, linux-arm-kernel, kvmarm, kvm-riscv, linux-riscv, linux-kernel, Colton Lewis, Andrew Jones Am 18.06.22 um 02:16 schrieb 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...) > > No functional change intended. > > Cc: Colton Lewis <coltonlewis@google.com> > Cc: Andrew Jones <drjones@redhat.com> > Signed-off-by: Sean Christopherson <seanjc@google.com> seems to work on s390. Tested-by: Christian Borntraeger <borntraeger@linux.ibm.com> > --- > tools/testing/selftests/kvm/Makefile | 1 + > .../selftests/kvm/include/ucall_common.h | 23 ++++++++++++++++--- > .../testing/selftests/kvm/lib/aarch64/ucall.c | 23 ++++--------------- > 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, 61 insertions(+), 75 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 b52c130f7b2f..bc2aee2af66c 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 98562f685151..c6a4fd7fe443 100644 > --- a/tools/testing/selftests/kvm/include/ucall_common.h > +++ b/tools/testing/selftests/kvm/include/ucall_common.h > @@ -23,10 +23,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 0b949ee06b5e..2de9fdd34159 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,31 +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 = { > - .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); > - > - *ucall_exit_mmio_addr = (vm_vaddr_t)&uc; > + *ucall_exit_mmio_addr = 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..749ffdf23855 > --- /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 = { > + .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); > + > + 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 = {}; ^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 1/3] KVM: selftests: Consolidate common code for popuplating ucall struct @ 2022-06-20 7:39 ` Christian Borntraeger 0 siblings, 0 replies; 44+ messages in thread From: Christian Borntraeger @ 2022-06-20 7:39 UTC (permalink / raw) To: Sean Christopherson, Paolo Bonzini, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Janosch Frank, Claudio Imbrenda Cc: kvm, David Hildenbrand, linux-kernel, Colton Lewis, kvm-riscv, Atish Patra, linux-riscv, kvmarm, linux-arm-kernel Am 18.06.22 um 02:16 schrieb 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...) > > No functional change intended. > > Cc: Colton Lewis <coltonlewis@google.com> > Cc: Andrew Jones <drjones@redhat.com> > Signed-off-by: Sean Christopherson <seanjc@google.com> seems to work on s390. Tested-by: Christian Borntraeger <borntraeger@linux.ibm.com> > --- > tools/testing/selftests/kvm/Makefile | 1 + > .../selftests/kvm/include/ucall_common.h | 23 ++++++++++++++++--- > .../testing/selftests/kvm/lib/aarch64/ucall.c | 23 ++++--------------- > 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, 61 insertions(+), 75 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 b52c130f7b2f..bc2aee2af66c 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 98562f685151..c6a4fd7fe443 100644 > --- a/tools/testing/selftests/kvm/include/ucall_common.h > +++ b/tools/testing/selftests/kvm/include/ucall_common.h > @@ -23,10 +23,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 0b949ee06b5e..2de9fdd34159 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,31 +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 = { > - .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); > - > - *ucall_exit_mmio_addr = (vm_vaddr_t)&uc; > + *ucall_exit_mmio_addr = 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..749ffdf23855 > --- /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 = { > + .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); > + > + 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 = {}; _______________________________________________ kvmarm mailing list kvmarm@lists.cs.columbia.edu https://lists.cs.columbia.edu/mailman/listinfo/kvmarm ^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 1/3] KVM: selftests: Consolidate common code for popuplating ucall struct @ 2022-06-20 7:39 ` Christian Borntraeger 0 siblings, 0 replies; 44+ messages in thread From: Christian Borntraeger @ 2022-06-20 7:39 UTC (permalink / raw) To: Sean Christopherson, Paolo Bonzini, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Janosch Frank, Claudio Imbrenda Cc: James Morse, Alexandru Elisei, Suzuki K Poulose, Atish Patra, David Hildenbrand, kvm, linux-arm-kernel, kvmarm, kvm-riscv, linux-riscv, linux-kernel, Colton Lewis, Andrew Jones Am 18.06.22 um 02:16 schrieb 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...) > > No functional change intended. > > Cc: Colton Lewis <coltonlewis@google.com> > Cc: Andrew Jones <drjones@redhat.com> > Signed-off-by: Sean Christopherson <seanjc@google.com> seems to work on s390. Tested-by: Christian Borntraeger <borntraeger@linux.ibm.com> > --- > tools/testing/selftests/kvm/Makefile | 1 + > .../selftests/kvm/include/ucall_common.h | 23 ++++++++++++++++--- > .../testing/selftests/kvm/lib/aarch64/ucall.c | 23 ++++--------------- > 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, 61 insertions(+), 75 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 b52c130f7b2f..bc2aee2af66c 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 98562f685151..c6a4fd7fe443 100644 > --- a/tools/testing/selftests/kvm/include/ucall_common.h > +++ b/tools/testing/selftests/kvm/include/ucall_common.h > @@ -23,10 +23,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 0b949ee06b5e..2de9fdd34159 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,31 +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 = { > - .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); > - > - *ucall_exit_mmio_addr = (vm_vaddr_t)&uc; > + *ucall_exit_mmio_addr = 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..749ffdf23855 > --- /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 = { > + .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); > + > + 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 = {}; _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 1/3] KVM: selftests: Consolidate common code for popuplating ucall struct @ 2022-06-20 7:39 ` Christian Borntraeger 0 siblings, 0 replies; 44+ messages in thread From: Christian Borntraeger @ 2022-06-20 7:39 UTC (permalink / raw) To: Sean Christopherson, Paolo Bonzini, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Janosch Frank, Claudio Imbrenda Cc: James Morse, Alexandru Elisei, Suzuki K Poulose, Atish Patra, David Hildenbrand, kvm, linux-arm-kernel, kvmarm, kvm-riscv, linux-riscv, linux-kernel, Colton Lewis, Andrew Jones Am 18.06.22 um 02:16 schrieb 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...) > > No functional change intended. > > Cc: Colton Lewis <coltonlewis@google.com> > Cc: Andrew Jones <drjones@redhat.com> > Signed-off-by: Sean Christopherson <seanjc@google.com> seems to work on s390. Tested-by: Christian Borntraeger <borntraeger@linux.ibm.com> > --- > tools/testing/selftests/kvm/Makefile | 1 + > .../selftests/kvm/include/ucall_common.h | 23 ++++++++++++++++--- > .../testing/selftests/kvm/lib/aarch64/ucall.c | 23 ++++--------------- > 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, 61 insertions(+), 75 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 b52c130f7b2f..bc2aee2af66c 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 98562f685151..c6a4fd7fe443 100644 > --- a/tools/testing/selftests/kvm/include/ucall_common.h > +++ b/tools/testing/selftests/kvm/include/ucall_common.h > @@ -23,10 +23,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 0b949ee06b5e..2de9fdd34159 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,31 +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 = { > - .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); > - > - *ucall_exit_mmio_addr = (vm_vaddr_t)&uc; > + *ucall_exit_mmio_addr = 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..749ffdf23855 > --- /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 = { > + .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); > + > + 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 = {}; _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply [flat|nested] 44+ messages in thread
* [PATCH 2/3] KVM: selftests: Consolidate boilerplate code in get_ucall() 2022-06-18 0:16 ` Sean Christopherson (?) (?) @ 2022-06-18 0:16 ` Sean Christopherson -1 siblings, 0 replies; 44+ messages in thread From: Sean Christopherson @ 2022-06-18 0:16 UTC (permalink / raw) To: Paolo Bonzini, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda Cc: James Morse, Alexandru Elisei, Suzuki K Poulose, Atish Patra, David Hildenbrand, kvm, linux-arm-kernel, kvmarm, kvm-riscv, linux-riscv, linux-kernel, Colton Lewis, Andrew Jones, Sean Christopherson Consolidate the actual copying of a ucall struct from guest=>host into the common get_ucall(). Return a host virtual address instead of a guest virtual address even though the addr_gva2hva() part could be moved to get_ucall() too. Conceptually, get_ucall() is invoked from the host and should return a host virtual address (and returning NULL for "nothing to see here" is far superior to returning 0). Use pointer shenanigans instead of an unnecessary bounce buffer when the caller of get_ucall() provides a valid pointer. Signed-off-by: Sean Christopherson <seanjc@google.com> --- .../selftests/kvm/include/ucall_common.h | 8 ++------ .../testing/selftests/kvm/lib/aarch64/ucall.c | 15 +++------------ tools/testing/selftests/kvm/lib/riscv/ucall.c | 19 +++---------------- tools/testing/selftests/kvm/lib/s390x/ucall.c | 16 +++------------- .../testing/selftests/kvm/lib/ucall_common.c | 19 +++++++++++++++++++ .../testing/selftests/kvm/lib/x86_64/ucall.c | 16 +++------------- 6 files changed, 33 insertions(+), 60 deletions(-) diff --git a/tools/testing/selftests/kvm/include/ucall_common.h b/tools/testing/selftests/kvm/include/ucall_common.h index c6a4fd7fe443..cb9b37282701 100644 --- a/tools/testing/selftests/kvm/include/ucall_common.h +++ b/tools/testing/selftests/kvm/include/ucall_common.h @@ -26,9 +26,10 @@ struct ucall { 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_arch_get_ucall(struct kvm_vcpu *vcpu); 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) { @@ -40,11 +41,6 @@ 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) #define GUEST_SYNC(stage) ucall(UCALL_SYNC, 2, "hello", stage) diff --git a/tools/testing/selftests/kvm/lib/aarch64/ucall.c b/tools/testing/selftests/kvm/lib/aarch64/ucall.c index 2de9fdd34159..9c124adbb560 100644 --- a/tools/testing/selftests/kvm/lib/aarch64/ucall.c +++ b/tools/testing/selftests/kvm/lib/aarch64/ucall.c @@ -75,13 +75,9 @@ void ucall_arch_do_ucall(vm_vaddr_t uc) *ucall_exit_mmio_addr = uc; } -uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) +void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu) { struct kvm_run *run = vcpu->run; - 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) { @@ -90,12 +86,7 @@ uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) TEST_ASSERT(run->mmio.is_write && run->mmio.len == 8, "Unexpected ucall exit mmio address access"); memcpy(&gva, run->mmio.data, sizeof(gva)); - memcpy(&ucall, addr_gva2hva(vcpu->vm, gva), sizeof(ucall)); - - vcpu_run_complete_io(vcpu); - if (uc) - memcpy(uc, &ucall, sizeof(ucall)); + return addr_gva2hva(vcpu->vm, gva); } - - return ucall.cmd; + return NULL; } diff --git a/tools/testing/selftests/kvm/lib/riscv/ucall.c b/tools/testing/selftests/kvm/lib/riscv/ucall.c index b1598f418c1f..37e091d4366e 100644 --- a/tools/testing/selftests/kvm/lib/riscv/ucall.c +++ b/tools/testing/selftests/kvm/lib/riscv/ucall.c @@ -51,27 +51,15 @@ void ucall_arch_do_ucall(vm_vaddr_t uc) uc, 0, 0, 0, 0, 0); } -uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) +void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu) { struct kvm_run *run = vcpu->run; - struct ucall ucall = {}; - - if (uc) - memset(uc, 0, sizeof(*uc)); if (run->exit_reason == KVM_EXIT_RISCV_SBI && run->riscv_sbi.extension_id == KVM_RISCV_SELFTESTS_SBI_EXT) { switch (run->riscv_sbi.function_id) { case KVM_RISCV_SELFTESTS_SBI_UCALL: - memcpy(&ucall, - addr_gva2hva(vcpu->vm, run->riscv_sbi.args[0]), - sizeof(ucall)); - - vcpu_run_complete_io(vcpu); - if (uc) - memcpy(uc, &ucall, sizeof(ucall)); - - break; + return addr_gva2hva(vcpu->vm, run->riscv_sbi.args[0]); case KVM_RISCV_SELFTESTS_SBI_UNEXP: vcpu_dump(stderr, vcpu, 2); TEST_ASSERT(0, "Unexpected trap taken by guest"); @@ -80,6 +68,5 @@ uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) break; } } - - return ucall.cmd; + return NULL; } diff --git a/tools/testing/selftests/kvm/lib/s390x/ucall.c b/tools/testing/selftests/kvm/lib/s390x/ucall.c index 114cb4af295f..0f695a031d35 100644 --- a/tools/testing/selftests/kvm/lib/s390x/ucall.c +++ b/tools/testing/selftests/kvm/lib/s390x/ucall.c @@ -20,13 +20,9 @@ void ucall_arch_do_ucall(vm_vaddr_t uc) asm volatile ("diag 0,%0,0x501" : : "a"(uc) : "memory"); } -uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) +void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu) { struct kvm_run *run = vcpu->run; - struct ucall ucall = {}; - - if (uc) - memset(uc, 0, sizeof(*uc)); if (run->exit_reason == KVM_EXIT_S390_SIEIC && run->s390_sieic.icptcode == 4 && @@ -34,13 +30,7 @@ uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) (run->s390_sieic.ipb >> 16) == 0x501) { int reg = run->s390_sieic.ipa & 0xf; - memcpy(&ucall, addr_gva2hva(vcpu->vm, run->s.regs.gprs[reg]), - sizeof(ucall)); - - vcpu_run_complete_io(vcpu); - if (uc) - memcpy(uc, &ucall, sizeof(ucall)); + return addr_gva2hva(vcpu->vm, run->s.regs.gprs[reg]); } - - return ucall.cmd; + return NULL; } diff --git a/tools/testing/selftests/kvm/lib/ucall_common.c b/tools/testing/selftests/kvm/lib/ucall_common.c index 749ffdf23855..c488ed23d0dd 100644 --- a/tools/testing/selftests/kvm/lib/ucall_common.c +++ b/tools/testing/selftests/kvm/lib/ucall_common.c @@ -18,3 +18,22 @@ void ucall(uint64_t cmd, int nargs, ...) ucall_arch_do_ucall((vm_vaddr_t)&uc); } + +uint64_t get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) +{ + struct ucall ucall; + void *addr; + + if (!uc) + uc = &ucall; + + addr = ucall_arch_get_ucall(vcpu); + if (addr) { + memcpy(uc, addr, sizeof(*uc)); + vcpu_run_complete_io(vcpu); + } else { + memset(uc, 0, sizeof(*uc)); + } + + return uc->cmd; +} diff --git a/tools/testing/selftests/kvm/lib/x86_64/ucall.c b/tools/testing/selftests/kvm/lib/x86_64/ucall.c index 9f532dba1003..ec53a406f689 100644 --- a/tools/testing/selftests/kvm/lib/x86_64/ucall.c +++ b/tools/testing/selftests/kvm/lib/x86_64/ucall.c @@ -22,25 +22,15 @@ void ucall_arch_do_ucall(vm_vaddr_t uc) : : [port] "d" (UCALL_PIO_PORT), "D" (uc) : "rax", "memory"); } -uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) +void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu) { struct kvm_run *run = vcpu->run; - struct ucall ucall = {}; - - if (uc) - memset(uc, 0, sizeof(*uc)); if (run->exit_reason == KVM_EXIT_IO && run->io.port == UCALL_PIO_PORT) { struct kvm_regs regs; vcpu_regs_get(vcpu, ®s); - memcpy(&ucall, addr_gva2hva(vcpu->vm, (vm_vaddr_t)regs.rdi), - sizeof(ucall)); - - vcpu_run_complete_io(vcpu); - if (uc) - memcpy(uc, &ucall, sizeof(ucall)); + return addr_gva2hva(vcpu->vm, (vm_vaddr_t)regs.rdi); } - - return ucall.cmd; + return NULL; } -- 2.37.0.rc0.104.g0611611a94-goog ^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 2/3] KVM: selftests: Consolidate boilerplate code in get_ucall() @ 2022-06-18 0:16 ` Sean Christopherson 0 siblings, 0 replies; 44+ messages in thread From: Sean Christopherson @ 2022-06-18 0:16 UTC (permalink / raw) To: Paolo Bonzini, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda Cc: James Morse, Alexandru Elisei, Suzuki K Poulose, Atish Patra, David Hildenbrand, kvm, linux-arm-kernel, kvmarm, kvm-riscv, linux-riscv, linux-kernel, Colton Lewis, Andrew Jones, Sean Christopherson Consolidate the actual copying of a ucall struct from guest=>host into the common get_ucall(). Return a host virtual address instead of a guest virtual address even though the addr_gva2hva() part could be moved to get_ucall() too. Conceptually, get_ucall() is invoked from the host and should return a host virtual address (and returning NULL for "nothing to see here" is far superior to returning 0). Use pointer shenanigans instead of an unnecessary bounce buffer when the caller of get_ucall() provides a valid pointer. Signed-off-by: Sean Christopherson <seanjc@google.com> --- .../selftests/kvm/include/ucall_common.h | 8 ++------ .../testing/selftests/kvm/lib/aarch64/ucall.c | 15 +++------------ tools/testing/selftests/kvm/lib/riscv/ucall.c | 19 +++---------------- tools/testing/selftests/kvm/lib/s390x/ucall.c | 16 +++------------- .../testing/selftests/kvm/lib/ucall_common.c | 19 +++++++++++++++++++ .../testing/selftests/kvm/lib/x86_64/ucall.c | 16 +++------------- 6 files changed, 33 insertions(+), 60 deletions(-) diff --git a/tools/testing/selftests/kvm/include/ucall_common.h b/tools/testing/selftests/kvm/include/ucall_common.h index c6a4fd7fe443..cb9b37282701 100644 --- a/tools/testing/selftests/kvm/include/ucall_common.h +++ b/tools/testing/selftests/kvm/include/ucall_common.h @@ -26,9 +26,10 @@ struct ucall { 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_arch_get_ucall(struct kvm_vcpu *vcpu); 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) { @@ -40,11 +41,6 @@ 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) #define GUEST_SYNC(stage) ucall(UCALL_SYNC, 2, "hello", stage) diff --git a/tools/testing/selftests/kvm/lib/aarch64/ucall.c b/tools/testing/selftests/kvm/lib/aarch64/ucall.c index 2de9fdd34159..9c124adbb560 100644 --- a/tools/testing/selftests/kvm/lib/aarch64/ucall.c +++ b/tools/testing/selftests/kvm/lib/aarch64/ucall.c @@ -75,13 +75,9 @@ void ucall_arch_do_ucall(vm_vaddr_t uc) *ucall_exit_mmio_addr = uc; } -uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) +void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu) { struct kvm_run *run = vcpu->run; - 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) { @@ -90,12 +86,7 @@ uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) TEST_ASSERT(run->mmio.is_write && run->mmio.len == 8, "Unexpected ucall exit mmio address access"); memcpy(&gva, run->mmio.data, sizeof(gva)); - memcpy(&ucall, addr_gva2hva(vcpu->vm, gva), sizeof(ucall)); - - vcpu_run_complete_io(vcpu); - if (uc) - memcpy(uc, &ucall, sizeof(ucall)); + return addr_gva2hva(vcpu->vm, gva); } - - return ucall.cmd; + return NULL; } diff --git a/tools/testing/selftests/kvm/lib/riscv/ucall.c b/tools/testing/selftests/kvm/lib/riscv/ucall.c index b1598f418c1f..37e091d4366e 100644 --- a/tools/testing/selftests/kvm/lib/riscv/ucall.c +++ b/tools/testing/selftests/kvm/lib/riscv/ucall.c @@ -51,27 +51,15 @@ void ucall_arch_do_ucall(vm_vaddr_t uc) uc, 0, 0, 0, 0, 0); } -uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) +void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu) { struct kvm_run *run = vcpu->run; - struct ucall ucall = {}; - - if (uc) - memset(uc, 0, sizeof(*uc)); if (run->exit_reason == KVM_EXIT_RISCV_SBI && run->riscv_sbi.extension_id == KVM_RISCV_SELFTESTS_SBI_EXT) { switch (run->riscv_sbi.function_id) { case KVM_RISCV_SELFTESTS_SBI_UCALL: - memcpy(&ucall, - addr_gva2hva(vcpu->vm, run->riscv_sbi.args[0]), - sizeof(ucall)); - - vcpu_run_complete_io(vcpu); - if (uc) - memcpy(uc, &ucall, sizeof(ucall)); - - break; + return addr_gva2hva(vcpu->vm, run->riscv_sbi.args[0]); case KVM_RISCV_SELFTESTS_SBI_UNEXP: vcpu_dump(stderr, vcpu, 2); TEST_ASSERT(0, "Unexpected trap taken by guest"); @@ -80,6 +68,5 @@ uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) break; } } - - return ucall.cmd; + return NULL; } diff --git a/tools/testing/selftests/kvm/lib/s390x/ucall.c b/tools/testing/selftests/kvm/lib/s390x/ucall.c index 114cb4af295f..0f695a031d35 100644 --- a/tools/testing/selftests/kvm/lib/s390x/ucall.c +++ b/tools/testing/selftests/kvm/lib/s390x/ucall.c @@ -20,13 +20,9 @@ void ucall_arch_do_ucall(vm_vaddr_t uc) asm volatile ("diag 0,%0,0x501" : : "a"(uc) : "memory"); } -uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) +void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu) { struct kvm_run *run = vcpu->run; - struct ucall ucall = {}; - - if (uc) - memset(uc, 0, sizeof(*uc)); if (run->exit_reason == KVM_EXIT_S390_SIEIC && run->s390_sieic.icptcode == 4 && @@ -34,13 +30,7 @@ uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) (run->s390_sieic.ipb >> 16) == 0x501) { int reg = run->s390_sieic.ipa & 0xf; - memcpy(&ucall, addr_gva2hva(vcpu->vm, run->s.regs.gprs[reg]), - sizeof(ucall)); - - vcpu_run_complete_io(vcpu); - if (uc) - memcpy(uc, &ucall, sizeof(ucall)); + return addr_gva2hva(vcpu->vm, run->s.regs.gprs[reg]); } - - return ucall.cmd; + return NULL; } diff --git a/tools/testing/selftests/kvm/lib/ucall_common.c b/tools/testing/selftests/kvm/lib/ucall_common.c index 749ffdf23855..c488ed23d0dd 100644 --- a/tools/testing/selftests/kvm/lib/ucall_common.c +++ b/tools/testing/selftests/kvm/lib/ucall_common.c @@ -18,3 +18,22 @@ void ucall(uint64_t cmd, int nargs, ...) ucall_arch_do_ucall((vm_vaddr_t)&uc); } + +uint64_t get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) +{ + struct ucall ucall; + void *addr; + + if (!uc) + uc = &ucall; + + addr = ucall_arch_get_ucall(vcpu); + if (addr) { + memcpy(uc, addr, sizeof(*uc)); + vcpu_run_complete_io(vcpu); + } else { + memset(uc, 0, sizeof(*uc)); + } + + return uc->cmd; +} diff --git a/tools/testing/selftests/kvm/lib/x86_64/ucall.c b/tools/testing/selftests/kvm/lib/x86_64/ucall.c index 9f532dba1003..ec53a406f689 100644 --- a/tools/testing/selftests/kvm/lib/x86_64/ucall.c +++ b/tools/testing/selftests/kvm/lib/x86_64/ucall.c @@ -22,25 +22,15 @@ void ucall_arch_do_ucall(vm_vaddr_t uc) : : [port] "d" (UCALL_PIO_PORT), "D" (uc) : "rax", "memory"); } -uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) +void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu) { struct kvm_run *run = vcpu->run; - struct ucall ucall = {}; - - if (uc) - memset(uc, 0, sizeof(*uc)); if (run->exit_reason == KVM_EXIT_IO && run->io.port == UCALL_PIO_PORT) { struct kvm_regs regs; vcpu_regs_get(vcpu, ®s); - memcpy(&ucall, addr_gva2hva(vcpu->vm, (vm_vaddr_t)regs.rdi), - sizeof(ucall)); - - vcpu_run_complete_io(vcpu); - if (uc) - memcpy(uc, &ucall, sizeof(ucall)); + return addr_gva2hva(vcpu->vm, (vm_vaddr_t)regs.rdi); } - - return ucall.cmd; + return NULL; } -- 2.37.0.rc0.104.g0611611a94-goog _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 2/3] KVM: selftests: Consolidate boilerplate code in get_ucall() @ 2022-06-18 0:16 ` Sean Christopherson 0 siblings, 0 replies; 44+ messages in thread From: Sean Christopherson @ 2022-06-18 0:16 UTC (permalink / raw) To: Paolo Bonzini, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda Cc: kvm, David Hildenbrand, linux-kernel, Colton Lewis, kvm-riscv, Atish Patra, linux-riscv, kvmarm, linux-arm-kernel Consolidate the actual copying of a ucall struct from guest=>host into the common get_ucall(). Return a host virtual address instead of a guest virtual address even though the addr_gva2hva() part could be moved to get_ucall() too. Conceptually, get_ucall() is invoked from the host and should return a host virtual address (and returning NULL for "nothing to see here" is far superior to returning 0). Use pointer shenanigans instead of an unnecessary bounce buffer when the caller of get_ucall() provides a valid pointer. Signed-off-by: Sean Christopherson <seanjc@google.com> --- .../selftests/kvm/include/ucall_common.h | 8 ++------ .../testing/selftests/kvm/lib/aarch64/ucall.c | 15 +++------------ tools/testing/selftests/kvm/lib/riscv/ucall.c | 19 +++---------------- tools/testing/selftests/kvm/lib/s390x/ucall.c | 16 +++------------- .../testing/selftests/kvm/lib/ucall_common.c | 19 +++++++++++++++++++ .../testing/selftests/kvm/lib/x86_64/ucall.c | 16 +++------------- 6 files changed, 33 insertions(+), 60 deletions(-) diff --git a/tools/testing/selftests/kvm/include/ucall_common.h b/tools/testing/selftests/kvm/include/ucall_common.h index c6a4fd7fe443..cb9b37282701 100644 --- a/tools/testing/selftests/kvm/include/ucall_common.h +++ b/tools/testing/selftests/kvm/include/ucall_common.h @@ -26,9 +26,10 @@ struct ucall { 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_arch_get_ucall(struct kvm_vcpu *vcpu); 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) { @@ -40,11 +41,6 @@ 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) #define GUEST_SYNC(stage) ucall(UCALL_SYNC, 2, "hello", stage) diff --git a/tools/testing/selftests/kvm/lib/aarch64/ucall.c b/tools/testing/selftests/kvm/lib/aarch64/ucall.c index 2de9fdd34159..9c124adbb560 100644 --- a/tools/testing/selftests/kvm/lib/aarch64/ucall.c +++ b/tools/testing/selftests/kvm/lib/aarch64/ucall.c @@ -75,13 +75,9 @@ void ucall_arch_do_ucall(vm_vaddr_t uc) *ucall_exit_mmio_addr = uc; } -uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) +void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu) { struct kvm_run *run = vcpu->run; - 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) { @@ -90,12 +86,7 @@ uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) TEST_ASSERT(run->mmio.is_write && run->mmio.len == 8, "Unexpected ucall exit mmio address access"); memcpy(&gva, run->mmio.data, sizeof(gva)); - memcpy(&ucall, addr_gva2hva(vcpu->vm, gva), sizeof(ucall)); - - vcpu_run_complete_io(vcpu); - if (uc) - memcpy(uc, &ucall, sizeof(ucall)); + return addr_gva2hva(vcpu->vm, gva); } - - return ucall.cmd; + return NULL; } diff --git a/tools/testing/selftests/kvm/lib/riscv/ucall.c b/tools/testing/selftests/kvm/lib/riscv/ucall.c index b1598f418c1f..37e091d4366e 100644 --- a/tools/testing/selftests/kvm/lib/riscv/ucall.c +++ b/tools/testing/selftests/kvm/lib/riscv/ucall.c @@ -51,27 +51,15 @@ void ucall_arch_do_ucall(vm_vaddr_t uc) uc, 0, 0, 0, 0, 0); } -uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) +void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu) { struct kvm_run *run = vcpu->run; - struct ucall ucall = {}; - - if (uc) - memset(uc, 0, sizeof(*uc)); if (run->exit_reason == KVM_EXIT_RISCV_SBI && run->riscv_sbi.extension_id == KVM_RISCV_SELFTESTS_SBI_EXT) { switch (run->riscv_sbi.function_id) { case KVM_RISCV_SELFTESTS_SBI_UCALL: - memcpy(&ucall, - addr_gva2hva(vcpu->vm, run->riscv_sbi.args[0]), - sizeof(ucall)); - - vcpu_run_complete_io(vcpu); - if (uc) - memcpy(uc, &ucall, sizeof(ucall)); - - break; + return addr_gva2hva(vcpu->vm, run->riscv_sbi.args[0]); case KVM_RISCV_SELFTESTS_SBI_UNEXP: vcpu_dump(stderr, vcpu, 2); TEST_ASSERT(0, "Unexpected trap taken by guest"); @@ -80,6 +68,5 @@ uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) break; } } - - return ucall.cmd; + return NULL; } diff --git a/tools/testing/selftests/kvm/lib/s390x/ucall.c b/tools/testing/selftests/kvm/lib/s390x/ucall.c index 114cb4af295f..0f695a031d35 100644 --- a/tools/testing/selftests/kvm/lib/s390x/ucall.c +++ b/tools/testing/selftests/kvm/lib/s390x/ucall.c @@ -20,13 +20,9 @@ void ucall_arch_do_ucall(vm_vaddr_t uc) asm volatile ("diag 0,%0,0x501" : : "a"(uc) : "memory"); } -uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) +void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu) { struct kvm_run *run = vcpu->run; - struct ucall ucall = {}; - - if (uc) - memset(uc, 0, sizeof(*uc)); if (run->exit_reason == KVM_EXIT_S390_SIEIC && run->s390_sieic.icptcode == 4 && @@ -34,13 +30,7 @@ uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) (run->s390_sieic.ipb >> 16) == 0x501) { int reg = run->s390_sieic.ipa & 0xf; - memcpy(&ucall, addr_gva2hva(vcpu->vm, run->s.regs.gprs[reg]), - sizeof(ucall)); - - vcpu_run_complete_io(vcpu); - if (uc) - memcpy(uc, &ucall, sizeof(ucall)); + return addr_gva2hva(vcpu->vm, run->s.regs.gprs[reg]); } - - return ucall.cmd; + return NULL; } diff --git a/tools/testing/selftests/kvm/lib/ucall_common.c b/tools/testing/selftests/kvm/lib/ucall_common.c index 749ffdf23855..c488ed23d0dd 100644 --- a/tools/testing/selftests/kvm/lib/ucall_common.c +++ b/tools/testing/selftests/kvm/lib/ucall_common.c @@ -18,3 +18,22 @@ void ucall(uint64_t cmd, int nargs, ...) ucall_arch_do_ucall((vm_vaddr_t)&uc); } + +uint64_t get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) +{ + struct ucall ucall; + void *addr; + + if (!uc) + uc = &ucall; + + addr = ucall_arch_get_ucall(vcpu); + if (addr) { + memcpy(uc, addr, sizeof(*uc)); + vcpu_run_complete_io(vcpu); + } else { + memset(uc, 0, sizeof(*uc)); + } + + return uc->cmd; +} diff --git a/tools/testing/selftests/kvm/lib/x86_64/ucall.c b/tools/testing/selftests/kvm/lib/x86_64/ucall.c index 9f532dba1003..ec53a406f689 100644 --- a/tools/testing/selftests/kvm/lib/x86_64/ucall.c +++ b/tools/testing/selftests/kvm/lib/x86_64/ucall.c @@ -22,25 +22,15 @@ void ucall_arch_do_ucall(vm_vaddr_t uc) : : [port] "d" (UCALL_PIO_PORT), "D" (uc) : "rax", "memory"); } -uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) +void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu) { struct kvm_run *run = vcpu->run; - struct ucall ucall = {}; - - if (uc) - memset(uc, 0, sizeof(*uc)); if (run->exit_reason == KVM_EXIT_IO && run->io.port == UCALL_PIO_PORT) { struct kvm_regs regs; vcpu_regs_get(vcpu, ®s); - memcpy(&ucall, addr_gva2hva(vcpu->vm, (vm_vaddr_t)regs.rdi), - sizeof(ucall)); - - vcpu_run_complete_io(vcpu); - if (uc) - memcpy(uc, &ucall, sizeof(ucall)); + return addr_gva2hva(vcpu->vm, (vm_vaddr_t)regs.rdi); } - - return ucall.cmd; + return NULL; } -- 2.37.0.rc0.104.g0611611a94-goog _______________________________________________ kvmarm mailing list kvmarm@lists.cs.columbia.edu https://lists.cs.columbia.edu/mailman/listinfo/kvmarm ^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 2/3] KVM: selftests: Consolidate boilerplate code in get_ucall() @ 2022-06-18 0:16 ` Sean Christopherson 0 siblings, 0 replies; 44+ messages in thread From: Sean Christopherson @ 2022-06-18 0:16 UTC (permalink / raw) To: Paolo Bonzini, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda Cc: James Morse, Alexandru Elisei, Suzuki K Poulose, Atish Patra, David Hildenbrand, kvm, linux-arm-kernel, kvmarm, kvm-riscv, linux-riscv, linux-kernel, Colton Lewis, Andrew Jones, Sean Christopherson Consolidate the actual copying of a ucall struct from guest=>host into the common get_ucall(). Return a host virtual address instead of a guest virtual address even though the addr_gva2hva() part could be moved to get_ucall() too. Conceptually, get_ucall() is invoked from the host and should return a host virtual address (and returning NULL for "nothing to see here" is far superior to returning 0). Use pointer shenanigans instead of an unnecessary bounce buffer when the caller of get_ucall() provides a valid pointer. Signed-off-by: Sean Christopherson <seanjc@google.com> --- .../selftests/kvm/include/ucall_common.h | 8 ++------ .../testing/selftests/kvm/lib/aarch64/ucall.c | 15 +++------------ tools/testing/selftests/kvm/lib/riscv/ucall.c | 19 +++---------------- tools/testing/selftests/kvm/lib/s390x/ucall.c | 16 +++------------- .../testing/selftests/kvm/lib/ucall_common.c | 19 +++++++++++++++++++ .../testing/selftests/kvm/lib/x86_64/ucall.c | 16 +++------------- 6 files changed, 33 insertions(+), 60 deletions(-) diff --git a/tools/testing/selftests/kvm/include/ucall_common.h b/tools/testing/selftests/kvm/include/ucall_common.h index c6a4fd7fe443..cb9b37282701 100644 --- a/tools/testing/selftests/kvm/include/ucall_common.h +++ b/tools/testing/selftests/kvm/include/ucall_common.h @@ -26,9 +26,10 @@ struct ucall { 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_arch_get_ucall(struct kvm_vcpu *vcpu); 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) { @@ -40,11 +41,6 @@ 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) #define GUEST_SYNC(stage) ucall(UCALL_SYNC, 2, "hello", stage) diff --git a/tools/testing/selftests/kvm/lib/aarch64/ucall.c b/tools/testing/selftests/kvm/lib/aarch64/ucall.c index 2de9fdd34159..9c124adbb560 100644 --- a/tools/testing/selftests/kvm/lib/aarch64/ucall.c +++ b/tools/testing/selftests/kvm/lib/aarch64/ucall.c @@ -75,13 +75,9 @@ void ucall_arch_do_ucall(vm_vaddr_t uc) *ucall_exit_mmio_addr = uc; } -uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) +void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu) { struct kvm_run *run = vcpu->run; - 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) { @@ -90,12 +86,7 @@ uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) TEST_ASSERT(run->mmio.is_write && run->mmio.len == 8, "Unexpected ucall exit mmio address access"); memcpy(&gva, run->mmio.data, sizeof(gva)); - memcpy(&ucall, addr_gva2hva(vcpu->vm, gva), sizeof(ucall)); - - vcpu_run_complete_io(vcpu); - if (uc) - memcpy(uc, &ucall, sizeof(ucall)); + return addr_gva2hva(vcpu->vm, gva); } - - return ucall.cmd; + return NULL; } diff --git a/tools/testing/selftests/kvm/lib/riscv/ucall.c b/tools/testing/selftests/kvm/lib/riscv/ucall.c index b1598f418c1f..37e091d4366e 100644 --- a/tools/testing/selftests/kvm/lib/riscv/ucall.c +++ b/tools/testing/selftests/kvm/lib/riscv/ucall.c @@ -51,27 +51,15 @@ void ucall_arch_do_ucall(vm_vaddr_t uc) uc, 0, 0, 0, 0, 0); } -uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) +void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu) { struct kvm_run *run = vcpu->run; - struct ucall ucall = {}; - - if (uc) - memset(uc, 0, sizeof(*uc)); if (run->exit_reason == KVM_EXIT_RISCV_SBI && run->riscv_sbi.extension_id == KVM_RISCV_SELFTESTS_SBI_EXT) { switch (run->riscv_sbi.function_id) { case KVM_RISCV_SELFTESTS_SBI_UCALL: - memcpy(&ucall, - addr_gva2hva(vcpu->vm, run->riscv_sbi.args[0]), - sizeof(ucall)); - - vcpu_run_complete_io(vcpu); - if (uc) - memcpy(uc, &ucall, sizeof(ucall)); - - break; + return addr_gva2hva(vcpu->vm, run->riscv_sbi.args[0]); case KVM_RISCV_SELFTESTS_SBI_UNEXP: vcpu_dump(stderr, vcpu, 2); TEST_ASSERT(0, "Unexpected trap taken by guest"); @@ -80,6 +68,5 @@ uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) break; } } - - return ucall.cmd; + return NULL; } diff --git a/tools/testing/selftests/kvm/lib/s390x/ucall.c b/tools/testing/selftests/kvm/lib/s390x/ucall.c index 114cb4af295f..0f695a031d35 100644 --- a/tools/testing/selftests/kvm/lib/s390x/ucall.c +++ b/tools/testing/selftests/kvm/lib/s390x/ucall.c @@ -20,13 +20,9 @@ void ucall_arch_do_ucall(vm_vaddr_t uc) asm volatile ("diag 0,%0,0x501" : : "a"(uc) : "memory"); } -uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) +void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu) { struct kvm_run *run = vcpu->run; - struct ucall ucall = {}; - - if (uc) - memset(uc, 0, sizeof(*uc)); if (run->exit_reason == KVM_EXIT_S390_SIEIC && run->s390_sieic.icptcode == 4 && @@ -34,13 +30,7 @@ uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) (run->s390_sieic.ipb >> 16) == 0x501) { int reg = run->s390_sieic.ipa & 0xf; - memcpy(&ucall, addr_gva2hva(vcpu->vm, run->s.regs.gprs[reg]), - sizeof(ucall)); - - vcpu_run_complete_io(vcpu); - if (uc) - memcpy(uc, &ucall, sizeof(ucall)); + return addr_gva2hva(vcpu->vm, run->s.regs.gprs[reg]); } - - return ucall.cmd; + return NULL; } diff --git a/tools/testing/selftests/kvm/lib/ucall_common.c b/tools/testing/selftests/kvm/lib/ucall_common.c index 749ffdf23855..c488ed23d0dd 100644 --- a/tools/testing/selftests/kvm/lib/ucall_common.c +++ b/tools/testing/selftests/kvm/lib/ucall_common.c @@ -18,3 +18,22 @@ void ucall(uint64_t cmd, int nargs, ...) ucall_arch_do_ucall((vm_vaddr_t)&uc); } + +uint64_t get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) +{ + struct ucall ucall; + void *addr; + + if (!uc) + uc = &ucall; + + addr = ucall_arch_get_ucall(vcpu); + if (addr) { + memcpy(uc, addr, sizeof(*uc)); + vcpu_run_complete_io(vcpu); + } else { + memset(uc, 0, sizeof(*uc)); + } + + return uc->cmd; +} diff --git a/tools/testing/selftests/kvm/lib/x86_64/ucall.c b/tools/testing/selftests/kvm/lib/x86_64/ucall.c index 9f532dba1003..ec53a406f689 100644 --- a/tools/testing/selftests/kvm/lib/x86_64/ucall.c +++ b/tools/testing/selftests/kvm/lib/x86_64/ucall.c @@ -22,25 +22,15 @@ void ucall_arch_do_ucall(vm_vaddr_t uc) : : [port] "d" (UCALL_PIO_PORT), "D" (uc) : "rax", "memory"); } -uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) +void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu) { struct kvm_run *run = vcpu->run; - struct ucall ucall = {}; - - if (uc) - memset(uc, 0, sizeof(*uc)); if (run->exit_reason == KVM_EXIT_IO && run->io.port == UCALL_PIO_PORT) { struct kvm_regs regs; vcpu_regs_get(vcpu, ®s); - memcpy(&ucall, addr_gva2hva(vcpu->vm, (vm_vaddr_t)regs.rdi), - sizeof(ucall)); - - vcpu_run_complete_io(vcpu); - if (uc) - memcpy(uc, &ucall, sizeof(ucall)); + return addr_gva2hva(vcpu->vm, (vm_vaddr_t)regs.rdi); } - - return ucall.cmd; + return NULL; } -- 2.37.0.rc0.104.g0611611a94-goog _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply related [flat|nested] 44+ messages in thread
* Re: [PATCH 2/3] KVM: selftests: Consolidate boilerplate code in get_ucall() 2022-06-18 0:16 ` Sean Christopherson (?) (?) @ 2022-06-19 10:36 ` Huang, Shaoqin -1 siblings, 0 replies; 44+ messages in thread From: Huang, Shaoqin @ 2022-06-19 10:36 UTC (permalink / raw) To: Sean Christopherson, Paolo Bonzini, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda Cc: James Morse, Alexandru Elisei, Suzuki K Poulose, Atish Patra, David Hildenbrand, kvm, linux-arm-kernel, kvmarm, kvm-riscv, linux-riscv, linux-kernel, Colton Lewis, Andrew Jones On 6/18/2022 8:16 AM, Sean Christopherson wrote: > Consolidate the actual copying of a ucall struct from guest=>host into > the common get_ucall(). Return a host virtual address instead of a guest > virtual address even though the addr_gva2hva() part could be moved to > get_ucall() too. Conceptually, get_ucall() is invoked from the host and > should return a host virtual address (and returning NULL for "nothing to > see here" is far superior to returning 0). It seems the get_ucall() returns the uc->cmd, the ucall_arch_get_ucall() returns a host virtual address. > > Use pointer shenanigans instead of an unnecessary bounce buffer when the > caller of get_ucall() provides a valid pointer. > > Signed-off-by: Sean Christopherson <seanjc@google.com> > --- > .../selftests/kvm/include/ucall_common.h | 8 ++------ > .../testing/selftests/kvm/lib/aarch64/ucall.c | 15 +++------------ > tools/testing/selftests/kvm/lib/riscv/ucall.c | 19 +++---------------- > tools/testing/selftests/kvm/lib/s390x/ucall.c | 16 +++------------- > .../testing/selftests/kvm/lib/ucall_common.c | 19 +++++++++++++++++++ > .../testing/selftests/kvm/lib/x86_64/ucall.c | 16 +++------------- > 6 files changed, 33 insertions(+), 60 deletions(-) > > diff --git a/tools/testing/selftests/kvm/include/ucall_common.h b/tools/testing/selftests/kvm/include/ucall_common.h > index c6a4fd7fe443..cb9b37282701 100644 > --- a/tools/testing/selftests/kvm/include/ucall_common.h > +++ b/tools/testing/selftests/kvm/include/ucall_common.h > @@ -26,9 +26,10 @@ struct ucall { > 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_arch_get_ucall(struct kvm_vcpu *vcpu); > > 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) > { > @@ -40,11 +41,6 @@ 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) > #define GUEST_SYNC(stage) ucall(UCALL_SYNC, 2, "hello", stage) > diff --git a/tools/testing/selftests/kvm/lib/aarch64/ucall.c b/tools/testing/selftests/kvm/lib/aarch64/ucall.c > index 2de9fdd34159..9c124adbb560 100644 > --- a/tools/testing/selftests/kvm/lib/aarch64/ucall.c > +++ b/tools/testing/selftests/kvm/lib/aarch64/ucall.c > @@ -75,13 +75,9 @@ void ucall_arch_do_ucall(vm_vaddr_t uc) > *ucall_exit_mmio_addr = uc; > } > > -uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) > +void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu) > { > struct kvm_run *run = vcpu->run; > - 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) { > @@ -90,12 +86,7 @@ uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) > TEST_ASSERT(run->mmio.is_write && run->mmio.len == 8, > "Unexpected ucall exit mmio address access"); > memcpy(&gva, run->mmio.data, sizeof(gva)); > - memcpy(&ucall, addr_gva2hva(vcpu->vm, gva), sizeof(ucall)); > - > - vcpu_run_complete_io(vcpu); > - if (uc) > - memcpy(uc, &ucall, sizeof(ucall)); > + return addr_gva2hva(vcpu->vm, gva); > } > - > - return ucall.cmd; > + return NULL; > } > diff --git a/tools/testing/selftests/kvm/lib/riscv/ucall.c b/tools/testing/selftests/kvm/lib/riscv/ucall.c > index b1598f418c1f..37e091d4366e 100644 > --- a/tools/testing/selftests/kvm/lib/riscv/ucall.c > +++ b/tools/testing/selftests/kvm/lib/riscv/ucall.c > @@ -51,27 +51,15 @@ void ucall_arch_do_ucall(vm_vaddr_t uc) > uc, 0, 0, 0, 0, 0); > } > > -uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) > +void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu) > { > struct kvm_run *run = vcpu->run; > - struct ucall ucall = {}; > - > - if (uc) > - memset(uc, 0, sizeof(*uc)); > > if (run->exit_reason == KVM_EXIT_RISCV_SBI && > run->riscv_sbi.extension_id == KVM_RISCV_SELFTESTS_SBI_EXT) { > switch (run->riscv_sbi.function_id) { > case KVM_RISCV_SELFTESTS_SBI_UCALL: > - memcpy(&ucall, > - addr_gva2hva(vcpu->vm, run->riscv_sbi.args[0]), > - sizeof(ucall)); > - > - vcpu_run_complete_io(vcpu); > - if (uc) > - memcpy(uc, &ucall, sizeof(ucall)); > - > - break; > + return addr_gva2hva(vcpu->vm, run->riscv_sbi.args[0]); > case KVM_RISCV_SELFTESTS_SBI_UNEXP: > vcpu_dump(stderr, vcpu, 2); > TEST_ASSERT(0, "Unexpected trap taken by guest"); > @@ -80,6 +68,5 @@ uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) > break; > } > } > - > - return ucall.cmd; > + return NULL; > } > diff --git a/tools/testing/selftests/kvm/lib/s390x/ucall.c b/tools/testing/selftests/kvm/lib/s390x/ucall.c > index 114cb4af295f..0f695a031d35 100644 > --- a/tools/testing/selftests/kvm/lib/s390x/ucall.c > +++ b/tools/testing/selftests/kvm/lib/s390x/ucall.c > @@ -20,13 +20,9 @@ void ucall_arch_do_ucall(vm_vaddr_t uc) > asm volatile ("diag 0,%0,0x501" : : "a"(uc) : "memory"); > } > > -uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) > +void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu) > { > struct kvm_run *run = vcpu->run; > - struct ucall ucall = {}; > - > - if (uc) > - memset(uc, 0, sizeof(*uc)); > > if (run->exit_reason == KVM_EXIT_S390_SIEIC && > run->s390_sieic.icptcode == 4 && > @@ -34,13 +30,7 @@ uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) > (run->s390_sieic.ipb >> 16) == 0x501) { > int reg = run->s390_sieic.ipa & 0xf; > > - memcpy(&ucall, addr_gva2hva(vcpu->vm, run->s.regs.gprs[reg]), > - sizeof(ucall)); > - > - vcpu_run_complete_io(vcpu); > - if (uc) > - memcpy(uc, &ucall, sizeof(ucall)); > + return addr_gva2hva(vcpu->vm, run->s.regs.gprs[reg]); > } > - > - return ucall.cmd; > + return NULL; > } > diff --git a/tools/testing/selftests/kvm/lib/ucall_common.c b/tools/testing/selftests/kvm/lib/ucall_common.c > index 749ffdf23855..c488ed23d0dd 100644 > --- a/tools/testing/selftests/kvm/lib/ucall_common.c > +++ b/tools/testing/selftests/kvm/lib/ucall_common.c > @@ -18,3 +18,22 @@ void ucall(uint64_t cmd, int nargs, ...) > > ucall_arch_do_ucall((vm_vaddr_t)&uc); > } > + > +uint64_t get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) > +{ > + struct ucall ucall; > + void *addr; > + > + if (!uc) > + uc = &ucall; > + > + addr = ucall_arch_get_ucall(vcpu); > + if (addr) { > + memcpy(uc, addr, sizeof(*uc)); > + vcpu_run_complete_io(vcpu); > + } else { > + memset(uc, 0, sizeof(*uc)); > + } > + > + return uc->cmd; > +} > diff --git a/tools/testing/selftests/kvm/lib/x86_64/ucall.c b/tools/testing/selftests/kvm/lib/x86_64/ucall.c > index 9f532dba1003..ec53a406f689 100644 > --- a/tools/testing/selftests/kvm/lib/x86_64/ucall.c > +++ b/tools/testing/selftests/kvm/lib/x86_64/ucall.c > @@ -22,25 +22,15 @@ void ucall_arch_do_ucall(vm_vaddr_t uc) > : : [port] "d" (UCALL_PIO_PORT), "D" (uc) : "rax", "memory"); > } > > -uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) > +void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu) > { > struct kvm_run *run = vcpu->run; > - struct ucall ucall = {}; > - > - if (uc) > - memset(uc, 0, sizeof(*uc)); > > if (run->exit_reason == KVM_EXIT_IO && run->io.port == UCALL_PIO_PORT) { > struct kvm_regs regs; > > vcpu_regs_get(vcpu, ®s); > - memcpy(&ucall, addr_gva2hva(vcpu->vm, (vm_vaddr_t)regs.rdi), > - sizeof(ucall)); > - > - vcpu_run_complete_io(vcpu); > - if (uc) > - memcpy(uc, &ucall, sizeof(ucall)); > + return addr_gva2hva(vcpu->vm, (vm_vaddr_t)regs.rdi); > } > - > - return ucall.cmd; > + return NULL; > } ^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 2/3] KVM: selftests: Consolidate boilerplate code in get_ucall() @ 2022-06-19 10:36 ` Huang, Shaoqin 0 siblings, 0 replies; 44+ messages in thread From: Huang, Shaoqin @ 2022-06-19 10:36 UTC (permalink / raw) To: Sean Christopherson, Paolo Bonzini, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda Cc: kvm, David Hildenbrand, linux-kernel, Colton Lewis, kvm-riscv, Atish Patra, linux-riscv, kvmarm, linux-arm-kernel On 6/18/2022 8:16 AM, Sean Christopherson wrote: > Consolidate the actual copying of a ucall struct from guest=>host into > the common get_ucall(). Return a host virtual address instead of a guest > virtual address even though the addr_gva2hva() part could be moved to > get_ucall() too. Conceptually, get_ucall() is invoked from the host and > should return a host virtual address (and returning NULL for "nothing to > see here" is far superior to returning 0). It seems the get_ucall() returns the uc->cmd, the ucall_arch_get_ucall() returns a host virtual address. > > Use pointer shenanigans instead of an unnecessary bounce buffer when the > caller of get_ucall() provides a valid pointer. > > Signed-off-by: Sean Christopherson <seanjc@google.com> > --- > .../selftests/kvm/include/ucall_common.h | 8 ++------ > .../testing/selftests/kvm/lib/aarch64/ucall.c | 15 +++------------ > tools/testing/selftests/kvm/lib/riscv/ucall.c | 19 +++---------------- > tools/testing/selftests/kvm/lib/s390x/ucall.c | 16 +++------------- > .../testing/selftests/kvm/lib/ucall_common.c | 19 +++++++++++++++++++ > .../testing/selftests/kvm/lib/x86_64/ucall.c | 16 +++------------- > 6 files changed, 33 insertions(+), 60 deletions(-) > > diff --git a/tools/testing/selftests/kvm/include/ucall_common.h b/tools/testing/selftests/kvm/include/ucall_common.h > index c6a4fd7fe443..cb9b37282701 100644 > --- a/tools/testing/selftests/kvm/include/ucall_common.h > +++ b/tools/testing/selftests/kvm/include/ucall_common.h > @@ -26,9 +26,10 @@ struct ucall { > 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_arch_get_ucall(struct kvm_vcpu *vcpu); > > 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) > { > @@ -40,11 +41,6 @@ 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) > #define GUEST_SYNC(stage) ucall(UCALL_SYNC, 2, "hello", stage) > diff --git a/tools/testing/selftests/kvm/lib/aarch64/ucall.c b/tools/testing/selftests/kvm/lib/aarch64/ucall.c > index 2de9fdd34159..9c124adbb560 100644 > --- a/tools/testing/selftests/kvm/lib/aarch64/ucall.c > +++ b/tools/testing/selftests/kvm/lib/aarch64/ucall.c > @@ -75,13 +75,9 @@ void ucall_arch_do_ucall(vm_vaddr_t uc) > *ucall_exit_mmio_addr = uc; > } > > -uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) > +void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu) > { > struct kvm_run *run = vcpu->run; > - 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) { > @@ -90,12 +86,7 @@ uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) > TEST_ASSERT(run->mmio.is_write && run->mmio.len == 8, > "Unexpected ucall exit mmio address access"); > memcpy(&gva, run->mmio.data, sizeof(gva)); > - memcpy(&ucall, addr_gva2hva(vcpu->vm, gva), sizeof(ucall)); > - > - vcpu_run_complete_io(vcpu); > - if (uc) > - memcpy(uc, &ucall, sizeof(ucall)); > + return addr_gva2hva(vcpu->vm, gva); > } > - > - return ucall.cmd; > + return NULL; > } > diff --git a/tools/testing/selftests/kvm/lib/riscv/ucall.c b/tools/testing/selftests/kvm/lib/riscv/ucall.c > index b1598f418c1f..37e091d4366e 100644 > --- a/tools/testing/selftests/kvm/lib/riscv/ucall.c > +++ b/tools/testing/selftests/kvm/lib/riscv/ucall.c > @@ -51,27 +51,15 @@ void ucall_arch_do_ucall(vm_vaddr_t uc) > uc, 0, 0, 0, 0, 0); > } > > -uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) > +void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu) > { > struct kvm_run *run = vcpu->run; > - struct ucall ucall = {}; > - > - if (uc) > - memset(uc, 0, sizeof(*uc)); > > if (run->exit_reason == KVM_EXIT_RISCV_SBI && > run->riscv_sbi.extension_id == KVM_RISCV_SELFTESTS_SBI_EXT) { > switch (run->riscv_sbi.function_id) { > case KVM_RISCV_SELFTESTS_SBI_UCALL: > - memcpy(&ucall, > - addr_gva2hva(vcpu->vm, run->riscv_sbi.args[0]), > - sizeof(ucall)); > - > - vcpu_run_complete_io(vcpu); > - if (uc) > - memcpy(uc, &ucall, sizeof(ucall)); > - > - break; > + return addr_gva2hva(vcpu->vm, run->riscv_sbi.args[0]); > case KVM_RISCV_SELFTESTS_SBI_UNEXP: > vcpu_dump(stderr, vcpu, 2); > TEST_ASSERT(0, "Unexpected trap taken by guest"); > @@ -80,6 +68,5 @@ uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) > break; > } > } > - > - return ucall.cmd; > + return NULL; > } > diff --git a/tools/testing/selftests/kvm/lib/s390x/ucall.c b/tools/testing/selftests/kvm/lib/s390x/ucall.c > index 114cb4af295f..0f695a031d35 100644 > --- a/tools/testing/selftests/kvm/lib/s390x/ucall.c > +++ b/tools/testing/selftests/kvm/lib/s390x/ucall.c > @@ -20,13 +20,9 @@ void ucall_arch_do_ucall(vm_vaddr_t uc) > asm volatile ("diag 0,%0,0x501" : : "a"(uc) : "memory"); > } > > -uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) > +void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu) > { > struct kvm_run *run = vcpu->run; > - struct ucall ucall = {}; > - > - if (uc) > - memset(uc, 0, sizeof(*uc)); > > if (run->exit_reason == KVM_EXIT_S390_SIEIC && > run->s390_sieic.icptcode == 4 && > @@ -34,13 +30,7 @@ uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) > (run->s390_sieic.ipb >> 16) == 0x501) { > int reg = run->s390_sieic.ipa & 0xf; > > - memcpy(&ucall, addr_gva2hva(vcpu->vm, run->s.regs.gprs[reg]), > - sizeof(ucall)); > - > - vcpu_run_complete_io(vcpu); > - if (uc) > - memcpy(uc, &ucall, sizeof(ucall)); > + return addr_gva2hva(vcpu->vm, run->s.regs.gprs[reg]); > } > - > - return ucall.cmd; > + return NULL; > } > diff --git a/tools/testing/selftests/kvm/lib/ucall_common.c b/tools/testing/selftests/kvm/lib/ucall_common.c > index 749ffdf23855..c488ed23d0dd 100644 > --- a/tools/testing/selftests/kvm/lib/ucall_common.c > +++ b/tools/testing/selftests/kvm/lib/ucall_common.c > @@ -18,3 +18,22 @@ void ucall(uint64_t cmd, int nargs, ...) > > ucall_arch_do_ucall((vm_vaddr_t)&uc); > } > + > +uint64_t get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) > +{ > + struct ucall ucall; > + void *addr; > + > + if (!uc) > + uc = &ucall; > + > + addr = ucall_arch_get_ucall(vcpu); > + if (addr) { > + memcpy(uc, addr, sizeof(*uc)); > + vcpu_run_complete_io(vcpu); > + } else { > + memset(uc, 0, sizeof(*uc)); > + } > + > + return uc->cmd; > +} > diff --git a/tools/testing/selftests/kvm/lib/x86_64/ucall.c b/tools/testing/selftests/kvm/lib/x86_64/ucall.c > index 9f532dba1003..ec53a406f689 100644 > --- a/tools/testing/selftests/kvm/lib/x86_64/ucall.c > +++ b/tools/testing/selftests/kvm/lib/x86_64/ucall.c > @@ -22,25 +22,15 @@ void ucall_arch_do_ucall(vm_vaddr_t uc) > : : [port] "d" (UCALL_PIO_PORT), "D" (uc) : "rax", "memory"); > } > > -uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) > +void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu) > { > struct kvm_run *run = vcpu->run; > - struct ucall ucall = {}; > - > - if (uc) > - memset(uc, 0, sizeof(*uc)); > > if (run->exit_reason == KVM_EXIT_IO && run->io.port == UCALL_PIO_PORT) { > struct kvm_regs regs; > > vcpu_regs_get(vcpu, ®s); > - memcpy(&ucall, addr_gva2hva(vcpu->vm, (vm_vaddr_t)regs.rdi), > - sizeof(ucall)); > - > - vcpu_run_complete_io(vcpu); > - if (uc) > - memcpy(uc, &ucall, sizeof(ucall)); > + return addr_gva2hva(vcpu->vm, (vm_vaddr_t)regs.rdi); > } > - > - return ucall.cmd; > + return NULL; > } _______________________________________________ kvmarm mailing list kvmarm@lists.cs.columbia.edu https://lists.cs.columbia.edu/mailman/listinfo/kvmarm ^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 2/3] KVM: selftests: Consolidate boilerplate code in get_ucall() @ 2022-06-19 10:36 ` Huang, Shaoqin 0 siblings, 0 replies; 44+ messages in thread From: Huang, Shaoqin @ 2022-06-19 10:36 UTC (permalink / raw) To: Sean Christopherson, Paolo Bonzini, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda Cc: James Morse, Alexandru Elisei, Suzuki K Poulose, Atish Patra, David Hildenbrand, kvm, linux-arm-kernel, kvmarm, kvm-riscv, linux-riscv, linux-kernel, Colton Lewis, Andrew Jones On 6/18/2022 8:16 AM, Sean Christopherson wrote: > Consolidate the actual copying of a ucall struct from guest=>host into > the common get_ucall(). Return a host virtual address instead of a guest > virtual address even though the addr_gva2hva() part could be moved to > get_ucall() too. Conceptually, get_ucall() is invoked from the host and > should return a host virtual address (and returning NULL for "nothing to > see here" is far superior to returning 0). It seems the get_ucall() returns the uc->cmd, the ucall_arch_get_ucall() returns a host virtual address. > > Use pointer shenanigans instead of an unnecessary bounce buffer when the > caller of get_ucall() provides a valid pointer. > > Signed-off-by: Sean Christopherson <seanjc@google.com> > --- > .../selftests/kvm/include/ucall_common.h | 8 ++------ > .../testing/selftests/kvm/lib/aarch64/ucall.c | 15 +++------------ > tools/testing/selftests/kvm/lib/riscv/ucall.c | 19 +++---------------- > tools/testing/selftests/kvm/lib/s390x/ucall.c | 16 +++------------- > .../testing/selftests/kvm/lib/ucall_common.c | 19 +++++++++++++++++++ > .../testing/selftests/kvm/lib/x86_64/ucall.c | 16 +++------------- > 6 files changed, 33 insertions(+), 60 deletions(-) > > diff --git a/tools/testing/selftests/kvm/include/ucall_common.h b/tools/testing/selftests/kvm/include/ucall_common.h > index c6a4fd7fe443..cb9b37282701 100644 > --- a/tools/testing/selftests/kvm/include/ucall_common.h > +++ b/tools/testing/selftests/kvm/include/ucall_common.h > @@ -26,9 +26,10 @@ struct ucall { > 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_arch_get_ucall(struct kvm_vcpu *vcpu); > > 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) > { > @@ -40,11 +41,6 @@ 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) > #define GUEST_SYNC(stage) ucall(UCALL_SYNC, 2, "hello", stage) > diff --git a/tools/testing/selftests/kvm/lib/aarch64/ucall.c b/tools/testing/selftests/kvm/lib/aarch64/ucall.c > index 2de9fdd34159..9c124adbb560 100644 > --- a/tools/testing/selftests/kvm/lib/aarch64/ucall.c > +++ b/tools/testing/selftests/kvm/lib/aarch64/ucall.c > @@ -75,13 +75,9 @@ void ucall_arch_do_ucall(vm_vaddr_t uc) > *ucall_exit_mmio_addr = uc; > } > > -uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) > +void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu) > { > struct kvm_run *run = vcpu->run; > - 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) { > @@ -90,12 +86,7 @@ uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) > TEST_ASSERT(run->mmio.is_write && run->mmio.len == 8, > "Unexpected ucall exit mmio address access"); > memcpy(&gva, run->mmio.data, sizeof(gva)); > - memcpy(&ucall, addr_gva2hva(vcpu->vm, gva), sizeof(ucall)); > - > - vcpu_run_complete_io(vcpu); > - if (uc) > - memcpy(uc, &ucall, sizeof(ucall)); > + return addr_gva2hva(vcpu->vm, gva); > } > - > - return ucall.cmd; > + return NULL; > } > diff --git a/tools/testing/selftests/kvm/lib/riscv/ucall.c b/tools/testing/selftests/kvm/lib/riscv/ucall.c > index b1598f418c1f..37e091d4366e 100644 > --- a/tools/testing/selftests/kvm/lib/riscv/ucall.c > +++ b/tools/testing/selftests/kvm/lib/riscv/ucall.c > @@ -51,27 +51,15 @@ void ucall_arch_do_ucall(vm_vaddr_t uc) > uc, 0, 0, 0, 0, 0); > } > > -uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) > +void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu) > { > struct kvm_run *run = vcpu->run; > - struct ucall ucall = {}; > - > - if (uc) > - memset(uc, 0, sizeof(*uc)); > > if (run->exit_reason == KVM_EXIT_RISCV_SBI && > run->riscv_sbi.extension_id == KVM_RISCV_SELFTESTS_SBI_EXT) { > switch (run->riscv_sbi.function_id) { > case KVM_RISCV_SELFTESTS_SBI_UCALL: > - memcpy(&ucall, > - addr_gva2hva(vcpu->vm, run->riscv_sbi.args[0]), > - sizeof(ucall)); > - > - vcpu_run_complete_io(vcpu); > - if (uc) > - memcpy(uc, &ucall, sizeof(ucall)); > - > - break; > + return addr_gva2hva(vcpu->vm, run->riscv_sbi.args[0]); > case KVM_RISCV_SELFTESTS_SBI_UNEXP: > vcpu_dump(stderr, vcpu, 2); > TEST_ASSERT(0, "Unexpected trap taken by guest"); > @@ -80,6 +68,5 @@ uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) > break; > } > } > - > - return ucall.cmd; > + return NULL; > } > diff --git a/tools/testing/selftests/kvm/lib/s390x/ucall.c b/tools/testing/selftests/kvm/lib/s390x/ucall.c > index 114cb4af295f..0f695a031d35 100644 > --- a/tools/testing/selftests/kvm/lib/s390x/ucall.c > +++ b/tools/testing/selftests/kvm/lib/s390x/ucall.c > @@ -20,13 +20,9 @@ void ucall_arch_do_ucall(vm_vaddr_t uc) > asm volatile ("diag 0,%0,0x501" : : "a"(uc) : "memory"); > } > > -uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) > +void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu) > { > struct kvm_run *run = vcpu->run; > - struct ucall ucall = {}; > - > - if (uc) > - memset(uc, 0, sizeof(*uc)); > > if (run->exit_reason == KVM_EXIT_S390_SIEIC && > run->s390_sieic.icptcode == 4 && > @@ -34,13 +30,7 @@ uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) > (run->s390_sieic.ipb >> 16) == 0x501) { > int reg = run->s390_sieic.ipa & 0xf; > > - memcpy(&ucall, addr_gva2hva(vcpu->vm, run->s.regs.gprs[reg]), > - sizeof(ucall)); > - > - vcpu_run_complete_io(vcpu); > - if (uc) > - memcpy(uc, &ucall, sizeof(ucall)); > + return addr_gva2hva(vcpu->vm, run->s.regs.gprs[reg]); > } > - > - return ucall.cmd; > + return NULL; > } > diff --git a/tools/testing/selftests/kvm/lib/ucall_common.c b/tools/testing/selftests/kvm/lib/ucall_common.c > index 749ffdf23855..c488ed23d0dd 100644 > --- a/tools/testing/selftests/kvm/lib/ucall_common.c > +++ b/tools/testing/selftests/kvm/lib/ucall_common.c > @@ -18,3 +18,22 @@ void ucall(uint64_t cmd, int nargs, ...) > > ucall_arch_do_ucall((vm_vaddr_t)&uc); > } > + > +uint64_t get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) > +{ > + struct ucall ucall; > + void *addr; > + > + if (!uc) > + uc = &ucall; > + > + addr = ucall_arch_get_ucall(vcpu); > + if (addr) { > + memcpy(uc, addr, sizeof(*uc)); > + vcpu_run_complete_io(vcpu); > + } else { > + memset(uc, 0, sizeof(*uc)); > + } > + > + return uc->cmd; > +} > diff --git a/tools/testing/selftests/kvm/lib/x86_64/ucall.c b/tools/testing/selftests/kvm/lib/x86_64/ucall.c > index 9f532dba1003..ec53a406f689 100644 > --- a/tools/testing/selftests/kvm/lib/x86_64/ucall.c > +++ b/tools/testing/selftests/kvm/lib/x86_64/ucall.c > @@ -22,25 +22,15 @@ void ucall_arch_do_ucall(vm_vaddr_t uc) > : : [port] "d" (UCALL_PIO_PORT), "D" (uc) : "rax", "memory"); > } > > -uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) > +void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu) > { > struct kvm_run *run = vcpu->run; > - struct ucall ucall = {}; > - > - if (uc) > - memset(uc, 0, sizeof(*uc)); > > if (run->exit_reason == KVM_EXIT_IO && run->io.port == UCALL_PIO_PORT) { > struct kvm_regs regs; > > vcpu_regs_get(vcpu, ®s); > - memcpy(&ucall, addr_gva2hva(vcpu->vm, (vm_vaddr_t)regs.rdi), > - sizeof(ucall)); > - > - vcpu_run_complete_io(vcpu); > - if (uc) > - memcpy(uc, &ucall, sizeof(ucall)); > + return addr_gva2hva(vcpu->vm, (vm_vaddr_t)regs.rdi); > } > - > - return ucall.cmd; > + return NULL; > } _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 2/3] KVM: selftests: Consolidate boilerplate code in get_ucall() @ 2022-06-19 10:36 ` Huang, Shaoqin 0 siblings, 0 replies; 44+ messages in thread From: Huang, Shaoqin @ 2022-06-19 10:36 UTC (permalink / raw) To: Sean Christopherson, Paolo Bonzini, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda Cc: James Morse, Alexandru Elisei, Suzuki K Poulose, Atish Patra, David Hildenbrand, kvm, linux-arm-kernel, kvmarm, kvm-riscv, linux-riscv, linux-kernel, Colton Lewis, Andrew Jones On 6/18/2022 8:16 AM, Sean Christopherson wrote: > Consolidate the actual copying of a ucall struct from guest=>host into > the common get_ucall(). Return a host virtual address instead of a guest > virtual address even though the addr_gva2hva() part could be moved to > get_ucall() too. Conceptually, get_ucall() is invoked from the host and > should return a host virtual address (and returning NULL for "nothing to > see here" is far superior to returning 0). It seems the get_ucall() returns the uc->cmd, the ucall_arch_get_ucall() returns a host virtual address. > > Use pointer shenanigans instead of an unnecessary bounce buffer when the > caller of get_ucall() provides a valid pointer. > > Signed-off-by: Sean Christopherson <seanjc@google.com> > --- > .../selftests/kvm/include/ucall_common.h | 8 ++------ > .../testing/selftests/kvm/lib/aarch64/ucall.c | 15 +++------------ > tools/testing/selftests/kvm/lib/riscv/ucall.c | 19 +++---------------- > tools/testing/selftests/kvm/lib/s390x/ucall.c | 16 +++------------- > .../testing/selftests/kvm/lib/ucall_common.c | 19 +++++++++++++++++++ > .../testing/selftests/kvm/lib/x86_64/ucall.c | 16 +++------------- > 6 files changed, 33 insertions(+), 60 deletions(-) > > diff --git a/tools/testing/selftests/kvm/include/ucall_common.h b/tools/testing/selftests/kvm/include/ucall_common.h > index c6a4fd7fe443..cb9b37282701 100644 > --- a/tools/testing/selftests/kvm/include/ucall_common.h > +++ b/tools/testing/selftests/kvm/include/ucall_common.h > @@ -26,9 +26,10 @@ struct ucall { > 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_arch_get_ucall(struct kvm_vcpu *vcpu); > > 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) > { > @@ -40,11 +41,6 @@ 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) > #define GUEST_SYNC(stage) ucall(UCALL_SYNC, 2, "hello", stage) > diff --git a/tools/testing/selftests/kvm/lib/aarch64/ucall.c b/tools/testing/selftests/kvm/lib/aarch64/ucall.c > index 2de9fdd34159..9c124adbb560 100644 > --- a/tools/testing/selftests/kvm/lib/aarch64/ucall.c > +++ b/tools/testing/selftests/kvm/lib/aarch64/ucall.c > @@ -75,13 +75,9 @@ void ucall_arch_do_ucall(vm_vaddr_t uc) > *ucall_exit_mmio_addr = uc; > } > > -uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) > +void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu) > { > struct kvm_run *run = vcpu->run; > - 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) { > @@ -90,12 +86,7 @@ uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) > TEST_ASSERT(run->mmio.is_write && run->mmio.len == 8, > "Unexpected ucall exit mmio address access"); > memcpy(&gva, run->mmio.data, sizeof(gva)); > - memcpy(&ucall, addr_gva2hva(vcpu->vm, gva), sizeof(ucall)); > - > - vcpu_run_complete_io(vcpu); > - if (uc) > - memcpy(uc, &ucall, sizeof(ucall)); > + return addr_gva2hva(vcpu->vm, gva); > } > - > - return ucall.cmd; > + return NULL; > } > diff --git a/tools/testing/selftests/kvm/lib/riscv/ucall.c b/tools/testing/selftests/kvm/lib/riscv/ucall.c > index b1598f418c1f..37e091d4366e 100644 > --- a/tools/testing/selftests/kvm/lib/riscv/ucall.c > +++ b/tools/testing/selftests/kvm/lib/riscv/ucall.c > @@ -51,27 +51,15 @@ void ucall_arch_do_ucall(vm_vaddr_t uc) > uc, 0, 0, 0, 0, 0); > } > > -uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) > +void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu) > { > struct kvm_run *run = vcpu->run; > - struct ucall ucall = {}; > - > - if (uc) > - memset(uc, 0, sizeof(*uc)); > > if (run->exit_reason == KVM_EXIT_RISCV_SBI && > run->riscv_sbi.extension_id == KVM_RISCV_SELFTESTS_SBI_EXT) { > switch (run->riscv_sbi.function_id) { > case KVM_RISCV_SELFTESTS_SBI_UCALL: > - memcpy(&ucall, > - addr_gva2hva(vcpu->vm, run->riscv_sbi.args[0]), > - sizeof(ucall)); > - > - vcpu_run_complete_io(vcpu); > - if (uc) > - memcpy(uc, &ucall, sizeof(ucall)); > - > - break; > + return addr_gva2hva(vcpu->vm, run->riscv_sbi.args[0]); > case KVM_RISCV_SELFTESTS_SBI_UNEXP: > vcpu_dump(stderr, vcpu, 2); > TEST_ASSERT(0, "Unexpected trap taken by guest"); > @@ -80,6 +68,5 @@ uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) > break; > } > } > - > - return ucall.cmd; > + return NULL; > } > diff --git a/tools/testing/selftests/kvm/lib/s390x/ucall.c b/tools/testing/selftests/kvm/lib/s390x/ucall.c > index 114cb4af295f..0f695a031d35 100644 > --- a/tools/testing/selftests/kvm/lib/s390x/ucall.c > +++ b/tools/testing/selftests/kvm/lib/s390x/ucall.c > @@ -20,13 +20,9 @@ void ucall_arch_do_ucall(vm_vaddr_t uc) > asm volatile ("diag 0,%0,0x501" : : "a"(uc) : "memory"); > } > > -uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) > +void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu) > { > struct kvm_run *run = vcpu->run; > - struct ucall ucall = {}; > - > - if (uc) > - memset(uc, 0, sizeof(*uc)); > > if (run->exit_reason == KVM_EXIT_S390_SIEIC && > run->s390_sieic.icptcode == 4 && > @@ -34,13 +30,7 @@ uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) > (run->s390_sieic.ipb >> 16) == 0x501) { > int reg = run->s390_sieic.ipa & 0xf; > > - memcpy(&ucall, addr_gva2hva(vcpu->vm, run->s.regs.gprs[reg]), > - sizeof(ucall)); > - > - vcpu_run_complete_io(vcpu); > - if (uc) > - memcpy(uc, &ucall, sizeof(ucall)); > + return addr_gva2hva(vcpu->vm, run->s.regs.gprs[reg]); > } > - > - return ucall.cmd; > + return NULL; > } > diff --git a/tools/testing/selftests/kvm/lib/ucall_common.c b/tools/testing/selftests/kvm/lib/ucall_common.c > index 749ffdf23855..c488ed23d0dd 100644 > --- a/tools/testing/selftests/kvm/lib/ucall_common.c > +++ b/tools/testing/selftests/kvm/lib/ucall_common.c > @@ -18,3 +18,22 @@ void ucall(uint64_t cmd, int nargs, ...) > > ucall_arch_do_ucall((vm_vaddr_t)&uc); > } > + > +uint64_t get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) > +{ > + struct ucall ucall; > + void *addr; > + > + if (!uc) > + uc = &ucall; > + > + addr = ucall_arch_get_ucall(vcpu); > + if (addr) { > + memcpy(uc, addr, sizeof(*uc)); > + vcpu_run_complete_io(vcpu); > + } else { > + memset(uc, 0, sizeof(*uc)); > + } > + > + return uc->cmd; > +} > diff --git a/tools/testing/selftests/kvm/lib/x86_64/ucall.c b/tools/testing/selftests/kvm/lib/x86_64/ucall.c > index 9f532dba1003..ec53a406f689 100644 > --- a/tools/testing/selftests/kvm/lib/x86_64/ucall.c > +++ b/tools/testing/selftests/kvm/lib/x86_64/ucall.c > @@ -22,25 +22,15 @@ void ucall_arch_do_ucall(vm_vaddr_t uc) > : : [port] "d" (UCALL_PIO_PORT), "D" (uc) : "rax", "memory"); > } > > -uint64_t ucall_arch_get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) > +void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu) > { > struct kvm_run *run = vcpu->run; > - struct ucall ucall = {}; > - > - if (uc) > - memset(uc, 0, sizeof(*uc)); > > if (run->exit_reason == KVM_EXIT_IO && run->io.port == UCALL_PIO_PORT) { > struct kvm_regs regs; > > vcpu_regs_get(vcpu, ®s); > - memcpy(&ucall, addr_gva2hva(vcpu->vm, (vm_vaddr_t)regs.rdi), > - sizeof(ucall)); > - > - vcpu_run_complete_io(vcpu); > - if (uc) > - memcpy(uc, &ucall, sizeof(ucall)); > + return addr_gva2hva(vcpu->vm, (vm_vaddr_t)regs.rdi); > } > - > - return ucall.cmd; > + return NULL; > } _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 2/3] KVM: selftests: Consolidate boilerplate code in get_ucall() 2022-06-19 10:36 ` Huang, Shaoqin (?) (?) @ 2022-06-21 14:41 ` Sean Christopherson -1 siblings, 0 replies; 44+ messages in thread From: Sean Christopherson @ 2022-06-21 14:41 UTC (permalink / raw) To: Huang, Shaoqin Cc: Paolo Bonzini, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda, James Morse, Alexandru Elisei, Suzuki K Poulose, Atish Patra, David Hildenbrand, kvm, linux-arm-kernel, kvmarm, kvm-riscv, linux-riscv, linux-kernel, Colton Lewis, Andrew Jones On Sun, Jun 19, 2022, Huang, Shaoqin wrote: > > > On 6/18/2022 8:16 AM, Sean Christopherson wrote: > > Consolidate the actual copying of a ucall struct from guest=>host into > > the common get_ucall(). Return a host virtual address instead of a guest > > virtual address even though the addr_gva2hva() part could be moved to > > get_ucall() too. Conceptually, get_ucall() is invoked from the host and > > should return a host virtual address (and returning NULL for "nothing to > > see here" is far superior to returning 0). > > It seems the get_ucall() returns the uc->cmd, the ucall_arch_get_ucall() > returns a host virtual address. Yep, get_ucall() then does the memcpy() from guest memory via that host virtual addres and returns the resulting ucall command. The intent is that the arch hooks are not to be called by common code. ^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 2/3] KVM: selftests: Consolidate boilerplate code in get_ucall() @ 2022-06-21 14:41 ` Sean Christopherson 0 siblings, 0 replies; 44+ messages in thread From: Sean Christopherson @ 2022-06-21 14:41 UTC (permalink / raw) To: Huang, Shaoqin Cc: Paolo Bonzini, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda, James Morse, Alexandru Elisei, Suzuki K Poulose, Atish Patra, David Hildenbrand, kvm, linux-arm-kernel, kvmarm, kvm-riscv, linux-riscv, linux-kernel, Colton Lewis, Andrew Jones On Sun, Jun 19, 2022, Huang, Shaoqin wrote: > > > On 6/18/2022 8:16 AM, Sean Christopherson wrote: > > Consolidate the actual copying of a ucall struct from guest=>host into > > the common get_ucall(). Return a host virtual address instead of a guest > > virtual address even though the addr_gva2hva() part could be moved to > > get_ucall() too. Conceptually, get_ucall() is invoked from the host and > > should return a host virtual address (and returning NULL for "nothing to > > see here" is far superior to returning 0). > > It seems the get_ucall() returns the uc->cmd, the ucall_arch_get_ucall() > returns a host virtual address. Yep, get_ucall() then does the memcpy() from guest memory via that host virtual addres and returns the resulting ucall command. The intent is that the arch hooks are not to be called by common code. _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 2/3] KVM: selftests: Consolidate boilerplate code in get_ucall() @ 2022-06-21 14:41 ` Sean Christopherson 0 siblings, 0 replies; 44+ messages in thread From: Sean Christopherson @ 2022-06-21 14:41 UTC (permalink / raw) To: Huang, Shaoqin Cc: kvm, David Hildenbrand, Paul Walmsley, Colton Lewis, linux-riscv, Claudio Imbrenda, kvmarm, Janosch Frank, Marc Zyngier, Christian Borntraeger, Albert Ou, Atish Patra, linux-arm-kernel, linux-kernel, Palmer Dabbelt, kvm-riscv, Paolo Bonzini On Sun, Jun 19, 2022, Huang, Shaoqin wrote: > > > On 6/18/2022 8:16 AM, Sean Christopherson wrote: > > Consolidate the actual copying of a ucall struct from guest=>host into > > the common get_ucall(). Return a host virtual address instead of a guest > > virtual address even though the addr_gva2hva() part could be moved to > > get_ucall() too. Conceptually, get_ucall() is invoked from the host and > > should return a host virtual address (and returning NULL for "nothing to > > see here" is far superior to returning 0). > > It seems the get_ucall() returns the uc->cmd, the ucall_arch_get_ucall() > returns a host virtual address. Yep, get_ucall() then does the memcpy() from guest memory via that host virtual addres and returns the resulting ucall command. The intent is that the arch hooks are not to be called by common code. _______________________________________________ kvmarm mailing list kvmarm@lists.cs.columbia.edu https://lists.cs.columbia.edu/mailman/listinfo/kvmarm ^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 2/3] KVM: selftests: Consolidate boilerplate code in get_ucall() @ 2022-06-21 14:41 ` Sean Christopherson 0 siblings, 0 replies; 44+ messages in thread From: Sean Christopherson @ 2022-06-21 14:41 UTC (permalink / raw) To: Huang, Shaoqin Cc: Paolo Bonzini, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda, James Morse, Alexandru Elisei, Suzuki K Poulose, Atish Patra, David Hildenbrand, kvm, linux-arm-kernel, kvmarm, kvm-riscv, linux-riscv, linux-kernel, Colton Lewis, Andrew Jones On Sun, Jun 19, 2022, Huang, Shaoqin wrote: > > > On 6/18/2022 8:16 AM, Sean Christopherson wrote: > > Consolidate the actual copying of a ucall struct from guest=>host into > > the common get_ucall(). Return a host virtual address instead of a guest > > virtual address even though the addr_gva2hva() part could be moved to > > get_ucall() too. Conceptually, get_ucall() is invoked from the host and > > should return a host virtual address (and returning NULL for "nothing to > > see here" is far superior to returning 0). > > It seems the get_ucall() returns the uc->cmd, the ucall_arch_get_ucall() > returns a host virtual address. Yep, get_ucall() then does the memcpy() from guest memory via that host virtual addres and returns the resulting ucall command. The intent is that the arch hooks are not to be called by common code. _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply [flat|nested] 44+ messages in thread
* [PATCH 3/3] KVM: selftest: Add __weak stubs for ucall_arch_(un)init() 2022-06-18 0:16 ` Sean Christopherson (?) (?) @ 2022-06-18 0:16 ` Sean Christopherson -1 siblings, 0 replies; 44+ messages in thread From: Sean Christopherson @ 2022-06-18 0:16 UTC (permalink / raw) To: Paolo Bonzini, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda Cc: James Morse, Alexandru Elisei, Suzuki K Poulose, Atish Patra, David Hildenbrand, kvm, linux-arm-kernel, kvmarm, kvm-riscv, linux-riscv, linux-kernel, Colton Lewis, Andrew Jones, Sean Christopherson Provide __weak stubs for (un)initializing ucall, aarch64 is the only architecture that actually needs to do work. No functional change intended. Signed-off-by: Sean Christopherson <seanjc@google.com> --- tools/testing/selftests/kvm/lib/riscv/ucall.c | 8 -------- tools/testing/selftests/kvm/lib/s390x/ucall.c | 8 -------- tools/testing/selftests/kvm/lib/ucall_common.c | 10 ++++++++++ tools/testing/selftests/kvm/lib/x86_64/ucall.c | 8 -------- 4 files changed, 10 insertions(+), 24 deletions(-) diff --git a/tools/testing/selftests/kvm/lib/riscv/ucall.c b/tools/testing/selftests/kvm/lib/riscv/ucall.c index 37e091d4366e..1c6c0432bdd7 100644 --- a/tools/testing/selftests/kvm/lib/riscv/ucall.c +++ b/tools/testing/selftests/kvm/lib/riscv/ucall.c @@ -10,14 +10,6 @@ #include "kvm_util.h" #include "processor.h" -void ucall_arch_init(struct kvm_vm *vm, void *arg) -{ -} - -void ucall_arch_uninit(struct kvm_vm *vm) -{ -} - struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0, unsigned long arg1, unsigned long arg2, unsigned long arg3, unsigned long arg4, diff --git a/tools/testing/selftests/kvm/lib/s390x/ucall.c b/tools/testing/selftests/kvm/lib/s390x/ucall.c index 0f695a031d35..3e8d4275c9e4 100644 --- a/tools/testing/selftests/kvm/lib/s390x/ucall.c +++ b/tools/testing/selftests/kvm/lib/s390x/ucall.c @@ -6,14 +6,6 @@ */ #include "kvm_util.h" -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) { /* Exit via DIAGNOSE 0x501 (normally used for breakpoints) */ diff --git a/tools/testing/selftests/kvm/lib/ucall_common.c b/tools/testing/selftests/kvm/lib/ucall_common.c index c488ed23d0dd..a1e563fd8fcc 100644 --- a/tools/testing/selftests/kvm/lib/ucall_common.c +++ b/tools/testing/selftests/kvm/lib/ucall_common.c @@ -1,6 +1,16 @@ // SPDX-License-Identifier: GPL-2.0-only #include "kvm_util.h" +void __weak ucall_arch_init(struct kvm_vm *vm, void *arg) +{ + +} + +void __weak ucall_arch_uninit(struct kvm_vm *vm) +{ + +} + void ucall(uint64_t cmd, int nargs, ...) { struct ucall uc = { diff --git a/tools/testing/selftests/kvm/lib/x86_64/ucall.c b/tools/testing/selftests/kvm/lib/x86_64/ucall.c index ec53a406f689..2f724f0bed32 100644 --- a/tools/testing/selftests/kvm/lib/x86_64/ucall.c +++ b/tools/testing/selftests/kvm/lib/x86_64/ucall.c @@ -8,14 +8,6 @@ #define UCALL_PIO_PORT ((uint16_t)0x1000) -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) { asm volatile("in %[port], %%al" -- 2.37.0.rc0.104.g0611611a94-goog ^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 3/3] KVM: selftest: Add __weak stubs for ucall_arch_(un)init() @ 2022-06-18 0:16 ` Sean Christopherson 0 siblings, 0 replies; 44+ messages in thread From: Sean Christopherson @ 2022-06-18 0:16 UTC (permalink / raw) To: Paolo Bonzini, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda Cc: James Morse, Alexandru Elisei, Suzuki K Poulose, Atish Patra, David Hildenbrand, kvm, linux-arm-kernel, kvmarm, kvm-riscv, linux-riscv, linux-kernel, Colton Lewis, Andrew Jones, Sean Christopherson Provide __weak stubs for (un)initializing ucall, aarch64 is the only architecture that actually needs to do work. No functional change intended. Signed-off-by: Sean Christopherson <seanjc@google.com> --- tools/testing/selftests/kvm/lib/riscv/ucall.c | 8 -------- tools/testing/selftests/kvm/lib/s390x/ucall.c | 8 -------- tools/testing/selftests/kvm/lib/ucall_common.c | 10 ++++++++++ tools/testing/selftests/kvm/lib/x86_64/ucall.c | 8 -------- 4 files changed, 10 insertions(+), 24 deletions(-) diff --git a/tools/testing/selftests/kvm/lib/riscv/ucall.c b/tools/testing/selftests/kvm/lib/riscv/ucall.c index 37e091d4366e..1c6c0432bdd7 100644 --- a/tools/testing/selftests/kvm/lib/riscv/ucall.c +++ b/tools/testing/selftests/kvm/lib/riscv/ucall.c @@ -10,14 +10,6 @@ #include "kvm_util.h" #include "processor.h" -void ucall_arch_init(struct kvm_vm *vm, void *arg) -{ -} - -void ucall_arch_uninit(struct kvm_vm *vm) -{ -} - struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0, unsigned long arg1, unsigned long arg2, unsigned long arg3, unsigned long arg4, diff --git a/tools/testing/selftests/kvm/lib/s390x/ucall.c b/tools/testing/selftests/kvm/lib/s390x/ucall.c index 0f695a031d35..3e8d4275c9e4 100644 --- a/tools/testing/selftests/kvm/lib/s390x/ucall.c +++ b/tools/testing/selftests/kvm/lib/s390x/ucall.c @@ -6,14 +6,6 @@ */ #include "kvm_util.h" -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) { /* Exit via DIAGNOSE 0x501 (normally used for breakpoints) */ diff --git a/tools/testing/selftests/kvm/lib/ucall_common.c b/tools/testing/selftests/kvm/lib/ucall_common.c index c488ed23d0dd..a1e563fd8fcc 100644 --- a/tools/testing/selftests/kvm/lib/ucall_common.c +++ b/tools/testing/selftests/kvm/lib/ucall_common.c @@ -1,6 +1,16 @@ // SPDX-License-Identifier: GPL-2.0-only #include "kvm_util.h" +void __weak ucall_arch_init(struct kvm_vm *vm, void *arg) +{ + +} + +void __weak ucall_arch_uninit(struct kvm_vm *vm) +{ + +} + void ucall(uint64_t cmd, int nargs, ...) { struct ucall uc = { diff --git a/tools/testing/selftests/kvm/lib/x86_64/ucall.c b/tools/testing/selftests/kvm/lib/x86_64/ucall.c index ec53a406f689..2f724f0bed32 100644 --- a/tools/testing/selftests/kvm/lib/x86_64/ucall.c +++ b/tools/testing/selftests/kvm/lib/x86_64/ucall.c @@ -8,14 +8,6 @@ #define UCALL_PIO_PORT ((uint16_t)0x1000) -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) { asm volatile("in %[port], %%al" -- 2.37.0.rc0.104.g0611611a94-goog _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 3/3] KVM: selftest: Add __weak stubs for ucall_arch_(un)init() @ 2022-06-18 0:16 ` Sean Christopherson 0 siblings, 0 replies; 44+ messages in thread From: Sean Christopherson @ 2022-06-18 0:16 UTC (permalink / raw) To: Paolo Bonzini, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda Cc: kvm, David Hildenbrand, linux-kernel, Colton Lewis, kvm-riscv, Atish Patra, linux-riscv, kvmarm, linux-arm-kernel Provide __weak stubs for (un)initializing ucall, aarch64 is the only architecture that actually needs to do work. No functional change intended. Signed-off-by: Sean Christopherson <seanjc@google.com> --- tools/testing/selftests/kvm/lib/riscv/ucall.c | 8 -------- tools/testing/selftests/kvm/lib/s390x/ucall.c | 8 -------- tools/testing/selftests/kvm/lib/ucall_common.c | 10 ++++++++++ tools/testing/selftests/kvm/lib/x86_64/ucall.c | 8 -------- 4 files changed, 10 insertions(+), 24 deletions(-) diff --git a/tools/testing/selftests/kvm/lib/riscv/ucall.c b/tools/testing/selftests/kvm/lib/riscv/ucall.c index 37e091d4366e..1c6c0432bdd7 100644 --- a/tools/testing/selftests/kvm/lib/riscv/ucall.c +++ b/tools/testing/selftests/kvm/lib/riscv/ucall.c @@ -10,14 +10,6 @@ #include "kvm_util.h" #include "processor.h" -void ucall_arch_init(struct kvm_vm *vm, void *arg) -{ -} - -void ucall_arch_uninit(struct kvm_vm *vm) -{ -} - struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0, unsigned long arg1, unsigned long arg2, unsigned long arg3, unsigned long arg4, diff --git a/tools/testing/selftests/kvm/lib/s390x/ucall.c b/tools/testing/selftests/kvm/lib/s390x/ucall.c index 0f695a031d35..3e8d4275c9e4 100644 --- a/tools/testing/selftests/kvm/lib/s390x/ucall.c +++ b/tools/testing/selftests/kvm/lib/s390x/ucall.c @@ -6,14 +6,6 @@ */ #include "kvm_util.h" -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) { /* Exit via DIAGNOSE 0x501 (normally used for breakpoints) */ diff --git a/tools/testing/selftests/kvm/lib/ucall_common.c b/tools/testing/selftests/kvm/lib/ucall_common.c index c488ed23d0dd..a1e563fd8fcc 100644 --- a/tools/testing/selftests/kvm/lib/ucall_common.c +++ b/tools/testing/selftests/kvm/lib/ucall_common.c @@ -1,6 +1,16 @@ // SPDX-License-Identifier: GPL-2.0-only #include "kvm_util.h" +void __weak ucall_arch_init(struct kvm_vm *vm, void *arg) +{ + +} + +void __weak ucall_arch_uninit(struct kvm_vm *vm) +{ + +} + void ucall(uint64_t cmd, int nargs, ...) { struct ucall uc = { diff --git a/tools/testing/selftests/kvm/lib/x86_64/ucall.c b/tools/testing/selftests/kvm/lib/x86_64/ucall.c index ec53a406f689..2f724f0bed32 100644 --- a/tools/testing/selftests/kvm/lib/x86_64/ucall.c +++ b/tools/testing/selftests/kvm/lib/x86_64/ucall.c @@ -8,14 +8,6 @@ #define UCALL_PIO_PORT ((uint16_t)0x1000) -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) { asm volatile("in %[port], %%al" -- 2.37.0.rc0.104.g0611611a94-goog _______________________________________________ kvmarm mailing list kvmarm@lists.cs.columbia.edu https://lists.cs.columbia.edu/mailman/listinfo/kvmarm ^ permalink raw reply related [flat|nested] 44+ messages in thread
* [PATCH 3/3] KVM: selftest: Add __weak stubs for ucall_arch_(un)init() @ 2022-06-18 0:16 ` Sean Christopherson 0 siblings, 0 replies; 44+ messages in thread From: Sean Christopherson @ 2022-06-18 0:16 UTC (permalink / raw) To: Paolo Bonzini, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda Cc: James Morse, Alexandru Elisei, Suzuki K Poulose, Atish Patra, David Hildenbrand, kvm, linux-arm-kernel, kvmarm, kvm-riscv, linux-riscv, linux-kernel, Colton Lewis, Andrew Jones, Sean Christopherson Provide __weak stubs for (un)initializing ucall, aarch64 is the only architecture that actually needs to do work. No functional change intended. Signed-off-by: Sean Christopherson <seanjc@google.com> --- tools/testing/selftests/kvm/lib/riscv/ucall.c | 8 -------- tools/testing/selftests/kvm/lib/s390x/ucall.c | 8 -------- tools/testing/selftests/kvm/lib/ucall_common.c | 10 ++++++++++ tools/testing/selftests/kvm/lib/x86_64/ucall.c | 8 -------- 4 files changed, 10 insertions(+), 24 deletions(-) diff --git a/tools/testing/selftests/kvm/lib/riscv/ucall.c b/tools/testing/selftests/kvm/lib/riscv/ucall.c index 37e091d4366e..1c6c0432bdd7 100644 --- a/tools/testing/selftests/kvm/lib/riscv/ucall.c +++ b/tools/testing/selftests/kvm/lib/riscv/ucall.c @@ -10,14 +10,6 @@ #include "kvm_util.h" #include "processor.h" -void ucall_arch_init(struct kvm_vm *vm, void *arg) -{ -} - -void ucall_arch_uninit(struct kvm_vm *vm) -{ -} - struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0, unsigned long arg1, unsigned long arg2, unsigned long arg3, unsigned long arg4, diff --git a/tools/testing/selftests/kvm/lib/s390x/ucall.c b/tools/testing/selftests/kvm/lib/s390x/ucall.c index 0f695a031d35..3e8d4275c9e4 100644 --- a/tools/testing/selftests/kvm/lib/s390x/ucall.c +++ b/tools/testing/selftests/kvm/lib/s390x/ucall.c @@ -6,14 +6,6 @@ */ #include "kvm_util.h" -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) { /* Exit via DIAGNOSE 0x501 (normally used for breakpoints) */ diff --git a/tools/testing/selftests/kvm/lib/ucall_common.c b/tools/testing/selftests/kvm/lib/ucall_common.c index c488ed23d0dd..a1e563fd8fcc 100644 --- a/tools/testing/selftests/kvm/lib/ucall_common.c +++ b/tools/testing/selftests/kvm/lib/ucall_common.c @@ -1,6 +1,16 @@ // SPDX-License-Identifier: GPL-2.0-only #include "kvm_util.h" +void __weak ucall_arch_init(struct kvm_vm *vm, void *arg) +{ + +} + +void __weak ucall_arch_uninit(struct kvm_vm *vm) +{ + +} + void ucall(uint64_t cmd, int nargs, ...) { struct ucall uc = { diff --git a/tools/testing/selftests/kvm/lib/x86_64/ucall.c b/tools/testing/selftests/kvm/lib/x86_64/ucall.c index ec53a406f689..2f724f0bed32 100644 --- a/tools/testing/selftests/kvm/lib/x86_64/ucall.c +++ b/tools/testing/selftests/kvm/lib/x86_64/ucall.c @@ -8,14 +8,6 @@ #define UCALL_PIO_PORT ((uint16_t)0x1000) -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) { asm volatile("in %[port], %%al" -- 2.37.0.rc0.104.g0611611a94-goog _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply related [flat|nested] 44+ messages in thread
* Re: [PATCH 0/3] KVM: selftests: Consolidate ucall code 2022-06-18 0:16 ` Sean Christopherson (?) (?) @ 2022-06-20 7:33 ` Andrew Jones -1 siblings, 0 replies; 44+ messages in thread From: Andrew Jones @ 2022-06-20 7:33 UTC (permalink / raw) To: Sean Christopherson Cc: Paolo Bonzini, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda, James Morse, Alexandru Elisei, Suzuki K Poulose, Atish Patra, David Hildenbrand, kvm, linux-arm-kernel, kvmarm, kvm-riscv, linux-riscv, linux-kernel, Colton Lewis On Sat, Jun 18, 2022 at 12:16:15AM +0000, Sean Christopherson wrote: > Consolidate the code for making and getting ucalls. All architectures pass > the ucall struct via memory, so filling and copying the struct is 100% > generic. The only per-arch code is sending and receiving the address of > said struct. > > Tested on x86 and arm, compile tested on s390 and RISC-V. For the series Reviewed-by: Andrew Jones <drjones@redhat.com> Thanks, drew ^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 0/3] KVM: selftests: Consolidate ucall code @ 2022-06-20 7:33 ` Andrew Jones 0 siblings, 0 replies; 44+ messages in thread From: Andrew Jones @ 2022-06-20 7:33 UTC (permalink / raw) To: Sean Christopherson Cc: Paolo Bonzini, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda, James Morse, Alexandru Elisei, Suzuki K Poulose, Atish Patra, David Hildenbrand, kvm, linux-arm-kernel, kvmarm, kvm-riscv, linux-riscv, linux-kernel, Colton Lewis On Sat, Jun 18, 2022 at 12:16:15AM +0000, Sean Christopherson wrote: > Consolidate the code for making and getting ucalls. All architectures pass > the ucall struct via memory, so filling and copying the struct is 100% > generic. The only per-arch code is sending and receiving the address of > said struct. > > Tested on x86 and arm, compile tested on s390 and RISC-V. For the series Reviewed-by: Andrew Jones <drjones@redhat.com> Thanks, drew _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 0/3] KVM: selftests: Consolidate ucall code @ 2022-06-20 7:33 ` Andrew Jones 0 siblings, 0 replies; 44+ messages in thread From: Andrew Jones @ 2022-06-20 7:33 UTC (permalink / raw) To: Sean Christopherson Cc: Marc Zyngier, Albert Ou, Janosch Frank, kvm, Claudio Imbrenda, Atish Patra, David Hildenbrand, linux-kernel, Colton Lewis, Palmer Dabbelt, kvm-riscv, Paul Walmsley, Paolo Bonzini, linux-riscv, Christian Borntraeger, kvmarm, linux-arm-kernel On Sat, Jun 18, 2022 at 12:16:15AM +0000, Sean Christopherson wrote: > Consolidate the code for making and getting ucalls. All architectures pass > the ucall struct via memory, so filling and copying the struct is 100% > generic. The only per-arch code is sending and receiving the address of > said struct. > > Tested on x86 and arm, compile tested on s390 and RISC-V. For the series Reviewed-by: Andrew Jones <drjones@redhat.com> Thanks, drew _______________________________________________ kvmarm mailing list kvmarm@lists.cs.columbia.edu https://lists.cs.columbia.edu/mailman/listinfo/kvmarm ^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 0/3] KVM: selftests: Consolidate ucall code @ 2022-06-20 7:33 ` Andrew Jones 0 siblings, 0 replies; 44+ messages in thread From: Andrew Jones @ 2022-06-20 7:33 UTC (permalink / raw) To: Sean Christopherson Cc: Paolo Bonzini, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda, James Morse, Alexandru Elisei, Suzuki K Poulose, Atish Patra, David Hildenbrand, kvm, linux-arm-kernel, kvmarm, kvm-riscv, linux-riscv, linux-kernel, Colton Lewis On Sat, Jun 18, 2022 at 12:16:15AM +0000, Sean Christopherson wrote: > Consolidate the code for making and getting ucalls. All architectures pass > the ucall struct via memory, so filling and copying the struct is 100% > generic. The only per-arch code is sending and receiving the address of > said struct. > > Tested on x86 and arm, compile tested on s390 and RISC-V. For the series Reviewed-by: Andrew Jones <drjones@redhat.com> Thanks, drew _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 0/3] KVM: selftests: Consolidate ucall code 2022-06-18 0:16 ` Sean Christopherson (?) (?) @ 2022-06-20 12:03 ` Paolo Bonzini -1 siblings, 0 replies; 44+ messages in thread From: Paolo Bonzini @ 2022-06-20 12:03 UTC (permalink / raw) To: Sean Christopherson, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda Cc: kvm, David Hildenbrand, linux-kernel, Colton Lewis, kvm-riscv, Atish Patra, linux-riscv, kvmarm, linux-arm-kernel On 6/18/22 02:16, Sean Christopherson wrote: > Consolidate the code for making and getting ucalls. All architectures pass > the ucall struct via memory, so filling and copying the struct is 100% > generic. The only per-arch code is sending and receiving the address of > said struct. > > Tested on x86 and arm, compile tested on s390 and RISC-V. I'm not sure about doing this yet. The SEV tests added multiple implementations of the ucalls in one architecture. I have rebased those recently (not the SEV part) to get more familiar with the new kvm_vcpu API for selftests, and was going to look at your old review next... Paolo _______________________________________________ kvmarm mailing list kvmarm@lists.cs.columbia.edu https://lists.cs.columbia.edu/mailman/listinfo/kvmarm ^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 0/3] KVM: selftests: Consolidate ucall code @ 2022-06-20 12:03 ` Paolo Bonzini 0 siblings, 0 replies; 44+ messages in thread From: Paolo Bonzini @ 2022-06-20 12:03 UTC (permalink / raw) To: Sean Christopherson, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda Cc: James Morse, Alexandru Elisei, Suzuki K Poulose, Atish Patra, David Hildenbrand, kvm, linux-arm-kernel, kvmarm, kvm-riscv, linux-riscv, linux-kernel, Colton Lewis, Andrew Jones On 6/18/22 02:16, Sean Christopherson wrote: > Consolidate the code for making and getting ucalls. All architectures pass > the ucall struct via memory, so filling and copying the struct is 100% > generic. The only per-arch code is sending and receiving the address of > said struct. > > Tested on x86 and arm, compile tested on s390 and RISC-V. I'm not sure about doing this yet. The SEV tests added multiple implementations of the ucalls in one architecture. I have rebased those recently (not the SEV part) to get more familiar with the new kvm_vcpu API for selftests, and was going to look at your old review next... Paolo _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 0/3] KVM: selftests: Consolidate ucall code @ 2022-06-20 12:03 ` Paolo Bonzini 0 siblings, 0 replies; 44+ messages in thread From: Paolo Bonzini @ 2022-06-20 12:03 UTC (permalink / raw) To: Sean Christopherson, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda Cc: James Morse, Alexandru Elisei, Suzuki K Poulose, Atish Patra, David Hildenbrand, kvm, linux-arm-kernel, kvmarm, kvm-riscv, linux-riscv, linux-kernel, Colton Lewis, Andrew Jones On 6/18/22 02:16, Sean Christopherson wrote: > Consolidate the code for making and getting ucalls. All architectures pass > the ucall struct via memory, so filling and copying the struct is 100% > generic. The only per-arch code is sending and receiving the address of > said struct. > > Tested on x86 and arm, compile tested on s390 and RISC-V. I'm not sure about doing this yet. The SEV tests added multiple implementations of the ucalls in one architecture. I have rebased those recently (not the SEV part) to get more familiar with the new kvm_vcpu API for selftests, and was going to look at your old review next... Paolo _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 0/3] KVM: selftests: Consolidate ucall code @ 2022-06-20 12:03 ` Paolo Bonzini 0 siblings, 0 replies; 44+ messages in thread From: Paolo Bonzini @ 2022-06-20 12:03 UTC (permalink / raw) To: Sean Christopherson, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda Cc: James Morse, Alexandru Elisei, Suzuki K Poulose, Atish Patra, David Hildenbrand, kvm, linux-arm-kernel, kvmarm, kvm-riscv, linux-riscv, linux-kernel, Colton Lewis, Andrew Jones On 6/18/22 02:16, Sean Christopherson wrote: > Consolidate the code for making and getting ucalls. All architectures pass > the ucall struct via memory, so filling and copying the struct is 100% > generic. The only per-arch code is sending and receiving the address of > said struct. > > Tested on x86 and arm, compile tested on s390 and RISC-V. I'm not sure about doing this yet. The SEV tests added multiple implementations of the ucalls in one architecture. I have rebased those recently (not the SEV part) to get more familiar with the new kvm_vcpu API for selftests, and was going to look at your old review next... Paolo ^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 0/3] KVM: selftests: Consolidate ucall code 2022-06-20 12:03 ` Paolo Bonzini (?) (?) @ 2022-06-21 14:54 ` Sean Christopherson -1 siblings, 0 replies; 44+ messages in thread From: Sean Christopherson @ 2022-06-21 14:54 UTC (permalink / raw) To: Paolo Bonzini Cc: Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda, James Morse, Alexandru Elisei, Suzuki K Poulose, Atish Patra, David Hildenbrand, kvm, linux-arm-kernel, kvmarm, kvm-riscv, linux-riscv, linux-kernel, Colton Lewis, Andrew Jones On Mon, Jun 20, 2022, Paolo Bonzini wrote: > On 6/18/22 02:16, Sean Christopherson wrote: > > Consolidate the code for making and getting ucalls. All architectures pass > > the ucall struct via memory, so filling and copying the struct is 100% > > generic. The only per-arch code is sending and receiving the address of > > said struct. > > > > Tested on x86 and arm, compile tested on s390 and RISC-V. > > I'm not sure about doing this yet. The SEV tests added multiple > implementations of the ucalls in one architecture. I have rebased those > recently (not the SEV part) to get more familiar with the new kvm_vcpu API > for selftests, and was going to look at your old review next... I had forgotten about that code. My idea of a per-VM list[*] would fit nicely on top, though maybe drop the last patch from this series. [*] https://lore.kernel.org/all/Yc4gcJdhxthBKUUd@google.com ^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 0/3] KVM: selftests: Consolidate ucall code @ 2022-06-21 14:54 ` Sean Christopherson 0 siblings, 0 replies; 44+ messages in thread From: Sean Christopherson @ 2022-06-21 14:54 UTC (permalink / raw) To: Paolo Bonzini Cc: Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda, James Morse, Alexandru Elisei, Suzuki K Poulose, Atish Patra, David Hildenbrand, kvm, linux-arm-kernel, kvmarm, kvm-riscv, linux-riscv, linux-kernel, Colton Lewis, Andrew Jones On Mon, Jun 20, 2022, Paolo Bonzini wrote: > On 6/18/22 02:16, Sean Christopherson wrote: > > Consolidate the code for making and getting ucalls. All architectures pass > > the ucall struct via memory, so filling and copying the struct is 100% > > generic. The only per-arch code is sending and receiving the address of > > said struct. > > > > Tested on x86 and arm, compile tested on s390 and RISC-V. > > I'm not sure about doing this yet. The SEV tests added multiple > implementations of the ucalls in one architecture. I have rebased those > recently (not the SEV part) to get more familiar with the new kvm_vcpu API > for selftests, and was going to look at your old review next... I had forgotten about that code. My idea of a per-VM list[*] would fit nicely on top, though maybe drop the last patch from this series. [*] https://lore.kernel.org/all/Yc4gcJdhxthBKUUd@google.com _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 0/3] KVM: selftests: Consolidate ucall code @ 2022-06-21 14:54 ` Sean Christopherson 0 siblings, 0 replies; 44+ messages in thread From: Sean Christopherson @ 2022-06-21 14:54 UTC (permalink / raw) To: Paolo Bonzini Cc: Albert Ou, Janosch Frank, kvm, Claudio Imbrenda, Marc Zyngier, Atish Patra, David Hildenbrand, linux-kernel, Colton Lewis, Palmer Dabbelt, kvm-riscv, Paul Walmsley, linux-riscv, Christian Borntraeger, kvmarm, linux-arm-kernel On Mon, Jun 20, 2022, Paolo Bonzini wrote: > On 6/18/22 02:16, Sean Christopherson wrote: > > Consolidate the code for making and getting ucalls. All architectures pass > > the ucall struct via memory, so filling and copying the struct is 100% > > generic. The only per-arch code is sending and receiving the address of > > said struct. > > > > Tested on x86 and arm, compile tested on s390 and RISC-V. > > I'm not sure about doing this yet. The SEV tests added multiple > implementations of the ucalls in one architecture. I have rebased those > recently (not the SEV part) to get more familiar with the new kvm_vcpu API > for selftests, and was going to look at your old review next... I had forgotten about that code. My idea of a per-VM list[*] would fit nicely on top, though maybe drop the last patch from this series. [*] https://lore.kernel.org/all/Yc4gcJdhxthBKUUd@google.com _______________________________________________ kvmarm mailing list kvmarm@lists.cs.columbia.edu https://lists.cs.columbia.edu/mailman/listinfo/kvmarm ^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 0/3] KVM: selftests: Consolidate ucall code @ 2022-06-21 14:54 ` Sean Christopherson 0 siblings, 0 replies; 44+ messages in thread From: Sean Christopherson @ 2022-06-21 14:54 UTC (permalink / raw) To: Paolo Bonzini Cc: Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda, James Morse, Alexandru Elisei, Suzuki K Poulose, Atish Patra, David Hildenbrand, kvm, linux-arm-kernel, kvmarm, kvm-riscv, linux-riscv, linux-kernel, Colton Lewis, Andrew Jones On Mon, Jun 20, 2022, Paolo Bonzini wrote: > On 6/18/22 02:16, Sean Christopherson wrote: > > Consolidate the code for making and getting ucalls. All architectures pass > > the ucall struct via memory, so filling and copying the struct is 100% > > generic. The only per-arch code is sending and receiving the address of > > said struct. > > > > Tested on x86 and arm, compile tested on s390 and RISC-V. > > I'm not sure about doing this yet. The SEV tests added multiple > implementations of the ucalls in one architecture. I have rebased those > recently (not the SEV part) to get more familiar with the new kvm_vcpu API > for selftests, and was going to look at your old review next... I had forgotten about that code. My idea of a per-VM list[*] would fit nicely on top, though maybe drop the last patch from this series. [*] https://lore.kernel.org/all/Yc4gcJdhxthBKUUd@google.com _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 0/3] KVM: selftests: Consolidate ucall code 2022-06-21 14:54 ` Sean Christopherson (?) (?) @ 2022-07-15 19:32 ` Peter Gonda -1 siblings, 0 replies; 44+ messages in thread From: Peter Gonda @ 2022-07-15 19:32 UTC (permalink / raw) To: Sean Christopherson Cc: Paolo Bonzini, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda, James Morse, Alexandru Elisei, Suzuki K Poulose, Atish Patra, David Hildenbrand, kvm list, linux-arm-kernel, kvmarm, kvm-riscv, linux-riscv, LKML, Colton Lewis, Andrew Jones On Tue, Jun 21, 2022 at 8:55 AM Sean Christopherson <seanjc@google.com> wrote: > > On Mon, Jun 20, 2022, Paolo Bonzini wrote: > > On 6/18/22 02:16, Sean Christopherson wrote: > > > Consolidate the code for making and getting ucalls. All architectures pass > > > the ucall struct via memory, so filling and copying the struct is 100% > > > generic. The only per-arch code is sending and receiving the address of > > > said struct. > > > > > > Tested on x86 and arm, compile tested on s390 and RISC-V. > > > > I'm not sure about doing this yet. The SEV tests added multiple > > implementations of the ucalls in one architecture. I have rebased those > > recently (not the SEV part) to get more familiar with the new kvm_vcpu API > > for selftests, and was going to look at your old review next... > > I had forgotten about that code. My idea of a per-VM list[*] would fit nicely on > top, though maybe drop the last patch from this series. > > [*] https://lore.kernel.org/all/Yc4gcJdhxthBKUUd@google.com I just sent an RFC of SEV selftesting using Sean's suggestion built on the first 2 patches in this series. I think they work well with the encrypted VMs ucalling. https://lore.kernel.org/all/20220715192956.1873315-1-pgonda@google.com/ ^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 0/3] KVM: selftests: Consolidate ucall code @ 2022-07-15 19:32 ` Peter Gonda 0 siblings, 0 replies; 44+ messages in thread From: Peter Gonda @ 2022-07-15 19:32 UTC (permalink / raw) To: Sean Christopherson Cc: kvm list, David Hildenbrand, Paul Walmsley, Colton Lewis, linux-riscv, Claudio Imbrenda, kvmarm, Janosch Frank, Marc Zyngier, Christian Borntraeger, Andrew Jones, Albert Ou, Atish Patra, linux-arm-kernel, LKML, Palmer Dabbelt, kvm-riscv, Paolo Bonzini On Tue, Jun 21, 2022 at 8:55 AM Sean Christopherson <seanjc@google.com> wrote: > > On Mon, Jun 20, 2022, Paolo Bonzini wrote: > > On 6/18/22 02:16, Sean Christopherson wrote: > > > Consolidate the code for making and getting ucalls. All architectures pass > > > the ucall struct via memory, so filling and copying the struct is 100% > > > generic. The only per-arch code is sending and receiving the address of > > > said struct. > > > > > > Tested on x86 and arm, compile tested on s390 and RISC-V. > > > > I'm not sure about doing this yet. The SEV tests added multiple > > implementations of the ucalls in one architecture. I have rebased those > > recently (not the SEV part) to get more familiar with the new kvm_vcpu API > > for selftests, and was going to look at your old review next... > > I had forgotten about that code. My idea of a per-VM list[*] would fit nicely on > top, though maybe drop the last patch from this series. > > [*] https://lore.kernel.org/all/Yc4gcJdhxthBKUUd@google.com I just sent an RFC of SEV selftesting using Sean's suggestion built on the first 2 patches in this series. I think they work well with the encrypted VMs ucalling. https://lore.kernel.org/all/20220715192956.1873315-1-pgonda@google.com/ _______________________________________________ kvmarm mailing list kvmarm@lists.cs.columbia.edu https://lists.cs.columbia.edu/mailman/listinfo/kvmarm ^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 0/3] KVM: selftests: Consolidate ucall code @ 2022-07-15 19:32 ` Peter Gonda 0 siblings, 0 replies; 44+ messages in thread From: Peter Gonda @ 2022-07-15 19:32 UTC (permalink / raw) To: Sean Christopherson Cc: Paolo Bonzini, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda, James Morse, Alexandru Elisei, Suzuki K Poulose, Atish Patra, David Hildenbrand, kvm list, linux-arm-kernel, kvmarm, kvm-riscv, linux-riscv, LKML, Colton Lewis, Andrew Jones On Tue, Jun 21, 2022 at 8:55 AM Sean Christopherson <seanjc@google.com> wrote: > > On Mon, Jun 20, 2022, Paolo Bonzini wrote: > > On 6/18/22 02:16, Sean Christopherson wrote: > > > Consolidate the code for making and getting ucalls. All architectures pass > > > the ucall struct via memory, so filling and copying the struct is 100% > > > generic. The only per-arch code is sending and receiving the address of > > > said struct. > > > > > > Tested on x86 and arm, compile tested on s390 and RISC-V. > > > > I'm not sure about doing this yet. The SEV tests added multiple > > implementations of the ucalls in one architecture. I have rebased those > > recently (not the SEV part) to get more familiar with the new kvm_vcpu API > > for selftests, and was going to look at your old review next... > > I had forgotten about that code. My idea of a per-VM list[*] would fit nicely on > top, though maybe drop the last patch from this series. > > [*] https://lore.kernel.org/all/Yc4gcJdhxthBKUUd@google.com I just sent an RFC of SEV selftesting using Sean's suggestion built on the first 2 patches in this series. I think they work well with the encrypted VMs ucalling. https://lore.kernel.org/all/20220715192956.1873315-1-pgonda@google.com/ _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 44+ messages in thread
* Re: [PATCH 0/3] KVM: selftests: Consolidate ucall code @ 2022-07-15 19:32 ` Peter Gonda 0 siblings, 0 replies; 44+ messages in thread From: Peter Gonda @ 2022-07-15 19:32 UTC (permalink / raw) To: Sean Christopherson Cc: Paolo Bonzini, Marc Zyngier, Anup Patel, Paul Walmsley, Palmer Dabbelt, Albert Ou, Christian Borntraeger, Janosch Frank, Claudio Imbrenda, James Morse, Alexandru Elisei, Suzuki K Poulose, Atish Patra, David Hildenbrand, kvm list, linux-arm-kernel, kvmarm, kvm-riscv, linux-riscv, LKML, Colton Lewis, Andrew Jones On Tue, Jun 21, 2022 at 8:55 AM Sean Christopherson <seanjc@google.com> wrote: > > On Mon, Jun 20, 2022, Paolo Bonzini wrote: > > On 6/18/22 02:16, Sean Christopherson wrote: > > > Consolidate the code for making and getting ucalls. All architectures pass > > > the ucall struct via memory, so filling and copying the struct is 100% > > > generic. The only per-arch code is sending and receiving the address of > > > said struct. > > > > > > Tested on x86 and arm, compile tested on s390 and RISC-V. > > > > I'm not sure about doing this yet. The SEV tests added multiple > > implementations of the ucalls in one architecture. I have rebased those > > recently (not the SEV part) to get more familiar with the new kvm_vcpu API > > for selftests, and was going to look at your old review next... > > I had forgotten about that code. My idea of a per-VM list[*] would fit nicely on > top, though maybe drop the last patch from this series. > > [*] https://lore.kernel.org/all/Yc4gcJdhxthBKUUd@google.com I just sent an RFC of SEV selftesting using Sean's suggestion built on the first 2 patches in this series. I think they work well with the encrypted VMs ucalling. https://lore.kernel.org/all/20220715192956.1873315-1-pgonda@google.com/ _______________________________________________ linux-riscv mailing list linux-riscv@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-riscv ^ permalink raw reply [flat|nested] 44+ messages in thread
end of thread, other threads:[~2022-07-16 9:32 UTC | newest] Thread overview: 44+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2022-06-18 0:16 [PATCH 0/3] KVM: selftests: Consolidate ucall code Sean Christopherson 2022-06-18 0:16 ` Sean Christopherson 2022-06-18 0:16 ` Sean Christopherson 2022-06-18 0:16 ` Sean Christopherson 2022-06-18 0:16 ` [PATCH 1/3] KVM: selftests: Consolidate common code for popuplating ucall struct Sean Christopherson 2022-06-18 0:16 ` Sean Christopherson 2022-06-18 0:16 ` Sean Christopherson 2022-06-18 0:16 ` Sean Christopherson 2022-06-20 7:39 ` Christian Borntraeger 2022-06-20 7:39 ` Christian Borntraeger 2022-06-20 7:39 ` Christian Borntraeger 2022-06-20 7:39 ` Christian Borntraeger 2022-06-18 0:16 ` [PATCH 2/3] KVM: selftests: Consolidate boilerplate code in get_ucall() Sean Christopherson 2022-06-18 0:16 ` Sean Christopherson 2022-06-18 0:16 ` Sean Christopherson 2022-06-18 0:16 ` Sean Christopherson 2022-06-19 10:36 ` Huang, Shaoqin 2022-06-19 10:36 ` Huang, Shaoqin 2022-06-19 10:36 ` Huang, Shaoqin 2022-06-19 10:36 ` Huang, Shaoqin 2022-06-21 14:41 ` Sean Christopherson 2022-06-21 14:41 ` Sean Christopherson 2022-06-21 14:41 ` Sean Christopherson 2022-06-21 14:41 ` Sean Christopherson 2022-06-18 0:16 ` [PATCH 3/3] KVM: selftest: Add __weak stubs for ucall_arch_(un)init() Sean Christopherson 2022-06-18 0:16 ` Sean Christopherson 2022-06-18 0:16 ` Sean Christopherson 2022-06-18 0:16 ` Sean Christopherson 2022-06-20 7:33 ` [PATCH 0/3] KVM: selftests: Consolidate ucall code Andrew Jones 2022-06-20 7:33 ` Andrew Jones 2022-06-20 7:33 ` Andrew Jones 2022-06-20 7:33 ` Andrew Jones 2022-06-20 12:03 ` Paolo Bonzini 2022-06-20 12:03 ` Paolo Bonzini 2022-06-20 12:03 ` Paolo Bonzini 2022-06-20 12:03 ` Paolo Bonzini 2022-06-21 14:54 ` Sean Christopherson 2022-06-21 14:54 ` Sean Christopherson 2022-06-21 14:54 ` Sean Christopherson 2022-06-21 14:54 ` Sean Christopherson 2022-07-15 19:32 ` Peter Gonda 2022-07-15 19:32 ` Peter Gonda 2022-07-15 19:32 ` Peter Gonda 2022-07-15 19:32 ` Peter Gonda
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.