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