Blame SOURCES/valgrind-3.15.0-s390x-wrap-drd.patch

01cf8b
From bfa89eae00ba7067445bc0532e1f17405c062954 Mon Sep 17 00:00:00 2001
01cf8b
From: Andreas Arnez <arnez@linux.ibm.com>
01cf8b
Date: Thu, 23 May 2019 17:17:43 +0200
01cf8b
Subject: [PATCH] Bug 407764 - s390x: drd fails on z13 due to function wrapping
01cf8b
 issue
01cf8b
01cf8b
The s390x-specific inline assembly macros for function wrapping in
01cf8b
include/valgrind.h have a few issues.
01cf8b
01cf8b
When the compiler uses vector registers, such as with "-march=z13", all
01cf8b
vector registers must be declared as clobbered by the callee.  Because
01cf8b
this is missing, many drd test failures are seen with "-march=z13".
01cf8b
01cf8b
Also, the inline assemblies write the return value into the target
01cf8b
register before restoring r11.  If r11 is used as the target register,
01cf8b
this means that the restore operation corrupts the result.  This bug
01cf8b
causes failures with memcheck's "wrap6" test case.
01cf8b
01cf8b
These bugs are fixed.  The clobber list is extended by the vector
01cf8b
registers (if appropriate), and the target register is now written at the
01cf8b
end, after restoring r11.
01cf8b
---
01cf8b
 include/valgrind.h | 38 +++++++++++++++++++++++---------------
01cf8b
 1 file changed, 23 insertions(+), 15 deletions(-)
01cf8b
01cf8b
diff --git a/include/valgrind.h b/include/valgrind.h
01cf8b
index f071bd392..815efa893 100644
01cf8b
--- a/include/valgrind.h
01cf8b
+++ b/include/valgrind.h
01cf8b
@@ -4687,8 +4687,16 @@ typedef
01cf8b
    r14 in s390_irgen_noredir (VEX/priv/guest_s390_irgen.c) to give the
01cf8b
    function a proper return address. All others are ABI defined call
01cf8b
    clobbers. */
01cf8b
-#define __CALLER_SAVED_REGS "0","1","2","3","4","5","14", \
01cf8b
-                           "f0","f1","f2","f3","f4","f5","f6","f7"
01cf8b
+#if defined(__VX__) || defined(__S390_VX__)
01cf8b
+#define __CALLER_SAVED_REGS "0", "1", "2", "3", "4", "5", "14",   \
01cf8b
+      "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",             \
01cf8b
+      "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",       \
01cf8b
+      "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",     \
01cf8b
+      "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
01cf8b
+#else
01cf8b
+#define __CALLER_SAVED_REGS "0", "1", "2", "3", "4", "5", "14",   \
01cf8b
+      "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7"
01cf8b
+#endif
01cf8b
 
01cf8b
 /* Nb: Although r11 is modified in the asm snippets below (inside 
01cf8b
    VALGRIND_CFI_PROLOGUE) it is not listed in the clobber section, for
01cf8b
@@ -4710,9 +4718,9 @@ typedef
01cf8b
          "aghi 15,-160\n\t"                                      \
01cf8b
          "lg 1, 0(1)\n\t"  /* target->r1 */                      \
01cf8b
          VALGRIND_CALL_NOREDIR_R1                                \
01cf8b
-         "lgr %0, 2\n\t"                                         \
01cf8b
          "aghi 15,160\n\t"                                       \
01cf8b
          VALGRIND_CFI_EPILOGUE                                   \
01cf8b
+         "lgr %0, 2\n\t"                                         \
01cf8b
          : /*out*/   "=d" (_res)                                 \
01cf8b
          : /*in*/    "d" (&_argvec[0]) __FRAME_POINTER           \
01cf8b
          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7"     \
01cf8b
@@ -4734,9 +4742,9 @@ typedef
01cf8b
          "lg 2, 8(1)\n\t"                                        \
01cf8b
          "lg 1, 0(1)\n\t"                                        \
01cf8b
          VALGRIND_CALL_NOREDIR_R1                                \
