@@ -30,10 +30,11 @@ tests += $(TEST_DIR)/spec_ex-sie.elf
tests += $(TEST_DIR)/firq.elf
tests += $(TEST_DIR)/epsw.elf
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
+tests += $(TEST_DIR)/migration-gs.elf
+tests += $(TEST_DIR)/migration-vec.elf
pv-tests += $(TEST_DIR)/pv-diags.elf
new file mode 100644
@@ -0,0 +1,122 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * s390x Migration Test for Guarded-Storage Extension
+ *
+ * Copyright IBM Corp. 2022
+ *
+ * Authors:
+ * Nico Boehr <nrb@linux.ibm.com>
+ */
+#include <libcflat.h>
+#include <asm/arch_def.h>
+#include <asm/barrier.h>
+#include <asm/facility.h>
+#include <gs.h>
+#include <bitops.h>
+#include <smp.h>
+
+static struct gs_cb gs_cb;
+static struct gs_epl gs_epl;
+
+/* set by CPU1 to signal it has completed */
+static int flag_thread_complete;
+/* set by CPU0 to signal migration has completed */
+static int flag_migration_complete;
+
+static void write_gs_regs(void)
+{
+ const unsigned long gs_area = 0x2000000;
+ const unsigned long gsc = 25; /* align = 32 M, section size = 512K */
+
+ gs_cb.gsd = gs_area | gsc;
+ gs_cb.gssm = 0xfeedc0ffe;
+ gs_cb.gs_epl_a = (uint64_t) &gs_epl;
+
+ load_gs_cb(&gs_cb);
+}
+
+static void check_gs_regs(void)
+{
+ struct gs_cb gs_cb_after_migration;
+
+ store_gs_cb(&gs_cb_after_migration);
+
+ report_prefix_push("guarded-storage registers");
+
+ report(gs_cb_after_migration.gsd == gs_cb.gsd, "gsd matches");
+ report(gs_cb_after_migration.gssm == gs_cb.gssm, "gssm matches");
+ report(gs_cb_after_migration.gs_epl_a == gs_cb.gs_epl_a, "gs_epl_a matches");
+
+ report_prefix_pop();
+}
+
+static bool have_guarded_storage_facility(void)
+{
+ return test_facility(133);
+}
+
+static void test_func(void)
+{
+ if (have_guarded_storage_facility()) {
+ ctl_set_bit(2, CTL2_GUARDED_STORAGE);
+
+ write_gs_regs();
+ }
+
+ flag_thread_complete = 1;
+ while(!flag_migration_complete)
+ mb();
+
+ report_pass("Migrated");
+
+ if (have_guarded_storage_facility()) {
+ check_gs_regs();
+
+ report(stctg(2) & BIT(CTL2_GUARDED_STORAGE), "ctl2 guarded-storage bit set");
+
+ ctl_clear_bit(2, CTL2_GUARDED_STORAGE);
+ }
+
+ flag_thread_complete = 1;
+}
+
+int main(void)
+{
+ struct psw psw;
+
+ /* don't say migrate here otherwise we will migrate right away */
+ report_prefix_push("migration-gs");
+
+ if (smp_query_num_cpus() == 1) {
+ report_skip("need at least 2 cpus for this test");
+ goto done;
+ }
+
+ /* Second CPU does the actual tests */
+ psw.mask = extract_psw_mask();
+ psw.addr = (unsigned long)test_func;
+ smp_cpu_setup(1, psw);
+
+ /* wait for thread setup */
+ while(!flag_thread_complete)
+ mb();
+ flag_thread_complete = 0;
+
+ /* ask migrate_cmd to migrate (it listens for 'migrate') */
+ puts("Please migrate me, then press return\n");
+
+ /* wait for migration to finish, we will read a newline */
+ (void)getchar();
+
+ flag_migration_complete = 1;
+
+ /* wait for thread to complete assertions */
+ while(!flag_thread_complete)
+ mb();
+
+ smp_cpu_destroy(1);
+
+done:
+ report_prefix_pop();
+ return report_summary();
+}
similarity index 77%
rename from s390x/migration.c
rename to s390x/migration-vec.c
@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
- * Migration Test for s390x
+ * s390x Migration Test for Vector Extensions
*
* Copyright IBM Corp. 2022
*
@@ -12,55 +12,19 @@
#include <asm/vector.h>
#include <asm/barrier.h>
#include <asm/facility.h>
-#include <gs.h>
#include <bitops.h>
#include <smp.h>
-static struct gs_cb gs_cb;
-static struct gs_epl gs_epl;
-
/* set by CPU1 to signal it has completed */
static int flag_thread_complete;
/* set by CPU0 to signal migration has completed */
static int flag_migration_complete;
-static void write_gs_regs(void)
-{
- const unsigned long gs_area = 0x2000000;
- const unsigned long gsc = 25; /* align = 32 M, section size = 512K */
-
- gs_cb.gsd = gs_area | gsc;
- gs_cb.gssm = 0xfeedc0ffe;
- gs_cb.gs_epl_a = (uint64_t) &gs_epl;
-
- load_gs_cb(&gs_cb);
-}
-
-static void check_gs_regs(void)
-{
- struct gs_cb gs_cb_after_migration;
-
- store_gs_cb(&gs_cb_after_migration);
-
- report_prefix_push("guarded-storage registers");
-
- report(gs_cb_after_migration.gsd == gs_cb.gsd, "gsd matches");
- report(gs_cb_after_migration.gssm == gs_cb.gssm, "gssm matches");
- report(gs_cb_after_migration.gs_epl_a == gs_cb.gs_epl_a, "gs_epl_a matches");
-
- report_prefix_pop();
-}
-
static bool have_vector_facility(void)
{
return test_facility(129);
}
-static bool have_guarded_storage_facility(void)
-{
- return test_facility(133);
-}
-
static void test_func(void)
{
uint8_t expected_vec_contents[VEC_REGISTER_NUM][VEC_REGISTER_SIZE];
@@ -69,12 +33,6 @@ static void test_func(void)
int i;
int vec_result = 0;
- if (have_guarded_storage_facility()) {
- ctl_set_bit(2, CTL2_GUARDED_STORAGE);
-
- write_gs_regs();
- }
-
if (have_vector_facility()) {
for (i = 0; i < VEC_REGISTER_NUM; i++) {
vec_reg = &expected_vec_contents[i][0];
@@ -145,14 +103,6 @@ static void test_func(void)
report_pass("Migrated");
- if (have_guarded_storage_facility()) {
- check_gs_regs();
-
- report(stctg(2) & BIT(CTL2_GUARDED_STORAGE), "ctl2 guarded-storage bit set");
-
- ctl_clear_bit(2, CTL2_GUARDED_STORAGE);
- }
-
flag_thread_complete = 1;
}
@@ -161,7 +111,7 @@ int main(void)
struct psw psw;
/* don't say migrate here otherwise we will migrate right away */
- report_prefix_push("migration");
+ report_prefix_push("migration-vec");
if (smp_query_num_cpus() == 1) {
report_skip("need at least 2 cpus for this test");
@@ -172,11 +172,6 @@ smp = 2
accel = tcg
extra_params = -cpu qemu,gs=off,vx=off
-[migration]
-file = migration.elf
-groups = migration
-smp = 2
-
[migration-cmm]
file = migration-cmm.elf
groups = migration
@@ -184,3 +179,13 @@ groups = migration
[migration-skey]
file = migration-skey.elf
groups = migration
+
+[migration-gs]
+file = migration-gs.elf
+groups = migration
+smp = 2
+
+[migration-vec]
+file = migration-vec.elf
+groups = migration
+smp = 2
Since we now have a few more migration tests, let's split migration.c into two files for vector and gs facilities. Since guarded-storage and vector facilities can be en-/disabled independant of each other, this simplifies the code a bit and makes it clear what the scope of the tests is. Signed-off-by: Nico Boehr <nrb@linux.ibm.com> --- s390x/Makefile | 3 +- s390x/migration-gs.c | 122 +++++++++++++++++++++++++ s390x/{migration.c => migration-vec.c} | 54 +---------- s390x/unittests.cfg | 15 ++- 4 files changed, 136 insertions(+), 58 deletions(-) create mode 100644 s390x/migration-gs.c rename s390x/{migration.c => migration-vec.c} (77%)