Upon migration, we expect storage keys set by the guest to be preserved, so add a test for it. We keep 128 pages and set predictable storage keys. Then, we migrate and check that they can be read back and match the value originally set. Signed-off-by: Nico Boehr <nrb@xxxxxxxxxxxxx> Reviewed-by: Claudio Imbrenda <imbrenda@xxxxxxxxxxxxx> Reviewed-by: Thomas Huth <thuth@xxxxxxxxxx> --- s390x/Makefile | 1 + s390x/migration-skey.c | 73 ++++++++++++++++++++++++++++++++++++++++++ s390x/unittests.cfg | 4 +++ 3 files changed, 78 insertions(+) create mode 100644 s390x/migration-skey.c diff --git a/s390x/Makefile b/s390x/Makefile index 25802428fa13..94fc5c1a3527 100644 --- a/s390x/Makefile +++ b/s390x/Makefile @@ -33,6 +33,7 @@ tests += $(TEST_DIR)/adtl-status.elf tests += $(TEST_DIR)/migration.elf tests += $(TEST_DIR)/pv-attest.elf tests += $(TEST_DIR)/migration-cmm.elf +tests += $(TEST_DIR)/migration-skey.elf pv-tests += $(TEST_DIR)/pv-diags.elf diff --git a/s390x/migration-skey.c b/s390x/migration-skey.c new file mode 100644 index 000000000000..323aa83202bb --- /dev/null +++ b/s390x/migration-skey.c @@ -0,0 +1,73 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Storage Key migration tests + * + * Copyright IBM Corp. 2022 + * + * Authors: + * Nico Boehr <nrb@xxxxxxxxxxxxx> + */ + +#include <libcflat.h> +#include <asm/facility.h> +#include <asm/page.h> +#include <asm/mem.h> +#include <asm/interrupt.h> +#include <hardware.h> + +#define NUM_PAGES 128 +static uint8_t pagebuf[NUM_PAGES][PAGE_SIZE] __attribute__((aligned(PAGE_SIZE))); + +static void test_migration(void) +{ + union skey expected_key, actual_key; + int i, key_to_set; + + for (i = 0; i < NUM_PAGES; i++) { + /* + * Storage keys are 7 bit, lowest bit is always returned as zero + * by iske + */ + key_to_set = i * 2; + set_storage_key(pagebuf[i], key_to_set, 1); + } + + puts("Please migrate me, then press return\n"); + (void)getchar(); + + for (i = 0; i < NUM_PAGES; i++) { + report_prefix_pushf("page %d", i); + + actual_key.val = get_storage_key(pagebuf[i]); + expected_key.val = i * 2; + + /* ignore reference bit */ + actual_key.str.rf = 0; + expected_key.str.rf = 0; + + report(actual_key.val == expected_key.val, "expected_key=0x%x actual_key=0x%x", expected_key.val, actual_key.val); + + report_prefix_pop(); + } +} + +int main(void) +{ + report_prefix_push("migration-skey"); + if (test_facility(169)) { + report_skip("storage key removal facility is active"); + + /* + * If we just exit and don't ask migrate_cmd to migrate us, it + * will just hang forever. Hence, also ask for migration when we + * skip this test altogether. + */ + puts("Please migrate me, then press return\n"); + (void)getchar(); + } else { + test_migration(); + } + + report_prefix_pop(); + return report_summary(); +} diff --git a/s390x/unittests.cfg b/s390x/unittests.cfg index 9b97d0471bcf..8e52f560bb1e 100644 --- a/s390x/unittests.cfg +++ b/s390x/unittests.cfg @@ -180,3 +180,7 @@ smp = 2 [migration-cmm] file = migration-cmm.elf groups = migration + +[migration-skey] +file = migration-skey.elf +groups = migration -- 2.36.1