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

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