On 06/07/2021 13.57, Janis Schoetterl-Glausch wrote:
Check that specification exceptions cause intercepts when
specification exception interpretation is off.
Check that specification exceptions caused by program new PSWs
cause interceptions.
We cannot assert that non program new PSW specification exceptions
are interpreted because whether interpretation occurs or not is
configuration dependent.
Signed-off-by: Janis Schoetterl-Glausch <scgl@xxxxxxxxxxxxx>
---
The patch is based on the following patch sets by Janosch:
[kvm-unit-tests PATCH 0/5] s390x: sie and uv cleanups
[kvm-unit-tests PATCH v2 0/3] s390x: Add snippet support
s390x/Makefile | 2 +
lib/s390x/sie.h | 1 +
s390x/snippets/c/spec_ex.c | 13 ++++++
s390x/spec_ex-sie.c | 91 ++++++++++++++++++++++++++++++++++++++
s390x/unittests.cfg | 3 ++
5 files changed, 110 insertions(+)
create mode 100644 s390x/snippets/c/spec_ex.c
create mode 100644 s390x/spec_ex-sie.c
diff --git a/s390x/Makefile b/s390x/Makefile
index 07af26d..b1b6536 100644
--- a/s390x/Makefile
+++ b/s390x/Makefile
@@ -24,6 +24,7 @@ tests += $(TEST_DIR)/mvpg.elf
tests += $(TEST_DIR)/uv-host.elf
tests += $(TEST_DIR)/edat.elf
tests += $(TEST_DIR)/mvpg-sie.elf
+tests += $(TEST_DIR)/spec_ex-sie.elf
tests_binary = $(patsubst %.elf,%.bin,$(tests))
ifneq ($(HOST_KEY_DOCUMENT),)
@@ -84,6 +85,7 @@ snippet_asmlib = $(SNIPPET_DIR)/c/cstart.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)/spec_ex-sie.elf: snippets = $(SNIPPET_DIR)/c/spec_ex.gbin
$(SNIPPET_DIR)/asm/%.gbin: $(SNIPPET_DIR)/asm/%.o $(FLATLIBS)
$(OBJCOPY) -O binary $(patsubst %.gbin,%.o,$@) $@
diff --git a/lib/s390x/sie.h b/lib/s390x/sie.h
index 6ba858a..a3b8623 100644
--- a/lib/s390x/sie.h
+++ b/lib/s390x/sie.h
@@ -98,6 +98,7 @@ struct kvm_s390_sie_block {
uint8_t fpf; /* 0x0060 */
#define ECB_GS 0x40
#define ECB_TE 0x10
+#define ECB_SPECI 0x08
#define ECB_SRSI 0x04
#define ECB_HOSTPROTINT 0x02
uint8_t ecb; /* 0x0061 */
diff --git a/s390x/snippets/c/spec_ex.c b/s390x/snippets/c/spec_ex.c
new file mode 100644
index 0000000..f2daab5
--- /dev/null
+++ b/s390x/snippets/c/spec_ex.c
Please add a short header comment with the basic idea here + license
information (e.g. SPDX identifier). Also in the other new file that you
introduce in this patch.
@@ -0,0 +1,13 @@
+#include <stdint.h>
+#include <asm/arch_def.h>
+
+__attribute__((section(".text"))) int main(void)
+{
+ uint64_t bad_psw = 0;
+ struct psw *pgm_new = (struct psw *)464;
Is it possible to use the lib/s390x/asm/arch_def.h in snippets? If so, I'd
vote for using &lowcore->pgm_new_psw instead of the magic number 464.
+ pgm_new->mask = 1UL << (63 - 12); //invalid program new PSW
Please add a space after the //
(also in the other spots in this patch)
+ pgm_new->addr = 0xdeadbeef;
Are we testing the mask or the addr here? If we're testing the mask, I'd
rather use an even addr here to make sure that we do not trap because of the
uneven address. Or do we just don't care?
+ asm volatile ("lpsw %0" :: "Q"(bad_psw));
+ return 0;
+}
Thomas