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

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