[PATCH v1 5/5] KVM: s390: selftests: Add regression tests for PLO subfunctions
From: Hariharan Mari
Date: Mon Aug 19 2024 - 10:02:22 EST
Extend the existing regression test framework for s390x CPU subfunctions
to include tests for the Perform Locked Operation (PLO) subfunction
functions.
PLO was introduced in the very first 64-bit machine generation.
Hence it is assumed PLO is always installed in the Z Arch.
The test procedure follows the established pattern.
Suggested-by: Janosch Frank <frankja@xxxxxxxxxxxxx>
Signed-off-by: Hariharan Mari <hari55@xxxxxxxxxxxxx>
Reviewed-by: Janosch Frank <frankja@xxxxxxxxxxxxx>
---
.../kvm/s390x/cpumodel_subfuncs_test.c | 36 ++++++++++++++++++-
1 file changed, 35 insertions(+), 1 deletion(-)
diff --git a/tools/testing/selftests/kvm/s390x/cpumodel_subfuncs_test.c b/tools/testing/selftests/kvm/s390x/cpumodel_subfuncs_test.c
index 901c99fe79d9..255984a52365 100644
--- a/tools/testing/selftests/kvm/s390x/cpumodel_subfuncs_test.c
+++ b/tools/testing/selftests/kvm/s390x/cpumodel_subfuncs_test.c
@@ -20,6 +20,8 @@
#include "kvm_util.h"
+#define U8_MAX ((u8)~0U)
+
/**
* Query available CPU subfunctions
*/
@@ -37,6 +39,33 @@ static void get_cpu_machine_subfuntions(struct kvm_vm *vm,
TEST_ASSERT(!r, "Get cpu subfunctions failed r=%d errno=%d", r, errno);
}
+static inline int plo_test_bit(unsigned char nr)
+{
+ unsigned long function = (unsigned long)nr | 0x100;
+ int cc;
+
+ asm volatile(" lgr 0,%[function]\n"
+ /* Parameter registers are ignored for "test bit" */
+ " plo 0,0,0,0(0)\n"
+ " ipm %0\n"
+ " srl %0,28\n"
+ : "=d" (cc)
+ : [function] "d" (function)
+ : "cc", "0");
+ return cc == 0;
+}
+
+/*
+ * Testing Perform Locked Operation (PLO) CPU subfunction's ASM block
+ */
+static void test_plo_asm_block(u8 (*query)[32])
+{
+ for (int i = 0; i <= U8_MAX; ++i) {
+ if (plo_test_bit(i))
+ (*query)[i >> 3] |= 0x80 >> (i & 7);
+ }
+}
+
/*
* Testing Crypto Compute Message Authentication Code (KMAC) CPU subfunction's
* ASM block
@@ -235,8 +264,13 @@ struct testdef {
u8 *subfunc_array;
size_t array_size;
testfunc_t test;
- bool facility_bit;
+ int facility_bit;
} testlist[] = {
+ /* PLO was introduced in the very first 64-bit machine generation.
+ * Hence it is assumed PLO is always installed in Z Arch .
+ */
+ { "PLO", cpu_subfunc.plo, sizeof(cpu_subfunc.plo),
+ test_plo_asm_block, 1 },
/* MSA - Facility bit 17 */
{ "KMAC", cpu_subfunc.kmac, sizeof(cpu_subfunc.kmac),
test_kmac_asm_block, 17 },
--
2.45.2