* Fix emulation of s390x instructions: CKSM, CLM, ICM, MC, CLGEBR(A)
* Remove useless and non-working s390x migration avocado tests * Fix loongarch CSRRD CPUID instruction when running on s390x hosts * Disable flaky s390x virtio-gpu test by default -----BEGIN PGP SIGNATURE----- iQJFBAABCAAvFiEEJ7iIR+7gJQEY8+q5LtnXdP5wLbUFAmS+q4IRHHRodXRoQHJl ZGhhdC5jb20ACgkQLtnXdP5wLbXB9xAAhF6bV23f1C9SHTWpxoN8oDYqJ3ZRR/D2 z/4RHzXC5icw4jWPXG/zf19a+TT5UA03HFqvXbFlEtLVLF1/RY2wDnQbHJd2msRX YwvqE9SVoxbS3Jy+FS6XQ69WmPNoz01x+BIG5ig/jzXdOPZmylfik+1eAmHNHvcF GNCvdFwDzAZnB7N7y973BRnYn73CXBk3ap3UnnX/PaFD9k7DowTW5HB4ej/Uydwl z71/NbZhjgKYNpWgPYCI0Mypmz8b870o0VJxEJO9/1pWYLOoUcy/BKdOeGr3vqqO cduRL2c78Xd2RaUt4TgYmsZKkLazcG37XnQ5iaewDctTjfjuL5Oss16SO0WTut3p 8DtJHZCwD+0GcnbdFxyy7qdFmW2jgqsJtIPtnZs29ruEXnl0iyovjw38/J4kgBrF eHY+X2AyvlXI6zNkRMjKp+ltAkVx1vXbedM/bfaEcSBiKAI/OlV0Y1slX7+K14pR ITGOmBEG+yytMDnanzZKdN1DlBJMbGFYg9MctL7/yEwtD9vTl7gc66JhqcndkmCg VXSvqN8ECXPRbeNyZQZP+weXQydpkk3ndVIlSUrWpWsJtj0GDQOt+iK/KWcQ+AkS TXXp2OKM/mC+z6pdODsn/EoLl0toeDjpZFu27t/AvglNkmDFneY72LrtSwKgYHsi OJpjY1zCoxM= =Q+jQ -----END PGP SIGNATURE----- Merge tag 'pull-request-2023-07-24' of https://gitlab.com/thuth/qemu into staging * Fix emulation of s390x instructions: CKSM, CLM, ICM, MC, CLGEBR(A) * Remove useless and non-working s390x migration avocado tests * Fix loongarch CSRRD CPUID instruction when running on s390x hosts * Disable flaky s390x virtio-gpu test by default # -----BEGIN PGP SIGNATURE----- # # iQJFBAABCAAvFiEEJ7iIR+7gJQEY8+q5LtnXdP5wLbUFAmS+q4IRHHRodXRoQHJl # ZGhhdC5jb20ACgkQLtnXdP5wLbXB9xAAhF6bV23f1C9SHTWpxoN8oDYqJ3ZRR/D2 # z/4RHzXC5icw4jWPXG/zf19a+TT5UA03HFqvXbFlEtLVLF1/RY2wDnQbHJd2msRX # YwvqE9SVoxbS3Jy+FS6XQ69WmPNoz01x+BIG5ig/jzXdOPZmylfik+1eAmHNHvcF # GNCvdFwDzAZnB7N7y973BRnYn73CXBk3ap3UnnX/PaFD9k7DowTW5HB4ej/Uydwl # z71/NbZhjgKYNpWgPYCI0Mypmz8b870o0VJxEJO9/1pWYLOoUcy/BKdOeGr3vqqO # cduRL2c78Xd2RaUt4TgYmsZKkLazcG37XnQ5iaewDctTjfjuL5Oss16SO0WTut3p # 8DtJHZCwD+0GcnbdFxyy7qdFmW2jgqsJtIPtnZs29ruEXnl0iyovjw38/J4kgBrF # eHY+X2AyvlXI6zNkRMjKp+ltAkVx1vXbedM/bfaEcSBiKAI/OlV0Y1slX7+K14pR # ITGOmBEG+yytMDnanzZKdN1DlBJMbGFYg9MctL7/yEwtD9vTl7gc66JhqcndkmCg # VXSvqN8ECXPRbeNyZQZP+weXQydpkk3ndVIlSUrWpWsJtj0GDQOt+iK/KWcQ+AkS # TXXp2OKM/mC+z6pdODsn/EoLl0toeDjpZFu27t/AvglNkmDFneY72LrtSwKgYHsi # OJpjY1zCoxM= # =Q+jQ # -----END PGP SIGNATURE----- # gpg: Signature made Mon 24 Jul 2023 17:49:06 BST # gpg: using RSA key 27B88847EEE0250118F3EAB92ED9D774FE702DB5 # gpg: issuer "thuth@redhat.com" # gpg: Good signature from "Thomas Huth <th.huth@gmx.de>" [full] # gpg: aka "Thomas Huth <thuth@redhat.com>" [full] # gpg: aka "Thomas Huth <huth@tuxfamily.org>" [full] # gpg: aka "Thomas Huth <th.huth@posteo.de>" [unknown] # Primary key fingerprint: 27B8 8847 EEE0 2501 18F3 EAB9 2ED9 D774 FE70 2DB5 * tag 'pull-request-2023-07-24' of https://gitlab.com/thuth/qemu: tests/avocado/machine_s390_ccw_virtio: Skip the flaky virtio-gpu test by default target/loongarch: Fix the CSRRD CPUID instruction on big endian hosts tests/avocado/migration: Remove the malfunctioning s390x tests tests/tcg/s390x: Test VCKSM tests/tcg/s390x: Test STPQ tests/tcg/s390x: Test MC tests/tcg/s390x: Test ICM tests/tcg/s390x: Test CLM tests/tcg/s390x: Test CLGEBR and CGEBRA tests/tcg/s390x: Test CKSM target/s390x: Fix assertion failure in VFMIN/VFMAX with type 13 target/s390x: Make MC raise specification exception when class >= 16 target/s390x: Fix ICM with M3=0 target/s390x: Fix CONVERT TO LOGICAL/FIXED with out-of-range inputs target/s390x: Fix CLM with M3=0 target/s390x: Make CKSM raise an exception if R2 is odd Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
3ee44ec727
@ -342,6 +342,7 @@ typedef struct CPUArchState {
|
|||||||
uint64_t CSR_DBG;
|
uint64_t CSR_DBG;
|
||||||
uint64_t CSR_DERA;
|
uint64_t CSR_DERA;
|
||||||
uint64_t CSR_DSAVE;
|
uint64_t CSR_DSAVE;
|
||||||
|
uint64_t CSR_CPUID;
|
||||||
|
|
||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
LoongArchTLB tlb[LOONGARCH_TLB_MAX];
|
LoongArchTLB tlb[LOONGARCH_TLB_MAX];
|
||||||
|
@ -35,6 +35,15 @@ target_ulong helper_csrrd_pgd(CPULoongArchState *env)
|
|||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
target_ulong helper_csrrd_cpuid(CPULoongArchState *env)
|
||||||
|
{
|
||||||
|
LoongArchCPU *lac = env_archcpu(env);
|
||||||
|
|
||||||
|
env->CSR_CPUID = CPU(lac)->cpu_index;
|
||||||
|
|
||||||
|
return env->CSR_CPUID;
|
||||||
|
}
|
||||||
|
|
||||||
target_ulong helper_csrrd_tval(CPULoongArchState *env)
|
target_ulong helper_csrrd_tval(CPULoongArchState *env)
|
||||||
{
|
{
|
||||||
LoongArchCPU *cpu = env_archcpu(env);
|
LoongArchCPU *cpu = env_archcpu(env);
|
||||||
|
@ -98,6 +98,7 @@ DEF_HELPER_1(rdtime_d, i64, env)
|
|||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
/* CSRs helper */
|
/* CSRs helper */
|
||||||
DEF_HELPER_1(csrrd_pgd, i64, env)
|
DEF_HELPER_1(csrrd_pgd, i64, env)
|
||||||
|
DEF_HELPER_1(csrrd_cpuid, i64, env)
|
||||||
DEF_HELPER_1(csrrd_tval, i64, env)
|
DEF_HELPER_1(csrrd_tval, i64, env)
|
||||||
DEF_HELPER_2(csrwr_estat, i64, env, tl)
|
DEF_HELPER_2(csrwr_estat, i64, env, tl)
|
||||||
DEF_HELPER_2(csrwr_asid, i64, env, tl)
|
DEF_HELPER_2(csrwr_asid, i64, env, tl)
|
||||||
|
@ -99,13 +99,7 @@ static const CSRInfo csr_info[] = {
|
|||||||
CSR_OFF(PWCH),
|
CSR_OFF(PWCH),
|
||||||
CSR_OFF(STLBPS),
|
CSR_OFF(STLBPS),
|
||||||
CSR_OFF(RVACFG),
|
CSR_OFF(RVACFG),
|
||||||
[LOONGARCH_CSR_CPUID] = {
|
CSR_OFF_FUNCS(CPUID, CSRFL_READONLY, gen_helper_csrrd_cpuid, NULL),
|
||||||
.offset = (int)offsetof(CPUState, cpu_index)
|
|
||||||
- (int)offsetof(LoongArchCPU, env),
|
|
||||||
.flags = CSRFL_READONLY,
|
|
||||||
.readfn = NULL,
|
|
||||||
.writefn = NULL
|
|
||||||
},
|
|
||||||
CSR_OFF_FLAGS(PRCFG1, CSRFL_READONLY),
|
CSR_OFF_FLAGS(PRCFG1, CSRFL_READONLY),
|
||||||
CSR_OFF_FLAGS(PRCFG2, CSRFL_READONLY),
|
CSR_OFF_FLAGS(PRCFG2, CSRFL_READONLY),
|
||||||
CSR_OFF_FLAGS(PRCFG3, CSRFL_READONLY),
|
CSR_OFF_FLAGS(PRCFG3, CSRFL_READONLY),
|
||||||
|
@ -639,7 +639,7 @@ void monitor_event(CPUS390XState *env,
|
|||||||
void HELPER(monitor_call)(CPUS390XState *env, uint64_t monitor_code,
|
void HELPER(monitor_call)(CPUS390XState *env, uint64_t monitor_code,
|
||||||
uint32_t monitor_class)
|
uint32_t monitor_class)
|
||||||
{
|
{
|
||||||
g_assert(monitor_class <= 0xff);
|
g_assert(monitor_class <= 0xf);
|
||||||
|
|
||||||
if (env->cregs[8] & (0x8000 >> monitor_class)) {
|
if (env->cregs[8] & (0x8000 >> monitor_class)) {
|
||||||
monitor_event(env, monitor_code, monitor_class, GETPC());
|
monitor_event(env, monitor_code, monitor_class, GETPC());
|
||||||
|
@ -52,7 +52,8 @@ uint8_t s390_softfloat_exc_to_ieee(unsigned int exc)
|
|||||||
s390_exc |= (exc & float_flag_divbyzero) ? S390_IEEE_MASK_DIVBYZERO : 0;
|
s390_exc |= (exc & float_flag_divbyzero) ? S390_IEEE_MASK_DIVBYZERO : 0;
|
||||||
s390_exc |= (exc & float_flag_overflow) ? S390_IEEE_MASK_OVERFLOW : 0;
|
s390_exc |= (exc & float_flag_overflow) ? S390_IEEE_MASK_OVERFLOW : 0;
|
||||||
s390_exc |= (exc & float_flag_underflow) ? S390_IEEE_MASK_UNDERFLOW : 0;
|
s390_exc |= (exc & float_flag_underflow) ? S390_IEEE_MASK_UNDERFLOW : 0;
|
||||||
s390_exc |= (exc & float_flag_inexact) ? S390_IEEE_MASK_INEXACT : 0;
|
s390_exc |= (exc & (float_flag_inexact | float_flag_invalid_cvti)) ?
|
||||||
|
S390_IEEE_MASK_INEXACT : 0;
|
||||||
|
|
||||||
return s390_exc;
|
return s390_exc;
|
||||||
}
|
}
|
||||||
|
@ -157,7 +157,7 @@
|
|||||||
C(0xb2fa, NIAI, E, EH, 0, 0, 0, 0, 0, 0)
|
C(0xb2fa, NIAI, E, EH, 0, 0, 0, 0, 0, 0)
|
||||||
|
|
||||||
/* CHECKSUM */
|
/* CHECKSUM */
|
||||||
C(0xb241, CKSM, RRE, Z, r1_o, ra2, new, r1_32, cksm, 0)
|
C(0xb241, CKSM, RRE, Z, r1_o, ra2_E, new, r1_32, cksm, 0)
|
||||||
|
|
||||||
/* COPY SIGN */
|
/* COPY SIGN */
|
||||||
F(0xb372, CPSDR, RRF_b, FPSSH, f3, f2, new, f1, cps, 0, IF_AFP1 | IF_AFP2 | IF_AFP3)
|
F(0xb372, CPSDR, RRF_b, FPSSH, f3, f2, new, f1, cps, 0, IF_AFP1 | IF_AFP2 | IF_AFP3)
|
||||||
|
@ -667,6 +667,11 @@ uint32_t HELPER(clm)(CPUS390XState *env, uint32_t r1, uint32_t mask,
|
|||||||
HELPER_LOG("%s: r1 0x%x mask 0x%x addr 0x%" PRIx64 "\n", __func__, r1,
|
HELPER_LOG("%s: r1 0x%x mask 0x%x addr 0x%" PRIx64 "\n", __func__, r1,
|
||||||
mask, addr);
|
mask, addr);
|
||||||
|
|
||||||
|
if (!mask) {
|
||||||
|
/* Recognize access exceptions for the first byte */
|
||||||
|
probe_read(env, addr, 1, cpu_mmu_index(env, false), ra);
|
||||||
|
}
|
||||||
|
|
||||||
while (mask) {
|
while (mask) {
|
||||||
if (mask & 8) {
|
if (mask & 8) {
|
||||||
uint8_t d = cpu_ldub_data_ra(env, addr, ra);
|
uint8_t d = cpu_ldub_data_ra(env, addr, ra);
|
||||||
|
@ -2515,6 +2515,12 @@ static DisasJumpType op_icm(DisasContext *s, DisasOps *o)
|
|||||||
ccm = ((1ull << len) - 1) << pos;
|
ccm = ((1ull << len) - 1) << pos;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 0:
|
||||||
|
/* Recognize access exceptions for the first byte. */
|
||||||
|
tcg_gen_qemu_ld_i64(tmp, o->in2, get_mem_index(s), MO_UB);
|
||||||
|
gen_op_movi_cc(s, 0);
|
||||||
|
return DISAS_NEXT;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
/* This is going to be a sequence of loads and inserts. */
|
/* This is going to be a sequence of loads and inserts. */
|
||||||
pos = base + 32 - 8;
|
pos = base + 32 - 8;
|
||||||
@ -3171,9 +3177,9 @@ static DisasJumpType op_lcbb(DisasContext *s, DisasOps *o)
|
|||||||
|
|
||||||
static DisasJumpType op_mc(DisasContext *s, DisasOps *o)
|
static DisasJumpType op_mc(DisasContext *s, DisasOps *o)
|
||||||
{
|
{
|
||||||
const uint16_t monitor_class = get_field(s, i2);
|
const uint8_t monitor_class = get_field(s, i2);
|
||||||
|
|
||||||
if (monitor_class & 0xff00) {
|
if (monitor_class & 0xf0) {
|
||||||
gen_program_exception(s, PGM_SPECIFICATION);
|
gen_program_exception(s, PGM_SPECIFICATION);
|
||||||
return DISAS_NORETURN;
|
return DISAS_NORETURN;
|
||||||
}
|
}
|
||||||
@ -5779,6 +5785,12 @@ static void in2_ra2(DisasContext *s, DisasOps *o)
|
|||||||
}
|
}
|
||||||
#define SPEC_in2_ra2 0
|
#define SPEC_in2_ra2 0
|
||||||
|
|
||||||
|
static void in2_ra2_E(DisasContext *s, DisasOps *o)
|
||||||
|
{
|
||||||
|
return in2_ra2(s, o);
|
||||||
|
}
|
||||||
|
#define SPEC_in2_ra2_E SPEC_r2_even
|
||||||
|
|
||||||
static void in2_a2(DisasContext *s, DisasOps *o)
|
static void in2_a2(DisasContext *s, DisasOps *o)
|
||||||
{
|
{
|
||||||
int x2 = have_field(s, x2) ? get_field(s, x2) : 0;
|
int x2 = have_field(s, x2) ? get_field(s, x2) : 0;
|
||||||
|
@ -3047,7 +3047,7 @@ static DisasJumpType op_vfmax(DisasContext *s, DisasOps *o)
|
|||||||
const uint8_t m5 = get_field(s, m5);
|
const uint8_t m5 = get_field(s, m5);
|
||||||
gen_helper_gvec_3_ptr *fn;
|
gen_helper_gvec_3_ptr *fn;
|
||||||
|
|
||||||
if (m6 == 5 || m6 == 6 || m6 == 7 || m6 > 13) {
|
if (m6 == 5 || m6 == 6 || m6 == 7 || m6 >= 13) {
|
||||||
gen_program_exception(s, PGM_SPECIFICATION);
|
gen_program_exception(s, PGM_SPECIFICATION);
|
||||||
return DISAS_NORETURN;
|
return DISAS_NORETURN;
|
||||||
}
|
}
|
||||||
|
@ -159,7 +159,6 @@ class S390CCWVirtioMachine(QemuSystemTest):
|
|||||||
'MemTotal: 115640 kB')
|
'MemTotal: 115640 kB')
|
||||||
|
|
||||||
|
|
||||||
@skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab')
|
|
||||||
def test_s390x_fedora(self):
|
def test_s390x_fedora(self):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
@ -229,6 +228,8 @@ class S390CCWVirtioMachine(QemuSystemTest):
|
|||||||
# writing to the framebuffer. Since the PPM is uncompressed, we then
|
# writing to the framebuffer. Since the PPM is uncompressed, we then
|
||||||
# can simply read the written "magic bytes" back from the PPM file to
|
# can simply read the written "magic bytes" back from the PPM file to
|
||||||
# check whether the framebuffer is working as expected.
|
# check whether the framebuffer is working as expected.
|
||||||
|
# Unfortunately, this test is flaky, so we don't run it by default
|
||||||
|
if os.getenv('QEMU_TEST_FLAKY_TESTS'):
|
||||||
self.log.info("Test screendump of virtio-gpu device")
|
self.log.info("Test screendump of virtio-gpu device")
|
||||||
exec_command_and_wait_for_pattern(self,
|
exec_command_and_wait_for_pattern(self,
|
||||||
'while ! (dmesg | grep gpudrmfb) ; do sleep 1 ; done',
|
'while ! (dmesg | grep gpudrmfb) ; do sleep 1 ; done',
|
||||||
@ -254,6 +255,8 @@ class S390CCWVirtioMachine(QemuSystemTest):
|
|||||||
self.assertEqual(line, b"255\n")
|
self.assertEqual(line, b"255\n")
|
||||||
line = ppmfile.readline(256)
|
line = ppmfile.readline(256)
|
||||||
self.assertEqual(line, b"The quick fox jumps over a lazy dog\n")
|
self.assertEqual(line, b"The quick fox jumps over a lazy dog\n")
|
||||||
|
else:
|
||||||
|
self.log.info("Skipped flaky screendump of virtio-gpu device test")
|
||||||
|
|
||||||
# Hot-plug a virtio-crypto device and see whether it gets accepted
|
# Hot-plug a virtio-crypto device and see whether it gets accepted
|
||||||
self.log.info("Test hot-plug virtio-crypto device")
|
self.log.info("Test hot-plug virtio-crypto device")
|
||||||
|
@ -134,21 +134,3 @@ class PPC64(MigrationTest):
|
|||||||
|
|
||||||
def test_migration_with_exec(self):
|
def test_migration_with_exec(self):
|
||||||
self.migration_with_exec()
|
self.migration_with_exec()
|
||||||
|
|
||||||
|
|
||||||
@skipUnless('s390x' in os.uname()[4], "host != target")
|
|
||||||
class S390X(MigrationTest):
|
|
||||||
"""
|
|
||||||
:avocado: tags=arch:s390x
|
|
||||||
:avocado: tags=machine:s390-ccw-virtio
|
|
||||||
:avocado: tags=cpu:qemu
|
|
||||||
"""
|
|
||||||
|
|
||||||
def test_migration_with_tcp_localhost(self):
|
|
||||||
self.migration_with_tcp_localhost()
|
|
||||||
|
|
||||||
def test_migration_with_unix(self):
|
|
||||||
self.migration_with_unix()
|
|
||||||
|
|
||||||
def test_migration_with_exec(self):
|
|
||||||
self.migration_with_exec()
|
|
||||||
|
@ -16,13 +16,18 @@ LDFLAGS=-nostdlib -static
|
|||||||
|
|
||||||
ASM_TESTS = \
|
ASM_TESTS = \
|
||||||
bal \
|
bal \
|
||||||
|
cksm \
|
||||||
|
clm \
|
||||||
exrl-ssm-early \
|
exrl-ssm-early \
|
||||||
|
icm \
|
||||||
sam \
|
sam \
|
||||||
lpsw \
|
lpsw \
|
||||||
lpswe-early \
|
lpswe-early \
|
||||||
lra \
|
lra \
|
||||||
|
mc \
|
||||||
ssm-early \
|
ssm-early \
|
||||||
stosm-early \
|
stosm-early \
|
||||||
|
stpq \
|
||||||
unaligned-lowcore
|
unaligned-lowcore
|
||||||
|
|
||||||
include $(S390X_SRC)/pgm-specification.mak
|
include $(S390X_SRC)/pgm-specification.mak
|
||||||
|
@ -39,12 +39,17 @@ TESTS+=mxdb
|
|||||||
TESTS+=epsw
|
TESTS+=epsw
|
||||||
TESTS+=larl
|
TESTS+=larl
|
||||||
TESTS+=mdeb
|
TESTS+=mdeb
|
||||||
|
TESTS+=cgebra
|
||||||
|
TESTS+=clgebr
|
||||||
|
|
||||||
cdsg: CFLAGS+=-pthread
|
cdsg: CFLAGS+=-pthread
|
||||||
cdsg: LDFLAGS+=-pthread
|
cdsg: LDFLAGS+=-pthread
|
||||||
|
|
||||||
rxsbg: CFLAGS+=-O2
|
rxsbg: CFLAGS+=-O2
|
||||||
|
|
||||||
|
cgebra: LDFLAGS+=-lm
|
||||||
|
clgebr: LDFLAGS+=-lm
|
||||||
|
|
||||||
include $(S390X_SRC)/pgm-specification.mak
|
include $(S390X_SRC)/pgm-specification.mak
|
||||||
$(PGM_SPECIFICATION_TESTS): pgm-specification-user.o
|
$(PGM_SPECIFICATION_TESTS): pgm-specification-user.o
|
||||||
$(PGM_SPECIFICATION_TESTS): LDFLAGS+=pgm-specification-user.o
|
$(PGM_SPECIFICATION_TESTS): LDFLAGS+=pgm-specification-user.o
|
||||||
@ -53,6 +58,7 @@ TESTS += $(PGM_SPECIFICATION_TESTS)
|
|||||||
Z13_TESTS=vistr
|
Z13_TESTS=vistr
|
||||||
Z13_TESTS+=lcbb
|
Z13_TESTS+=lcbb
|
||||||
Z13_TESTS+=locfhr
|
Z13_TESTS+=locfhr
|
||||||
|
Z13_TESTS+=vcksm
|
||||||
$(Z13_TESTS): CFLAGS+=-march=z13 -O2
|
$(Z13_TESTS): CFLAGS+=-march=z13 -O2
|
||||||
TESTS+=$(Z13_TESTS)
|
TESTS+=$(Z13_TESTS)
|
||||||
|
|
||||||
|
32
tests/tcg/s390x/cgebra.c
Normal file
32
tests/tcg/s390x/cgebra.c
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* Test the CGEBRA instruction.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*/
|
||||||
|
#include <assert.h>
|
||||||
|
#include <fenv.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
float r2 = 1E+300;
|
||||||
|
long long r1;
|
||||||
|
int cc;
|
||||||
|
|
||||||
|
feclearexcept(FE_ALL_EXCEPT);
|
||||||
|
asm("cgebra %[r1],%[m3],%[r2],%[m4]\n"
|
||||||
|
"ipm %[cc]\n"
|
||||||
|
: [r1] "=r" (r1)
|
||||||
|
, [cc] "=r" (cc)
|
||||||
|
: [m3] "i" (5) /* round toward 0 */
|
||||||
|
, [r2] "f" (r2)
|
||||||
|
, [m4] "i" (8) /* bit 0 is set, but must be ignored; XxC is not set */
|
||||||
|
: "cc");
|
||||||
|
cc >>= 28;
|
||||||
|
|
||||||
|
assert(r1 == 0x7fffffffffffffffLL);
|
||||||
|
assert(cc == 3);
|
||||||
|
assert(fetestexcept(FE_ALL_EXCEPT) == (FE_INVALID | FE_INEXACT));
|
||||||
|
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
29
tests/tcg/s390x/cksm.S
Normal file
29
tests/tcg/s390x/cksm.S
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
.org 0x8e
|
||||||
|
program_interruption_code:
|
||||||
|
.org 0x1d0 /* program new PSW */
|
||||||
|
.quad 0,pgm
|
||||||
|
.org 0x200 /* lowcore padding */
|
||||||
|
.globl _start
|
||||||
|
_start:
|
||||||
|
lmg %r0,%r1,cksm_args
|
||||||
|
cksm %r2,%r0
|
||||||
|
c %r2,cksm_exp
|
||||||
|
jne failure
|
||||||
|
.insn rre,0xb2410000,%r2,%r15 /* cksm %r2,%r15 */
|
||||||
|
failure:
|
||||||
|
lpswe failure_psw
|
||||||
|
pgm:
|
||||||
|
chhsi program_interruption_code,6 /* specification exception? */
|
||||||
|
jne failure
|
||||||
|
lpswe success_psw
|
||||||
|
cksm_args:
|
||||||
|
.quad cksm_buf, 16
|
||||||
|
cksm_buf:
|
||||||
|
.quad 0xaaaabbbbcccc0000, 0x12345678
|
||||||
|
cksm_exp:
|
||||||
|
.long 0x89ab1234
|
||||||
|
.align 8
|
||||||
|
success_psw:
|
||||||
|
.quad 0x2000000000000,0xfff /* see is_special_wait_psw() */
|
||||||
|
failure_psw:
|
||||||
|
.quad 0x2000000000000,0 /* disabled wait */
|
32
tests/tcg/s390x/clgebr.c
Normal file
32
tests/tcg/s390x/clgebr.c
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* Test the CLGEBR instruction.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*/
|
||||||
|
#include <assert.h>
|
||||||
|
#include <fenv.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
float r2 = -1;
|
||||||
|
long long r1;
|
||||||
|
int cc;
|
||||||
|
|
||||||
|
feclearexcept(FE_ALL_EXCEPT);
|
||||||
|
asm("clgebr %[r1],%[m3],%[r2],%[m4]\n"
|
||||||
|
"ipm %[cc]\n"
|
||||||
|
: [r1] "=r" (r1)
|
||||||
|
, [cc] "=r" (cc)
|
||||||
|
: [m3] "i" (5) /* round toward 0 */
|
||||||
|
, [r2] "f" (r2)
|
||||||
|
, [m4] "i" (8) /* bit 0 is set, but must be ignored; XxC is not set */
|
||||||
|
: "cc");
|
||||||
|
cc >>= 28;
|
||||||
|
|
||||||
|
assert(r1 == 0);
|
||||||
|
assert(cc == 3);
|
||||||
|
assert(fetestexcept(FE_ALL_EXCEPT) == (FE_INVALID | FE_INEXACT));
|
||||||
|
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
29
tests/tcg/s390x/clm.S
Normal file
29
tests/tcg/s390x/clm.S
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
.org 0x8e
|
||||||
|
program_interruption_code:
|
||||||
|
.org 0x1d0 /* program new PSW */
|
||||||
|
.quad 0,pgm
|
||||||
|
.org 0x200 /* lowcore padding */
|
||||||
|
.globl _start
|
||||||
|
_start:
|
||||||
|
lgrl %r0,op1
|
||||||
|
clm %r0,6,op2
|
||||||
|
jle failure
|
||||||
|
lgrl %r1,bad_addr
|
||||||
|
clm %r0,0,0(%r1)
|
||||||
|
failure:
|
||||||
|
lpswe failure_psw
|
||||||
|
pgm:
|
||||||
|
chhsi program_interruption_code,5 /* addressing exception? */
|
||||||
|
jne failure
|
||||||
|
lpswe success_psw
|
||||||
|
.align 8
|
||||||
|
op1:
|
||||||
|
.quad 0x1234567887654321
|
||||||
|
op2:
|
||||||
|
.quad 0x3456789abcdef012
|
||||||
|
bad_addr:
|
||||||
|
.quad 0xffffffff00000000
|
||||||
|
success_psw:
|
||||||
|
.quad 0x2000000000000,0xfff /* see is_special_wait_psw() */
|
||||||
|
failure_psw:
|
||||||
|
.quad 0x2000000000000,0 /* disabled wait */
|
32
tests/tcg/s390x/icm.S
Normal file
32
tests/tcg/s390x/icm.S
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
.org 0x8e
|
||||||
|
program_interruption_code:
|
||||||
|
.org 0x1d0 /* program new PSW */
|
||||||
|
.quad 0,pgm
|
||||||
|
.org 0x200 /* lowcore padding */
|
||||||
|
.globl _start
|
||||||
|
_start:
|
||||||
|
lgrl %r0,op1
|
||||||
|
icm %r0,10,op2
|
||||||
|
cg %r0,exp
|
||||||
|
jne failure
|
||||||
|
lgrl %r1,bad_addr
|
||||||
|
icm %r0,0,0(%r1)
|
||||||
|
failure:
|
||||||
|
lpswe failure_psw
|
||||||
|
pgm:
|
||||||
|
chhsi program_interruption_code,5 /* addressing exception? */
|
||||||
|
jne failure
|
||||||
|
lpswe success_psw
|
||||||
|
.align 8
|
||||||
|
op1:
|
||||||
|
.quad 0x1234567887654321
|
||||||
|
op2:
|
||||||
|
.quad 0x0011223344556677
|
||||||
|
exp:
|
||||||
|
.quad 0x1234567800651121
|
||||||
|
bad_addr:
|
||||||
|
.quad 0xffffffff00000000
|
||||||
|
success_psw:
|
||||||
|
.quad 0x2000000000000,0xfff /* see is_special_wait_psw() */
|
||||||
|
failure_psw:
|
||||||
|
.quad 0x2000000000000,0 /* disabled wait */
|
56
tests/tcg/s390x/mc.S
Normal file
56
tests/tcg/s390x/mc.S
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
.org 0x8d
|
||||||
|
ilc:
|
||||||
|
.org 0x8e
|
||||||
|
program_interruption_code:
|
||||||
|
.org 0x94
|
||||||
|
monitor_class:
|
||||||
|
.org 0xb0
|
||||||
|
monitor_code:
|
||||||
|
.org 0x150
|
||||||
|
program_old_psw:
|
||||||
|
.org 0x1d0 /* program new PSW */
|
||||||
|
.quad 0x180000000,pgm /* 64-bit mode */
|
||||||
|
.org 0x200 /* lowcore padding */
|
||||||
|
.globl _start
|
||||||
|
_start:
|
||||||
|
stctg %c8,%c8,c8 /* enable only monitor class 1 */
|
||||||
|
mvhhi c8+6,0x4000
|
||||||
|
lctlg %c8,%c8,c8
|
||||||
|
mc_nop:
|
||||||
|
mc 123,0
|
||||||
|
mc_monitor_event:
|
||||||
|
mc 321,1
|
||||||
|
j failure
|
||||||
|
mc_specification:
|
||||||
|
mc 333,16
|
||||||
|
j failure
|
||||||
|
pgm:
|
||||||
|
lgrl %r0,program_old_psw+8 /* ilc adjustment */
|
||||||
|
llgc %r1,ilc
|
||||||
|
sgr %r0,%r1
|
||||||
|
larl %r1,mc_monitor_event /* dispatch based on old PSW */
|
||||||
|
cgrje %r0,%r1,pgm_monitor_event
|
||||||
|
larl %r1,mc_specification
|
||||||
|
cgrje %r0,%r1,pgm_specification
|
||||||
|
j failure
|
||||||
|
pgm_monitor_event:
|
||||||
|
chhsi program_interruption_code,0x40 /* monitor event? */
|
||||||
|
jne failure
|
||||||
|
chhsi monitor_class,1 /* class from mc_monitor_event? */
|
||||||
|
jne failure
|
||||||
|
cghsi monitor_code,321 /* code from mc_monitor_event? */
|
||||||
|
jne failure
|
||||||
|
j mc_specification /* next test */
|
||||||
|
pgm_specification:
|
||||||
|
chhsi program_interruption_code,6 /* specification exception? */
|
||||||
|
jne failure
|
||||||
|
lpswe success_psw
|
||||||
|
failure:
|
||||||
|
lpswe failure_psw
|
||||||
|
.align 8
|
||||||
|
c8:
|
||||||
|
.quad 0
|
||||||
|
success_psw:
|
||||||
|
.quad 0x2000000000000,0xfff /* see is_special_wait_psw() */
|
||||||
|
failure_psw:
|
||||||
|
.quad 0x2000000000000,0 /* disabled wait */
|
20
tests/tcg/s390x/stpq.S
Normal file
20
tests/tcg/s390x/stpq.S
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
.org 0x200 /* lowcore padding */
|
||||||
|
.globl _start
|
||||||
|
_start:
|
||||||
|
lgrl %r0,value
|
||||||
|
lgrl %r1,value+8
|
||||||
|
stpq %r0,stored_value
|
||||||
|
clc stored_value(16),value
|
||||||
|
jne failure
|
||||||
|
lpswe success_psw
|
||||||
|
failure:
|
||||||
|
lpswe failure_psw
|
||||||
|
.align 16
|
||||||
|
value:
|
||||||
|
.quad 0x1234567887654321, 0x8765432112345678
|
||||||
|
stored_value:
|
||||||
|
.quad 0, 0
|
||||||
|
success_psw:
|
||||||
|
.quad 0x2000000000000,0xfff /* see is_special_wait_psw() */
|
||||||
|
failure_psw:
|
||||||
|
.quad 0x2000000000000,0 /* disabled wait */
|
31
tests/tcg/s390x/vcksm.c
Normal file
31
tests/tcg/s390x/vcksm.c
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* Test the VCKSM instruction.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*/
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "vx.h"
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
S390Vector v1;
|
||||||
|
S390Vector v2 = {
|
||||||
|
.d[0] = 0xb2261c8140edce49ULL,
|
||||||
|
.d[1] = 0x387bf5a433af39d1ULL,
|
||||||
|
};
|
||||||
|
S390Vector v3 = {
|
||||||
|
.d[0] = 0x73b03d2c7f9e654eULL,
|
||||||
|
.d[1] = 0x23d74e51fb479877ULL,
|
||||||
|
};
|
||||||
|
S390Vector exp = {.d[0] = 0xdedd7f8eULL, .d[1] = 0ULL};
|
||||||
|
|
||||||
|
asm volatile("vcksm %[v1],%[v2],%[v3]"
|
||||||
|
: [v1] "=v" (v1.v)
|
||||||
|
: [v2] "v" (v2.v)
|
||||||
|
, [v3] "v" (v3.v));
|
||||||
|
assert(memcmp(&v1, &exp, sizeof(v1)) == 0);
|
||||||
|
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
@ -1,6 +1,8 @@
|
|||||||
#ifndef QEMU_TESTS_S390X_VX_H
|
#ifndef QEMU_TESTS_S390X_VX_H
|
||||||
#define QEMU_TESTS_S390X_VX_H
|
#define QEMU_TESTS_S390X_VX_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
typedef union S390Vector {
|
typedef union S390Vector {
|
||||||
uint64_t d[2]; /* doubleword */
|
uint64_t d[2]; /* doubleword */
|
||||||
uint32_t w[4]; /* word */
|
uint32_t w[4]; /* word */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user