tests/tcg/s390x: Test unaligned accesses
Add a number of small test that check whether accessing unaligned addresses in various ways leads to a specification exception. Run these test both in softmmu and user configurations; expect a PGM in one case and SIGILL in the other. Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> Reviewed-by: Thomas Huth <thuth@redhat.com> Message-Id: <20230316164428.275147-13-iii@linux.ibm.com> [thuth: Added -Wl,--build-id=none to LDFLAGS] Signed-off-by: Thomas Huth <thuth@redhat.com>
This commit is contained in:
parent
ba1ef833be
commit
e902126cae
@ -1,10 +1,14 @@
|
|||||||
S390X_SRC=$(SRC_PATH)/tests/tcg/s390x
|
S390X_SRC=$(SRC_PATH)/tests/tcg/s390x
|
||||||
VPATH+=$(S390X_SRC)
|
VPATH+=$(S390X_SRC)
|
||||||
QEMU_OPTS=-action panic=exit-failure -kernel
|
QEMU_OPTS=-action panic=exit-failure -kernel
|
||||||
|
LINK_SCRIPT=$(S390X_SRC)/softmmu.ld
|
||||||
|
LDFLAGS=-nostdlib -static -Wl,-T$(LINK_SCRIPT) -Wl,--build-id=none
|
||||||
|
|
||||||
%: %.S
|
%.o: %.S
|
||||||
$(CC) -march=z13 -m64 -nostdlib -static -Wl,-Ttext=0 \
|
$(CC) -march=z13 -m64 -c $< -o $@
|
||||||
-Wl,--build-id=none $< -o $@
|
|
||||||
|
%: %.o $(LINK_SCRIPT)
|
||||||
|
$(CC) $< -o $@ $(LDFLAGS)
|
||||||
|
|
||||||
TESTS += unaligned-lowcore
|
TESTS += unaligned-lowcore
|
||||||
TESTS += bal
|
TESTS += bal
|
||||||
@ -14,3 +18,8 @@ TESTS += lpswe-early
|
|||||||
TESTS += ssm-early
|
TESTS += ssm-early
|
||||||
TESTS += stosm-early
|
TESTS += stosm-early
|
||||||
TESTS += exrl-ssm-early
|
TESTS += exrl-ssm-early
|
||||||
|
|
||||||
|
include $(S390X_SRC)/pgm-specification.mak
|
||||||
|
$(PGM_SPECIFICATION_TESTS): pgm-specification-softmmu.o
|
||||||
|
$(PGM_SPECIFICATION_TESTS): LDFLAGS+=pgm-specification-softmmu.o
|
||||||
|
TESTS += $(PGM_SPECIFICATION_TESTS)
|
||||||
|
@ -2,6 +2,9 @@ S390X_SRC=$(SRC_PATH)/tests/tcg/s390x
|
|||||||
VPATH+=$(S390X_SRC)
|
VPATH+=$(S390X_SRC)
|
||||||
CFLAGS+=-march=zEC12 -m64
|
CFLAGS+=-march=zEC12 -m64
|
||||||
|
|
||||||
|
%.o: %.c
|
||||||
|
$(CC) $(CFLAGS) $(EXTRA_CFLAGS) -c $< -o $@
|
||||||
|
|
||||||
config-cc.mak: Makefile
|
config-cc.mak: Makefile
|
||||||
$(quiet-@)( \
|
$(quiet-@)( \
|
||||||
$(call cc-option,-march=z14, CROSS_CC_HAS_Z14); \
|
$(call cc-option,-march=z14, CROSS_CC_HAS_Z14); \
|
||||||
@ -37,6 +40,11 @@ cdsg: LDFLAGS+=-pthread
|
|||||||
|
|
||||||
rxsbg: CFLAGS+=-O2
|
rxsbg: CFLAGS+=-O2
|
||||||
|
|
||||||
|
include $(S390X_SRC)/pgm-specification.mak
|
||||||
|
$(PGM_SPECIFICATION_TESTS): pgm-specification-user.o
|
||||||
|
$(PGM_SPECIFICATION_TESTS): LDFLAGS+=pgm-specification-user.o
|
||||||
|
TESTS += $(PGM_SPECIFICATION_TESTS)
|
||||||
|
|
||||||
Z13_TESTS=vistr
|
Z13_TESTS=vistr
|
||||||
$(Z13_TESTS): CFLAGS+=-march=z13 -O2
|
$(Z13_TESTS): CFLAGS+=-march=z13 -O2
|
||||||
TESTS+=$(Z13_TESTS)
|
TESTS+=$(Z13_TESTS)
|
||||||
|
16
tests/tcg/s390x/br-odd.S
Normal file
16
tests/tcg/s390x/br-odd.S
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
* Test BRanching to a non-mapped odd address.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*/
|
||||||
|
.globl test
|
||||||
|
test:
|
||||||
|
lgrl %r1,odd_addr
|
||||||
|
br %r1
|
||||||
|
|
||||||
|
.align 8
|
||||||
|
odd_addr:
|
||||||
|
.quad 0xDDDDDDDDDDDDDDDD
|
||||||
|
.globl expected_old_psw
|
||||||
|
expected_old_psw:
|
||||||
|
.quad 0x180000000,0xDDDDDDDDDDDDDDDD
|
16
tests/tcg/s390x/cgrl-unaligned.S
Normal file
16
tests/tcg/s390x/cgrl-unaligned.S
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
* Test CGRL with a non-doubleword aligned address.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*/
|
||||||
|
.globl test
|
||||||
|
test:
|
||||||
|
cgrl %r1,unaligned
|
||||||
|
|
||||||
|
.align 8
|
||||||
|
.globl expected_old_psw
|
||||||
|
expected_old_psw:
|
||||||
|
.quad 0x180000000,test
|
||||||
|
.long 0
|
||||||
|
unaligned:
|
||||||
|
.quad 0
|
16
tests/tcg/s390x/clrl-unaligned.S
Normal file
16
tests/tcg/s390x/clrl-unaligned.S
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
* Test CLRL with a non-word aligned address.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*/
|
||||||
|
.globl test
|
||||||
|
test:
|
||||||
|
clrl %r1,unaligned
|
||||||
|
|
||||||
|
.align 8
|
||||||
|
.globl expected_old_psw
|
||||||
|
expected_old_psw:
|
||||||
|
.quad 0x180000000,test
|
||||||
|
.short 0
|
||||||
|
unaligned:
|
||||||
|
.long 0
|
16
tests/tcg/s390x/crl-unaligned.S
Normal file
16
tests/tcg/s390x/crl-unaligned.S
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
* Test CRL with a non-word aligned address.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*/
|
||||||
|
.globl test
|
||||||
|
test:
|
||||||
|
crl %r1,unaligned
|
||||||
|
|
||||||
|
.align 8
|
||||||
|
.globl expected_old_psw
|
||||||
|
expected_old_psw:
|
||||||
|
.quad 0x180000000,test
|
||||||
|
.short 0
|
||||||
|
unaligned:
|
||||||
|
.long 0
|
17
tests/tcg/s390x/ex-odd.S
Normal file
17
tests/tcg/s390x/ex-odd.S
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
/*
|
||||||
|
* Test EXECUTing a non-mapped odd address.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*/
|
||||||
|
.globl test
|
||||||
|
test:
|
||||||
|
lgrl %r1,odd_addr
|
||||||
|
fail:
|
||||||
|
ex 0,0(%r1)
|
||||||
|
|
||||||
|
.align 8
|
||||||
|
odd_addr:
|
||||||
|
.quad 0xDDDDDDDDDDDDDDDD
|
||||||
|
.globl expected_old_psw
|
||||||
|
expected_old_psw:
|
||||||
|
.quad 0x180000000,fail
|
16
tests/tcg/s390x/lgrl-unaligned.S
Normal file
16
tests/tcg/s390x/lgrl-unaligned.S
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
* Test LGRL from a non-doubleword aligned address.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*/
|
||||||
|
.globl test
|
||||||
|
test:
|
||||||
|
lgrl %r1,unaligned
|
||||||
|
|
||||||
|
.align 8
|
||||||
|
.globl expected_old_psw
|
||||||
|
expected_old_psw:
|
||||||
|
.quad 0x180000000,test
|
||||||
|
.long 0
|
||||||
|
unaligned:
|
||||||
|
.quad 0
|
16
tests/tcg/s390x/llgfrl-unaligned.S
Normal file
16
tests/tcg/s390x/llgfrl-unaligned.S
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
* Test LLGFRL from a non-word aligned address.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*/
|
||||||
|
.globl test
|
||||||
|
test:
|
||||||
|
llgfrl %r1,unaligned
|
||||||
|
|
||||||
|
.align 8
|
||||||
|
.globl expected_old_psw
|
||||||
|
expected_old_psw:
|
||||||
|
.quad 0x180000000,test
|
||||||
|
.short 0
|
||||||
|
unaligned:
|
||||||
|
.long 0
|
18
tests/tcg/s390x/lpswe-unaligned.S
Normal file
18
tests/tcg/s390x/lpswe-unaligned.S
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
* Test LPSWE from a non-doubleword aligned address.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*/
|
||||||
|
.globl test
|
||||||
|
test:
|
||||||
|
larl %r1,unaligned
|
||||||
|
fail:
|
||||||
|
lpswe 0(%r1)
|
||||||
|
|
||||||
|
.align 8
|
||||||
|
.globl expected_old_psw
|
||||||
|
expected_old_psw:
|
||||||
|
.quad 0x180000000,fail
|
||||||
|
.long 0
|
||||||
|
unaligned:
|
||||||
|
.quad 0
|
16
tests/tcg/s390x/lrl-unaligned.S
Normal file
16
tests/tcg/s390x/lrl-unaligned.S
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
* Test LRL from a non-word aligned address.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*/
|
||||||
|
.globl test
|
||||||
|
test:
|
||||||
|
lrl %r1,unaligned
|
||||||
|
|
||||||
|
.align 8
|
||||||
|
.globl expected_old_psw
|
||||||
|
expected_old_psw:
|
||||||
|
.quad 0x180000000,test
|
||||||
|
.short 0
|
||||||
|
unaligned:
|
||||||
|
.long 0
|
40
tests/tcg/s390x/pgm-specification-softmmu.S
Normal file
40
tests/tcg/s390x/pgm-specification-softmmu.S
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
* Common softmmu code for specification exception testing.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*/
|
||||||
|
.section .head
|
||||||
|
.org 0x8d
|
||||||
|
ilc:
|
||||||
|
.org 0x8e
|
||||||
|
program_interruption_code:
|
||||||
|
.org 0x150
|
||||||
|
program_old_psw:
|
||||||
|
.org 0x1D0 /* program new PSW */
|
||||||
|
.quad 0x180000000,pgm /* 64-bit mode */
|
||||||
|
.org 0x200 /* lowcore padding */
|
||||||
|
|
||||||
|
.globl _start
|
||||||
|
_start:
|
||||||
|
lpswe test_psw
|
||||||
|
|
||||||
|
pgm:
|
||||||
|
chhsi program_interruption_code,0x6 /* PGM_SPECIFICATION? */
|
||||||
|
jne failure
|
||||||
|
lg %r0,expected_old_psw+8 /* ilc adjustment */
|
||||||
|
llgc %r1,ilc
|
||||||
|
agr %r0,%r1
|
||||||
|
stg %r0,expected_old_psw+8
|
||||||
|
clc expected_old_psw(16),program_old_psw /* correct location? */
|
||||||
|
jne failure
|
||||||
|
lpswe success_psw
|
||||||
|
failure:
|
||||||
|
lpswe failure_psw
|
||||||
|
|
||||||
|
.align 8
|
||||||
|
test_psw:
|
||||||
|
.quad 0x180000000,test /* 64-bit mode */
|
||||||
|
success_psw:
|
||||||
|
.quad 0x2000180000000,0xfff /* see is_special_wait_psw() */
|
||||||
|
failure_psw:
|
||||||
|
.quad 0x2000180000000,0 /* disabled wait */
|
37
tests/tcg/s390x/pgm-specification-user.c
Normal file
37
tests/tcg/s390x/pgm-specification-user.c
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* Common user code for specification exception testing.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*/
|
||||||
|
#include <assert.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
extern void test(void);
|
||||||
|
extern long expected_old_psw[2];
|
||||||
|
|
||||||
|
static void handle_sigill(int sig, siginfo_t *info, void *ucontext)
|
||||||
|
{
|
||||||
|
if ((long)info->si_addr != expected_old_psw[1]) {
|
||||||
|
_exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
_exit(EXIT_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
struct sigaction act;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
memset(&act, 0, sizeof(act));
|
||||||
|
act.sa_sigaction = handle_sigill;
|
||||||
|
act.sa_flags = SA_SIGINFO;
|
||||||
|
err = sigaction(SIGILL, &act, NULL);
|
||||||
|
assert(err == 0);
|
||||||
|
|
||||||
|
test();
|
||||||
|
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
15
tests/tcg/s390x/pgm-specification.mak
Normal file
15
tests/tcg/s390x/pgm-specification.mak
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
# List of specification exception tests.
|
||||||
|
# Shared between the softmmu and the user makefiles.
|
||||||
|
PGM_SPECIFICATION_TESTS = \
|
||||||
|
br-odd \
|
||||||
|
cgrl-unaligned \
|
||||||
|
clrl-unaligned \
|
||||||
|
crl-unaligned \
|
||||||
|
ex-odd \
|
||||||
|
lgrl-unaligned \
|
||||||
|
llgfrl-unaligned \
|
||||||
|
lpswe-unaligned \
|
||||||
|
lrl-unaligned \
|
||||||
|
stgrl-unaligned \
|
||||||
|
strl-unaligned
|
20
tests/tcg/s390x/softmmu.ld
Normal file
20
tests/tcg/s390x/softmmu.ld
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* Linker script for the softmmu test kernels.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*/
|
||||||
|
|
||||||
|
ENTRY(_start)
|
||||||
|
|
||||||
|
SECTIONS {
|
||||||
|
. = 0;
|
||||||
|
|
||||||
|
.text : {
|
||||||
|
*(.head)
|
||||||
|
*(.text)
|
||||||
|
}
|
||||||
|
|
||||||
|
/DISCARD/ : {
|
||||||
|
*(*)
|
||||||
|
}
|
||||||
|
}
|
16
tests/tcg/s390x/stgrl-unaligned.S
Normal file
16
tests/tcg/s390x/stgrl-unaligned.S
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
* Test STGRL to a non-doubleword aligned address.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*/
|
||||||
|
.globl test
|
||||||
|
test:
|
||||||
|
stgrl %r1,unaligned
|
||||||
|
|
||||||
|
.align 8
|
||||||
|
.globl expected_old_psw
|
||||||
|
expected_old_psw:
|
||||||
|
.quad 0x180000000,test
|
||||||
|
.long 0
|
||||||
|
unaligned:
|
||||||
|
.quad 0
|
16
tests/tcg/s390x/strl-unaligned.S
Normal file
16
tests/tcg/s390x/strl-unaligned.S
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
* Test STRL to a non-word aligned address.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*/
|
||||||
|
.globl test
|
||||||
|
test:
|
||||||
|
strl %r1,unaligned
|
||||||
|
|
||||||
|
.align 8
|
||||||
|
.globl expected_old_psw
|
||||||
|
expected_old_psw:
|
||||||
|
.quad 0x180000000,test
|
||||||
|
.short 0
|
||||||
|
unaligned:
|
||||||
|
.long 0
|
Loading…
Reference in New Issue
Block a user