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

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