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