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

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