Petr Tesarik 4d198f
From: Janis Schoetterl-Glausch <scgl@linux.ibm.com>
Petr Tesarik 4d198f
Date: Tue, 8 Mar 2022 13:58:38 +0100
Petr Tesarik 4d198f
Subject: KVM: s390: selftests: Add macro as abstraction for MEM_OP
Petr Tesarik 4d198f
Git-commit: 4eb562ab99c427bcfb94d39bf54a44919ccbb64c
Petr Tesarik 4d198f
Patch-mainline: v5.18-rc1
Petr Tesarik 4d198f
References: jsc#PED-579
Petr Tesarik 4d198f
Petr Tesarik 4d198f
In order to achieve good test coverage we need to be able to invoke the
Petr Tesarik 4d198f
MEM_OP ioctl with all possible parametrizations.
Petr Tesarik 4d198f
However, for a given test, we want to be concise and not specify a long
Petr Tesarik 4d198f
list of default values for parameters not relevant for the test, so the
Petr Tesarik 4d198f
readers attention is not needlessly diverted.
Petr Tesarik 4d198f
Add a macro that enables this and convert the existing test to use it.
Petr Tesarik 4d198f
The macro emulates named arguments and hides some of the ioctl's
Petr Tesarik 4d198f
redundancy, e.g. sets the key flag if an access key is specified.
Petr Tesarik 4d198f
Petr Tesarik 4d198f
Signed-off-by: Janis Schoetterl-Glausch <scgl@linux.ibm.com>
Petr Tesarik 4d198f
Link: https://lore.kernel.org/r/20220308125841.3271721-3-scgl@linux.ibm.com
Petr Tesarik 4d198f
Signed-off-by: Christian Borntraeger <borntraeger@linux.ibm.com>
Petr Tesarik 4d198f
Acked-by: Petr Tesarik <ptesarik@suse.com>
Petr Tesarik 4d198f
---
Petr Tesarik 4d198f
 tools/testing/selftests/kvm/s390x/memop.c |  272 +++++++++++++++++++++---------
Petr Tesarik 4d198f
 1 file changed, 197 insertions(+), 75 deletions(-)
Petr Tesarik 4d198f
Petr Tesarik 4d198f
--- a/tools/testing/selftests/kvm/s390x/memop.c
Petr Tesarik 4d198f
+++ b/tools/testing/selftests/kvm/s390x/memop.c
Petr Tesarik 4d198f
@@ -13,6 +13,188 @@
Petr Tesarik 4d198f
 #include "test_util.h"
Petr Tesarik 4d198f
 #include "kvm_util.h"
Petr Tesarik 4d198f
 
