On 7/22/21 11:28 AM, Thomas Huth wrote: > 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. I think it should be, we don't print in arch_def.h and that's usually the biggest problem for snippets. But even if it doesn't work we can still use GEN_LC_PGM_NEW_PSW from asm-offsets.h > >> + 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? If I remember correctly then the odd address would be a late exception and an invalid mask is an early exception. The whole topic of PSW exceptions is rather complex especially if you add the instructions that change the PSW into the consideration. > >> + asm volatile ("lpsw %0" :: "Q"(bad_psw)); >> + return 0; >> +} > > Thomas >