diff options
author | Henrik Edin <henrik.edin@mongodb.com> | 2018-12-20 15:21:17 -0500 |
---|---|---|
committer | Henrik Edin <henrik.edin@mongodb.com> | 2019-01-08 10:51:43 -0500 |
commit | 93c3fd1d836967a863eabd795d6080f909dd068d (patch) | |
tree | 52f67aa533b979bd73afd75ffd0a1e75d9c6f0fa /src | |
parent | a43fb64a1c640378c54d1e61869d607f70154f91 (diff) | |
download | mongo-93c3fd1d836967a863eabd795d6080f909dd068d.tar.gz |
SERVER-38008 Upgrade Valgrind to version 3.14.0
Diffstat (limited to 'src')
-rw-r--r-- | src/third_party/SConscript | 2 | ||||
-rw-r--r-- | src/third_party/valgrind-3.14.0/include/valgrind/valgrind.h (renamed from src/third_party/valgrind-3.11.0/include/valgrind/valgrind.h) | 857 |
2 files changed, 190 insertions, 669 deletions
diff --git a/src/third_party/SConscript b/src/third_party/SConscript index 1a5e1f5ff12..b33fcf64396 100644 --- a/src/third_party/SConscript +++ b/src/third_party/SConscript @@ -48,7 +48,7 @@ if not use_system_version_of_library('snappy'): # Valgrind is a header only include as valgrind.h includes everything we need if not use_system_version_of_library('valgrind'): thirdPartyIncludePathList.append( - ('valgrind', '#/src/third_party/valgrind-3.11.0/include')) + ('valgrind', '#/src/third_party/valgrind-3.14.0/include')) if not use_system_version_of_library('zlib'): thirdPartyIncludePathList.append( diff --git a/src/third_party/valgrind-3.11.0/include/valgrind/valgrind.h b/src/third_party/valgrind-3.14.0/include/valgrind/valgrind.h index 4b8ef75eb22..577c8f05e5b 100644 --- a/src/third_party/valgrind-3.11.0/include/valgrind/valgrind.h +++ b/src/third_party/valgrind-3.14.0/include/valgrind/valgrind.h @@ -12,7 +12,7 @@ This file is part of Valgrind, a dynamic binary instrumentation framework. - Copyright (C) 2000-2015 Julian Seward. All rights reserved. + Copyright (C) 2000-2017 Julian Seward. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -89,7 +89,7 @@ || (__VALGRIND_MAJOR__ == 3 && __VALGRIND_MINOR__ >= 6)) */ #define __VALGRIND_MAJOR__ 3 -#define __VALGRIND_MINOR__ 11 +#define __VALGRIND_MINOR__ 14 #include <stdarg.h> @@ -122,7 +122,6 @@ #undef PLAT_s390x_linux #undef PLAT_mips32_linux #undef PLAT_mips64_linux -#undef PLAT_tilegx_linux #undef PLAT_x86_solaris #undef PLAT_amd64_solaris @@ -160,8 +159,6 @@ # define PLAT_mips64_linux 1 #elif defined(__linux__) && defined(__mips__) && (__mips!=64) # define PLAT_mips32_linux 1 -#elif defined(__linux__) && defined(__tilegx__) -# define PLAT_tilegx_linux 1 #elif defined(__sun) && defined(__i386__) # define PLAT_x86_solaris 1 #elif defined(__sun) && defined(__x86_64__) @@ -946,7 +943,7 @@ typedef "move %0, $11\n\t" /*result*/ \ : "=r" (_zzq_result) \ : "r" (_zzq_default), "r" (&_zzq_args[0]) \ - : "$11", "$12"); \ + : "$11", "$12", "memory"); \ _zzq_result; \ }) @@ -1017,7 +1014,7 @@ typedef "move %0, $11\n\t" /*result*/ \ : "=r" (_zzq_result) \ : "r" (_zzq_default), "r" (&_zzq_args[0]) \ - : "$11", "$12"); \ + : "$11", "$12", "memory"); \ _zzq_result; \ }) @@ -1048,73 +1045,6 @@ typedef #endif /* PLAT_mips64_linux */ -/* ------------------------ tilegx-linux --------------- */ -#if defined(PLAT_tilegx_linux) - -typedef - struct { - unsigned long long int nraddr; /* where's the code? */ - } - OrigFn; -/*** special instruction sequence. - 0:02b3c7ff91234fff { moveli zero, 4660 ; moveli zero, 22136 } - 8:0091a7ff95678fff { moveli zero, 22136 ; moveli zero, 4660 } -****/ - -#define __SPECIAL_INSTRUCTION_PREAMBLE \ - ".quad 0x02b3c7ff91234fff\n" \ - ".quad 0x0091a7ff95678fff\n" - -#define VALGRIND_DO_CLIENT_REQUEST_EXPR( \ - _zzq_default, _zzq_request, \ - _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ - ({ volatile unsigned long long int _zzq_args[6]; \ - volatile unsigned long long int _zzq_result; \ - _zzq_args[0] = (unsigned long long int)(_zzq_request); \ - _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \ - _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \ - _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \ - _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \ - _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \ - __asm__ volatile("move r11, %1\n\t" /*default*/ \ - "move r12, %2\n\t" /*ptr*/ \ - __SPECIAL_INSTRUCTION_PREAMBLE \ - /* r11 = client_request */ \ - "or r13, r13, r13\n\t" \ - "move %0, r11\n\t" /*result*/ \ - : "=r" (_zzq_result) \ - : "r" (_zzq_default), "r" (&_zzq_args[0]) \ - : "memory", "r11", "r12"); \ - _zzq_result; \ - }) - -#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ - { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ - volatile unsigned long long int __addr; \ - __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ - /* r11 = guest_NRADDR */ \ - "or r14, r14, r14\n" \ - "move %0, r11\n" \ - : "=r" (__addr) \ - : \ - : "memory", "r11" \ - ); \ - _zzq_orig->nraddr = __addr; \ - } - -#define VALGRIND_CALL_NOREDIR_R12 \ - __SPECIAL_INSTRUCTION_PREAMBLE \ - "or r15, r15, r15\n\t" - -#define VALGRIND_VEX_INJECT_IR() \ - do { \ - __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ - "or r11, r11, r11\n\t" \ - ); \ - } while (0) - -#endif /* PLAT_tilegx_linux */ - /* Insert assembly code for other platforms here... */ #endif /* NVALGRIND */ @@ -2708,7 +2638,7 @@ typedef #define __CALLER_SAVED_REGS \ "lr", "ctr", "xer", \ "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \ - "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \ + "r0", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \ "r11", "r12", "r13" /* Macros to save and align the stack before making a function @@ -3264,7 +3194,7 @@ typedef #define __CALLER_SAVED_REGS \ "lr", "ctr", "xer", \ "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \ - "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \ + "r0", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \ "r11", "r12", "r13" /* Macros to save and align the stack before making a function @@ -5757,15 +5687,17 @@ typedef "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \ "$25", "$31" -/* These CALL_FN_ macros assume that on mips-linux, sizeof(unsigned - long) == 4. */ +/* These CALL_FN_ macros assume that on mips64-linux, + sizeof(long long) == 8. */ + +#define MIPS64_LONG2REG_CAST(x) ((long long)(long)x) #define CALL_FN_W_v(lval, orig) \ do { \ volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[1]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ + volatile unsigned long long _argvec[1]; \ + volatile unsigned long long _res; \ + _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr); \ __asm__ volatile( \ "ld $25, 0(%1)\n\t" /* target->t9 */ \ VALGRIND_CALL_NOREDIR_T9 \ @@ -5774,16 +5706,16 @@ typedef : /*in*/ "0" (&_argvec[0]) \ : /*trash*/ "memory", __CALLER_SAVED_REGS \ ); \ - lval = (__typeof__(lval)) _res; \ + lval = (__typeof__(lval)) (long)_res; \ } while (0) #define CALL_FN_W_W(lval, orig, arg1) \ do { \ volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[2]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ + volatile unsigned long long _argvec[2]; \ + volatile unsigned long long _res; \ + _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr); \ + _argvec[1] = MIPS64_LONG2REG_CAST(arg1); \ __asm__ volatile( \ "ld $4, 8(%1)\n\t" /* arg1*/ \ "ld $25, 0(%1)\n\t" /* target->t9 */ \ @@ -5793,17 +5725,17 @@ typedef : /*in*/ "r" (&_argvec[0]) \ : /*trash*/ "memory", __CALLER_SAVED_REGS \ ); \ - lval = (__typeof__(lval)) _res; \ + lval = (__typeof__(lval)) (long)_res; \ } while (0) #define CALL_FN_W_WW(lval, orig, arg1,arg2) \ do { \ volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[3]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ + volatile unsigned long long _argvec[3]; \ + volatile unsigned long long _res; \ + _argvec[0] = _orig.nraddr; \ + _argvec[1] = MIPS64_LONG2REG_CAST(arg1); \ + _argvec[2] = MIPS64_LONG2REG_CAST(arg2); \ __asm__ volatile( \ "ld $4, 8(%1)\n\t" \ "ld $5, 16(%1)\n\t" \ @@ -5814,18 +5746,19 @@ typedef : /*in*/ "r" (&_argvec[0]) \ : /*trash*/ "memory", __CALLER_SAVED_REGS \ ); \ - lval = (__typeof__(lval)) _res; \ + lval = (__typeof__(lval)) (long)_res; \ } while (0) + #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ do { \ volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[4]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ + volatile unsigned long long _argvec[4]; \ + volatile unsigned long long _res; \ + _argvec[0] = _orig.nraddr; \ + _argvec[1] = MIPS64_LONG2REG_CAST(arg1); \ + _argvec[2] = MIPS64_LONG2REG_CAST(arg2); \ + _argvec[3] = MIPS64_LONG2REG_CAST(arg3); \ __asm__ volatile( \ "ld $4, 8(%1)\n\t" \ "ld $5, 16(%1)\n\t" \ @@ -5837,19 +5770,19 @@ typedef : /*in*/ "r" (&_argvec[0]) \ : /*trash*/ "memory", __CALLER_SAVED_REGS \ ); \ - lval = (__typeof__(lval)) _res; \ + lval = (__typeof__(lval)) (long)_res; \ } while (0) #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ do { \ volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[5]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ + volatile unsigned long long _argvec[5]; \ + volatile unsigned long long _res; \ + _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr); \ + _argvec[1] = MIPS64_LONG2REG_CAST(arg1); \ + _argvec[2] = MIPS64_LONG2REG_CAST(arg2); \ + _argvec[3] = MIPS64_LONG2REG_CAST(arg3); \ + _argvec[4] = MIPS64_LONG2REG_CAST(arg4); \ __asm__ volatile( \ "ld $4, 8(%1)\n\t" \ "ld $5, 16(%1)\n\t" \ @@ -5862,20 +5795,20 @@ typedef : /*in*/ "r" (&_argvec[0]) \ : /*trash*/ "memory", __CALLER_SAVED_REGS \ ); \ - lval = (__typeof__(lval)) _res; \ + lval = (__typeof__(lval)) (long)_res; \ } while (0) #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ do { \ volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[6]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ + volatile unsigned long long _argvec[6]; \ + volatile unsigned long long _res; \ + _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr); \ + _argvec[1] = MIPS64_LONG2REG_CAST(arg1); \ + _argvec[2] = MIPS64_LONG2REG_CAST(arg2); \ + _argvec[3] = MIPS64_LONG2REG_CAST(arg3); \ + _argvec[4] = MIPS64_LONG2REG_CAST(arg4); \ + _argvec[5] = MIPS64_LONG2REG_CAST(arg5); \ __asm__ volatile( \ "ld $4, 8(%1)\n\t" \ "ld $5, 16(%1)\n\t" \ @@ -5889,21 +5822,21 @@ typedef : /*in*/ "r" (&_argvec[0]) \ : /*trash*/ "memory", __CALLER_SAVED_REGS \ ); \ - lval = (__typeof__(lval)) _res; \ + lval = (__typeof__(lval)) (long)_res; \ } while (0) #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ do { \ volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[7]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ + volatile unsigned long long _argvec[7]; \ + volatile unsigned long long _res; \ + _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr); \ + _argvec[1] = MIPS64_LONG2REG_CAST(arg1); \ + _argvec[2] = MIPS64_LONG2REG_CAST(arg2); \ + _argvec[3] = MIPS64_LONG2REG_CAST(arg3); \ + _argvec[4] = MIPS64_LONG2REG_CAST(arg4); \ + _argvec[5] = MIPS64_LONG2REG_CAST(arg5); \ + _argvec[6] = MIPS64_LONG2REG_CAST(arg6); \ __asm__ volatile( \ "ld $4, 8(%1)\n\t" \ "ld $5, 16(%1)\n\t" \ @@ -5918,23 +5851,23 @@ typedef : /*in*/ "r" (&_argvec[0]) \ : /*trash*/ "memory", __CALLER_SAVED_REGS \ ); \ - lval = (__typeof__(lval)) _res; \ + lval = (__typeof__(lval)) (long)_res; \ } while (0) #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ arg7) \ do { \ volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[8]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ + volatile unsigned long long _argvec[8]; \ + volatile unsigned long long _res; \ + _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr); \ + _argvec[1] = MIPS64_LONG2REG_CAST(arg1); \ + _argvec[2] = MIPS64_LONG2REG_CAST(arg2); \ + _argvec[3] = MIPS64_LONG2REG_CAST(arg3); \ + _argvec[4] = MIPS64_LONG2REG_CAST(arg4); \ + _argvec[5] = MIPS64_LONG2REG_CAST(arg5); \ + _argvec[6] = MIPS64_LONG2REG_CAST(arg6); \ + _argvec[7] = MIPS64_LONG2REG_CAST(arg7); \ __asm__ volatile( \ "ld $4, 8(%1)\n\t" \ "ld $5, 16(%1)\n\t" \ @@ -5950,24 +5883,24 @@ typedef : /*in*/ "r" (&_argvec[0]) \ : /*trash*/ "memory", __CALLER_SAVED_REGS \ ); \ - lval = (__typeof__(lval)) _res; \ + lval = (__typeof__(lval)) (long)_res; \ } while (0) #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ arg7,arg8) \ do { \ volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[9]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ + volatile unsigned long long _argvec[9]; \ + volatile unsigned long long _res; \ + _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr); \ + _argvec[1] = MIPS64_LONG2REG_CAST(arg1); \ + _argvec[2] = MIPS64_LONG2REG_CAST(arg2); \ + _argvec[3] = MIPS64_LONG2REG_CAST(arg3); \ + _argvec[4] = MIPS64_LONG2REG_CAST(arg4); \ + _argvec[5] = MIPS64_LONG2REG_CAST(arg5); \ + _argvec[6] = MIPS64_LONG2REG_CAST(arg6); \ + _argvec[7] = MIPS64_LONG2REG_CAST(arg7); \ + _argvec[8] = MIPS64_LONG2REG_CAST(arg8); \ __asm__ volatile( \ "ld $4, 8(%1)\n\t" \ "ld $5, 16(%1)\n\t" \ @@ -5984,25 +5917,25 @@ typedef : /*in*/ "r" (&_argvec[0]) \ : /*trash*/ "memory", __CALLER_SAVED_REGS \ ); \ - lval = (__typeof__(lval)) _res; \ + lval = (__typeof__(lval)) (long)_res; \ } while (0) #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ arg7,arg8,arg9) \ do { \ volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[10]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ - _argvec[9] = (unsigned long)(arg9); \ + volatile unsigned long long _argvec[10]; \ + volatile unsigned long long _res; \ + _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr); \ + _argvec[1] = MIPS64_LONG2REG_CAST(arg1); \ + _argvec[2] = MIPS64_LONG2REG_CAST(arg2); \ + _argvec[3] = MIPS64_LONG2REG_CAST(arg3); \ + _argvec[4] = MIPS64_LONG2REG_CAST(arg4); \ + _argvec[5] = MIPS64_LONG2REG_CAST(arg5); \ + _argvec[6] = MIPS64_LONG2REG_CAST(arg6); \ + _argvec[7] = MIPS64_LONG2REG_CAST(arg7); \ + _argvec[8] = MIPS64_LONG2REG_CAST(arg8); \ + _argvec[9] = MIPS64_LONG2REG_CAST(arg9); \ __asm__ volatile( \ "dsubu $29, $29, 8\n\t" \ "ld $4, 72(%1)\n\t" \ @@ -6023,26 +5956,26 @@ typedef : /*in*/ "r" (&_argvec[0]) \ : /*trash*/ "memory", __CALLER_SAVED_REGS \ ); \ - lval = (__typeof__(lval)) _res; \ + lval = (__typeof__(lval)) (long)_res; \ } while (0) #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ arg7,arg8,arg9,arg10) \ do { \ volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[11]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ - _argvec[9] = (unsigned long)(arg9); \ - _argvec[10] = (unsigned long)(arg10); \ + volatile unsigned long long _argvec[11]; \ + volatile unsigned long long _res; \ + _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr); \ + _argvec[1] = MIPS64_LONG2REG_CAST(arg1); \ + _argvec[2] = MIPS64_LONG2REG_CAST(arg2); \ + _argvec[3] = MIPS64_LONG2REG_CAST(arg3); \ + _argvec[4] = MIPS64_LONG2REG_CAST(arg4); \ + _argvec[5] = MIPS64_LONG2REG_CAST(arg5); \ + _argvec[6] = MIPS64_LONG2REG_CAST(arg6); \ + _argvec[7] = MIPS64_LONG2REG_CAST(arg7); \ + _argvec[8] = MIPS64_LONG2REG_CAST(arg8); \ + _argvec[9] = MIPS64_LONG2REG_CAST(arg9); \ + _argvec[10] = MIPS64_LONG2REG_CAST(arg10); \ __asm__ volatile( \ "dsubu $29, $29, 16\n\t" \ "ld $4, 72(%1)\n\t" \ @@ -6065,7 +5998,7 @@ typedef : /*in*/ "r" (&_argvec[0]) \ : /*trash*/ "memory", __CALLER_SAVED_REGS \ ); \ - lval = (__typeof__(lval)) _res; \ + lval = (__typeof__(lval)) (long)_res; \ } while (0) #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ @@ -6073,20 +6006,20 @@ typedef arg11) \ do { \ volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[12]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ - _argvec[9] = (unsigned long)(arg9); \ - _argvec[10] = (unsigned long)(arg10); \ - _argvec[11] = (unsigned long)(arg11); \ + volatile unsigned long long _argvec[12]; \ + volatile unsigned long long _res; \ + _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr); \ + _argvec[1] = MIPS64_LONG2REG_CAST(arg1); \ + _argvec[2] = MIPS64_LONG2REG_CAST(arg2); \ + _argvec[3] = MIPS64_LONG2REG_CAST(arg3); \ + _argvec[4] = MIPS64_LONG2REG_CAST(arg4); \ + _argvec[5] = MIPS64_LONG2REG_CAST(arg5); \ + _argvec[6] = MIPS64_LONG2REG_CAST(arg6); \ + _argvec[7] = MIPS64_LONG2REG_CAST(arg7); \ + _argvec[8] = MIPS64_LONG2REG_CAST(arg8); \ + _argvec[9] = MIPS64_LONG2REG_CAST(arg9); \ + _argvec[10] = MIPS64_LONG2REG_CAST(arg10); \ + _argvec[11] = MIPS64_LONG2REG_CAST(arg11); \ __asm__ volatile( \ "dsubu $29, $29, 24\n\t" \ "ld $4, 72(%1)\n\t" \ @@ -6111,7 +6044,7 @@ typedef : /*in*/ "r" (&_argvec[0]) \ : /*trash*/ "memory", __CALLER_SAVED_REGS \ ); \ - lval = (__typeof__(lval)) _res; \ + lval = (__typeof__(lval)) (long)_res; \ } while (0) #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ @@ -6119,21 +6052,21 @@ typedef arg11,arg12) \ do { \ volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[13]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ - _argvec[9] = (unsigned long)(arg9); \ - _argvec[10] = (unsigned long)(arg10); \ - _argvec[11] = (unsigned long)(arg11); \ - _argvec[12] = (unsigned long)(arg12); \ + volatile unsigned long long _argvec[13]; \ + volatile unsigned long long _res; \ + _argvec[0] = MIPS64_LONG2REG_CAST(_orig.nraddr); \ + _argvec[1] = MIPS64_LONG2REG_CAST(arg1); \ + _argvec[2] = MIPS64_LONG2REG_CAST(arg2); \ + _argvec[3] = MIPS64_LONG2REG_CAST(arg3); \ + _argvec[4] = MIPS64_LONG2REG_CAST(arg4); \ + _argvec[5] = MIPS64_LONG2REG_CAST(arg5); \ + _argvec[6] = MIPS64_LONG2REG_CAST(arg6); \ + _argvec[7] = MIPS64_LONG2REG_CAST(arg7); \ + _argvec[8] = MIPS64_LONG2REG_CAST(arg8); \ + _argvec[9] = MIPS64_LONG2REG_CAST(arg9); \ + _argvec[10] = MIPS64_LONG2REG_CAST(arg10); \ + _argvec[11] = MIPS64_LONG2REG_CAST(arg11); \ + _argvec[12] = MIPS64_LONG2REG_CAST(arg12); \ __asm__ volatile( \ "dsubu $29, $29, 32\n\t" \ "ld $4, 72(%1)\n\t" \ @@ -6160,466 +6093,11 @@ typedef : /*in*/ "r" (&_argvec[0]) \ : /*trash*/ "memory", __CALLER_SAVED_REGS \ ); \ - lval = (__typeof__(lval)) _res; \ + lval = (__typeof__(lval)) (long)_res; \ } while (0) #endif /* PLAT_mips64_linux */ -/* ------------------------ tilegx-linux ------------------------- */ - -#if defined(PLAT_tilegx_linux) - -/* These regs are trashed by the hidden call. */ -#define __CALLER_SAVED_REGS "r0", "r1", "r2", "r3", "r4", "r5", \ - "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", \ - "r15", "r16", "r17", "r18", "r19", "r20", "r21", "r22", \ - "r23", "r24", "r25", "r26", "r27", "r28", "r29", "lr" - -/* These CALL_FN_ macros assume that on tilegx-linux, sizeof(unsigned - long) == 8. */ - -#define CALL_FN_W_v(lval, orig) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[1]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - __asm__ volatile( \ - "addi sp, sp, -8 \n\t" \ - "st_add sp, lr, -8 \n\t" \ - "ld r12, %1 \n\t" /* target->r11 */ \ - VALGRIND_CALL_NOREDIR_R12 \ - "addi sp, sp, 8\n\t" \ - "ld_add lr, sp, 8 \n\t" \ - "move %0, r0 \n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS); \ - \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_W(lval, orig, arg1) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[2]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - __asm__ volatile( \ - "addi sp, sp, -8 \n\t" \ - "st_add sp, lr, -8 \n\t" \ - "move r29, %1 \n\t" \ - "ld_add r12, r29, 8 \n\t" /* target->r11 */ \ - "ld_add r0, r29, 8 \n\t" /*arg1 -> r0 */ \ - VALGRIND_CALL_NOREDIR_R12 \ - "addi sp, sp, 8\n\t" \ - "ld_add lr, sp, 8 \n\t" \ - "move %0, r0\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_WW(lval, orig, arg1,arg2) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[3]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - __asm__ volatile( \ - "addi sp, sp, -8 \n\t" \ - "st_add sp, lr, -8 \n\t" \ - "move r29, %1 \n\t" \ - "ld_add r12, r29, 8 \n\t" /* target->r11 */ \ - "ld_add r0, r29, 8 \n\t" /*arg1 -> r0 */ \ - "ld_add r1, r29, 8 \n\t" /*arg2 -> r1 */ \ - VALGRIND_CALL_NOREDIR_R12 \ - "addi sp, sp, 8\n\t" \ - "ld_add lr, sp, 8 \n\t" \ - "move %0, r0\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[4]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - __asm__ volatile( \ - "addi sp, sp, -8 \n\t" \ - "st_add sp, lr, -8 \n\t" \ - "move r29, %1 \n\t" \ - "ld_add r12, r29, 8 \n\t" /* target->r11 */ \ - "ld_add r0, r29, 8 \n\t" /*arg1 -> r0 */ \ - "ld_add r1, r29, 8 \n\t" /*arg2 -> r1 */ \ - "ld_add r2, r29, 8 \n\t" /*arg3 -> r2 */ \ - VALGRIND_CALL_NOREDIR_R12 \ - "addi sp, sp, 8 \n\t" \ - "ld_add lr, sp, 8 \n\t" \ - "move %0, r0\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[5]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - __asm__ volatile( \ - "addi sp, sp, -8 \n\t" \ - "st_add sp, lr, -8 \n\t" \ - "move r29, %1 \n\t" \ - "ld_add r12, r29, 8 \n\t" /* target->r11 */ \ - "ld_add r0, r29, 8 \n\t" /*arg1 -> r0 */ \ - "ld_add r1, r29, 8 \n\t" /*arg2 -> r1 */ \ - "ld_add r2, r29, 8 \n\t" /*arg3 -> r2 */ \ - "ld_add r3, r29, 8 \n\t" /*arg4 -> r3 */ \ - VALGRIND_CALL_NOREDIR_R12 \ - "addi sp, sp, 8\n\t" \ - "ld_add lr, sp, 8 \n\t" \ - "move %0, r0\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[6]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - __asm__ volatile( \ - "addi sp, sp, -8 \n\t" \ - "st_add sp, lr, -8 \n\t" \ - "move r29, %1 \n\t" \ - "ld_add r12, r29, 8 \n\t" /* target->r11 */ \ - "ld_add r0, r29, 8 \n\t" /*arg1 -> r0 */ \ - "ld_add r1, r29, 8 \n\t" /*arg2 -> r1 */ \ - "ld_add r2, r29, 8 \n\t" /*arg3 -> r2 */ \ - "ld_add r3, r29, 8 \n\t" /*arg4 -> r3 */ \ - "ld_add r4, r29, 8 \n\t" /*arg5 -> r4 */ \ - VALGRIND_CALL_NOREDIR_R12 \ - "addi sp, sp, 8\n\t" \ - "ld_add lr, sp, 8 \n\t" \ - "move %0, r0\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS); \ - lval = (__typeof__(lval)) _res; \ - } while (0) -#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[7]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - __asm__ volatile( \ - "addi sp, sp, -8 \n\t" \ - "st_add sp, lr, -8 \n\t" \ - "move r29, %1 \n\t" \ - "ld_add r12, r29, 8 \n\t" /* target->r11 */ \ - "ld_add r0, r29, 8 \n\t" /*arg1 -> r0 */ \ - "ld_add r1, r29, 8 \n\t" /*arg2 -> r1 */ \ - "ld_add r2, r29, 8 \n\t" /*arg3 -> r2 */ \ - "ld_add r3, r29, 8 \n\t" /*arg4 -> r3 */ \ - "ld_add r4, r29, 8 \n\t" /*arg5 -> r4 */ \ - "ld_add r5, r29, 8 \n\t" /*arg6 -> r5 */ \ - VALGRIND_CALL_NOREDIR_R12 \ - "addi sp, sp, 8\n\t" \ - "ld_add lr, sp, 8 \n\t" \ - "move %0, r0\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[8]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - __asm__ volatile( \ - "addi sp, sp, -8 \n\t" \ - "st_add sp, lr, -8 \n\t" \ - "move r29, %1 \n\t" \ - "ld_add r12, r29, 8 \n\t" /* target->r11 */ \ - "ld_add r0, r29, 8 \n\t" /*arg1 -> r0 */ \ - "ld_add r1, r29, 8 \n\t" /*arg2 -> r1 */ \ - "ld_add r2, r29, 8 \n\t" /*arg3 -> r2 */ \ - "ld_add r3, r29, 8 \n\t" /*arg4 -> r3 */ \ - "ld_add r4, r29, 8 \n\t" /*arg5 -> r4 */ \ - "ld_add r5, r29, 8 \n\t" /*arg6 -> r5 */ \ - "ld_add r6, r29, 8 \n\t" /*arg7 -> r6 */ \ - VALGRIND_CALL_NOREDIR_R12 \ - "addi sp, sp, 8\n\t" \ - "ld_add lr, sp, 8 \n\t" \ - "move %0, r0\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7,arg8) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[9]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ - __asm__ volatile( \ - "addi sp, sp, -8 \n\t" \ - "st_add sp, lr, -8 \n\t" \ - "move r29, %1 \n\t" \ - "ld_add r12, r29, 8 \n\t" /* target->r11 */ \ - "ld_add r0, r29, 8 \n\t" /*arg1 -> r0 */ \ - "ld_add r1, r29, 8 \n\t" /*arg2 -> r1 */ \ - "ld_add r2, r29, 8 \n\t" /*arg3 -> r2 */ \ - "ld_add r3, r29, 8 \n\t" /*arg4 -> r3 */ \ - "ld_add r4, r29, 8 \n\t" /*arg5 -> r4 */ \ - "ld_add r5, r29, 8 \n\t" /*arg6 -> r5 */ \ - "ld_add r6, r29, 8 \n\t" /*arg7 -> r6 */ \ - "ld_add r7, r29, 8 \n\t" /*arg8 -> r7 */ \ - VALGRIND_CALL_NOREDIR_R12 \ - "addi sp, sp, 8\n\t" \ - "ld_add lr, sp, 8 \n\t" \ - "move %0, r0\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7,arg8,arg9) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[10]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ - _argvec[9] = (unsigned long)(arg9); \ - __asm__ volatile( \ - "addi sp, sp, -8 \n\t" \ - "st_add sp, lr, -8 \n\t" \ - "move r29, %1 \n\t" \ - "ld_add r12, r29, 8 \n\t" /* target->r11 */ \ - "ld_add r0, r29, 8 \n\t" /*arg1 -> r0 */ \ - "ld_add r1, r29, 8 \n\t" /*arg2 -> r1 */ \ - "ld_add r2, r29, 8 \n\t" /*arg3 -> r2 */ \ - "ld_add r3, r29, 8 \n\t" /*arg4 -> r3 */ \ - "ld_add r4, r29, 8 \n\t" /*arg5 -> r4 */ \ - "ld_add r5, r29, 8 \n\t" /*arg6 -> r5 */ \ - "ld_add r6, r29, 8 \n\t" /*arg7 -> r6 */ \ - "ld_add r7, r29, 8 \n\t" /*arg8 -> r7 */ \ - "ld_add r8, r29, 8 \n\t" /*arg9 -> r8 */ \ - VALGRIND_CALL_NOREDIR_R12 \ - "addi sp, sp, 8\n\t" \ - "ld_add lr, sp, 8 \n\t" \ - "move %0, r0\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ - arg7,arg8,arg9,arg10) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[11]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ - _argvec[9] = (unsigned long)(arg9); \ - _argvec[10] = (unsigned long)(arg10); \ - __asm__ volatile( \ - "addi sp, sp, -8 \n\t" \ - "st_add sp, lr, -8 \n\t" \ - "move r29, %1 \n\t" \ - "ld_add r12, r29, 8 \n\t" /* target->r11 */ \ - "ld_add r0, r29, 8 \n\t" /*arg1 -> r0 */ \ - "ld_add r1, r29, 8 \n\t" /*arg2 -> r1 */ \ - "ld_add r2, r29, 8 \n\t" /*arg3 -> r2 */ \ - "ld_add r3, r29, 8 \n\t" /*arg4 -> r3 */ \ - "ld_add r4, r29, 8 \n\t" /*arg5 -> r4 */ \ - "ld_add r5, r29, 8 \n\t" /*arg6 -> r5 */ \ - "ld_add r6, r29, 8 \n\t" /*arg7 -> r6 */ \ - "ld_add r7, r29, 8 \n\t" /*arg8 -> r7 */ \ - "ld_add r8, r29, 8 \n\t" /*arg9 -> r8 */ \ - "ld_add r9, r29, 8 \n\t" /*arg10 -> r9 */ \ - VALGRIND_CALL_NOREDIR_R12 \ - "addi sp, sp, 8\n\t" \ - "ld_add lr, sp, 8 \n\t" \ - "move %0, r0\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ - arg6,arg7,arg8,arg9,arg10, \ - arg11) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[12]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ - _argvec[9] = (unsigned long)(arg9); \ - _argvec[10] = (unsigned long)(arg10); \ - _argvec[11] = (unsigned long)(arg11); \ - __asm__ volatile( \ - "addi sp, sp, -8 \n\t" \ - "st_add sp, lr, -8 \n\t" \ - "move r29, %1 \n\t" \ - "ld_add r12, r29, 8 \n\t" /* target->r11 */ \ - "ld_add r0, r29, 8 \n\t" /*arg1 -> r0 */ \ - "ld_add r1, r29, 8 \n\t" /*arg2 -> r1 */ \ - "ld_add r2, r29, 8 \n\t" /*arg3 -> r2 */ \ - "ld_add r3, r29, 8 \n\t" /*arg4 -> r3 */ \ - "ld_add r4, r29, 8 \n\t" /*arg5 -> r4 */ \ - "ld_add r5, r29, 8 \n\t" /*arg6 -> r5 */ \ - "ld_add r6, r29, 8 \n\t" /*arg7 -> r6 */ \ - "ld_add r7, r29, 8 \n\t" /*arg8 -> r7 */ \ - "ld_add r8, r29, 8 \n\t" /*arg9 -> r8 */ \ - "ld_add r9, r29, 8 \n\t" /*arg10 -> r9 */ \ - "ld r10, r29 \n\t" \ - "st_add sp, r10, -16 \n\t" \ - VALGRIND_CALL_NOREDIR_R12 \ - "addi sp, sp, 24 \n\t" \ - "ld_add lr, sp, 8 \n\t" \ - "move %0, r0\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS); \ - lval = (__typeof__(lval)) _res; \ - } while (0) - -#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ - arg6,arg7,arg8,arg9,arg10, \ - arg11,arg12) \ - do { \ - volatile OrigFn _orig = (orig); \ - volatile unsigned long _argvec[13]; \ - volatile unsigned long _res; \ - _argvec[0] = (unsigned long)_orig.nraddr; \ - _argvec[1] = (unsigned long)(arg1); \ - _argvec[2] = (unsigned long)(arg2); \ - _argvec[3] = (unsigned long)(arg3); \ - _argvec[4] = (unsigned long)(arg4); \ - _argvec[5] = (unsigned long)(arg5); \ - _argvec[6] = (unsigned long)(arg6); \ - _argvec[7] = (unsigned long)(arg7); \ - _argvec[8] = (unsigned long)(arg8); \ - _argvec[9] = (unsigned long)(arg9); \ - _argvec[10] = (unsigned long)(arg10); \ - _argvec[11] = (unsigned long)(arg11); \ - _argvec[12] = (unsigned long)(arg12); \ - __asm__ volatile( \ - "addi sp, sp, -8 \n\t" \ - "st_add sp, lr, -8 \n\t" \ - "move r29, %1 \n\t" \ - "ld_add r12, r29, 8 \n\t" /* target->r11 */ \ - "ld_add r0, r29, 8 \n\t" /*arg1 -> r0 */ \ - "ld_add r1, r29, 8 \n\t" /*arg2 -> r1 */ \ - "ld_add r2, r29, 8 \n\t" /*arg3 -> r2 */ \ - "ld_add r3, r29, 8 \n\t" /*arg4 -> r3 */ \ - "ld_add r4, r29, 8 \n\t" /*arg5 -> r4 */ \ - "ld_add r5, r29, 8 \n\t" /*arg6 -> r5 */ \ - "ld_add r6, r29, 8 \n\t" /*arg7 -> r6 */ \ - "ld_add r7, r29, 8 \n\t" /*arg8 -> r7 */ \ - "ld_add r8, r29, 8 \n\t" /*arg9 -> r8 */ \ - "ld_add r9, r29, 8 \n\t" /*arg10 -> r9 */ \ - "addi r28, sp, -8 \n\t" \ - "addi sp, sp, -24 \n\t" \ - "ld_add r10, r29, 8 \n\t" \ - "ld r11, r29 \n\t" \ - "st_add r28, r10, 8 \n\t" \ - "st r28, r11 \n\t" \ - VALGRIND_CALL_NOREDIR_R12 \ - "addi sp, sp, 32 \n\t" \ - "ld_add lr, sp, 8 \n\t" \ - "move %0, r0\n" \ - : /*out*/ "=r" (_res) \ - : /*in*/ "r" (&_argvec[0]) \ - : /*trash*/ "memory", __CALLER_SAVED_REGS); \ - lval = (__typeof__(lval)) _res; \ - } while (0) -#endif /* PLAT_tilegx_linux */ - /* ------------------------------------------------------------------ */ /* ARCHITECTURE INDEPENDENT MACROS for CLIENT REQUESTS. */ /* */ @@ -6642,8 +6120,9 @@ typedef /* !! ABIWARNING !! ABIWARNING !! ABIWARNING !! ABIWARNING !! This enum comprises an ABI exported by Valgrind to programs - which use client requests. DO NOT CHANGE THE ORDER OF THESE - ENTRIES, NOR DELETE ANY -- add new ones at the end. */ + which use client requests. DO NOT CHANGE THE NUMERIC VALUES OF THESE + ENTRIES, NOR DELETE ANY -- add new ones at the end of the most + relevant group. */ typedef enum { VG_USERREQ__RUNNING_ON_VALGRIND = 0x1001, VG_USERREQ__DISCARD_TRANSLATIONS = 0x1002, @@ -6713,8 +6192,13 @@ typedef Other values are not allowed. */ VG_USERREQ__CHANGE_ERR_DISABLEMENT = 0x1801, + /* Some requests used for Valgrind internal, such as + self-test or self-hosting. */ /* Initialise IR injection */ - VG_USERREQ__VEX_INIT_FOR_IRI = 0x1901 + VG_USERREQ__VEX_INIT_FOR_IRI = 0x1901, + /* Used by Inner Valgrind to inform Outer Valgrind where to + find the list of inner guest threads */ + VG_USERREQ__INNER_THREADS = 0x1902 } Vg_ClientRequest; #if !defined(__GNUC__) @@ -6740,6 +6224,10 @@ typedef VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DISCARD_TRANSLATIONS, \ _qzz_addr, _qzz_len, 0, 0, 0) +#define VALGRIND_INNER_THREADS(_qzz_addr) \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__INNER_THREADS, \ + _qzz_addr, 0, 0, 0, 0) + /* These requests are for getting Valgrind itself to print something. Possibly with a backtrace. This is a really ugly hack. The return value @@ -6759,6 +6247,7 @@ __inline VALGRIND_PRINTF(const char *format, ...) { #if defined(NVALGRIND) + (void)format; return 0; #else /* NVALGRIND */ #if defined(_MSC_VER) || defined(__MINGW64__) @@ -6797,6 +6286,7 @@ __inline VALGRIND_PRINTF_BACKTRACE(const char *format, ...) { #if defined(NVALGRIND) + (void)format; return 0; #else /* NVALGRIND */ #if defined(_MSC_VER) || defined(__MINGW64__) @@ -6826,7 +6316,7 @@ VALGRIND_PRINTF_BACKTRACE(const char *format, ...) /* These requests allow control to move from the simulated CPU to the - real CPU, calling an arbitary function. + real CPU, calling an arbitrary function. Note that the current ThreadId is inserted as the first argument. So this call: @@ -7007,6 +6497,38 @@ VALGRIND_PRINTF_BACKTRACE(const char *format, ...) VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CREATE_MEMPOOL, \ pool, rzB, is_zeroed, 0, 0) +/* Create a memory pool with some flags specifying extended behaviour. + When flags is zero, the behaviour is identical to VALGRIND_CREATE_MEMPOOL. + + The flag VALGRIND_MEMPOOL_METAPOOL specifies that the pieces of memory + associated with the pool using VALGRIND_MEMPOOL_ALLOC will be used + by the application as superblocks to dole out MALLOC_LIKE blocks using + VALGRIND_MALLOCLIKE_BLOCK. In other words, a meta pool is a "2 levels" + pool : first level is the blocks described by VALGRIND_MEMPOOL_ALLOC. + The second level blocks are described using VALGRIND_MALLOCLIKE_BLOCK. + Note that the association between the pool and the second level blocks + is implicit : second level blocks will be located inside first level + blocks. It is necessary to use the VALGRIND_MEMPOOL_METAPOOL flag + for such 2 levels pools, as otherwise valgrind will detect overlapping + memory blocks, and will abort execution (e.g. during leak search). + + Such a meta pool can also be marked as an 'auto free' pool using the flag + VALGRIND_MEMPOOL_AUTO_FREE, which must be OR-ed together with the + VALGRIND_MEMPOOL_METAPOOL. For an 'auto free' pool, VALGRIND_MEMPOOL_FREE + will automatically free the second level blocks that are contained + inside the first level block freed with VALGRIND_MEMPOOL_FREE. + In other words, calling VALGRIND_MEMPOOL_FREE will cause implicit calls + to VALGRIND_FREELIKE_BLOCK for all the second level blocks included + in the first level block. + Note: it is an error to use the VALGRIND_MEMPOOL_AUTO_FREE flag + without the VALGRIND_MEMPOOL_METAPOOL flag. +*/ +#define VALGRIND_MEMPOOL_AUTO_FREE 1 +#define VALGRIND_MEMPOOL_METAPOOL 2 +#define VALGRIND_CREATE_MEMPOOL_EXT(pool, rzB, is_zeroed, flags) \ + VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CREATE_MEMPOOL, \ + pool, rzB, is_zeroed, flags, 0) + /* Destroy a memory pool. */ #define VALGRIND_DESTROY_MEMPOOL(pool) \ VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DESTROY_MEMPOOL, \ @@ -7119,7 +6641,6 @@ VALGRIND_PRINTF_BACKTRACE(const char *format, ...) #undef PLAT_s390x_linux #undef PLAT_mips32_linux #undef PLAT_mips64_linux -#undef PLAT_tilegx_linux #undef PLAT_x86_solaris #undef PLAT_amd64_solaris |