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

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