Petr Tesarik 4d198f
+enum mop_target {
Petr Tesarik 4d198f
+	LOGICAL,
Petr Tesarik 4d198f
+	SIDA,
Petr Tesarik 4d198f
+	ABSOLUTE,
Petr Tesarik 4d198f
+	INVALID,
Petr Tesarik 4d198f
+};
Petr Tesarik 4d198f
+
Petr Tesarik 4d198f
+enum mop_access_mode {
Petr Tesarik 4d198f
+	READ,
Petr Tesarik 4d198f
+	WRITE,
Petr Tesarik 4d198f
+};
Petr Tesarik 4d198f
+
Petr Tesarik 4d198f
+struct mop_desc {
Petr Tesarik 4d198f
+	uintptr_t gaddr;
Petr Tesarik 4d198f
+	uintptr_t gaddr_v;
Petr Tesarik 4d198f
+	uint64_t set_flags;
Petr Tesarik 4d198f
+	unsigned int f_check : 1;
Petr Tesarik 4d198f
+	unsigned int f_inject : 1;
Petr Tesarik 4d198f
+	unsigned int f_key : 1;
Petr Tesarik 4d198f
+	unsigned int _gaddr_v : 1;
Petr Tesarik 4d198f
+	unsigned int _set_flags : 1;
Petr Tesarik 4d198f
+	unsigned int _sida_offset : 1;
Petr Tesarik 4d198f
+	unsigned int _ar : 1;
Petr Tesarik 4d198f
+	uint32_t size;
Petr Tesarik 4d198f
+	enum mop_target target;
Petr Tesarik 4d198f
+	enum mop_access_mode mode;
Petr Tesarik 4d198f
+	void *buf;
Petr Tesarik 4d198f
+	uint32_t sida_offset;
Petr Tesarik 4d198f
+	uint8_t ar;
Petr Tesarik 4d198f
+	uint8_t key;
Petr Tesarik 4d198f
+};
Petr Tesarik 4d198f
+
Petr Tesarik 4d198f
+static struct kvm_s390_mem_op ksmo_from_desc(struct mop_desc desc)
Petr Tesarik 4d198f
+{
Petr Tesarik 4d198f
+	struct kvm_s390_mem_op ksmo = {
Petr Tesarik 4d198f
+		.gaddr = (uintptr_t)desc.gaddr,
Petr Tesarik 4d198f
+		.size = desc.size,
Petr Tesarik 4d198f
+		.buf = ((uintptr_t)desc.buf),
Petr Tesarik 4d198f
+		.reserved = "ignored_ignored_ignored_ignored"
Petr Tesarik 4d198f
+	};
Petr Tesarik 4d198f
+
Petr Tesarik 4d198f
+	switch (desc.target) {
Petr Tesarik 4d198f
+	case LOGICAL:
Petr Tesarik 4d198f
+		if (desc.mode == READ)
Petr Tesarik 4d198f
+			ksmo.op = KVM_S390_MEMOP_LOGICAL_READ;
Petr Tesarik 4d198f
+		if (desc.mode == WRITE)
Petr Tesarik 4d198f
+			ksmo.op = KVM_S390_MEMOP_LOGICAL_WRITE;
Petr Tesarik 4d198f
+		break;
Petr Tesarik 4d198f
+	case SIDA:
Petr Tesarik 4d198f
+		if (desc.mode == READ)
Petr Tesarik 4d198f
+			ksmo.op = KVM_S390_MEMOP_SIDA_READ;
Petr Tesarik 4d198f
+		if (desc.mode == WRITE)
Petr Tesarik 4d198f
+			ksmo.op = KVM_S390_MEMOP_SIDA_WRITE;
Petr Tesarik 4d198f
+		break;
Petr Tesarik 4d198f
+	case ABSOLUTE:
Petr Tesarik 4d198f
+		if (desc.mode == READ)
Petr Tesarik 4d198f
+			ksmo.op = KVM_S390_MEMOP_ABSOLUTE_READ;
Petr Tesarik 4d198f
+		if (desc.mode == WRITE)
Petr Tesarik 4d198f
+			ksmo.op = KVM_S390_MEMOP_ABSOLUTE_WRITE;
Petr Tesarik 4d198f
+		break;
Petr Tesarik 4d198f
+	case INVALID:
Petr Tesarik 4d198f
+		ksmo.op = -1;
Petr Tesarik 4d198f
+	}
Petr Tesarik 4d198f
+	if (desc.f_check)
Petr Tesarik 4d198f
+		ksmo.flags |= KVM_S390_MEMOP_F_CHECK_ONLY;
Petr Tesarik 4d198f
+	if (desc.f_inject)
Petr Tesarik 4d198f
+		ksmo.flags |= KVM_S390_MEMOP_F_INJECT_EXCEPTION;
Petr Tesarik 4d198f
+	if (desc._set_flags)
Petr Tesarik 4d198f
+		ksmo.flags = desc.set_flags;
Petr Tesarik 4d198f
+	if (desc.f_key) {
Petr Tesarik 4d198f
+		ksmo.flags |= KVM_S390_MEMOP_F_SKEY_PROTECTION;
Petr Tesarik 4d198f
+		ksmo.key = desc.key;
Petr Tesarik 4d198f
+	}
Petr Tesarik 4d198f
+	if (desc._ar)
Petr Tesarik 4d198f
+		ksmo.ar = desc.ar;
Petr Tesarik 4d198f
+	else
Petr Tesarik 4d198f
+		ksmo.ar = 0;
Petr Tesarik 4d198f
+	if (desc._sida_offset)
Petr Tesarik 4d198f
+		ksmo.sida_offset = desc.sida_offset;
Petr Tesarik 4d198f
+
Petr Tesarik 4d198f
+	return ksmo;
Petr Tesarik 4d198f
+}
Petr Tesarik 4d198f
+
Petr Tesarik 4d198f
+/* vcpu dummy id signifying that vm instead of vcpu ioctl is to occur */
Petr Tesarik 4d198f
+const uint32_t VM_VCPU_ID = (uint32_t)-1;
Petr Tesarik 4d198f
+
Petr Tesarik 4d198f
+struct test_vcpu {
Petr Tesarik 4d198f
+	struct kvm_vm *vm;
Petr Tesarik 4d198f
+	uint32_t id;
Petr Tesarik 4d198f
+};
Petr Tesarik 4d198f
+
Petr Tesarik 4d198f
+#define PRINT_MEMOP false
Petr Tesarik 4d198f
+static void print_memop(uint32_t vcpu_id, const struct kvm_s390_mem_op *ksmo)
Petr Tesarik 4d198f
+{
Petr Tesarik 4d198f
+	if (!PRINT_MEMOP)
Petr Tesarik 4d198f
+		return;
Petr Tesarik 4d198f
+
Petr Tesarik 4d198f
+	if (vcpu_id == VM_VCPU_ID)
Petr Tesarik 4d198f
+		printf("vm memop(");
Petr Tesarik 4d198f
+	else
Petr Tesarik 4d198f
+		printf("vcpu memop(");
Petr Tesarik 4d198f
+	switch (ksmo->op) {
Petr Tesarik 4d198f
+	case KVM_S390_MEMOP_LOGICAL_READ:
Petr Tesarik 4d198f
+		printf("LOGICAL, READ, ");
Petr Tesarik 4d198f
+		break;
Petr Tesarik 4d198f
+	case KVM_S390_MEMOP_LOGICAL_WRITE:
Petr Tesarik 4d198f
+		printf("LOGICAL, WRITE, ");
Petr Tesarik 4d198f
+		break;
Petr Tesarik 4d198f
+	case KVM_S390_MEMOP_SIDA_READ:
Petr Tesarik 4d198f
+		printf("SIDA, READ, ");
Petr Tesarik 4d198f
+		break;
Petr Tesarik 4d198f
+	case KVM_S390_MEMOP_SIDA_WRITE:
Petr Tesarik 4d198f
+		printf("SIDA, WRITE, ");
Petr Tesarik 4d198f
+		break;
Petr Tesarik 4d198f
+	case KVM_S390_MEMOP_ABSOLUTE_READ:
Petr Tesarik 4d198f
+		printf("ABSOLUTE, READ, ");
Petr Tesarik 4d198f
+		break;
Petr Tesarik 4d198f
+	case KVM_S390_MEMOP_ABSOLUTE_WRITE:
Petr Tesarik 4d198f
+		printf("ABSOLUTE, WRITE, ");
Petr Tesarik 4d198f
+		break;
Petr Tesarik 4d198f
+	}
Petr Tesarik 4d198f
+	printf("gaddr=%llu, size=%u, buf=%llu, ar=%u, key=%u",
Petr Tesarik 4d198f
+	       ksmo->gaddr, ksmo->size, ksmo->buf, ksmo->ar, ksmo->key);
Petr Tesarik 4d198f
+	if (ksmo->flags & KVM_S390_MEMOP_F_CHECK_ONLY)
Petr Tesarik 4d198f
+		printf(", CHECK_ONLY");
Petr Tesarik 4d198f
+	if (ksmo->flags & KVM_S390_MEMOP_F_INJECT_EXCEPTION)
Petr Tesarik 4d198f
+		printf(", INJECT_EXCEPTION");
Petr Tesarik 4d198f
+	if (ksmo->flags & KVM_S390_MEMOP_F_SKEY_PROTECTION)
Petr Tesarik 4d198f
+		printf(", SKEY_PROTECTION");
Petr Tesarik 4d198f
+	puts(")");
Petr Tesarik 4d198f
+}
Petr Tesarik 4d198f
+
Petr Tesarik 4d198f
+static void memop_ioctl(struct test_vcpu vcpu, struct kvm_s390_mem_op *ksmo)
Petr Tesarik 4d198f
+{
Petr Tesarik 4d198f
+	if (vcpu.id == VM_VCPU_ID)
Petr Tesarik 4d198f
+		vm_ioctl(vcpu.vm, KVM_S390_MEM_OP, ksmo);
Petr Tesarik 4d198f
+	else
Petr Tesarik 4d198f
+		vcpu_ioctl(vcpu.vm, vcpu.id, KVM_S390_MEM_OP, ksmo);
Petr Tesarik 4d198f
+}
Petr Tesarik 4d198f
+
Petr Tesarik 4d198f
+static int err_memop_ioctl(struct test_vcpu vcpu, struct kvm_s390_mem_op *ksmo)
Petr Tesarik 4d198f
+{
Petr Tesarik 4d198f
+	if (vcpu.id == VM_VCPU_ID)
Petr Tesarik 4d198f
+		return _vm_ioctl(vcpu.vm, KVM_S390_MEM_OP, ksmo);
Petr Tesarik 4d198f
+	else
Petr Tesarik 4d198f
+		return _vcpu_ioctl(vcpu.vm, vcpu.id, KVM_S390_MEM_OP, ksmo);
Petr Tesarik 4d198f
+}
Petr Tesarik 4d198f
+
Petr Tesarik 4d198f
+#define MEMOP(err, vcpu_p, mop_target_p, access_mode_p, buf_p, size_p, ...)	\
Petr Tesarik 4d198f
+({										\
Petr Tesarik 4d198f
+	struct test_vcpu __vcpu = (vcpu_p);					\
Petr Tesarik 4d198f
+	struct mop_desc __desc = {						\
Petr Tesarik 4d198f
+		.target = (mop_target_p),					\
Petr Tesarik 4d198f
+		.mode = (access_mode_p),					\
Petr Tesarik 4d198f
+		.buf = (buf_p),							\
Petr Tesarik 4d198f
+		.size = (size_p),						\
Petr Tesarik 4d198f
+		__VA_ARGS__							\
Petr Tesarik 4d198f
+	};									\
Petr Tesarik 4d198f
+	struct kvm_s390_mem_op __ksmo;						\
Petr Tesarik 4d198f
+										\
Petr Tesarik 4d198f
+	if (__desc._gaddr_v) {							\
Petr Tesarik 4d198f
+		if (__desc.target == ABSOLUTE)					\
Petr Tesarik 4d198f
+			__desc.gaddr = addr_gva2gpa(__vcpu.vm, __desc.gaddr_v);	\
Petr Tesarik 4d198f
+		else								\
Petr Tesarik 4d198f
+			__desc.gaddr = __desc.gaddr_v;				\
Petr Tesarik 4d198f
+	}									\
Petr Tesarik 4d198f
+	__ksmo = ksmo_from_desc(__desc);					\
Petr Tesarik 4d198f
+	print_memop(__vcpu.id, &__ksmo);					\
Petr Tesarik 4d198f
+	err##memop_ioctl(__vcpu, &__ksmo);					\
Petr Tesarik 4d198f
+})
Petr Tesarik 4d198f
+
Petr Tesarik 4d198f
+#define MOP(...) MEMOP(, __VA_ARGS__)
Petr Tesarik 4d198f
+#define ERR_MOP(...) MEMOP(err_, __VA_ARGS__)
Petr Tesarik 4d198f
+
Petr Tesarik 4d198f
+#define GADDR(a) .gaddr = ((uintptr_t)a)
Petr Tesarik 4d198f
+#define GADDR_V(v) ._gaddr_v = 1, .gaddr_v = ((uintptr_t)v)
Petr Tesarik 4d198f
+#define CHECK_ONLY .f_check = 1
Petr Tesarik 4d198f
+#define SET_FLAGS(f) ._set_flags = 1, .set_flags = (f)
Petr Tesarik 4d198f
+#define SIDA_OFFSET(o) ._sida_offset = 1, .sida_offset = (o)
Petr Tesarik 4d198f
+#define AR(a) ._ar = 1, .ar = (a)
Petr Tesarik 4d198f
+#define KEY(a) .f_key = 1, .key = (a)
Petr Tesarik 4d198f
+
Petr Tesarik 4d198f
 #define VCPU_ID 1
