From: Andreas Arnez Date: Thu, 26 Jul 2018 14:35:24 +0000 (+0200) Subject: s390x: More fixes for z13 support X-Git-Tag: VALGRIND_3_15_0~153 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ddfc274b24a1ae3b57166ada1fe97acb433b9b79;p=thirdparty%2Fvalgrind.git s390x: More fixes for z13 support This patch addresses the following: * Fix the implementation of LOCGHI. Previously Valgrind performed 32-bit sign extension instead of 64-bit sign extension on the immediate value. * Advertise VXRS in HWCAP. If no VXRS are advertised, but the program uses vector registers, this could cause problems with a glibc built with "-march=z13". --- diff --git a/NEWS b/NEWS index 2fa2c86a3c..8b6d4b361b 100644 --- a/NEWS +++ b/NEWS @@ -50,6 +50,7 @@ where XXXXXX is the bug number as listed below. 400490 s390x: VRs allocated as if separate from FPRs 400491 s390x: Operand of LOCH treated as unsigned integer 397187 z13 vector register support for vgdb gdbserver +401277 More bugs in z13 support Release 3.14.0 (9 October 2018) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/VEX/priv/guest_s390_toIR.c b/VEX/priv/guest_s390_toIR.c index 9c4d79b87e..50a5a41774 100644 --- a/VEX/priv/guest_s390_toIR.c +++ b/VEX/priv/guest_s390_toIR.c @@ -16325,7 +16325,7 @@ static const HChar * s390_irgen_LOCGHI(UChar r1, UChar m3, UShort i2, UChar unused) { next_insn_if(binop(Iop_CmpEQ32, s390_call_calculate_cond(m3), mkU32(0))); - put_gpr_dw0(r1, mkU64((UInt)(Int)(Short)i2)); + put_gpr_dw0(r1, mkU64((ULong)(Long)(Short)i2)); return "locghi"; } diff --git a/coregrind/m_initimg/initimg-linux.c b/coregrind/m_initimg/initimg-linux.c index 61cc458bcf..8a7f0d024d 100644 --- a/coregrind/m_initimg/initimg-linux.c +++ b/coregrind/m_initimg/initimg-linux.c @@ -699,9 +699,9 @@ Addr setup_client_stack( void* init_sp, } # elif defined(VGP_s390x_linux) { - /* Advertise hardware features "below" TE only. TE and VXRS - (and anything above) are not supported by Valgrind. */ - auxv->u.a_val &= VKI_HWCAP_S390_TE - 1; + /* Advertise hardware features "below" TE and VXRS. TE itself + and anything above VXRS is not supported by Valgrind. */ + auxv->u.a_val &= (VKI_HWCAP_S390_TE - 1) | VKI_HWCAP_S390_VXRS; } # elif defined(VGP_arm64_linux) {