From: Nico Boehr <nrb@linux.ibm.com>
To: frankja@linux.ibm.com, imbrenda@linux.ibm.com, thuth@redhat.com
Cc: kvm@vger.kernel.org, linux-s390@vger.kernel.org
Subject: [kvm-unit-tests PATCH v2 6/6] s390x: add a test for SIE without MSO/MSL
Date: Tue, 16 May 2023 15:04:56 +0200 [thread overview]
Message-ID: <20230516130456.256205-7-nrb@linux.ibm.com> (raw)
In-Reply-To: <20230516130456.256205-1-nrb@linux.ibm.com>
Since we now have the ability to run guests without MSO/MSL, add a test
to make sure this doesn't break.
Signed-off-by: Nico Boehr <nrb@linux.ibm.com>
---
s390x/Makefile | 2 +
s390x/sie-dat.c | 120 +++++++++++++++++++++++++++++++++++++
s390x/snippets/c/sie-dat.c | 58 ++++++++++++++++++
s390x/unittests.cfg | 3 +
4 files changed, 183 insertions(+)
create mode 100644 s390x/sie-dat.c
create mode 100644 s390x/snippets/c/sie-dat.c
diff --git a/s390x/Makefile b/s390x/Makefile
index a80db538810e..4921669ee4c3 100644
--- a/s390x/Makefile
+++ b/s390x/Makefile
@@ -40,6 +40,7 @@ tests += $(TEST_DIR)/panic-loop-pgm.elf
tests += $(TEST_DIR)/migration-sck.elf
tests += $(TEST_DIR)/exittime.elf
tests += $(TEST_DIR)/ex.elf
+tests += $(TEST_DIR)/sie-dat.elf
pv-tests += $(TEST_DIR)/pv-diags.elf
@@ -120,6 +121,7 @@ snippet_lib = $(snippet_asmlib) lib/auxinfo.o
# perquisites (=guests) for the snippet hosts.
# $(TEST_DIR)/<snippet-host>.elf: snippets = $(SNIPPET_DIR)/<c/asm>/<snippet>.gbin
$(TEST_DIR)/mvpg-sie.elf: snippets = $(SNIPPET_DIR)/c/mvpg-snippet.gbin
+$(TEST_DIR)/sie-dat.elf: snippets = $(SNIPPET_DIR)/c/sie-dat.gbin
$(TEST_DIR)/spec_ex-sie.elf: snippets = $(SNIPPET_DIR)/c/spec_ex.gbin
$(TEST_DIR)/pv-diags.elf: pv-snippets += $(SNIPPET_DIR)/asm/snippet-pv-diag-yield.gbin
diff --git a/s390x/sie-dat.c b/s390x/sie-dat.c
new file mode 100644
index 000000000000..c490a2aa825c
--- /dev/null
+++ b/s390x/sie-dat.c
@@ -0,0 +1,120 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Tests SIE with paging.
+ *
+ * Copyright 2023 IBM Corp.
+ *
+ * Authors:
+ * Nico Boehr <nrb@linux.ibm.com>
+ */
+#include <libcflat.h>
+#include <vmalloc.h>
+#include <asm/asm-offsets.h>
+#include <asm-generic/barrier.h>
+#include <asm/pgtable.h>
+#include <mmu.h>
+#include <asm/page.h>
+#include <asm/facility.h>
+#include <asm/interrupt.h>
+#include <asm/mem.h>
+#include <alloc_page.h>
+#include <sclp.h>
+#include <sie.h>
+#include <snippet.h>
+
+static struct vm vm;
+static pgd_t *guest_root;
+
+/* keep in sync with TEST_PAGE_COUNT in s390x/snippets/c/sie-dat.c */
+#define GUEST_TEST_PAGE_COUNT 10
+
+/* keep in sync with TOTAL_PAGE_COUNT in s390x/snippets/c/sie-dat.c */
+#define GUEST_TOTAL_PAGE_COUNT 256
+
+static void test_sie_dat(void)
+{
+ uint8_t r1;
+ bool contents_match;
+ uint64_t test_page_gpa, test_page_hpa;
+ uint8_t *test_page_hva;
+
+ /* guest will tell us the guest physical address of the test buffer */
+ sie(&vm);
+
+ r1 = (vm.sblk->ipa & 0xf0) >> 4;
+ test_page_gpa = vm.save_area.guest.grs[r1];
+ test_page_hpa = virt_to_pte_phys(guest_root, (void*)test_page_gpa);
+ test_page_hva = __va(test_page_hpa);
+ report(vm.sblk->icptcode == ICPT_INST &&
+ (vm.sblk->ipa & 0xFF00) == 0x8300 && vm.sblk->ipb == 0x9c0000,
+ "test buffer gpa=0x%lx hva=%p", test_page_gpa, test_page_hva);
+
+ /* guest will now write to the test buffer and we verify the contents */
+ sie(&vm);
+ report(vm.sblk->icptcode == ICPT_INST &&
+ vm.sblk->ipa == 0x8300 && vm.sblk->ipb == 0x440000,
+ "guest wrote to test buffer");
+
+ contents_match = true;
+ for (unsigned int i = 0; i < GUEST_TEST_PAGE_COUNT; i++) {
+ uint8_t expected_val = 42 + i;
+ if (test_page_hva[i * PAGE_SIZE] != expected_val) {
+ report_fail("page %u mismatch actual_val=%x expected_val=%x",
+ i, test_page_hva[i], expected_val);
+ contents_match = false;
+ }
+ }
+ report(contents_match, "test buffer contents match");
+
+ /* the guest will now write to an unmapped address and we check that this causes a segment translation exception */
+ report_prefix_push("guest write to unmapped");
+ expect_pgm_int();
+ sie(&vm);
+ check_pgm_int_code(PGM_INT_CODE_SEGMENT_TRANSLATION);
+ report_prefix_pop();
+}
+
+static void setup_guest(void)
+{
+ extern const char SNIPPET_NAME_START(c, sie_dat)[];
+ extern const char SNIPPET_NAME_END(c, sie_dat)[];
+ uint64_t guest_max_addr;
+
+ setup_vm();
+ snippet_setup_guest(&vm, false);
+
+ /* allocate a region-1 table */
+ guest_root = pgd_alloc_one();
+
+ /* map guest memory 1:1 */
+ guest_max_addr = GUEST_TOTAL_PAGE_COUNT * PAGE_SIZE;
+ for (uint64_t i = 0; i < guest_max_addr; i += PAGE_SIZE)
+ install_page(guest_root, __pa(vm.guest_mem + i), (void *)i);
+
+ /* set up storage limit supression - leave mso and msl intact they are ignored anyways */
+ vm.sblk->cpuflags |= CPUSTAT_SM;
+
+ /* set up the guest asce */
+ vm.save_area.guest.asce = __pa(guest_root) | ASCE_DT_REGION1 | REGION_TABLE_LENGTH;
+
+ snippet_init(&vm, SNIPPET_NAME_START(c, sie_dat),
+ SNIPPET_LEN(c, sie_dat), SNIPPET_UNPACK_OFF);
+}
+
+int main(void)
+{
+ report_prefix_push("sie-dat");
+ if (!sclp_facilities.has_sief2) {
+ report_skip("SIEF2 facility unavailable");
+ goto done;
+ }
+
+ setup_guest();
+ test_sie_dat();
+ sie_guest_destroy(&vm);
+
+done:
+ report_prefix_pop();
+ return report_summary();
+
+}
diff --git a/s390x/snippets/c/sie-dat.c b/s390x/snippets/c/sie-dat.c
new file mode 100644
index 000000000000..e156d0c36c4c
--- /dev/null
+++ b/s390x/snippets/c/sie-dat.c
@@ -0,0 +1,58 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Snippet used by the sie-dat.c test to verify paging without MSO/MSL
+ *
+ * Copyright (c) 2023 IBM Corp
+ *
+ * Authors:
+ * Nico Boehr <nrb@linux.ibm.com>
+ */
+#include <stddef.h>
+#include <inttypes.h>
+#include <string.h>
+#include <asm-generic/page.h>
+
+/* keep in sync with GUEST_TEST_PAGE_COUNT in s390x/sie-dat.c */
+#define TEST_PAGE_COUNT 10
+static uint8_t test_page[TEST_PAGE_COUNT * PAGE_SIZE] __attribute__((__aligned__(PAGE_SIZE)));
+
+/* keep in sync with GUEST_TOTAL_PAGE_COUNT in s390x/sie-dat.c */
+#define TOTAL_PAGE_COUNT 256
+
+static inline void force_exit(void)
+{
+ asm volatile("diag 0,0,0x44\n");
+}
+
+static inline void force_exit_value(uint64_t val)
+{
+ asm volatile(
+ "diag %[val],0,0x9c\n"
+ : : [val] "d"(val)
+ );
+}
+
+__attribute__((section(".text"))) int main(void)
+{
+ uint8_t *invalid_ptr;
+
+ memset(test_page, 0, sizeof(test_page));
+ /* tell the host the page's physical address (we're running DAT off) */
+ force_exit_value((uint64_t)test_page);
+
+ /* write some value to the page so the host can verify it */
+ for (size_t i = 0; i < TEST_PAGE_COUNT; i++)
+ test_page[i * PAGE_SIZE] = 42 + i;
+
+ /* indicate we've written all pages */
+ force_exit();
+
+ /* the first unmapped address */
+ invalid_ptr = (uint8_t *)(TOTAL_PAGE_COUNT * PAGE_SIZE);
+ *invalid_ptr = 42;
+
+ /* indicate we've written the non-allowed page (should never get here) */
+ force_exit();
+
+ return 0;
+}
diff --git a/s390x/unittests.cfg b/s390x/unittests.cfg
index b61faf0737c3..24cd27202a08 100644
--- a/s390x/unittests.cfg
+++ b/s390x/unittests.cfg
@@ -218,3 +218,6 @@ extra_params = -append '--parallel'
[execute]
file = ex.elf
+
+[sie-dat]
+file = sie-dat.elf
--
2.39.1
prev parent reply other threads:[~2023-05-16 13:06 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-05-16 13:04 [kvm-unit-tests PATCH v2 0/6] s390x: Add support for running guests without MSO/MSL Nico Boehr
2023-05-16 13:04 ` [kvm-unit-tests PATCH v2 1/6] s390x: add function to set DAT mode for all interrupts Nico Boehr
2023-05-16 17:17 ` Claudio Imbrenda
2023-05-17 12:25 ` Nico Boehr
2023-05-17 13:04 ` Claudio Imbrenda
2023-05-16 13:04 ` [kvm-unit-tests PATCH v2 2/6] s390x: sie: switch to home space mode before entering SIE Nico Boehr
2023-05-16 17:22 ` Claudio Imbrenda
2023-05-17 12:44 ` Nico Boehr
2023-05-16 13:04 ` [kvm-unit-tests PATCH v2 3/6] s390x: lib: don't forward PSW when handling exception in SIE Nico Boehr
2023-05-16 13:04 ` [kvm-unit-tests PATCH v2 4/6] s390x: fix compile of interrupt.c Nico Boehr
2023-05-16 17:24 ` Claudio Imbrenda
2023-05-16 13:04 ` [kvm-unit-tests PATCH v2 5/6] s390x: lib: sie: don't reenter SIE on pgm int Nico Boehr
2023-05-16 17:30 ` Claudio Imbrenda
2023-05-17 12:52 ` Nico Boehr
2023-05-16 13:04 ` Nico Boehr [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230516130456.256205-7-nrb@linux.ibm.com \
--to=nrb@linux.ibm.com \
--cc=frankja@linux.ibm.com \
--cc=imbrenda@linux.ibm.com \
--cc=kvm@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=thuth@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.