Petr Tesarik 4d198f
 
Petr Tesarik 4d198f
 static uint8_t mem1[65536];
Petr Tesarik 4d198f
@@ -20,6 +202,7 @@ static uint8_t mem2[65536];
Petr Tesarik 4d198f
 
Petr Tesarik 4d198f
 struct test_default {
Petr Tesarik 4d198f
 	struct kvm_vm *kvm_vm;
Petr Tesarik 4d198f
+	struct test_vcpu vcpu;
Petr Tesarik 4d198f
 	struct kvm_run *run;
Petr Tesarik 4d198f
 	int size;
Petr Tesarik 4d198f
 };
Petr Tesarik 4d198f
@@ -30,6 +213,7 @@ static struct test_default test_default_
Petr Tesarik 4d198f
 
Petr Tesarik 4d198f
 	t.size = min((size_t)kvm_check_cap(KVM_CAP_S390_MEM_OP), sizeof(mem1));
Petr Tesarik 4d198f
 	t.kvm_vm = vm_create_default(VCPU_ID, 0, guest_code);
Petr Tesarik 4d198f
+	t.vcpu = (struct test_vcpu) { t.kvm_vm, VCPU_ID };
Petr Tesarik 4d198f
 	t.run = vcpu_state(t.kvm_vm, VCPU_ID);