01cf8b
-         "lgr %0, 2\n\t"                                         \
01cf8b
          "aghi 15,160\n\t"                                       \
01cf8b
          VALGRIND_CFI_EPILOGUE                                   \
01cf8b
+         "lgr %0, 2\n\t"                                         \
01cf8b
          : /*out*/   "=d" (_res)                                 \
01cf8b
          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
01cf8b
          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7"     \
01cf8b
@@ -4759,9 +4767,9 @@ typedef
01cf8b
          "lg 3,16(1)\n\t"                                        \
01cf8b
          "lg 1, 0(1)\n\t"                                        \
01cf8b
          VALGRIND_CALL_NOREDIR_R1                                \
01cf8b
-         "lgr %0, 2\n\t"                                         \
01cf8b
          "aghi 15,160\n\t"                                       \
01cf8b
          VALGRIND_CFI_EPILOGUE                                   \
01cf8b
+         "lgr %0, 2\n\t"                                         \
01cf8b
          : /*out*/   "=d" (_res)                                 \
01cf8b
          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
01cf8b
          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7"     \
01cf8b
@@ -4786,9 +4794,9 @@ typedef
01cf8b
          "lg 4,24(1)\n\t"                                        \
01cf8b
          "lg 1, 0(1)\n\t"                                        \
01cf8b
          VALGRIND_CALL_NOREDIR_R1                                \
01cf8b
-         "lgr %0, 2\n\t"                                         \
01cf8b
          "aghi 15,160\n\t"                                       \
01cf8b
          VALGRIND_CFI_EPILOGUE                                   \
01cf8b
+         "lgr %0, 2\n\t"                                         \
01cf8b
          : /*out*/   "=d" (_res)                                 \
01cf8b
          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
01cf8b
          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7"     \
01cf8b
@@ -4815,9 +4823,9 @@ typedef
01cf8b
          "lg 5,32(1)\n\t"                                        \
01cf8b
          "lg 1, 0(1)\n\t"                                        \
01cf8b
          VALGRIND_CALL_NOREDIR_R1                                \
01cf8b
-         "lgr %0, 2\n\t"                                         \
01cf8b
          "aghi 15,160\n\t"                                       \
01cf8b
          VALGRIND_CFI_EPILOGUE                                   \
01cf8b
+         "lgr %0, 2\n\t"                                         \
01cf8b
          : /*out*/   "=d" (_res)                                 \
01cf8b
          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
01cf8b
          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"7"     \
01cf8b
@@ -4846,9 +4854,9 @@ typedef
01cf8b
          "lg 6,40(1)\n\t"                                        \
01cf8b
          "lg 1, 0(1)\n\t"                                        \
01cf8b
          VALGRIND_CALL_NOREDIR_R1                                \
01cf8b
-         "lgr %0, 2\n\t"                                         \
01cf8b
          "aghi 15,160\n\t"                                       \
01cf8b
          VALGRIND_CFI_EPILOGUE                                   \
01cf8b
+         "lgr %0, 2\n\t"                                         \
01cf8b
          : /*out*/   "=d" (_res)                                 \
01cf8b
          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
01cf8b
          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
01cf8b
@@ -4880,9 +4888,9 @@ typedef
01cf8b
          "mvc 160(8,15), 48(1)\n\t"                              \
01cf8b
          "lg 1, 0(1)\n\t"                                        \
01cf8b
          VALGRIND_CALL_NOREDIR_R1                                \
01cf8b
-         "lgr %0, 2\n\t"                                         \
01cf8b
          "aghi 15,168\n\t"                                       \
01cf8b
          VALGRIND_CFI_EPILOGUE                                   \
01cf8b
+         "lgr %0, 2\n\t"                                         \
01cf8b
          : /*out*/   "=d" (_res)                                 \
01cf8b
          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
01cf8b
          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
01cf8b
@@ -4916,9 +4924,9 @@ typedef
01cf8b
          "mvc 168(8,15), 56(1)\n\t"                              \
01cf8b
          "lg 1, 0(1)\n\t"                                        \
