* [kvm-unit-tests GIT PULL 00/14] s390x: new maintainer, refactor linker scripts, tests for misalignments, execute-type instructions and vSIE epdx
@ 2023-03-31 11:30 Nico Boehr
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 01/14] .gitignore: ignore `s390x/comm.key` file Nico Boehr
` (14 more replies)
0 siblings, 15 replies; 17+ messages in thread
From: Nico Boehr @ 2023-03-31 11:30 UTC (permalink / raw)
To: thuth, pbonzini, andrew.jones; +Cc: kvm, frankja, imbrenda
Hi Paolo and/or Thomas,
here comes the first pull request from me. :)
Changes in this pull request:
* Marc contributed a series with a few fixes. Most importantly, it generates
linker scripts for s390x with the assembler, permitting the use of defines in
linker scripts.
It is worth noting that it also touches lib/linux/const.h to check for
__ASSEMBLY__ and __ASSEMBLER__.
* Nina contributed quite a few tests for misalignments in various instructions.
As well as tests for execute-type instructions. Note that a few of her tests
will require recent QEMUs under TCG. Upstream fixes are available [1, 2].
* Thomas contributed a test for vSIE on s390x, where the g3 clock might
sometimes we wrong after reboot. A kernel patch is required[3].
* And, finally, the patch where I get the honor to work as maintainer.
MERGE: https://gitlab.com/kvm-unit-tests/kvm-unit-tests/-/merge_requests/42
PIPELINE: https://gitlab.com/Nico-Boehr/kvm-unit-tests/-/pipelines/824153766
PULL: https://gitlab.com/Nico-Boehr/kvm-unit-tests.git s390x-2023-03
[1] https://lists.gnu.org/archive/html/qemu-devel/2023-03/msg04860.html
[2] https://lists.gnu.org/archive/html/qemu-devel/2023-03/msg04896.html
[3] https://lore.kernel.org/kvm/20221123090833.292938-1-thuth@redhat.com/
The following changes since commit 42ff0bbcaa6863c755f9e333499448a1ea6e7239:
Add a proper LICENSE file (2023-03-31 10:45:22 +0200)
are available in the Git repository at:
https://gitlab.com/Nico-Boehr/kvm-unit-tests.git
for you to fetch changes up to 51bd40c5044bd2636346333be6cb2dffd45289f1:
s390x: sie: Test whether the epoch extension field is working as expected (2023-03-31 12:06:54 +0200)
----------------------------------------------------------------
Janosch Frank (1):
MAINTAINERS: Add Nico as s390x Maintainer and make Thomas reviewer
Marc Hartmayer (7):
.gitignore: ignore `s390x/comm.key` file
s390x/Makefile: simplify `%.hdr` target rules
s390x/Makefile: fix `*.gbin` target dependencies
s390x/Makefile: refactor CPPFLAGS
s390x: use preprocessor for linker script generation
s390x: define a macro for the stack frame size
lib/linux/const.h: test for `__ASSEMBLER__` as well
Nina Schoetterl-Glausch (5):
s390x/spec_ex: Use PSW macro
s390x/spec_ex: Add test introducing odd address into PSW
s390x/spec_ex: Add test of EXECUTE with odd target address
s390x: Add tests for execute-type instructions
s390x: spec_ex: Add test for misaligned load
Thomas Huth (1):
s390x: sie: Test whether the epoch extension field is working as
expected
MAINTAINERS | 3 +-
s390x/Makefile | 28 +--
lib/linux/const.h | 2 +-
lib/s390x/asm-offsets.c | 1 +
s390x/cstart64.S | 2 +-
s390x/{flat.lds => flat.lds.S} | 4 +-
s390x/macros.S | 4 +-
s390x/snippets/asm/{flat.lds => flat.lds.S} | 0
s390x/snippets/c/{flat.lds => flat.lds.S} | 6 +-
s390x/ex.c | 188 ++++++++++++++++++++
s390x/gs.c | 38 ++--
s390x/sie.c | 28 +++
s390x/spec_ex.c | 106 +++++++++--
s390x/unittests.cfg | 3 +
.gitignore | 2 +
.gitlab-ci.yml | 1 +
16 files changed, 370 insertions(+), 46 deletions(-)
rename s390x/{flat.lds => flat.lds.S} (93%)
rename s390x/snippets/asm/{flat.lds => flat.lds.S} (100%)
rename s390x/snippets/c/{flat.lds => flat.lds.S} (88%)
create mode 100644 s390x/ex.c
--
2.39.2
^ permalink raw reply [flat|nested] 17+ messages in thread
* [kvm-unit-tests GIT PULL 01/14] .gitignore: ignore `s390x/comm.key` file
2023-03-31 11:30 [kvm-unit-tests GIT PULL 00/14] s390x: new maintainer, refactor linker scripts, tests for misalignments, execute-type instructions and vSIE epdx Nico Boehr
@ 2023-03-31 11:30 ` Nico Boehr
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 02/14] s390x/Makefile: simplify `%.hdr` target rules Nico Boehr
` (13 subsequent siblings)
14 siblings, 0 replies; 17+ messages in thread
From: Nico Boehr @ 2023-03-31 11:30 UTC (permalink / raw)
To: thuth, pbonzini, andrew.jones; +Cc: kvm, frankja, imbrenda, Marc Hartmayer
From: Marc Hartmayer <mhartmay@linux.ibm.com>
Ignore the Secure Execution Customer Communication Key file.
Signed-off-by: Marc Hartmayer <mhartmay@linux.ibm.com>
Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
Reviewed-by: Nico Boehr <nrb@linux.ibm.com>
Link: https://lore.kernel.org/r/20230307091051.13945-2-mhartmay@linux.ibm.com
Signed-off-by: Nico Boehr <nrb@linux.ibm.com>
---
.gitignore | 1 +
1 file changed, 1 insertion(+)
diff --git a/.gitignore b/.gitignore
index 33529b6..601822d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -28,5 +28,6 @@ cscope.*
/s390x/*.bin
/s390x/snippets/*/*.gbin
/efi-tests/*
+/s390x/comm.key
/s390x/snippets/*/*.hdr
/s390x/snippets/*/*.*obj
--
2.39.2
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [kvm-unit-tests GIT PULL 02/14] s390x/Makefile: simplify `%.hdr` target rules
2023-03-31 11:30 [kvm-unit-tests GIT PULL 00/14] s390x: new maintainer, refactor linker scripts, tests for misalignments, execute-type instructions and vSIE epdx Nico Boehr
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 01/14] .gitignore: ignore `s390x/comm.key` file Nico Boehr
@ 2023-03-31 11:30 ` Nico Boehr
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 03/14] s390x/Makefile: fix `*.gbin` target dependencies Nico Boehr
` (12 subsequent siblings)
14 siblings, 0 replies; 17+ messages in thread
From: Nico Boehr @ 2023-03-31 11:30 UTC (permalink / raw)
To: thuth, pbonzini, andrew.jones; +Cc: kvm, frankja, imbrenda, Marc Hartmayer
From: Marc Hartmayer <mhartmay@linux.ibm.com>
Merge the two Makefile target rules `$(SNIPPET_DIR)/asm/%.hdr` and
`$(SNIPPET_DIR)/c/%.hdr` into one target rule.
Signed-off-by: Marc Hartmayer <mhartmay@linux.ibm.com>
Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
Link: https://lore.kernel.org/r/20230307091051.13945-3-mhartmay@linux.ibm.com
Signed-off-by: Nico Boehr <nrb@linux.ibm.com>
---
s390x/Makefile | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/s390x/Makefile b/s390x/Makefile
index 97a6161..660ff06 100644
--- a/s390x/Makefile
+++ b/s390x/Makefile
@@ -145,10 +145,7 @@ $(SNIPPET_DIR)/c/%.gbin: $(SNIPPET_DIR)/c/%.o $(snippet_lib) $(FLATLIBS)
$(OBJCOPY) -O binary -j ".rodata" -j ".lowcore" -j ".text" -j ".data" -j ".bss" --set-section-flags .bss=alloc,load,contents $@ $@
truncate -s '%4096' $@
-$(SNIPPET_DIR)/asm/%.hdr: $(SNIPPET_DIR)/asm/%.gbin $(HOST_KEY_DOCUMENT)
- $(GEN_SE_HEADER) -k $(HOST_KEY_DOCUMENT) -c $<,0x0,0x00000000000000420000000000000000 --psw-addr 0x4000 -o $@
-
-$(SNIPPET_DIR)/c/%.hdr: $(SNIPPET_DIR)/c/%.gbin $(HOST_KEY_DOCUMENT)
+%.hdr: %.gbin $(HOST_KEY_DOCUMENT)
$(GEN_SE_HEADER) -k $(HOST_KEY_DOCUMENT) -c $<,0x0,0x00000000000000420000000000000000 --psw-addr 0x4000 -o $@
.SECONDARY:
--
2.39.2
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [kvm-unit-tests GIT PULL 03/14] s390x/Makefile: fix `*.gbin` target dependencies
2023-03-31 11:30 [kvm-unit-tests GIT PULL 00/14] s390x: new maintainer, refactor linker scripts, tests for misalignments, execute-type instructions and vSIE epdx Nico Boehr
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 01/14] .gitignore: ignore `s390x/comm.key` file Nico Boehr
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 02/14] s390x/Makefile: simplify `%.hdr` target rules Nico Boehr
@ 2023-03-31 11:30 ` Nico Boehr
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 04/14] s390x/Makefile: refactor CPPFLAGS Nico Boehr
` (11 subsequent siblings)
14 siblings, 0 replies; 17+ messages in thread
From: Nico Boehr @ 2023-03-31 11:30 UTC (permalink / raw)
To: thuth, pbonzini, andrew.jones; +Cc: kvm, frankja, imbrenda, Marc Hartmayer
From: Marc Hartmayer <mhartmay@linux.ibm.com>
If the linker scripts change, then the .gbin binaries must be rebuilt.
While at it, replace `$(SRCDIR)/s390x/snippets` with `$(SNIPPET_DIR)`
for these Makefile rules.
Signed-off-by: Marc Hartmayer <mhartmay@linux.ibm.com>
Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
Link: https://lore.kernel.org/r/20230307091051.13945-4-mhartmay@linux.ibm.com
Signed-off-by: Nico Boehr <nrb@linux.ibm.com>
---
s390x/Makefile | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/s390x/Makefile b/s390x/Makefile
index 660ff06..71e6563 100644
--- a/s390x/Makefile
+++ b/s390x/Makefile
@@ -135,13 +135,13 @@ $(SNIPPET_DIR)/asm/%.o: $(SNIPPET_DIR)/asm/%.S $(asm-offsets)
$(SNIPPET_DIR)/c/%.o: $(SNIPPET_DIR)/c/%.c $(asm-offsets)
$(CC) $(CFLAGS) -c -nostdlib -o $@ $<
-$(SNIPPET_DIR)/asm/%.gbin: $(SNIPPET_DIR)/asm/%.o
- $(CC) $(LDFLAGS) -o $@ -T $(SRCDIR)/s390x/snippets/asm/flat.lds $<
+$(SNIPPET_DIR)/asm/%.gbin: $(SNIPPET_DIR)/asm/%.o $(SNIPPET_DIR)/asm/flat.lds
+ $(CC) $(LDFLAGS) -o $@ -T $(SNIPPET_DIR)/asm/flat.lds $<
$(OBJCOPY) -O binary -j ".rodata" -j ".lowcore" -j ".text" -j ".data" -j ".bss" --set-section-flags .bss=alloc,load,contents $@ $@
truncate -s '%4096' $@
-$(SNIPPET_DIR)/c/%.gbin: $(SNIPPET_DIR)/c/%.o $(snippet_lib) $(FLATLIBS)
- $(CC) $(LDFLAGS) -o $@ -T $(SRCDIR)/s390x/snippets/c/flat.lds $< $(snippet_lib) $(FLATLIBS)
+$(SNIPPET_DIR)/c/%.gbin: $(SNIPPET_DIR)/c/%.o $(snippet_lib) $(FLATLIBS) $(SNIPPET_DIR)/c/flat.lds
+ $(CC) $(LDFLAGS) -o $@ -T $(SNIPPET_DIR)/c/flat.lds $< $(snippet_lib) $(FLATLIBS)
$(OBJCOPY) -O binary -j ".rodata" -j ".lowcore" -j ".text" -j ".data" -j ".bss" --set-section-flags .bss=alloc,load,contents $@ $@
truncate -s '%4096' $@
--
2.39.2
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [kvm-unit-tests GIT PULL 04/14] s390x/Makefile: refactor CPPFLAGS
2023-03-31 11:30 [kvm-unit-tests GIT PULL 00/14] s390x: new maintainer, refactor linker scripts, tests for misalignments, execute-type instructions and vSIE epdx Nico Boehr
` (2 preceding siblings ...)
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 03/14] s390x/Makefile: fix `*.gbin` target dependencies Nico Boehr
@ 2023-03-31 11:30 ` Nico Boehr
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 05/14] s390x: use preprocessor for linker script generation Nico Boehr
` (10 subsequent siblings)
14 siblings, 0 replies; 17+ messages in thread
From: Nico Boehr @ 2023-03-31 11:30 UTC (permalink / raw)
To: thuth, pbonzini, andrew.jones; +Cc: kvm, frankja, imbrenda, Marc Hartmayer
From: Marc Hartmayer <mhartmay@linux.ibm.com>
This change makes it easier to reuse them. While at it, add a comment
why the `lib` include path is required.
Signed-off-by: Marc Hartmayer <mhartmay@linux.ibm.com>
Link: https://lore.kernel.org/r/20230331082709.35955-1-mhartmay@linux.ibm.com
[ nrb: remove trailing space after INCLUDE_PATHS ]
Signed-off-by: Nico Boehr <nrb@linux.ibm.com>
Reviewed-by: Nico Boehr <nrb@linux.ibm.com>
Tested-by: Nico Boehr <nrb@linux.ibm.com>
---
s390x/Makefile | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/s390x/Makefile b/s390x/Makefile
index 71e6563..50171f3 100644
--- a/s390x/Makefile
+++ b/s390x/Makefile
@@ -63,9 +63,14 @@ test_cases: $(tests)
test_cases_binary: $(tests_binary)
test_cases_pv: $(tests_pv_binary)
+INCLUDE_PATHS = $(SRCDIR)/lib $(SRCDIR)/lib/s390x
+# Include generated header files (e.g. in case of out-of-source builds)
+INCLUDE_PATHS += lib
+CPPFLAGS = $(addprefix -I,$(INCLUDE_PATHS))
+
CFLAGS += -std=gnu99
CFLAGS += -ffreestanding
-CFLAGS += -I $(SRCDIR)/lib -I $(SRCDIR)/lib/s390x -I lib
+CFLAGS += $(CPPFLAGS)
CFLAGS += -O2
CFLAGS += -march=zEC12
CFLAGS += -mbackchain
--
2.39.2
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [kvm-unit-tests GIT PULL 05/14] s390x: use preprocessor for linker script generation
2023-03-31 11:30 [kvm-unit-tests GIT PULL 00/14] s390x: new maintainer, refactor linker scripts, tests for misalignments, execute-type instructions and vSIE epdx Nico Boehr
` (3 preceding siblings ...)
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 04/14] s390x/Makefile: refactor CPPFLAGS Nico Boehr
@ 2023-03-31 11:30 ` Nico Boehr
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 06/14] s390x: define a macro for the stack frame size Nico Boehr
` (9 subsequent siblings)
14 siblings, 0 replies; 17+ messages in thread
From: Nico Boehr @ 2023-03-31 11:30 UTC (permalink / raw)
To: thuth, pbonzini, andrew.jones
Cc: kvm, frankja, imbrenda, Marc Hartmayer, Nina Schoetterl-Glausch
From: Marc Hartmayer <mhartmay@linux.ibm.com>
The old `.lds` scripts are being renamed to `.lds.S` and the actual
`.lds` scripts are being generated by the assembler preprocessor. This
change allows us to use constants defined by macros in the `.lds.S`
files.
Signed-off-by: Marc Hartmayer <mhartmay@linux.ibm.com>
Reviewed-by: Nina Schoetterl-Glausch <nsg@linux.ibm.com>
Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Link: https://lore.kernel.org/r/20230307091051.13945-6-mhartmay@linux.ibm.com
Signed-off-by: Nico Boehr <nrb@linux.ibm.com>
---
s390x/Makefile | 7 +++++--
s390x/{flat.lds => flat.lds.S} | 0
s390x/snippets/asm/{flat.lds => flat.lds.S} | 0
s390x/snippets/c/{flat.lds => flat.lds.S} | 0
.gitignore | 1 +
5 files changed, 6 insertions(+), 2 deletions(-)
rename s390x/{flat.lds => flat.lds.S} (100%)
rename s390x/snippets/asm/{flat.lds => flat.lds.S} (100%)
rename s390x/snippets/c/{flat.lds => flat.lds.S} (100%)
diff --git a/s390x/Makefile b/s390x/Makefile
index 50171f3..6732b48 100644
--- a/s390x/Makefile
+++ b/s390x/Makefile
@@ -78,7 +78,7 @@ CFLAGS += -fno-delete-null-pointer-checks
LDFLAGS += -nostdlib -Wl,--build-id=none
# We want to keep intermediate files
-.PRECIOUS: %.o
+.PRECIOUS: %.o %.lds
asm-offsets = lib/$(ARCH)/asm-offsets.h
include $(SRCDIR)/scripts/asm-offsets.mak
@@ -161,6 +161,9 @@ $(SNIPPET_DIR)/c/%.gbin: $(SNIPPET_DIR)/c/%.o $(snippet_lib) $(FLATLIBS) $(SNIPP
%.hdr.obj: %.hdr
$(OBJCOPY) -I binary -O elf64-s390 -B "s390:64-bit" $< $@
+lds-autodepend-flags = -MMD -MF $(dir $*).$(notdir $*).d -MT $@
+%.lds: %.lds.S
+ $(CPP) $(lds-autodepend-flags) $(CPPFLAGS) -P -C -o $@ $<
.SECONDEXPANSION:
%.elf: $(FLATLIBS) $(asmlib) $(SRCDIR)/s390x/flat.lds $$(snippets-obj) $$(snippet-hdr-obj) %.o
@@ -213,7 +216,7 @@ $(snippet_asmlib): $$(patsubst %.o,%.S,$$@) $(asm-offsets)
arch_clean: asm_offsets_clean
- $(RM) $(TEST_DIR)/*.{o,elf,bin} $(SNIPPET_DIR)/*/*.{o,elf,*bin,*obj,hdr} $(SNIPPET_DIR)/asm/.*.d $(TEST_DIR)/.*.d lib/s390x/.*.d $(comm-key)
+ $(RM) $(TEST_DIR)/*.{o,elf,bin,lds} $(SNIPPET_DIR)/*/*.{o,elf,*bin,*obj,hdr,lds} $(SNIPPET_DIR)/asm/.*.d $(TEST_DIR)/.*.d lib/s390x/.*.d $(comm-key)
generated-files = $(asm-offsets)
$(tests:.elf=.o) $(asmlib) $(cflatobjs): $(generated-files)
diff --git a/s390x/flat.lds b/s390x/flat.lds.S
similarity index 100%
rename from s390x/flat.lds
rename to s390x/flat.lds.S
diff --git a/s390x/snippets/asm/flat.lds b/s390x/snippets/asm/flat.lds.S
similarity index 100%
rename from s390x/snippets/asm/flat.lds
rename to s390x/snippets/asm/flat.lds.S
diff --git a/s390x/snippets/c/flat.lds b/s390x/snippets/c/flat.lds.S
similarity index 100%
rename from s390x/snippets/c/flat.lds
rename to s390x/snippets/c/flat.lds.S
diff --git a/.gitignore b/.gitignore
index 601822d..29f352c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -31,3 +31,4 @@ cscope.*
/s390x/comm.key
/s390x/snippets/*/*.hdr
/s390x/snippets/*/*.*obj
+/s390x/**/*.lds
--
2.39.2
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [kvm-unit-tests GIT PULL 06/14] s390x: define a macro for the stack frame size
2023-03-31 11:30 [kvm-unit-tests GIT PULL 00/14] s390x: new maintainer, refactor linker scripts, tests for misalignments, execute-type instructions and vSIE epdx Nico Boehr
` (4 preceding siblings ...)
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 05/14] s390x: use preprocessor for linker script generation Nico Boehr
@ 2023-03-31 11:30 ` Nico Boehr
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 07/14] lib/linux/const.h: test for `__ASSEMBLER__` as well Nico Boehr
` (8 subsequent siblings)
14 siblings, 0 replies; 17+ messages in thread
From: Nico Boehr @ 2023-03-31 11:30 UTC (permalink / raw)
To: thuth, pbonzini, andrew.jones
Cc: kvm, frankja, imbrenda, Marc Hartmayer, Nina Schoetterl-Glausch
From: Marc Hartmayer <mhartmay@linux.ibm.com>
Define and use a macro for the stack frame size. While at it, fix
whitespace in the `gs_handler_asm` block.
Signed-off-by: Marc Hartmayer <mhartmay@linux.ibm.com>
Co-developed-by: Nina Schoetterl-Glausch <nsg@linux.ibm.com>
Reviewed-by: Nina Schoetterl-Glausch <nsg@linux.ibm.com>
Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Link: https://lore.kernel.org/r/20230307091051.13945-7-mhartmay@linux.ibm.com
Signed-off-by: Nico Boehr <nrb@linux.ibm.com>
---
s390x/Makefile | 2 +-
lib/s390x/asm-offsets.c | 1 +
s390x/cstart64.S | 2 +-
s390x/flat.lds.S | 4 +++-
s390x/macros.S | 4 ++--
s390x/snippets/c/flat.lds.S | 6 ++++--
s390x/gs.c | 38 +++++++++++++++++++++----------------
7 files changed, 34 insertions(+), 23 deletions(-)
diff --git a/s390x/Makefile b/s390x/Makefile
index 6732b48..ab146eb 100644
--- a/s390x/Makefile
+++ b/s390x/Makefile
@@ -162,7 +162,7 @@ $(SNIPPET_DIR)/c/%.gbin: $(SNIPPET_DIR)/c/%.o $(snippet_lib) $(FLATLIBS) $(SNIPP
$(OBJCOPY) -I binary -O elf64-s390 -B "s390:64-bit" $< $@
lds-autodepend-flags = -MMD -MF $(dir $*).$(notdir $*).d -MT $@
-%.lds: %.lds.S
+%.lds: %.lds.S $(asm-offsets)
$(CPP) $(lds-autodepend-flags) $(CPPFLAGS) -P -C -o $@ $<
.SECONDEXPANSION:
diff --git a/lib/s390x/asm-offsets.c b/lib/s390x/asm-offsets.c
index f612f32..188dd2e 100644
--- a/lib/s390x/asm-offsets.c
+++ b/lib/s390x/asm-offsets.c
@@ -87,6 +87,7 @@ int main(void)
OFFSET(STACK_FRAME_INT_GRS0, stack_frame_int, grs0);
OFFSET(STACK_FRAME_INT_GRS1, stack_frame_int, grs1);
DEFINE(STACK_FRAME_INT_SIZE, sizeof(struct stack_frame_int));
+ DEFINE(STACK_FRAME_SIZE, sizeof(struct stack_frame));
return 0;
}
diff --git a/s390x/cstart64.S b/s390x/cstart64.S
index 6f83da2..468ace3 100644
--- a/s390x/cstart64.S
+++ b/s390x/cstart64.S
@@ -38,7 +38,7 @@ start:
/* setup stack */
larl %r15, stackptr
/* Clear first stack frame */
- xc 0(160,%r15), 0(%r15)
+ xc 0(STACK_FRAME_SIZE,%r15), 0(%r15)
/* setup initial PSW mask + control registers*/
larl %r1, initial_psw
lpswe 0(%r1)
diff --git a/s390x/flat.lds.S b/s390x/flat.lds.S
index 952f6cd..0cb7e38 100644
--- a/s390x/flat.lds.S
+++ b/s390x/flat.lds.S
@@ -1,3 +1,5 @@
+#include <asm/asm-offsets.h>
+
SECTIONS
{
.lowcore : {
@@ -44,6 +46,6 @@ SECTIONS
/*
* stackptr set with initial stack frame preallocated
*/
- stackptr = . - 160;
+ stackptr = . - STACK_FRAME_SIZE;
stacktop = .;
}
diff --git a/s390x/macros.S b/s390x/macros.S
index 13cff29..e2a56a3 100644
--- a/s390x/macros.S
+++ b/s390x/macros.S
@@ -21,14 +21,14 @@
/* Save the stack address in GR2 which is the first function argument */
lgr %r2, %r15
/* Allocate stack space for called C function, as specified in s390 ELF ABI */
- slgfi %r15, 160
+ slgfi %r15, STACK_FRAME_SIZE
/*
* Save the address of the interrupt stack into the back chain
* of the called function.
*/
stg %r2, STACK_FRAME_INT_BACKCHAIN(%r15)
brasl %r14, \c_func
- algfi %r15, 160
+ algfi %r15, STACK_FRAME_SIZE
RESTORE_REGS_STACK
lpswe \old_psw
.endm
diff --git a/s390x/snippets/c/flat.lds.S b/s390x/snippets/c/flat.lds.S
index 9e5eb66..468b5f1 100644
--- a/s390x/snippets/c/flat.lds.S
+++ b/s390x/snippets/c/flat.lds.S
@@ -1,3 +1,5 @@
+#include <asm/asm-offsets.h>
+
SECTIONS
{
.lowcore : {
@@ -18,9 +20,9 @@ SECTIONS
. = 0x4000;
/*
* The stack grows down from 0x4000 to 0x2000, we pre-allocoate
- * a frame via the -160.
+ * a frame via the -STACK_FRAME_SIZE.
*/
- stackptr = . - 160;
+ stackptr = . - STACK_FRAME_SIZE;
stacktop = .;
/* Start text 0x4000 */
.text : {
diff --git a/s390x/gs.c b/s390x/gs.c
index 4993eb8..9ae893e 100644
--- a/s390x/gs.c
+++ b/s390x/gs.c
@@ -9,6 +9,7 @@
* Janosch Frank <frankja@linux.ibm.com>
*/
#include <libcflat.h>
+#include <asm/asm-offsets.h>
#include <asm/page.h>
#include <asm/facility.h>
#include <asm/interrupt.h>
@@ -35,22 +36,27 @@ static inline unsigned long load_guarded(unsigned long *p)
/* guarded-storage event handler and finally it calls gs_handler */
extern void gs_handler_asm(void);
- asm(".globl gs_handler_asm\n"
- "gs_handler_asm:\n"
- " lgr %r14,%r15\n" /* Save current stack address in r14 */
- " aghi %r15,-320\n" /* Allocate stack frame */
- " stmg %r0,%r13,192(%r15)\n" /* Store regs to save area */
- " stg %r14,312(%r15)\n"
- " la %r2,160(%r15)\n" /* Store gscb address in this_cb */
- " .insn rxy,0xe30000000049,0,160(%r15)\n" /* stgsc */
- " lg %r14,24(%r2)\n" /* Get GSEPLA from GSCB*/
- " lg %r14,40(%r14)\n" /* Get GSERA from GSEPL*/
- " stg %r14,304(%r15)\n" /* Store GSERA in r14 of reg save area */
- " brasl %r14,gs_handler\n" /* Jump to gs_handler */
- " lmg %r0,%r15,192(%r15)\n" /* Restore regs */
- " aghi %r14, 6\n" /* Add lgg instr len to GSERA */
- " br %r14\n" /* Jump to next instruction after lgg */
- " .size gs_handler_asm,.-gs_handler_asm\n");
+ asm ( ".macro STGSC args:vararg\n"
+ " .insn rxy,0xe30000000049,\\args\n"
+ " .endm\n"
+ " .globl gs_handler_asm\n"
+ "gs_handler_asm:\n"
+ " lgr %r14,%r15\n" /* Save current stack address in r14 */
+ ".Lgs_handler_frame = 16*8+32+" xstr(STACK_FRAME_SIZE) "\n"
+ " aghi %r15,-(.Lgs_handler_frame)\n" /* Allocate stack frame */
+ " stmg %r0,%r13,192(%r15)\n" /* Store regs to save area */
+ " stg %r14,312(%r15)\n"
+ " la %r2," xstr(STACK_FRAME_SIZE) "(%r15)\n" /* Store gscb address in this_cb */
+ " STGSC %r0," xstr(STACK_FRAME_SIZE) "(%r15)\n"
+ " lg %r14,24(%r2)\n" /* Get GSEPLA from GSCB*/
+ " lg %r14,40(%r14)\n" /* Get GSERA from GSEPL*/
+ " stg %r14,304(%r15)\n" /* Store GSERA in r14 of reg save area */
+ " brasl %r14,gs_handler\n" /* Jump to gs_handler */
+ " lmg %r0,%r15,192(%r15)\n" /* Restore regs */
+ " aghi %r14, 6\n" /* Add lgg instr len to GSERA */
+ " br %r14\n" /* Jump to next instruction after lgg */
+ ".size gs_handler_asm,.-gs_handler_asm\n"
+ );
void gs_handler(struct gs_cb *this_cb)
{
--
2.39.2
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [kvm-unit-tests GIT PULL 07/14] lib/linux/const.h: test for `__ASSEMBLER__` as well
2023-03-31 11:30 [kvm-unit-tests GIT PULL 00/14] s390x: new maintainer, refactor linker scripts, tests for misalignments, execute-type instructions and vSIE epdx Nico Boehr
` (5 preceding siblings ...)
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 06/14] s390x: define a macro for the stack frame size Nico Boehr
@ 2023-03-31 11:30 ` Nico Boehr
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 08/14] s390x/spec_ex: Use PSW macro Nico Boehr
` (7 subsequent siblings)
14 siblings, 0 replies; 17+ messages in thread
From: Nico Boehr @ 2023-03-31 11:30 UTC (permalink / raw)
To: thuth, pbonzini, andrew.jones; +Cc: kvm, frankja, imbrenda, Marc Hartmayer
From: Marc Hartmayer <mhartmay@linux.ibm.com>
On s390x we're using the preprocessor for generating our linker scripts
out of assembly files. The macro `__ASSEMBLER__` is defined with value 1
when preprocessing assembly language using gcc. [1] Therefore, let's
check for the macro `__ASSEMBLER__` in `lib/linux/const.h` as well. Thus
we can use macros that makes use of the `_AC` or `_AT` macro in the
"linker scripts".
[1] https://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html
Signed-off-by: Marc Hartmayer <mhartmay@linux.ibm.com>
Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
Link: https://lore.kernel.org/r/20230307091051.13945-8-mhartmay@linux.ibm.com
Signed-off-by: Nico Boehr <nrb@linux.ibm.com>
---
lib/linux/const.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/linux/const.h b/lib/linux/const.h
index c872bfd..be114dc 100644
--- a/lib/linux/const.h
+++ b/lib/linux/const.h
@@ -12,7 +12,7 @@
* leave it unchanged in asm.
*/
-#ifdef __ASSEMBLY__
+#if defined(__ASSEMBLY__) || defined(__ASSEMBLER__)
#define _AC(X,Y) X
#define _AT(T,X) X
#else
--
2.39.2
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [kvm-unit-tests GIT PULL 08/14] s390x/spec_ex: Use PSW macro
2023-03-31 11:30 [kvm-unit-tests GIT PULL 00/14] s390x: new maintainer, refactor linker scripts, tests for misalignments, execute-type instructions and vSIE epdx Nico Boehr
` (6 preceding siblings ...)
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 07/14] lib/linux/const.h: test for `__ASSEMBLER__` as well Nico Boehr
@ 2023-03-31 11:30 ` Nico Boehr
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 09/14] s390x/spec_ex: Add test introducing odd address into PSW Nico Boehr
` (6 subsequent siblings)
14 siblings, 0 replies; 17+ messages in thread
From: Nico Boehr @ 2023-03-31 11:30 UTC (permalink / raw)
To: thuth, pbonzini, andrew.jones
Cc: kvm, frankja, imbrenda, Nina Schoetterl-Glausch
From: Nina Schoetterl-Glausch <nsg@linux.ibm.com>
Replace explicit psw definition by PSW macro.
No functional change intended.
Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
Signed-off-by: Nina Schoetterl-Glausch <nsg@linux.ibm.com>
Link: https://lore.kernel.org/r/20230317133253.965010-2-nsg@linux.ibm.com
Signed-off-by: Nico Boehr <nrb@linux.ibm.com>
---
s390x/spec_ex.c | 10 ++--------
1 file changed, 2 insertions(+), 8 deletions(-)
diff --git a/s390x/spec_ex.c b/s390x/spec_ex.c
index 42ecaed..2adc599 100644
--- a/s390x/spec_ex.c
+++ b/s390x/spec_ex.c
@@ -105,10 +105,7 @@ static int check_invalid_psw(void)
/* For normal PSWs bit 12 has to be 0 to be a valid PSW*/
static int psw_bit_12_is_1(void)
{
- struct psw invalid = {
- .mask = BIT(63 - 12),
- .addr = 0x00000000deadbeee
- };
+ struct psw invalid = PSW(BIT(63 - 12), 0x00000000deadbeee);
expect_invalid_psw(invalid);
load_psw(invalid);
@@ -118,10 +115,7 @@ static int psw_bit_12_is_1(void)
/* A short PSW needs to have bit 12 set to be valid. */
static int short_psw_bit_12_is_0(void)
{
- struct psw invalid = {
- .mask = BIT(63 - 12),
- .addr = 0x00000000deadbeee
- };
+ struct psw invalid = PSW(BIT(63 - 12), 0x00000000deadbeee);
struct short_psw short_invalid = {
.mask = 0x0,
.addr = 0xdeadbeee
--
2.39.2
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [kvm-unit-tests GIT PULL 09/14] s390x/spec_ex: Add test introducing odd address into PSW
2023-03-31 11:30 [kvm-unit-tests GIT PULL 00/14] s390x: new maintainer, refactor linker scripts, tests for misalignments, execute-type instructions and vSIE epdx Nico Boehr
` (7 preceding siblings ...)
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 08/14] s390x/spec_ex: Use PSW macro Nico Boehr
@ 2023-03-31 11:30 ` Nico Boehr
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 10/14] s390x/spec_ex: Add test of EXECUTE with odd target address Nico Boehr
` (5 subsequent siblings)
14 siblings, 0 replies; 17+ messages in thread
From: Nico Boehr @ 2023-03-31 11:30 UTC (permalink / raw)
To: thuth, pbonzini, andrew.jones
Cc: kvm, frankja, imbrenda, Nina Schoetterl-Glausch
From: Nina Schoetterl-Glausch <nsg@linux.ibm.com>
Instructions on s390 must be halfword aligned.
Introducing an odd instruction address into the PSW leads to a
specification exception when attempting to execute the instruction at
the odd address.
Add a test for this.
Acked-by: Janosch Frank <frankja@linux.ibm.com>
Signed-off-by: Nina Schoetterl-Glausch <nsg@linux.ibm.com>
Link: https://lore.kernel.org/r/20230317133253.965010-3-nsg@linux.ibm.com
Signed-off-by: Nico Boehr <nrb@linux.ibm.com>
---
s390x/spec_ex.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 49 insertions(+), 1 deletion(-)
diff --git a/s390x/spec_ex.c b/s390x/spec_ex.c
index 2adc599..ab02334 100644
--- a/s390x/spec_ex.c
+++ b/s390x/spec_ex.c
@@ -88,12 +88,23 @@ static void expect_invalid_psw(struct psw psw)
invalid_psw_expected = true;
}
+static void clear_invalid_psw(void)
+{
+ expected_psw = PSW(0, 0);
+ invalid_psw_expected = false;
+}
+
static int check_invalid_psw(void)
{
/* Since the fixup sets this to false we check for false here. */
if (!invalid_psw_expected) {
+ /*
+ * Early exception recognition: pgm_int_id == 0.
+ * Late exception recognition: psw address has been
+ * incremented by pgm_int_id (unpredictable value)
+ */
if (expected_psw.mask == invalid_psw.mask &&
- expected_psw.addr == invalid_psw.addr)
+ expected_psw.addr == invalid_psw.addr - lowcore.pgm_int_id)
return 0;
report_fail("Wrong invalid PSW");
} else {
@@ -112,6 +123,42 @@ static int psw_bit_12_is_1(void)
return check_invalid_psw();
}
+extern char misaligned_code[];
+asm ( ".balign 2\n"
+" . = . + 1\n"
+"misaligned_code:\n"
+" larl %r0,0\n"
+" br %r1\n"
+);
+
+static int psw_odd_address(void)
+{
+ struct psw odd = PSW_WITH_CUR_MASK((uint64_t)&misaligned_code);
+ uint64_t executed_addr;
+
+ expect_invalid_psw(odd);
+ fixup_psw.mask = extract_psw_mask();
+ asm volatile ( "xgr %%r0,%%r0\n"
+ " larl %%r1,0f\n"
+ " stg %%r1,%[fixup_addr]\n"
+ " lpswe %[odd_psw]\n"
+ "0: lr %[executed_addr],%%r0\n"
+ : [fixup_addr] "=&T" (fixup_psw.addr),
+ [executed_addr] "=d" (executed_addr)
+ : [odd_psw] "Q" (odd)
+ : "cc", "%r0", "%r1"
+ );
+
+ if (!executed_addr) {
+ return check_invalid_psw();
+ } else {
+ assert(executed_addr == odd.addr);
+ clear_invalid_psw();
+ report_fail("did not execute unaligned instructions");
+ return 1;
+ }
+}
+
/* A short PSW needs to have bit 12 set to be valid. */
static int short_psw_bit_12_is_0(void)
{
@@ -170,6 +217,7 @@ struct spec_ex_trigger {
static const struct spec_ex_trigger spec_ex_triggers[] = {
{ "psw_bit_12_is_1", &psw_bit_12_is_1, false, &fixup_invalid_psw },
{ "short_psw_bit_12_is_0", &short_psw_bit_12_is_0, false, &fixup_invalid_psw },
+ { "psw_odd_address", &psw_odd_address, false, &fixup_invalid_psw },
{ "bad_alignment", &bad_alignment, true, NULL },
{ "not_even", ¬_even, true, NULL },
{ NULL, NULL, false, NULL },
--
2.39.2
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [kvm-unit-tests GIT PULL 10/14] s390x/spec_ex: Add test of EXECUTE with odd target address
2023-03-31 11:30 [kvm-unit-tests GIT PULL 00/14] s390x: new maintainer, refactor linker scripts, tests for misalignments, execute-type instructions and vSIE epdx Nico Boehr
` (8 preceding siblings ...)
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 09/14] s390x/spec_ex: Add test introducing odd address into PSW Nico Boehr
@ 2023-03-31 11:30 ` Nico Boehr
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 11/14] s390x: Add tests for execute-type instructions Nico Boehr
` (4 subsequent siblings)
14 siblings, 0 replies; 17+ messages in thread
From: Nico Boehr @ 2023-03-31 11:30 UTC (permalink / raw)
To: thuth, pbonzini, andrew.jones
Cc: kvm, frankja, imbrenda, Nina Schoetterl-Glausch
From: Nina Schoetterl-Glausch <nsg@linux.ibm.com>
The EXECUTE instruction executes the instruction at the given target
address. This address must be halfword aligned, otherwise a
specification exception occurs.
Add a test for this.
Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
Signed-off-by: Nina Schoetterl-Glausch <nsg@linux.ibm.com>
Link: https://lore.kernel.org/r/20230317133253.965010-4-nsg@linux.ibm.com
Signed-off-by: Nico Boehr <nrb@linux.ibm.com>
---
s390x/spec_ex.c | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/s390x/spec_ex.c b/s390x/spec_ex.c
index ab02334..b4b9095 100644
--- a/s390x/spec_ex.c
+++ b/s390x/spec_ex.c
@@ -177,6 +177,30 @@ static int short_psw_bit_12_is_0(void)
return 0;
}
+static int odd_ex_target(void)
+{
+ uint64_t pre_target_addr;
+ int to = 0, from = 0x0dd;
+
+ asm volatile ( ".pushsection .text.ex_odd\n"
+ " .balign 2\n"
+ "pre_odd_ex_target:\n"
+ " . = . + 1\n"
+ " lr %[to],%[from]\n"
+ " .popsection\n"
+
+ " larl %[pre_target_addr],pre_odd_ex_target\n"
+ " ex 0,1(%[pre_target_addr])\n"
+ : [pre_target_addr] "=&a" (pre_target_addr),
+ [to] "+d" (to)
+ : [from] "d" (from)
+ );
+
+ assert((pre_target_addr + 1) & 1);
+ report(to != from, "did not perform ex with odd target");
+ return 0;
+}
+
static int bad_alignment(void)
{
uint32_t words[5] __attribute__((aligned(16)));
@@ -218,6 +242,7 @@ static const struct spec_ex_trigger spec_ex_triggers[] = {
{ "psw_bit_12_is_1", &psw_bit_12_is_1, false, &fixup_invalid_psw },
{ "short_psw_bit_12_is_0", &short_psw_bit_12_is_0, false, &fixup_invalid_psw },
{ "psw_odd_address", &psw_odd_address, false, &fixup_invalid_psw },
+ { "odd_ex_target", &odd_ex_target, true, NULL },
{ "bad_alignment", &bad_alignment, true, NULL },
{ "not_even", ¬_even, true, NULL },
{ NULL, NULL, false, NULL },
--
2.39.2
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [kvm-unit-tests GIT PULL 11/14] s390x: Add tests for execute-type instructions
2023-03-31 11:30 [kvm-unit-tests GIT PULL 00/14] s390x: new maintainer, refactor linker scripts, tests for misalignments, execute-type instructions and vSIE epdx Nico Boehr
` (9 preceding siblings ...)
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 10/14] s390x/spec_ex: Add test of EXECUTE with odd target address Nico Boehr
@ 2023-03-31 11:30 ` Nico Boehr
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 12/14] MAINTAINERS: Add Nico as s390x Maintainer and make Thomas reviewer Nico Boehr
` (3 subsequent siblings)
14 siblings, 0 replies; 17+ messages in thread
From: Nico Boehr @ 2023-03-31 11:30 UTC (permalink / raw)
To: thuth, pbonzini, andrew.jones
Cc: kvm, frankja, imbrenda, Nina Schoetterl-Glausch
From: Nina Schoetterl-Glausch <nsg@linux.ibm.com>
Test the instruction address used by targets of an execute instruction.
When the target instruction calculates a relative address, the result is
relative to the target instruction, not the execute instruction.
Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
Signed-off-by: Nina Schoetterl-Glausch <nsg@linux.ibm.com>
Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Link: https://lore.kernel.org/r/20230317112339.774659-1-nsg@linux.ibm.com
Signed-off-by: Nico Boehr <nrb@linux.ibm.com>
---
s390x/Makefile | 1 +
s390x/ex.c | 188 ++++++++++++++++++++++++++++++++++++++++++++
s390x/unittests.cfg | 3 +
.gitlab-ci.yml | 1 +
4 files changed, 193 insertions(+)
create mode 100644 s390x/ex.c
diff --git a/s390x/Makefile b/s390x/Makefile
index ab146eb..a80db53 100644
--- a/s390x/Makefile
+++ b/s390x/Makefile
@@ -39,6 +39,7 @@ tests += $(TEST_DIR)/panic-loop-extint.elf
tests += $(TEST_DIR)/panic-loop-pgm.elf
tests += $(TEST_DIR)/migration-sck.elf
tests += $(TEST_DIR)/exittime.elf
+tests += $(TEST_DIR)/ex.elf
pv-tests += $(TEST_DIR)/pv-diags.elf
diff --git a/s390x/ex.c b/s390x/ex.c
new file mode 100644
index 0000000..dbd8030
--- /dev/null
+++ b/s390x/ex.c
@@ -0,0 +1,188 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright IBM Corp. 2023
+ *
+ * Test EXECUTE (RELATIVE LONG).
+ * These instructions execute a target instruction. The target instruction is formed
+ * by reading an instruction from memory and optionally modifying some of its bits.
+ * The execution of the target instruction is the same as if it was executed
+ * normally as part of the instruction sequence, except for the instruction
+ * address and the instruction-length code.
+ */
+
+#include <libcflat.h>
+
+/*
+ * Accesses to the operand of execute-type instructions are instruction fetches.
+ * Minimum alignment is two, since the relative offset is specified by number of halfwords.
+ */
+asm ( ".pushsection .text.exrl_targets,\"x\"\n"
+" .balign 2\n"
+" .popsection\n"
+);
+
+/*
+ * BRANCH AND SAVE, register register variant.
+ * Saves the next instruction address (address from PSW + length of instruction)
+ * to the first register. No branch is taken in this test, because 0 is
+ * specified as target.
+ * BASR does *not* perform a relative address calculation with an intermediate.
+ */
+static void test_basr(void)
+{
+ uint64_t ret_addr, after_ex;
+
+ report_prefix_push("BASR");
+ asm volatile ( ".pushsection .text.exrl_targets\n"
+ "0: basr %[ret_addr],0\n"
+ " .popsection\n"
+
+ " larl %[after_ex],1f\n"
+ " exrl 0,0b\n"
+ "1:\n"
+ : [ret_addr] "=d" (ret_addr),
+ [after_ex] "=d" (after_ex)
+ );
+
+ report(ret_addr == after_ex, "return address after EX");
+ report_prefix_pop();
+}
+
+/*
+ * BRANCH RELATIVE AND SAVE.
+ * According to PoP (Branch-Address Generation), the address calculated relative
+ * to the instruction address is relative to BRAS when it is the target of an
+ * execute-type instruction, not relative to the execute-type instruction.
+ */
+static void test_bras(void)
+{
+ uint64_t after_target, ret_addr, after_ex, branch_addr;
+
+ report_prefix_push("BRAS");
+ asm volatile ( ".pushsection .text.exrl_targets\n"
+ "0: bras %[ret_addr],1f\n"
+ " nopr %%r7\n"
+ "1: larl %[branch_addr],0\n"
+ " j 4f\n"
+ " .popsection\n"
+
+ " larl %[after_target],1b\n"
+ " larl %[after_ex],3f\n"
+ "2: exrl 0,0b\n"
+/*
+ * In case the address calculation is correct, we jump by the relative offset 1b-0b from 0b to 1b.
+ * In case the address calculation is relative to the exrl (i.e. a test failure),
+ * put a valid instruction at the same relative offset from the exrl, so the test continues in a
+ * controlled manner.
+ */
+ "3: larl %[branch_addr],0\n"
+ "4:\n"
+
+ " .if (1b - 0b) != (3b - 2b)\n"
+ " .error \"right and wrong target must have same offset\"\n"
+ " .endif\n"
+ : [after_target] "=d" (after_target),
+ [ret_addr] "=d" (ret_addr),
+ [after_ex] "=d" (after_ex),
+ [branch_addr] "=d" (branch_addr)
+ );
+
+ report(after_target == branch_addr, "address calculated relative to BRAS");
+ report(ret_addr == after_ex, "return address after EX");
+ report_prefix_pop();
+}
+
+/*
+ * LOAD ADDRESS RELATIVE LONG.
+ * If it is the target of an execute-type instruction, the address is relative
+ * to the LARL.
+ */
+static void test_larl(void)
+{
+ uint64_t target, addr;
+
+ report_prefix_push("LARL");
+ asm volatile ( ".pushsection .text.exrl_targets\n"
+ "0: larl %[addr],0\n"
+ " .popsection\n"
+
+ " larl %[target],0b\n"
+ " exrl 0,0b\n"
+ : [target] "=d" (target),
+ [addr] "=d" (addr)
+ );
+
+ report(target == addr, "address calculated relative to LARL");
+ report_prefix_pop();
+}
+
+/* LOAD LOGICAL RELATIVE LONG.
+ * If it is the target of an execute-type instruction, the address is relative
+ * to the LLGFRL.
+ */
+static void test_llgfrl(void)
+{
+ uint64_t target, value;
+
+ report_prefix_push("LLGFRL");
+ asm volatile ( ".pushsection .text.exrl_targets\n"
+ " .balign 4\n"
+ //operand of llgfrl must be word aligned
+ "0: llgfrl %[value],0\n"
+ " .popsection\n"
+
+ " llgfrl %[target],0b\n"
+ //align (pad with nop), in case the wrong operand is used
+ " .balignw 4,0x0707\n"
+ " exrl 0,0b\n"
+ : [target] "=d" (target),
+ [value] "=d" (value)
+ );
+
+ report(target == value, "loaded correct value");
+ report_prefix_pop();
+}
+
+/*
+ * COMPARE RELATIVE LONG
+ * If it is the target of an execute-type instruction, the address is relative
+ * to the CRL.
+ */
+static void test_crl(void)
+{
+ uint32_t program_mask, cc, crl_word;
+
+ report_prefix_push("CRL");
+ asm volatile ( ".pushsection .text.exrl_targets\n"
+ //operand of crl must be word aligned
+ " .balign 4\n"
+ "0: crl %[crl_word],0\n"
+ " .popsection\n"
+
+ " lrl %[crl_word],0b\n"
+ //align (pad with nop), in case the wrong operand is used
+ " .balignw 4,0x0707\n"
+ " exrl 0,0b\n"
+ " ipm %[program_mask]\n"
+ : [program_mask] "=d" (program_mask),
+ [crl_word] "=d" (crl_word)
+ :: "cc"
+ );
+
+ cc = program_mask >> 28;
+ report(!cc, "operand compared to is relative to CRL");
+ report_prefix_pop();
+}
+
+int main(int argc, char **argv)
+{
+ report_prefix_push("ex");
+ test_basr();
+ test_bras();
+ test_larl();
+ test_llgfrl();
+ test_crl();
+ report_prefix_pop();
+
+ return report_summary();
+}
diff --git a/s390x/unittests.cfg b/s390x/unittests.cfg
index d97eb5e..b61faf0 100644
--- a/s390x/unittests.cfg
+++ b/s390x/unittests.cfg
@@ -215,3 +215,6 @@ file = migration-skey.elf
smp = 2
groups = migration
extra_params = -append '--parallel'
+
+[execute]
+file = ex.elf
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index ad7949c..a999f64 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -275,6 +275,7 @@ s390x-kvm:
- ACCEL=kvm ./run_tests.sh
selftest-setup intercept emulator sieve sthyi diag10 diag308 pfmf
cmm vector gs iep cpumodel diag288 stsi sclp-1g sclp-3g css skrf sie
+ execute
| tee results.txt
- grep -q PASS results.txt && ! grep -q FAIL results.txt
only:
--
2.39.2
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [kvm-unit-tests GIT PULL 12/14] MAINTAINERS: Add Nico as s390x Maintainer and make Thomas reviewer
2023-03-31 11:30 [kvm-unit-tests GIT PULL 00/14] s390x: new maintainer, refactor linker scripts, tests for misalignments, execute-type instructions and vSIE epdx Nico Boehr
` (10 preceding siblings ...)
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 11/14] s390x: Add tests for execute-type instructions Nico Boehr
@ 2023-03-31 11:30 ` Nico Boehr
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 13/14] s390x: spec_ex: Add test for misaligned load Nico Boehr
` (2 subsequent siblings)
14 siblings, 0 replies; 17+ messages in thread
From: Nico Boehr @ 2023-03-31 11:30 UTC (permalink / raw)
To: thuth, pbonzini, andrew.jones; +Cc: kvm, frankja, imbrenda
From: Janosch Frank <frankja@linux.ibm.com>
The circle of life continues as we bring in Nico as a s390x
maintainer. Thomas moves from the maintainer position to reviewer but
he's a general maintainer of the project anyway.
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
Acked-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Acked-by: Nico Boehr <nrb@linux.ibm.com>
Link: https://lore.kernel.org/r/20230322113400.1123378-1-frankja@linux.ibm.com
Signed-off-by: Nico Boehr <nrb@linux.ibm.com>
---
MAINTAINERS | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/MAINTAINERS b/MAINTAINERS
index 649de50..bd1761d 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -85,11 +85,12 @@ F: lib/powerpc/
F: lib/ppc64/
S390X
-M: Thomas Huth <thuth@redhat.com>
M: Janosch Frank <frankja@linux.ibm.com>
M: Claudio Imbrenda <imbrenda@linux.ibm.com>
+M: Nico Böhr <nrb@linux.ibm.com>
S: Supported
R: David Hildenbrand <david@redhat.com>
+R: Thomas Huth <thuth@redhat.com>
L: kvm@vger.kernel.org
L: linux-s390@vger.kernel.org
F: s390x/
--
2.39.2
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [kvm-unit-tests GIT PULL 13/14] s390x: spec_ex: Add test for misaligned load
2023-03-31 11:30 [kvm-unit-tests GIT PULL 00/14] s390x: new maintainer, refactor linker scripts, tests for misalignments, execute-type instructions and vSIE epdx Nico Boehr
` (11 preceding siblings ...)
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 12/14] MAINTAINERS: Add Nico as s390x Maintainer and make Thomas reviewer Nico Boehr
@ 2023-03-31 11:30 ` Nico Boehr
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 14/14] s390x: sie: Test whether the epoch extension field is working as expected Nico Boehr
2023-03-31 13:17 ` [kvm-unit-tests GIT PULL 00/14] s390x: new maintainer, refactor linker scripts, tests for misalignments, execute-type instructions and vSIE epdx Thomas Huth
14 siblings, 0 replies; 17+ messages in thread
From: Nico Boehr @ 2023-03-31 11:30 UTC (permalink / raw)
To: thuth, pbonzini, andrew.jones
Cc: kvm, frankja, imbrenda, Nina Schoetterl-Glausch
From: Nina Schoetterl-Glausch <nsg@linux.ibm.com>
The operand of LOAD RELATIVE LONG must be word aligned, otherwise a
specification exception occurs. Test that this exception occurs.
Signed-off-by: Nina Schoetterl-Glausch <nsg@linux.ibm.com>
Reviewed-by: Nico Boehr <nrb@linux.ibm.com>
Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Link: https://lore.kernel.org/r/20230301132638.3336040-1-nsg@linux.ibm.com
Signed-off-by: Nico Boehr <nrb@linux.ibm.com>
---
s390x/spec_ex.c | 21 +++++++++++++++++++--
1 file changed, 19 insertions(+), 2 deletions(-)
diff --git a/s390x/spec_ex.c b/s390x/spec_ex.c
index b4b9095..20bd502 100644
--- a/s390x/spec_ex.c
+++ b/s390x/spec_ex.c
@@ -201,7 +201,7 @@ static int odd_ex_target(void)
return 0;
}
-static int bad_alignment(void)
+static int bad_alignment_lqp(void)
{
uint32_t words[5] __attribute__((aligned(16)));
uint32_t (*bad_aligned)[4] = (uint32_t (*)[4])&words[1];
@@ -214,6 +214,22 @@ static int bad_alignment(void)
return 0;
}
+static int bad_alignment_lrl(void)
+{
+ uint64_t r;
+
+ asm volatile ( ".pushsection .rodata\n"
+ " .balign 4\n"
+ " . = . + 2\n"
+ "0: .fill 4\n"
+ " .popsection\n"
+
+ " lrl %0,0b\n"
+ : "=d" (r)
+ );
+ return 0;
+}
+
static int not_even(void)
{
uint64_t quad[2] __attribute__((aligned(16))) = {0};
@@ -243,7 +259,8 @@ static const struct spec_ex_trigger spec_ex_triggers[] = {
{ "short_psw_bit_12_is_0", &short_psw_bit_12_is_0, false, &fixup_invalid_psw },
{ "psw_odd_address", &psw_odd_address, false, &fixup_invalid_psw },
{ "odd_ex_target", &odd_ex_target, true, NULL },
- { "bad_alignment", &bad_alignment, true, NULL },
+ { "bad_alignment_lqp", &bad_alignment_lqp, true, NULL },
+ { "bad_alignment_lrl", &bad_alignment_lrl, true, NULL },
{ "not_even", ¬_even, true, NULL },
{ NULL, NULL, false, NULL },
};
--
2.39.2
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [kvm-unit-tests GIT PULL 14/14] s390x: sie: Test whether the epoch extension field is working as expected
2023-03-31 11:30 [kvm-unit-tests GIT PULL 00/14] s390x: new maintainer, refactor linker scripts, tests for misalignments, execute-type instructions and vSIE epdx Nico Boehr
` (12 preceding siblings ...)
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 13/14] s390x: spec_ex: Add test for misaligned load Nico Boehr
@ 2023-03-31 11:30 ` Nico Boehr
2023-03-31 13:17 ` [kvm-unit-tests GIT PULL 00/14] s390x: new maintainer, refactor linker scripts, tests for misalignments, execute-type instructions and vSIE epdx Thomas Huth
14 siblings, 0 replies; 17+ messages in thread
From: Nico Boehr @ 2023-03-31 11:30 UTC (permalink / raw)
To: thuth, pbonzini, andrew.jones; +Cc: kvm, frankja, imbrenda
From: Thomas Huth <thuth@redhat.com>
We recently discovered a bug with the time management in nested scenarios
which got fixed by kernel commit "KVM: s390: vsie: Fix the initialization
of the epoch extension (epdx) field". This adds a simple test for this
bug so that it is easier to determine whether the host kernel of a machine
has already been fixed or not.
Signed-off-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Link: https://lore.kernel.org/r/20221208170502.17984-1-thuth@redhat.com
Signed-off-by: Nico Boehr <nrb@linux.ibm.com>
---
s390x/sie.c | 28 ++++++++++++++++++++++++++++
1 file changed, 28 insertions(+)
diff --git a/s390x/sie.c b/s390x/sie.c
index 87575b2..cd3cea1 100644
--- a/s390x/sie.c
+++ b/s390x/sie.c
@@ -58,6 +58,33 @@ static void test_diags(void)
}
}
+static void test_epoch_ext(void)
+{
+ u32 instr[] = {
+ 0xb2780000, /* STCKE 0 */
+ 0x83000044 /* DIAG 0x44 to intercept */
+ };
+
+ if (!test_facility(139)) {
+ report_skip("epdx: Multiple Epoch Facility is not available");
+ return;
+ }
+
+ guest[0] = 0x00;
+ memcpy(guest_instr, instr, sizeof(instr));
+
+ vm.sblk->gpsw.addr = PAGE_SIZE * 2;
+ vm.sblk->gpsw.mask = PSW_MASK_64;
+
+ vm.sblk->ecd |= ECD_MEF;
+ vm.sblk->epdx = 0x47; /* Setting the epoch extension here ... */
+
+ sie(&vm);
+
+ /* ... should result in the same epoch extension here: */
+ report(guest[0] == 0x47, "epdx: different epoch is visible in the guest");
+}
+
static void setup_guest(void)
{
setup_vm();
@@ -80,6 +107,7 @@ int main(void)
setup_guest();
test_diags();
+ test_epoch_ext();
sie_guest_destroy(&vm);
done:
--
2.39.2
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [kvm-unit-tests GIT PULL 00/14] s390x: new maintainer, refactor linker scripts, tests for misalignments, execute-type instructions and vSIE epdx
2023-03-31 11:30 [kvm-unit-tests GIT PULL 00/14] s390x: new maintainer, refactor linker scripts, tests for misalignments, execute-type instructions and vSIE epdx Nico Boehr
` (13 preceding siblings ...)
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 14/14] s390x: sie: Test whether the epoch extension field is working as expected Nico Boehr
@ 2023-03-31 13:17 ` Thomas Huth
2023-03-31 14:19 ` Nico Boehr
14 siblings, 1 reply; 17+ messages in thread
From: Thomas Huth @ 2023-03-31 13:17 UTC (permalink / raw)
To: Nico Boehr, pbonzini, andrew.jones, Nina Schoetterl-Glausch
Cc: kvm, frankja, imbrenda
On 31/03/2023 13.30, Nico Boehr wrote:
> Hi Paolo and/or Thomas,
>
> here comes the first pull request from me. :)
Thanks!
... I gave it a try, but I'm hitting a failure in the spec_ex test:
$ cat logs/spec_ex.log
timeout -k 1s --foreground 90s qemu-system-s390x -nodefaults -nographic -machine s390-ccw-virtio,accel=kvm -chardev stdio,id=con0 -device sclpconsole,chardev=con0 -kernel s390x/spec_ex.elf -smp 1 # -initrd /tmp/tmp.cxHP06rT1F
PASS: specification exception: psw_bit_12_is_1: Program interrupt: expected(6) == received(6)
PASS: specification exception: short_psw_bit_12_is_0: Program interrupt: expected(6) == received(6)
FAIL: specification exception: psw_odd_address: Expected exception due to invalid PSW
PASS: specification exception: odd_ex_target: did not perform ex with odd target
PASS: specification exception: odd_ex_target: Program interrupt: expected(6) == received(6)
PASS: specification exception: bad_alignment_lqp: Program interrupt: expected(6) == received(6)
PASS: specification exception: bad_alignment_lrl: Program interrupt: expected(6) == received(6)
PASS: specification exception: not_even: Program interrupt: expected(6) == received(6)
PASS: specification exception during transaction: odd_ex_target: Program interrupt: expected(518) == received(518)
PASS: specification exception during transaction: bad_alignment_lqp: Program interrupt: expected(518) == received(518)
PASS: specification exception during transaction: bad_alignment_lrl: Program interrupt: expected(518) == received(518)
PASS: specification exception during transaction: not_even: Program interrupt: expected(518) == received(518)
SUMMARY: 12 tests, 1 unexpected failures
EXIT: STATUS=3
I'm sure I'm missing something, I just cannot figure it out right
now (it's Friday afternoon...) - QEMU is the current version from
the master branch, so I thought that it should contain all the
recent fixes ... does this psw_odd_address test require a fix in
the kernel, too? (I'm currently running a RHEL9 kernel)
Thomas
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [kvm-unit-tests GIT PULL 00/14] s390x: new maintainer, refactor linker scripts, tests for misalignments, execute-type instructions and vSIE epdx
2023-03-31 13:17 ` [kvm-unit-tests GIT PULL 00/14] s390x: new maintainer, refactor linker scripts, tests for misalignments, execute-type instructions and vSIE epdx Thomas Huth
@ 2023-03-31 14:19 ` Nico Boehr
0 siblings, 0 replies; 17+ messages in thread
From: Nico Boehr @ 2023-03-31 14:19 UTC (permalink / raw)
To: Nina Schoetterl-Glausch, Thomas Huth, andrew.jones, pbonzini
Cc: kvm, frankja, imbrenda
Quoting Thomas Huth (2023-03-31 15:17:33)
> On 31/03/2023 13.30, Nico Boehr wrote:
> > Hi Paolo and/or Thomas,
> >
> > here comes the first pull request from me. :)
>
> Thanks!
>
> ... I gave it a try, but I'm hitting a failure in the spec_ex test:
>
> $ cat logs/spec_ex.log
> timeout -k 1s --foreground 90s qemu-system-s390x -nodefaults -nographic -machine s390-ccw-virtio,accel=kvm -chardev stdio,id=con0 -device sclpconsole,chardev=con0 -kernel s390x/spec_ex.elf -smp 1 # -initrd /tmp/tmp.cxHP06rT1F
> PASS: specification exception: psw_bit_12_is_1: Program interrupt: expected(6) == received(6)
> PASS: specification exception: short_psw_bit_12_is_0: Program interrupt: expected(6) == received(6)
> FAIL: specification exception: psw_odd_address: Expected exception due to invalid PSW
> PASS: specification exception: odd_ex_target: did not perform ex with odd target
> PASS: specification exception: odd_ex_target: Program interrupt: expected(6) == received(6)
> PASS: specification exception: bad_alignment_lqp: Program interrupt: expected(6) == received(6)
> PASS: specification exception: bad_alignment_lrl: Program interrupt: expected(6) == received(6)
> PASS: specification exception: not_even: Program interrupt: expected(6) == received(6)
> PASS: specification exception during transaction: odd_ex_target: Program interrupt: expected(518) == received(518)
> PASS: specification exception during transaction: bad_alignment_lqp: Program interrupt: expected(518) == received(518)
> PASS: specification exception during transaction: bad_alignment_lrl: Program interrupt: expected(518) == received(518)
> PASS: specification exception during transaction: not_even: Program interrupt: expected(518) == received(518)
> SUMMARY: 12 tests, 1 unexpected failures
>
> EXIT: STATUS=3
>
> I'm sure I'm missing something, I just cannot figure it out right
> now (it's Friday afternoon...) - QEMU is the current version from
> the master branch, so I thought that it should contain all the
> recent fixes ... does this psw_odd_address test require a fix in
> the kernel, too? (I'm currently running a RHEL9 kernel)
Thomas, I cannot reproduce this with a QEMU master and 6.3-rc4, so you might be right that some kernel fix is required.
Since the weekend is calling now, I will take a look at this on Monday.
^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2023-03-31 14:19 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-03-31 11:30 [kvm-unit-tests GIT PULL 00/14] s390x: new maintainer, refactor linker scripts, tests for misalignments, execute-type instructions and vSIE epdx Nico Boehr
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 01/14] .gitignore: ignore `s390x/comm.key` file Nico Boehr
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 02/14] s390x/Makefile: simplify `%.hdr` target rules Nico Boehr
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 03/14] s390x/Makefile: fix `*.gbin` target dependencies Nico Boehr
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 04/14] s390x/Makefile: refactor CPPFLAGS Nico Boehr
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 05/14] s390x: use preprocessor for linker script generation Nico Boehr
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 06/14] s390x: define a macro for the stack frame size Nico Boehr
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 07/14] lib/linux/const.h: test for `__ASSEMBLER__` as well Nico Boehr
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 08/14] s390x/spec_ex: Use PSW macro Nico Boehr
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 09/14] s390x/spec_ex: Add test introducing odd address into PSW Nico Boehr
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 10/14] s390x/spec_ex: Add test of EXECUTE with odd target address Nico Boehr
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 11/14] s390x: Add tests for execute-type instructions Nico Boehr
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 12/14] MAINTAINERS: Add Nico as s390x Maintainer and make Thomas reviewer Nico Boehr
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 13/14] s390x: spec_ex: Add test for misaligned load Nico Boehr
2023-03-31 11:30 ` [kvm-unit-tests GIT PULL 14/14] s390x: sie: Test whether the epoch extension field is working as expected Nico Boehr
2023-03-31 13:17 ` [kvm-unit-tests GIT PULL 00/14] s390x: new maintainer, refactor linker scripts, tests for misalignments, execute-type instructions and vSIE epdx Thomas Huth
2023-03-31 14:19 ` Nico Boehr
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox