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