01cf8b
          VALGRIND_CALL_NOREDIR_R1                                \
01cf8b
-         "lgr %0, 2\n\t"                                         \
01cf8b
          "aghi 15,176\n\t"                                       \
01cf8b
          VALGRIND_CFI_EPILOGUE                                   \
01cf8b
+         "lgr %0, 2\n\t"                                         \
01cf8b
          : /*out*/   "=d" (_res)                                 \
01cf8b
          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
01cf8b
          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
01cf8b
@@ -4954,9 +4962,9 @@ typedef
01cf8b
          "mvc 176(8,15), 64(1)\n\t"                              \
01cf8b
          "lg 1, 0(1)\n\t"                                        \
01cf8b
          VALGRIND_CALL_NOREDIR_R1                                \
01cf8b
-         "lgr %0, 2\n\t"                                         \
01cf8b
          "aghi 15,184\n\t"                                       \
01cf8b
          VALGRIND_CFI_EPILOGUE                                   \
01cf8b
+         "lgr %0, 2\n\t"                                         \
01cf8b
          : /*out*/   "=d" (_res)                                 \
01cf8b
          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
01cf8b
          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
01cf8b
@@ -4994,9 +5002,9 @@ typedef
01cf8b
          "mvc 184(8,15), 72(1)\n\t"                              \
01cf8b
          "lg 1, 0(1)\n\t"                                        \
01cf8b
          VALGRIND_CALL_NOREDIR_R1                                \
01cf8b
-         "lgr %0, 2\n\t"                                         \
01cf8b
          "aghi 15,192\n\t"                                       \
01cf8b
          VALGRIND_CFI_EPILOGUE                                   \
01cf8b
+         "lgr %0, 2\n\t"                                         \
01cf8b
          : /*out*/   "=d" (_res)                                 \
01cf8b
          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
01cf8b
          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
01cf8b
@@ -5036,9 +5044,9 @@ typedef
01cf8b
          "mvc 192(8,15), 80(1)\n\t"                              \
01cf8b
          "lg 1, 0(1)\n\t"                                        \
01cf8b
          VALGRIND_CALL_NOREDIR_R1                                \
01cf8b
-         "lgr %0, 2\n\t"                                         \
01cf8b
          "aghi 15,200\n\t"                                       \
01cf8b
          VALGRIND_CFI_EPILOGUE                                   \
01cf8b
+         "lgr %0, 2\n\t"                                         \
01cf8b
          : /*out*/   "=d" (_res)                                 \
01cf8b
          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
01cf8b
          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
01cf8b
@@ -5080,9 +5088,9 @@ typedef
01cf8b
          "mvc 200(8,15), 88(1)\n\t"                              \
01cf8b
          "lg 1, 0(1)\n\t"                                        \
01cf8b
          VALGRIND_CALL_NOREDIR_R1                                \
01cf8b
-         "lgr %0, 2\n\t"                                         \
01cf8b
          "aghi 15,208\n\t"                                       \
01cf8b
          VALGRIND_CFI_EPILOGUE                                   \
01cf8b
+         "lgr %0, 2\n\t"                                         \
01cf8b
          : /*out*/   "=d" (_res)                                 \
01cf8b
          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
01cf8b
          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
01cf8b
@@ -5126,9 +5134,9 @@ typedef
01cf8b
          "mvc 208(8,15), 96(1)\n\t"                              \
01cf8b
          "lg 1, 0(1)\n\t"                                        \
01cf8b
          VALGRIND_CALL_NOREDIR_R1                                \
01cf8b
-         "lgr %0, 2\n\t"                                         \
01cf8b
          "aghi 15,216\n\t"                                       \
01cf8b
          VALGRIND_CFI_EPILOGUE                                   \
01cf8b
+         "lgr %0, 2\n\t"                                         \
01cf8b
          : /*out*/   "=d" (_res)                                 \
01cf8b
          : /*in*/    "a" (&_argvec[0]) __FRAME_POINTER           \
01cf8b
          : /*trash*/ "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
01cf8b
-- 
01cf8b
2.17.0
01cf8b