Petr Tesarik 4d198f
 	return t;
Petr Tesarik 4d198f
 }
Petr Tesarik 4d198f
@@ -43,20 +227,14 @@ static void guest_copy(void)
Petr Tesarik 4d198f
 static void test_copy(void)
Petr Tesarik 4d198f
 {
Petr Tesarik 4d198f
 	struct test_default t = test_default_init(guest_copy);
Petr Tesarik 4d198f
-	struct kvm_s390_mem_op ksmo;
Petr Tesarik 4d198f
 	int i;
Petr Tesarik 4d198f
 
Petr Tesarik 4d198f
 	for (i = 0; i < sizeof(mem1); i++)
Petr Tesarik 4d198f
 		mem1[i] = i * i + i;
Petr Tesarik 4d198f
 
Petr Tesarik 4d198f
 	/* Set the first array */
Petr Tesarik 4d198f
-	ksmo.gaddr = addr_gva2gpa(t.kvm_vm, (uintptr_t)mem1);
Petr Tesarik 4d198f
-	ksmo.flags = 0;
Petr Tesarik 4d198f
-	ksmo.size = t.size;
Petr Tesarik 4d198f
-	ksmo.op = KVM_S390_MEMOP_LOGICAL_WRITE;
Petr Tesarik 4d198f
-	ksmo.buf = (uintptr_t)mem1;
Petr Tesarik 4d198f
-	ksmo.ar = 0;
Petr Tesarik 4d198f
-	vcpu_ioctl(t.kvm_vm, VCPU_ID, KVM_S390_MEM_OP, &ksmo);
Petr Tesarik 4d198f
+	MOP(t.vcpu, LOGICAL, WRITE, mem1, t.size,
Petr Tesarik 4d198f
+	    GADDR(addr_gva2gpa(t.kvm_vm, (uintptr_t)mem1)));
Petr Tesarik 4d198f
 
Petr Tesarik 4d198f
 	/* Let the guest code copy the first array to the second */
Petr Tesarik 4d198f
 	vcpu_run(t.kvm_vm, VCPU_ID);
Petr Tesarik 4d198f
@@ -68,13 +246,7 @@ static void test_copy(void)
Petr Tesarik 4d198f
 	memset(mem2, 0xaa, sizeof(mem2));
Petr Tesarik 4d198f
 
Petr Tesarik 4d198f
 	/* Get the second array */
Petr Tesarik 4d198f
-	ksmo.gaddr = (uintptr_t)mem2;
Petr Tesarik 4d198f
-	ksmo.flags = 0;
Petr Tesarik 4d198f
-	ksmo.size = t.size;
Petr Tesarik 4d198f
-	ksmo.op = KVM_S390_MEMOP_LOGICAL_READ;
Petr Tesarik 4d198f
-	ksmo.buf = (uintptr_t)mem2;
Petr Tesarik 4d198f
-	ksmo.ar = 0;
Petr Tesarik 4d198f
-	vcpu_ioctl(t.kvm_vm, VCPU_ID, KVM_S390_MEM_OP, &ksmo);
Petr Tesarik 4d198f
+	MOP(t.vcpu, LOGICAL, READ, mem2, t.size, GADDR_V(mem2));
Petr Tesarik 4d198f
 
Petr Tesarik 4d198f
 	TEST_ASSERT(!memcmp(mem1, mem2, t.size),
Petr Tesarik 4d198f
 		    "Memory contents do not match!");
Petr Tesarik 4d198f
@@ -91,68 +263,31 @@ static void guest_idle(void)
Petr Tesarik 4d198f
 static void test_errors(void)
Petr Tesarik 4d198f
 {
Petr Tesarik 4d198f
 	struct test_default t = test_default_init(guest_idle);
Petr Tesarik 4d198f
-	struct kvm_s390_mem_op ksmo;
Petr Tesarik 4d198f
 	int rv;
Petr Tesarik 4d198f
 
Petr Tesarik 4d198f
-	/* Check error conditions - first bad size: */
Petr Tesarik 4d198f
-	ksmo.gaddr = (uintptr_t)mem1;
Petr Tesarik 4d198f
-	ksmo.flags = 0;
Petr Tesarik 4d198f
-	ksmo.size = -1;
Petr Tesarik 4d198f
-	ksmo.op = KVM_S390_MEMOP_LOGICAL_WRITE;
Petr Tesarik 4d198f
-	ksmo.buf = (uintptr_t)mem1;
Petr Tesarik 4d198f
-	ksmo.ar = 0;
Petr Tesarik 4d198f
-	rv = _vcpu_ioctl(t.kvm_vm, VCPU_ID, KVM_S390_MEM_OP, &ksmo);
Petr Tesarik 4d198f
+	/* Bad size: */
Petr Tesarik 4d198f
+	rv = ERR_MOP(t.vcpu, LOGICAL, WRITE, mem1, -1, GADDR_V(mem1));
Petr Tesarik 4d198f
 	TEST_ASSERT(rv == -1 && errno == E2BIG, "ioctl allows insane sizes");
Petr Tesarik 4d198f
 
Petr Tesarik 4d198f
 	/* Zero size: */
Petr Tesarik 4d198f
-	ksmo.gaddr = (uintptr_t)mem1;
Petr Tesarik 4d198f
-	ksmo.flags = 0;
Petr Tesarik 4d198f
-	ksmo.size = 0;
Petr Tesarik 4d198f
-	ksmo.op = KVM_S390_MEMOP_LOGICAL_WRITE;
Petr Tesarik 4d198f
-	ksmo.buf = (uintptr_t)mem1;
Petr Tesarik 4d198f
-	ksmo.ar = 0;
Petr Tesarik 4d198f
-	rv = _vcpu_ioctl(t.kvm_vm, VCPU_ID, KVM_S390_MEM_OP, &ksmo);
Petr Tesarik 4d198f
+	rv = ERR_MOP(t.vcpu, LOGICAL, WRITE, mem1, 0, GADDR_V(mem1));
Petr Tesarik 4d198f
 	TEST_ASSERT(rv == -1 && (errno == EINVAL || errno == ENOMEM),
Petr Tesarik 4d198f
 		    "ioctl allows 0 as size");
Petr Tesarik 4d198f
 
Petr Tesarik 4d198f
 	/* Bad flags: */
Petr Tesarik 4d198f
-	ksmo.gaddr = (uintptr_t)mem1;
Petr Tesarik 4d198f
-	ksmo.flags = -1;
Petr Tesarik 4d198f
-	ksmo.size = t.size;
Petr Tesarik 4d198f
-	ksmo.op = KVM_S390_MEMOP_LOGICAL_WRITE;
Petr Tesarik 4d198f
-	ksmo.buf = (uintptr_t)mem1;
Petr Tesarik 4d198f
-	ksmo.ar = 0;
Petr Tesarik 4d198f
-	rv = _vcpu_ioctl(t.kvm_vm, VCPU_ID, KVM_S390_MEM_OP, &ksmo);
Petr Tesarik 4d198f
+	rv = ERR_MOP(t.vcpu, LOGICAL, WRITE, mem1, t.size, GADDR_V(mem1), SET_FLAGS(-1));
Petr Tesarik 4d198f
 	TEST_ASSERT(rv == -1 && errno == EINVAL, "ioctl allows all flags");
Petr Tesarik 4d198f
 
Petr Tesarik 4d198f
 	/* Bad operation: */
Petr Tesarik 4d198f
-	ksmo.gaddr = (uintptr_t)mem1;
Petr Tesarik 4d198f
-	ksmo.flags = 0;
Petr Tesarik 4d198f
-	ksmo.size = t.size;
Petr Tesarik 4d198f
-	ksmo.op = -1;
Petr Tesarik 4d198f
-	ksmo.buf = (uintptr_t)mem1;
Petr Tesarik 4d198f
-	ksmo.ar = 0;
Petr Tesarik 4d198f
-	rv = _vcpu_ioctl(t.kvm_vm, VCPU_ID, KVM_S390_MEM_OP, &ksmo);
Petr Tesarik 4d198f
+	rv = ERR_MOP(t.vcpu, INVALID, WRITE, mem1, t.size, GADDR_V(mem1));
Petr Tesarik 4d198f
 	TEST_ASSERT(rv == -1 && errno == EINVAL, "ioctl allows bad operations");
Petr Tesarik 4d198f
 
Petr Tesarik 4d198f
 	/* Bad guest address: */
Petr Tesarik 4d198f
-	ksmo.gaddr = ~0xfffUL;
Petr Tesarik 4d198f
-	ksmo.flags = KVM_S390_MEMOP_F_CHECK_ONLY;
Petr Tesarik 4d198f
-	ksmo.size = t.size;
Petr Tesarik 4d198f
-	ksmo.op = KVM_S390_MEMOP_LOGICAL_WRITE;
Petr Tesarik 4d198f
-	ksmo.buf = (uintptr_t)mem1;
Petr Tesarik 4d198f
-	ksmo.ar = 0;
Petr Tesarik 4d198f
-	rv = _vcpu_ioctl(t.kvm_vm, VCPU_ID, KVM_S390_MEM_OP, &ksmo);
Petr Tesarik 4d198f
+	rv = ERR_MOP(t.vcpu, LOGICAL, WRITE, mem1, t.size, GADDR((void *)~0xfffUL), CHECK_ONLY);
Petr Tesarik 4d198f
 	TEST_ASSERT(rv > 0, "ioctl does not report bad guest memory access");
Petr Tesarik 4d198f
 
Petr Tesarik 4d198f
 	/* Bad host address: */
Petr Tesarik 4d198f
-	ksmo.gaddr = (uintptr_t)mem1;
Petr Tesarik 4d198f
-	ksmo.flags = 0;
Petr Tesarik 4d198f
-	ksmo.size = t.size;
Petr Tesarik 4d198f
-	ksmo.op = KVM_S390_MEMOP_LOGICAL_WRITE;
Petr Tesarik 4d198f
-	ksmo.buf = 0;
Petr Tesarik 4d198f
-	ksmo.ar = 0;
Petr Tesarik 4d198f
-	rv = _vcpu_ioctl(t.kvm_vm, VCPU_ID, KVM_S390_MEM_OP, &ksmo);
Petr Tesarik 4d198f
+	rv = ERR_MOP(t.vcpu, LOGICAL, WRITE, 0, t.size, GADDR_V(mem1));
Petr Tesarik 4d198f
 	TEST_ASSERT(rv == -1 && errno == EFAULT,
Petr Tesarik 4d198f
 		    "ioctl does not report bad host memory address");
Petr Tesarik 4d198f
 
Petr Tesarik 4d198f
@@ -160,29 +295,16 @@ static void test_errors(void)
Petr Tesarik 4d198f
 	t.run->psw_mask &= ~(3UL << (63 - 17));
Petr Tesarik 4d198f
 	t.run->psw_mask |= 1UL << (63 - 17);  /* Enable AR mode */
Petr Tesarik 4d198f
 	vcpu_run(t.kvm_vm, VCPU_ID);              /* To sync new state to SIE block */
Petr Tesarik 4d198f
-	ksmo.gaddr = (uintptr_t)mem1;
Petr Tesarik 4d198f
-	ksmo.flags = 0;
Petr Tesarik 4d198f
-	ksmo.size = t.size;
Petr Tesarik 4d198f
-	ksmo.op = KVM_S390_MEMOP_LOGICAL_WRITE;
Petr Tesarik 4d198f
-	ksmo.buf = (uintptr_t)mem1;
Petr Tesarik 4d198f
-	ksmo.ar = 17;
Petr Tesarik 4d198f
-	rv = _vcpu_ioctl(t.kvm_vm, VCPU_ID, KVM_S390_MEM_OP, &ksmo);
Petr Tesarik 4d198f
+	rv = ERR_MOP(t.vcpu, LOGICAL, WRITE, mem1, t.size, GADDR_V(mem1), AR(17));
Petr Tesarik 4d198f
 	TEST_ASSERT(rv == -1 && errno == EINVAL, "ioctl allows ARs > 15");
Petr Tesarik 4d198f
 	t.run->psw_mask &= ~(3UL << (63 - 17));   /* Disable AR mode */
Petr Tesarik 4d198f
 	vcpu_run(t.kvm_vm, VCPU_ID);                  /* Run to sync new state */
Petr Tesarik 4d198f
 
Petr Tesarik 4d198f
 	/* Check that the SIDA calls are rejected for non-protected guests */
Petr Tesarik 4d198f
-	ksmo.gaddr = 0;
Petr Tesarik 4d198f
-	ksmo.flags = 0;
Petr Tesarik 4d198f
-	ksmo.size = 8;
Petr Tesarik 4d198f
-	ksmo.op = KVM_S390_MEMOP_SIDA_READ;
Petr Tesarik 4d198f
-	ksmo.buf = (uintptr_t)mem1;
Petr Tesarik 4d198f
-	ksmo.sida_offset = 0x1c0;
Petr Tesarik 4d198f
-	rv = _vcpu_ioctl(t.kvm_vm, VCPU_ID, KVM_S390_MEM_OP, &ksmo);
Petr Tesarik 4d198f
+	rv = ERR_MOP(t.vcpu, SIDA, READ, mem1, 8, GADDR(0), SIDA_OFFSET(0x1c0));
Petr Tesarik 4d198f
 	TEST_ASSERT(rv == -1 && errno == EINVAL,
Petr Tesarik 4d198f
 		    "ioctl does not reject SIDA_READ in non-protected mode");
Petr Tesarik 4d198f
-	ksmo.op = KVM_S390_MEMOP_SIDA_WRITE;
Petr Tesarik 4d198f
-	rv = _vcpu_ioctl(t.kvm_vm, VCPU_ID, KVM_S390_MEM_OP, &ksmo);
Petr Tesarik 4d198f
+	rv = ERR_MOP(t.vcpu, SIDA, WRITE, mem1, 8, GADDR(0), SIDA_OFFSET(0x1c0));
Petr Tesarik 4d198f
 	TEST_ASSERT(rv == -1 && errno == EINVAL,
Petr Tesarik 4d198f
 		    "ioctl does not reject SIDA_WRITE in non-protected mode");
Petr Tesarik 4d198f