[valgrind] 3.9.0-5 - Add valgrind-3.9.0-s390-fpr-pair.patch.

Mark Wielaard mjw at fedoraproject.org
Thu Dec 12 22:29:17 UTC 2013


commit 93919c15a03a7450554faffa412382d70e2053d7
Author: Mark Wielaard <mjw at redhat.com>
Date:   Thu Dec 12 23:23:29 2013 +0100

    3.9.0-5 - Add valgrind-3.9.0-s390-fpr-pair.patch.

 valgrind-3.9.0-s390-fpr-pair.patch |  201 ++++++++++++++++++++++++++++++++++++
 valgrind.spec                      |    9 ++-
 2 files changed, 208 insertions(+), 2 deletions(-)
---
diff --git a/valgrind-3.9.0-s390-fpr-pair.patch b/valgrind-3.9.0-s390-fpr-pair.patch
new file mode 100644
index 0000000..5d9a9a1
--- /dev/null
+++ b/valgrind-3.9.0-s390-fpr-pair.patch
@@ -0,0 +1,201 @@
+commit 9b28d5ecf72accc80d267a3fcfd0bd4212ff34d8
+Author: florian <florian at 8f6e269a-dfd6-0310-a8e1-e2731360e62c>
+Date:   Tue Dec 10 16:51:15 2013 +0000
+
+    The result of rounding a 128-bit BFP/DFP value to 32/64 bit needs to
+    be stored in a register pair. This constraint was not observed previously
+    and the result was stored in any FPR that happened to be chosen. If the
+    selected FPR was not identifying a proper FPR pair, a SIGILL was delivered.
+    Fixes BZ #328455.
+    
+    
+    git-svn-id: svn://svn.valgrind.org/vex/trunk@2801 8f6e269a-dfd6-0310-a8e1-e2731360e62c
+
+diff --git a/priv/host_s390_defs.c b/priv/host_s390_defs.c
+index 0b61a5d..ce76285 100644
+--- a/VEX/priv/host_s390_defs.c
++++ b/VEX/priv/host_s390_defs.c
+@@ -5861,7 +5861,6 @@ s390_insn_bfp128_convert(UChar size, s390_bfp_conv_t tag, HReg dst_hi,
+    } else {
+       /* From 16 bytes to smaller size */
+       vassert(is_valid_fp128_regpair(op_hi, op_lo));
+-      vassert(hregIsInvalid(dst_lo));
+    }
+ 
+    insn->tag  = S390_INSN_BFP_CONVERT;
+@@ -5891,11 +5890,11 @@ s390_insn_bfp128_convert_to(UChar size, s390_bfp_conv_t tag, HReg dst_hi,
+ 
+ 
+ s390_insn *
+-s390_insn_bfp128_convert_from(UChar size, s390_bfp_conv_t tag, HReg dst,
+-                              HReg op_hi, HReg op_lo,
++s390_insn_bfp128_convert_from(UChar size, s390_bfp_conv_t tag, HReg dst_hi,
++                              HReg dst_lo, HReg op_hi, HReg op_lo,
+                               s390_bfp_round_t rounding_mode)
+ {
+-   return s390_insn_bfp128_convert(size, tag, dst, INVALID_HREG, op_hi, op_lo,
++   return s390_insn_bfp128_convert(size, tag, dst_hi, dst_lo, op_hi, op_lo,
+                                    rounding_mode);
+ }
+ 
+@@ -6192,7 +6191,6 @@ s390_insn_dfp128_convert(UChar size, s390_dfp_conv_t tag, HReg dst_hi,
+    } else {
+       /* From 16 bytes to smaller size */
+       vassert(is_valid_fp128_regpair(op_hi, op_lo));
+-      vassert(hregIsInvalid(dst_lo));
+    }
+ 
+    insn->tag  = S390_INSN_DFP_CONVERT;
+@@ -6222,11 +6220,11 @@ s390_insn_dfp128_convert_to(UChar size, s390_dfp_conv_t tag, HReg dst_hi,
+ 
+ 
+ s390_insn *
+-s390_insn_dfp128_convert_from(UChar size, s390_dfp_conv_t tag, HReg dst,
+-                              HReg op_hi, HReg op_lo,
++s390_insn_dfp128_convert_from(UChar size, s390_dfp_conv_t tag, HReg dst_hi,
++                              HReg dst_lo, HReg op_hi, HReg op_lo,
+                               s390_dfp_round_t rounding_mode)
+ {
+-   return s390_insn_dfp128_convert(size, tag, dst, INVALID_HREG, op_hi, op_lo,
++   return s390_insn_dfp128_convert(size, tag, dst_hi, dst_lo, op_hi, op_lo,
+                                    rounding_mode);
+ }
+ 
+diff --git a/priv/host_s390_defs.h b/priv/host_s390_defs.h
+index dafc8ae..5b6fc1f 100644
+--- a/VEX/priv/host_s390_defs.h
++++ b/VEX/priv/host_s390_defs.h
+@@ -665,8 +665,8 @@ s390_insn *s390_insn_bfp128_compare(UChar size, HReg dst, HReg op1_hi,
+ s390_insn *s390_insn_bfp128_convert_to(UChar size, s390_bfp_conv_t,
+                                        HReg dst_hi, HReg dst_lo, HReg op);
+ s390_insn *s390_insn_bfp128_convert_from(UChar size, s390_bfp_conv_t,
+-                                         HReg dst, HReg op_hi, HReg op_lo,
+-                                         s390_bfp_round_t);
++                                         HReg dst_hi, HReg dst_lo, HReg op_hi,
++                                         HReg op_lo, s390_bfp_round_t);
+ s390_insn *s390_insn_dfp_binop(UChar size, s390_dfp_binop_t, HReg dst,
+                                HReg op2, HReg op3,
+                                s390_dfp_round_t rounding_mode);
+@@ -699,8 +699,8 @@ s390_insn *s390_insn_dfp128_compare(UChar size, s390_dfp_cmp_t, HReg dst,
+ s390_insn *s390_insn_dfp128_convert_to(UChar size, s390_dfp_conv_t,
+                                        HReg dst_hi, HReg dst_lo, HReg op);
+ s390_insn *s390_insn_dfp128_convert_from(UChar size, s390_dfp_conv_t,
+-                                         HReg dst, HReg op_hi, HReg op_lo,
+-                                         s390_dfp_round_t);
++                                         HReg dst_hi, HReg dst_lo, HReg op_hi,
++                                         HReg op_lo, s390_dfp_round_t);
+ s390_insn *s390_insn_dfp128_reround(UChar size, HReg dst_hi, HReg dst_lo,
+                                     HReg op2, HReg op3_hi, HReg op3_lo,
+                                     s390_dfp_round_t);
+diff --git a/priv/host_s390_isel.c b/priv/host_s390_isel.c
+index aaccff6..3662ffd 100644
+--- a/VEX/priv/host_s390_isel.c
++++ b/VEX/priv/host_s390_isel.c
+@@ -1257,7 +1257,8 @@ s390_isel_int_expr_wrk(ISelEnv *env, IRExpr *expr)
+          addInstr(env, s390_insn_move(8, f15, op_lo));
+ 
+          rounding_mode = get_bfp_rounding_mode(env, arg1);
+-         addInstr(env, s390_insn_bfp128_convert_from(size, conv, res, f13, f15,
++         addInstr(env, s390_insn_bfp128_convert_from(size, conv, res,
++                                                     INVALID_HREG, f13, f15,
+                                                      rounding_mode));
+          return res;
+       }
+@@ -1290,7 +1291,8 @@ s390_isel_int_expr_wrk(ISelEnv *env, IRExpr *expr)
+             addInstr(env, s390_insn_move(8, f15, op_lo));
+ 
+             rounding_mode = get_dfp_rounding_mode(env, arg1);
+-            addInstr(env, s390_insn_dfp128_convert_from(size, dconv, res, f13,
++            addInstr(env, s390_insn_dfp128_convert_from(size, dconv, res,
++                                                        INVALID_HREG, f13,
+                                                         f15, rounding_mode));
+             return res;
+          }
+@@ -2455,7 +2457,7 @@ s390_isel_float_expr_wrk(ISelEnv *env, IRExpr *expr)
+ 
+       case Iop_F128toF64:
+       case Iop_F128toF32: {
+-         HReg op_hi, op_lo, f13, f15;
++         HReg op_hi, op_lo, f12, f13, f14, f15;
+          s390_bfp_round_t rounding_mode;
+ 
+          conv = op == Iop_F128toF32 ? S390_BFP_F128_TO_F32
+@@ -2463,15 +2465,18 @@ s390_isel_float_expr_wrk(ISelEnv *env, IRExpr *expr)
+ 
+          s390_isel_float128_expr(&op_hi, &op_lo, env, left);
+ 
+-         /* We use non-virtual registers as pairs (f13, f15) */
++         /* We use non-virtual registers as pairs (f13, f15) and (f12, f14)) */
++         f12 = make_fpr(12);
+          f13 = make_fpr(13);
++         f14 = make_fpr(14);
+          f15 = make_fpr(15);
+ 
+          /* operand --> (f13, f15) */
+          addInstr(env, s390_insn_move(8, f13, op_hi));
+          addInstr(env, s390_insn_move(8, f15, op_lo));
+ 
+-         dst = newVRegF(env);
++         /* result --> (f12, f14) */
++
+          /* load-rounded has a rounding mode field when the floating point
+             extension facility is installed. */
+          if (s390_host_has_fpext) {
+@@ -2480,8 +2485,12 @@ s390_isel_float_expr_wrk(ISelEnv *env, IRExpr *expr)
+             set_bfp_rounding_mode_in_fpc(env, irrm);
+             rounding_mode = S390_BFP_ROUND_PER_FPC;
+          }
+-         addInstr(env, s390_insn_bfp128_convert_from(size, conv, dst, f13, f15,
+-                                                     rounding_mode));
++
++         addInstr(env, s390_insn_bfp128_convert_from(size, conv, f12, f14,
++                                                     f13, f15, rounding_mode));
++         dst = newVRegF(env);
++         addInstr(env, s390_insn_move(8, dst, f12));
++
+          return dst;
+       }
+       }
+@@ -3044,22 +3053,25 @@ s390_isel_dfp_expr_wrk(ISelEnv *env, IRExpr *expr)
+       }
+ 
+       case Iop_D128toD64: {
+-         HReg op_hi, op_lo, f13, f15;
++         HReg op_hi, op_lo, f12, f13, f14, f15;
+          s390_dfp_round_t rounding_mode;
+ 
+          conv = S390_DFP_D128_TO_D64;
+ 
+          s390_isel_dfp128_expr(&op_hi, &op_lo, env, left);
+ 
+-         /* We use non-virtual registers as pairs (f13, f15) */
++         /* We use non-virtual registers as pairs (f13, f15) and (f12, f14) */
++         f12 = make_fpr(12);
+          f13 = make_fpr(13);
++         f14 = make_fpr(14);
+          f15 = make_fpr(15);
+ 
+          /* operand --> (f13, f15) */
+          addInstr(env, s390_insn_move(8, f13, op_hi));
+          addInstr(env, s390_insn_move(8, f15, op_lo));
+ 
+-         dst = newVRegF(env);
++         /* result --> (f12, f14) */
++ 
+          /* load-rounded has a rounding mode field when the floating point
+             extension facility is installed. */
+          if (s390_host_has_fpext) {
+@@ -3068,8 +3080,11 @@ s390_isel_dfp_expr_wrk(ISelEnv *env, IRExpr *expr)
+             set_dfp_rounding_mode_in_fpc(env, irrm);
+             rounding_mode = S390_DFP_ROUND_PER_FPC_0;
+          }
+-         addInstr(env, s390_insn_dfp128_convert_from(size, conv, dst, f13, f15,
+-                                                     rounding_mode));
++         addInstr(env, s390_insn_dfp128_convert_from(size, conv, f12, f14,
++                                                     f13, f15, rounding_mode));
++         dst = newVRegF(env);
++         addInstr(env, s390_insn_move(8, dst, f12));
++
+          return dst;
+       }
+ 
diff --git a/valgrind.spec b/valgrind.spec
index 94d5f97..4c4f970 100644
--- a/valgrind.spec
+++ b/valgrind.spec
@@ -3,7 +3,7 @@
 Summary: Tool for finding memory management bugs in programs
 Name: %{?scl_prefix}valgrind
 Version: 3.9.0
-Release: 4%{?dist}
+Release: 5%{?dist}
 Epoch: 1
 License: GPLv2+
 URL: http://www.valgrind.org/
@@ -50,6 +50,9 @@ Patch11: valgrind-3.9.0-xabort.patch
 # KDE#328711 - valgrind.1 manpage "memcheck options" section is bad
 Patch12: valgrind-3.9.0-manpage-memcheck-options.patch
 
+# KDE#328455 - s390x SIGILL after emitting wrong register pair for ldxbr
+Patch13: valgrind-3.9.0-s390-fpr-pair.patch
+
 %ifarch x86_64 ppc64
 # Ensure glibc{,-devel} is installed for both multilib arches
 BuildRequires: /lib/libc.so.6 /usr/lib/libc.so /lib64/libc.so.6 /usr/lib64/libc.so
@@ -154,6 +157,7 @@ Valgrind User Manual for details.
 
 %patch11 -p1
 %patch12 -p1
+%patch13 -p1
 
 %build
 # We need to use the software collection compiler and binutils if available.
@@ -307,8 +311,9 @@ echo ===============END TESTING===============
 %endif
 
 %changelog
-* Thu Dec 12 2013 Mark Wielaard <mjw at redhat.com>
+* Thu Dec 12 2013 Mark Wielaard <mjw at redhat.com> - 3.9.0-5
 - Add valgrind-3.9.0-manpage-memcheck-options.patch.
+- Add valgrind-3.9.0-s390-fpr-pair.patch.
 
 * Thu Nov 28 2013 Mark Wielaard <mjw at redhat.com> - 3.9.0-4
 - Add valgrind-3.9.0-xabort.patch.


More information about the scm-commits mailing list