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