Re: [kvm-unit-tests PATCH v2 2/2] s390x: Add specification exception interception test

Janis Schoetterl-Glausch
2021-10-05T14:13:58Z

On 10/5/21 3:09 PM, Claudio Imbrenda wrote:
> On Tue, 5 Oct 2021 11:11:53 +0200
> Janis Schoetterl-Glausch <scgl@linux.ibm.com> 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@linux.ibm.com>
>> ---
>> s390x/Makefile | 2 +
>> lib/s390x/sie.h | 1 +
>> s390x/snippets/c/spec_ex.c | 20 +++++++++
>> s390x/spec_ex-sie.c | 83 ++++++++++++++++++++++++++++++++++++++
>> s390x/unittests.cfg | 3 ++
>> 5 files changed, 109 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 ef8041a..7198882 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),)
>> @@ -85,6 +86,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 ca514ef..7ef7251 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..bdba4f4
>> --- /dev/null
>> +++ b/s390x/snippets/c/spec_ex.c
>> @@ -0,0 +1,20 @@
>> +// SPDX-License-Identifier: GPL-2.0-only
>> +/*
>> + * © Copyright IBM Corp. 2021
>> + *
>> + * Snippet used by specification exception interception test.
>> + */
>> +#include <stdint.h>
>> +#include <asm/arch_def.h>
>> +
>> +__attribute__((section(".text"))) int main(void)
>> +{
>> + struct lowcore *lowcore = (struct lowcore *) 0;
>> + uint64_t bad_psw = 0;
>> +
>> + /* PSW bit 12 has no name or meaning and must be 0 */
>> + lowcore->pgm_new_psw.mask = 1UL << (63 - 12);
>
> you can use the BIT or BIT_ULL macro
>
>> + lowcore->pgm_new_psw.addr = 0xdeadbeee;
>
> if the system is broken, it might actually jump at that address; in
> that case, will the test fail?

Broken how? If interpretation is overzealous the test might hang. …