91 #define __VALGRIND_MAJOR__ 3
92 #define __VALGRIND_MINOR__ 6
111 #undef PLAT_x86_darwin
112 #undef PLAT_amd64_darwin
113 #undef PLAT_x86_win32
114 #undef PLAT_x86_linux
115 #undef PLAT_amd64_linux
116 #undef PLAT_ppc32_linux
117 #undef PLAT_ppc64_linux
118 #undef PLAT_arm_linux
119 #undef PLAT_s390x_linux
122 #if defined(__APPLE__) && defined(__i386__)
123 # define PLAT_x86_darwin 1
124 #elif defined(__APPLE__) && defined(__x86_64__)
125 # define PLAT_amd64_darwin 1
126 #elif defined(__MINGW32__) || defined(__CYGWIN32__) \
127 || (defined(_WIN32) && defined(_M_IX86))
128 # define PLAT_x86_win32 1
129 #elif defined(__linux__) && defined(__i386__)
130 # define PLAT_x86_linux 1
131 #elif defined(__linux__) && defined(__x86_64__)
132 # define PLAT_amd64_linux 1
133 #elif defined(__linux__) && defined(__powerpc__) && !defined(__powerpc64__)
134 # define PLAT_ppc32_linux 1
135 #elif defined(__linux__) && defined(__powerpc__) && defined(__powerpc64__)
136 # define PLAT_ppc64_linux 1
137 #elif defined(__linux__) && defined(__arm__)
138 # define PLAT_arm_linux 1
139 #elif defined(__linux__) && defined(__s390__) && defined(__s390x__)
140 # define PLAT_s390x_linux 1
144 # if !defined(NVALGRIND)
168 #define VALGRIND_DO_CLIENT_REQUEST(_zzq_rlval, _zzq_default, \
169 _zzq_request, _zzq_arg1, _zzq_arg2, \
170 _zzq_arg3, _zzq_arg4, _zzq_arg5) \
171 do { (_zzq_rlval) = VALGRIND_DO_CLIENT_REQUEST_EXPR((_zzq_default), \
172 (_zzq_request), (_zzq_arg1), (_zzq_arg2), \
173 (_zzq_arg3), (_zzq_arg4), (_zzq_arg5)); } while (0)
175 #define VALGRIND_DO_CLIENT_REQUEST_STMT(_zzq_request, _zzq_arg1, \
176 _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
177 do { (void) VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
178 (_zzq_request), (_zzq_arg1), (_zzq_arg2), \
179 (_zzq_arg3), (_zzq_arg4), (_zzq_arg5)); } while (0)
181 #if defined(NVALGRIND)
186 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
187 _zzq_default, _zzq_request, \
188 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
230 #if defined(PLAT_x86_linux) || defined(PLAT_x86_darwin) \
231 || (defined(PLAT_x86_win32) && defined(__GNUC__))
239 #define __SPECIAL_INSTRUCTION_PREAMBLE \
240 "roll $3, %%edi ; roll $13, %%edi\n\t" \
241 "roll $29, %%edi ; roll $19, %%edi\n\t"
243 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
244 _zzq_default, _zzq_request, \
245 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
247 ({volatile unsigned int _zzq_args[6]; \
248 volatile unsigned int _zzq_result; \
249 _zzq_args[0] = (unsigned int)(_zzq_request); \
250 _zzq_args[1] = (unsigned int)(_zzq_arg1); \
251 _zzq_args[2] = (unsigned int)(_zzq_arg2); \
252 _zzq_args[3] = (unsigned int)(_zzq_arg3); \
253 _zzq_args[4] = (unsigned int)(_zzq_arg4); \
254 _zzq_args[5] = (unsigned int)(_zzq_arg5); \
255 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
257 "xchgl %%ebx,%%ebx" \
258 : "=d" (_zzq_result) \
259 : "a" (&_zzq_args[0]), "0" (_zzq_default) \
265 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
266 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
267 volatile unsigned int __addr; \
268 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
270 "xchgl %%ecx,%%ecx" \
275 _zzq_orig->nraddr = __addr; \
278 #define VALGRIND_CALL_NOREDIR_EAX \
279 __SPECIAL_INSTRUCTION_PREAMBLE \
281 "xchgl %%edx,%%edx\n\t"
286 #if defined(PLAT_x86_win32) && !defined(__GNUC__)
294 #if defined(_MSC_VER)
296 #define __SPECIAL_INSTRUCTION_PREAMBLE \
297 __asm rol edi, 3 __asm rol edi, 13 \
298 __asm rol edi, 29 __asm rol edi, 19
300 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
301 _zzq_default, _zzq_request, \
302 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
303 valgrind_do_client_request_expr((uintptr_t)(_zzq_default), \
304 (uintptr_t)(_zzq_request), (uintptr_t)(_zzq_arg1), \
305 (uintptr_t)(_zzq_arg2), (uintptr_t)(_zzq_arg3), \
306 (uintptr_t)(_zzq_arg4), (uintptr_t)(_zzq_arg5))
315 volatile unsigned int _zzq_result;
316 _zzq_args[0] = (
uintptr_t)(_zzq_request);
322 __asm { __asm lea eax, _zzq_args __asm mov edx, _zzq_default
323 __SPECIAL_INSTRUCTION_PREAMBLE
326 __asm mov _zzq_result, edx
331 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
332 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
333 volatile unsigned int __addr; \
334 __asm { __SPECIAL_INSTRUCTION_PREAMBLE \
337 __asm mov __addr, eax \
339 _zzq_orig->nraddr = __addr; \
342 #define VALGRIND_CALL_NOREDIR_EAX ERROR
345 #error Unsupported compiler.
352 #if defined(PLAT_amd64_linux) || defined(PLAT_amd64_darwin)
356 unsigned long long int nraddr;
360 #define __SPECIAL_INSTRUCTION_PREAMBLE \
361 "rolq $3, %%rdi ; rolq $13, %%rdi\n\t" \
362 "rolq $61, %%rdi ; rolq $51, %%rdi\n\t"
364 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
365 _zzq_default, _zzq_request, \
366 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
368 ({ volatile unsigned long long int _zzq_args[6]; \
369 volatile unsigned long long int _zzq_result; \
370 _zzq_args[0] = (unsigned long long int)(_zzq_request); \
371 _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \
372 _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \
373 _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \
374 _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \
375 _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \
376 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
378 "xchgq %%rbx,%%rbx" \
379 : "=d" (_zzq_result) \
380 : "a" (&_zzq_args[0]), "0" (_zzq_default) \
386 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
387 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
388 volatile unsigned long long int __addr; \
389 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
391 "xchgq %%rcx,%%rcx" \
396 _zzq_orig->nraddr = __addr; \
399 #define VALGRIND_CALL_NOREDIR_RAX \
400 __SPECIAL_INSTRUCTION_PREAMBLE \
402 "xchgq %%rdx,%%rdx\n\t"
407 #if defined(PLAT_ppc32_linux)
415 #define __SPECIAL_INSTRUCTION_PREAMBLE \
416 "rlwinm 0,0,3,0,0 ; rlwinm 0,0,13,0,0\n\t" \
417 "rlwinm 0,0,29,0,0 ; rlwinm 0,0,19,0,0\n\t"
419 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
420 _zzq_default, _zzq_request, \
421 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
424 ({ unsigned int _zzq_args[6]; \
425 unsigned int _zzq_result; \
426 unsigned int* _zzq_ptr; \
427 _zzq_args[0] = (unsigned int)(_zzq_request); \
428 _zzq_args[1] = (unsigned int)(_zzq_arg1); \
429 _zzq_args[2] = (unsigned int)(_zzq_arg2); \
430 _zzq_args[3] = (unsigned int)(_zzq_arg3); \
431 _zzq_args[4] = (unsigned int)(_zzq_arg4); \
432 _zzq_args[5] = (unsigned int)(_zzq_arg5); \
433 _zzq_ptr = _zzq_args; \
434 __asm__ volatile("mr 3,%1\n\t" \
436 __SPECIAL_INSTRUCTION_PREAMBLE \
440 : "=b" (_zzq_result) \
441 : "b" (_zzq_default), "b" (_zzq_ptr) \
442 : "cc", "memory", "r3", "r4"); \
446 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
447 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
448 unsigned int __addr; \
449 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
455 : "cc", "memory", "r3" \
457 _zzq_orig->nraddr = __addr; \
460 #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
461 __SPECIAL_INSTRUCTION_PREAMBLE \
468 #if defined(PLAT_ppc64_linux)
472 unsigned long long int nraddr;
473 unsigned long long int r2;
477 #define __SPECIAL_INSTRUCTION_PREAMBLE \
478 "rotldi 0,0,3 ; rotldi 0,0,13\n\t" \
479 "rotldi 0,0,61 ; rotldi 0,0,51\n\t"
481 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
482 _zzq_default, _zzq_request, \
483 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
486 ({ unsigned long long int _zzq_args[6]; \
487 unsigned long long int _zzq_result; \
488 unsigned long long int* _zzq_ptr; \
489 _zzq_args[0] = (unsigned long long int)(_zzq_request); \
490 _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \
491 _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \
492 _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \
493 _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \
494 _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \
495 _zzq_ptr = _zzq_args; \
496 __asm__ volatile("mr 3,%1\n\t" \
498 __SPECIAL_INSTRUCTION_PREAMBLE \
502 : "=b" (_zzq_result) \
503 : "b" (_zzq_default), "b" (_zzq_ptr) \
504 : "cc", "memory", "r3", "r4"); \
508 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
509 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
510 unsigned long long int __addr; \
511 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
517 : "cc", "memory", "r3" \
519 _zzq_orig->nraddr = __addr; \
520 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
526 : "cc", "memory", "r3" \
528 _zzq_orig->r2 = __addr; \
531 #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
532 __SPECIAL_INSTRUCTION_PREAMBLE \
540 #if defined(PLAT_arm_linux)
548 #define __SPECIAL_INSTRUCTION_PREAMBLE \
549 "mov r12, r12, ror #3 ; mov r12, r12, ror #13 \n\t" \
550 "mov r12, r12, ror #29 ; mov r12, r12, ror #19 \n\t"
552 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
553 _zzq_default, _zzq_request, \
554 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
557 ({volatile unsigned int _zzq_args[6]; \
558 volatile unsigned int _zzq_result; \
559 _zzq_args[0] = (unsigned int)(_zzq_request); \
560 _zzq_args[1] = (unsigned int)(_zzq_arg1); \
561 _zzq_args[2] = (unsigned int)(_zzq_arg2); \
562 _zzq_args[3] = (unsigned int)(_zzq_arg3); \
563 _zzq_args[4] = (unsigned int)(_zzq_arg4); \
564 _zzq_args[5] = (unsigned int)(_zzq_arg5); \
565 __asm__ volatile("mov r3, %1\n\t" \
567 __SPECIAL_INSTRUCTION_PREAMBLE \
569 "orr r10, r10, r10\n\t" \
571 : "=r" (_zzq_result) \
572 : "r" (_zzq_default), "r" (&_zzq_args[0]) \
573 : "cc","memory", "r3", "r4"); \
577 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
578 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
579 unsigned int __addr; \
580 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
582 "orr r11, r11, r11\n\t" \
586 : "cc", "memory", "r3" \
588 _zzq_orig->nraddr = __addr; \
591 #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
592 __SPECIAL_INSTRUCTION_PREAMBLE \
594 "orr r12, r12, r12\n\t"
600 #if defined(PLAT_s390x_linux)
604 unsigned long long int nraddr;
612 #define __SPECIAL_INSTRUCTION_PREAMBLE \
618 #define __CLIENT_REQUEST_CODE "lr 2,2\n\t"
619 #define __GET_NR_CONTEXT_CODE "lr 3,3\n\t"
620 #define __CALL_NO_REDIR_CODE "lr 4,4\n\t"
622 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
623 _zzq_default, _zzq_request, \
624 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
626 ({volatile unsigned long long int _zzq_args[6]; \
627 volatile unsigned long long int _zzq_result; \
628 _zzq_args[0] = (unsigned long long int)(_zzq_request); \
629 _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \
630 _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \
631 _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \
632 _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \
633 _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \
638 __SPECIAL_INSTRUCTION_PREAMBLE \
639 __CLIENT_REQUEST_CODE \
642 : "=d" (_zzq_result) \
643 : "a" (&_zzq_args[0]), "0" (_zzq_default) \
644 : "cc", "2", "3", "memory" \
649 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
650 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
651 volatile unsigned long long int __addr; \
652 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
653 __GET_NR_CONTEXT_CODE \
657 : "cc", "3", "memory" \
659 _zzq_orig->nraddr = __addr; \
662 #define VALGRIND_CALL_NOREDIR_R1 \
663 __SPECIAL_INSTRUCTION_PREAMBLE \
704 #define VG_CONCAT4(_aa,_bb,_cc,_dd) _aa##_bb##_cc##_dd
706 #define I_WRAP_SONAME_FNNAME_ZU(soname,fnname) \
707 VG_CONCAT4(_vgw00000ZU_,soname,_,fnname)
709 #define I_WRAP_SONAME_FNNAME_ZZ(soname,fnname) \
710 VG_CONCAT4(_vgw00000ZZ_,soname,_,fnname)
716 #define VALGRIND_GET_ORIG_FN(_lval) VALGRIND_GET_NR_CONTEXT(_lval)
721 #define CALL_FN_v_v(fnptr) \
722 do { volatile unsigned long _junk; \
723 CALL_FN_W_v(_junk,fnptr); } while (0)
725 #define CALL_FN_v_W(fnptr, arg1) \
726 do { volatile unsigned long _junk; \
727 CALL_FN_W_W(_junk,fnptr,arg1); } while (0)
729 #define CALL_FN_v_WW(fnptr, arg1,arg2) \
730 do { volatile unsigned long _junk; \
731 CALL_FN_W_WW(_junk,fnptr,arg1,arg2); } while (0)
733 #define CALL_FN_v_WWW(fnptr, arg1,arg2,arg3) \
734 do { volatile unsigned long _junk; \
735 CALL_FN_W_WWW(_junk,fnptr,arg1,arg2,arg3); } while (0)
737 #define CALL_FN_v_WWWW(fnptr, arg1,arg2,arg3,arg4) \
738 do { volatile unsigned long _junk; \
739 CALL_FN_W_WWWW(_junk,fnptr,arg1,arg2,arg3,arg4); } while (0)
741 #define CALL_FN_v_5W(fnptr, arg1,arg2,arg3,arg4,arg5) \
742 do { volatile unsigned long _junk; \
743 CALL_FN_W_5W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5); } while (0)
745 #define CALL_FN_v_6W(fnptr, arg1,arg2,arg3,arg4,arg5,arg6) \
746 do { volatile unsigned long _junk; \
747 CALL_FN_W_6W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5,arg6); } while (0)
749 #define CALL_FN_v_7W(fnptr, arg1,arg2,arg3,arg4,arg5,arg6,arg7) \
750 do { volatile unsigned long _junk; \
751 CALL_FN_W_7W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5,arg6,arg7); } while (0)
755 #if defined(PLAT_x86_linux) || defined(PLAT_x86_darwin)
759 #define __CALLER_SAVED_REGS "ecx", "edx"
764 #define CALL_FN_W_v(lval, orig) \
766 volatile OrigFn _orig = (orig); \
767 volatile unsigned long _argvec[1]; \
768 volatile unsigned long _res; \
769 _argvec[0] = (unsigned long)_orig.nraddr; \
771 "movl (%%eax), %%eax\n\t" \
772 VALGRIND_CALL_NOREDIR_EAX \
774 :
"a" (&_argvec[0]) \
775 :
"cc", "memory", __CALLER_SAVED_REGS \
777 lval = (__typeof__(lval)) _res; \
780 #define CALL_FN_W_W(lval, orig, arg1) \
782 volatile OrigFn _orig = (orig); \
783 volatile unsigned long _argvec[2]; \
784 volatile unsigned long _res; \
785 _argvec[0] = (unsigned long)_orig.nraddr; \
786 _argvec[1] = (unsigned long)(arg1); \
788 "subl $12, %%esp\n\t" \
789 "pushl 4(%%eax)\n\t" \
790 "movl (%%eax), %%eax\n\t"
\
791 VALGRIND_CALL_NOREDIR_EAX \
792 "addl $16, %%esp\n" \
794 :
"a" (&_argvec[0]) \
795 :
"cc", "memory", __CALLER_SAVED_REGS \
797 lval = (__typeof__(lval)) _res; \
800 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
802 volatile OrigFn _orig = (orig); \
803 volatile unsigned long _argvec[3]; \
804 volatile unsigned long _res; \
805 _argvec[0] = (unsigned long)_orig.nraddr; \
806 _argvec[1] = (unsigned long)(arg1); \
807 _argvec[2] = (unsigned long)(arg2); \
809 "subl $8, %%esp\n\t" \
810 "pushl 8(%%eax)\n\t" \
811 "pushl 4(%%eax)\n\t" \
812 "movl (%%eax), %%eax\n\t"
\
813 VALGRIND_CALL_NOREDIR_EAX \
814 "addl $16, %%esp\n" \
816 :
"a" (&_argvec[0]) \
817 :
"cc", "memory", __CALLER_SAVED_REGS \
819 lval = (__typeof__(lval)) _res; \
822 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
824 volatile OrigFn _orig = (orig); \
825 volatile unsigned long _argvec[4]; \
826 volatile unsigned long _res; \
827 _argvec[0] = (unsigned long)_orig.nraddr; \
828 _argvec[1] = (unsigned long)(arg1); \
829 _argvec[2] = (unsigned long)(arg2); \
830 _argvec[3] = (unsigned long)(arg3); \
832 "subl $4, %%esp\n\t" \
833 "pushl 12(%%eax)\n\t" \
834 "pushl 8(%%eax)\n\t" \
835 "pushl 4(%%eax)\n\t" \
836 "movl (%%eax), %%eax\n\t"
\
837 VALGRIND_CALL_NOREDIR_EAX \
838 "addl $16, %%esp\n" \
840 :
"a" (&_argvec[0]) \
841 :
"cc", "memory", __CALLER_SAVED_REGS \
843 lval = (__typeof__(lval)) _res; \
846 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
848 volatile OrigFn _orig = (orig); \
849 volatile unsigned long _argvec[5]; \
850 volatile unsigned long _res; \
851 _argvec[0] = (unsigned long)_orig.nraddr; \
852 _argvec[1] = (unsigned long)(arg1); \
853 _argvec[2] = (unsigned long)(arg2); \
854 _argvec[3] = (unsigned long)(arg3); \
855 _argvec[4] = (unsigned long)(arg4); \
857 "pushl 16(%%eax)\n\t" \
858 "pushl 12(%%eax)\n\t" \
859 "pushl 8(%%eax)\n\t" \
860 "pushl 4(%%eax)\n\t" \
861 "movl (%%eax), %%eax\n\t"
\
862 VALGRIND_CALL_NOREDIR_EAX \
863 "addl $16, %%esp\n" \
865 :
"a" (&_argvec[0]) \
866 :
"cc", "memory", __CALLER_SAVED_REGS \
868 lval = (__typeof__(lval)) _res; \
871 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
873 volatile OrigFn _orig = (orig); \
874 volatile unsigned long _argvec[6]; \
875 volatile unsigned long _res; \
876 _argvec[0] = (unsigned long)_orig.nraddr; \
877 _argvec[1] = (unsigned long)(arg1); \
878 _argvec[2] = (unsigned long)(arg2); \
879 _argvec[3] = (unsigned long)(arg3); \
880 _argvec[4] = (unsigned long)(arg4); \
881 _argvec[5] = (unsigned long)(arg5); \
883 "subl $12, %%esp\n\t" \
884 "pushl 20(%%eax)\n\t" \
885 "pushl 16(%%eax)\n\t" \
886 "pushl 12(%%eax)\n\t" \
887 "pushl 8(%%eax)\n\t" \
888 "pushl 4(%%eax)\n\t" \
889 "movl (%%eax), %%eax\n\t"
\
890 VALGRIND_CALL_NOREDIR_EAX \
891 "addl $32, %%esp\n" \
893 :
"a" (&_argvec[0]) \
894 :
"cc", "memory", __CALLER_SAVED_REGS \
896 lval = (__typeof__(lval)) _res; \
899 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
901 volatile OrigFn _orig = (orig); \
902 volatile unsigned long _argvec[7]; \
903 volatile unsigned long _res; \
904 _argvec[0] = (unsigned long)_orig.nraddr; \
905 _argvec[1] = (unsigned long)(arg1); \
906 _argvec[2] = (unsigned long)(arg2); \
907 _argvec[3] = (unsigned long)(arg3); \
908 _argvec[4] = (unsigned long)(arg4); \
909 _argvec[5] = (unsigned long)(arg5); \
910 _argvec[6] = (unsigned long)(arg6); \
912 "subl $8, %%esp\n\t" \
913 "pushl 24(%%eax)\n\t" \
914 "pushl 20(%%eax)\n\t" \
915 "pushl 16(%%eax)\n\t" \
916 "pushl 12(%%eax)\n\t" \
917 "pushl 8(%%eax)\n\t" \
918 "pushl 4(%%eax)\n\t" \
919 "movl (%%eax), %%eax\n\t"
\
920 VALGRIND_CALL_NOREDIR_EAX \
921 "addl $32, %%esp\n" \
923 :
"a" (&_argvec[0]) \
924 :
"cc", "memory", __CALLER_SAVED_REGS \
926 lval = (__typeof__(lval)) _res; \
929 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
932 volatile OrigFn _orig = (orig); \
933 volatile unsigned long _argvec[8]; \
934 volatile unsigned long _res; \
935 _argvec[0] = (unsigned long)_orig.nraddr; \
936 _argvec[1] = (unsigned long)(arg1); \
937 _argvec[2] = (unsigned long)(arg2); \
938 _argvec[3] = (unsigned long)(arg3); \
939 _argvec[4] = (unsigned long)(arg4); \
940 _argvec[5] = (unsigned long)(arg5); \
941 _argvec[6] = (unsigned long)(arg6); \
942 _argvec[7] = (unsigned long)(arg7); \
944 "subl $4, %%esp\n\t" \
945 "pushl 28(%%eax)\n\t" \
946 "pushl 24(%%eax)\n\t" \
947 "pushl 20(%%eax)\n\t" \
948 "pushl 16(%%eax)\n\t" \
949 "pushl 12(%%eax)\n\t" \
950 "pushl 8(%%eax)\n\t" \
951 "pushl 4(%%eax)\n\t" \
952 "movl (%%eax), %%eax\n\t"
\
953 VALGRIND_CALL_NOREDIR_EAX \
954 "addl $32, %%esp\n" \
956 :
"a" (&_argvec[0]) \
957 :
"cc", "memory", __CALLER_SAVED_REGS \
959 lval = (__typeof__(lval)) _res; \
962 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
965 volatile OrigFn _orig = (orig); \
966 volatile unsigned long _argvec[9]; \
967 volatile unsigned long _res; \
968 _argvec[0] = (unsigned long)_orig.nraddr; \
969 _argvec[1] = (unsigned long)(arg1); \
970 _argvec[2] = (unsigned long)(arg2); \
971 _argvec[3] = (unsigned long)(arg3); \
972 _argvec[4] = (unsigned long)(arg4); \
973 _argvec[5] = (unsigned long)(arg5); \
974 _argvec[6] = (unsigned long)(arg6); \
975 _argvec[7] = (unsigned long)(arg7); \
976 _argvec[8] = (unsigned long)(arg8); \
978 "pushl 32(%%eax)\n\t" \
979 "pushl 28(%%eax)\n\t" \
980 "pushl 24(%%eax)\n\t" \
981 "pushl 20(%%eax)\n\t" \
982 "pushl 16(%%eax)\n\t" \
983 "pushl 12(%%eax)\n\t" \
984 "pushl 8(%%eax)\n\t" \
985 "pushl 4(%%eax)\n\t" \
986 "movl (%%eax), %%eax\n\t"
\
987 VALGRIND_CALL_NOREDIR_EAX \
988 "addl $32, %%esp\n" \
990 :
"a" (&_argvec[0]) \
991 :
"cc", "memory", __CALLER_SAVED_REGS \
993 lval = (__typeof__(lval)) _res; \
996 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
999 volatile OrigFn _orig = (orig); \
1000 volatile unsigned long _argvec[10]; \
1001 volatile unsigned long _res; \
1002 _argvec[0] = (unsigned long)_orig.nraddr; \
1003 _argvec[1] = (unsigned long)(arg1); \
1004 _argvec[2] = (unsigned long)(arg2); \
1005 _argvec[3] = (unsigned long)(arg3); \
1006 _argvec[4] = (unsigned long)(arg4); \
1007 _argvec[5] = (unsigned long)(arg5); \
1008 _argvec[6] = (unsigned long)(arg6); \
1009 _argvec[7] = (unsigned long)(arg7); \
1010 _argvec[8] = (unsigned long)(arg8); \
1011 _argvec[9] = (unsigned long)(arg9); \
1013 "subl $12, %%esp\n\t" \
1014 "pushl 36(%%eax)\n\t" \
1015 "pushl 32(%%eax)\n\t" \
1016 "pushl 28(%%eax)\n\t" \
1017 "pushl 24(%%eax)\n\t" \
1018 "pushl 20(%%eax)\n\t" \
1019 "pushl 16(%%eax)\n\t" \
1020 "pushl 12(%%eax)\n\t" \
1021 "pushl 8(%%eax)\n\t" \
1022 "pushl 4(%%eax)\n\t" \
1023 "movl (%%eax), %%eax\n\t"
\
1024 VALGRIND_CALL_NOREDIR_EAX \
1025 "addl $48, %%esp\n" \
1027 :
"a" (&_argvec[0]) \
1028 :
"cc", "memory", __CALLER_SAVED_REGS \
1030 lval = (__typeof__(lval)) _res; \
1033 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1034 arg7,arg8,arg9,arg10) \
1036 volatile OrigFn _orig = (orig); \
1037 volatile unsigned long _argvec[11]; \
1038 volatile unsigned long _res; \
1039 _argvec[0] = (unsigned long)_orig.nraddr; \
1040 _argvec[1] = (unsigned long)(arg1); \
1041 _argvec[2] = (unsigned long)(arg2); \
1042 _argvec[3] = (unsigned long)(arg3); \
1043 _argvec[4] = (unsigned long)(arg4); \
1044 _argvec[5] = (unsigned long)(arg5); \
1045 _argvec[6] = (unsigned long)(arg6); \
1046 _argvec[7] = (unsigned long)(arg7); \
1047 _argvec[8] = (unsigned long)(arg8); \
1048 _argvec[9] = (unsigned long)(arg9); \
1049 _argvec[10] = (unsigned long)(arg10); \
1051 "subl $8, %%esp\n\t" \
1052 "pushl 40(%%eax)\n\t" \
1053 "pushl 36(%%eax)\n\t" \
1054 "pushl 32(%%eax)\n\t" \
1055 "pushl 28(%%eax)\n\t" \
1056 "pushl 24(%%eax)\n\t" \
1057 "pushl 20(%%eax)\n\t" \
1058 "pushl 16(%%eax)\n\t" \
1059 "pushl 12(%%eax)\n\t" \
1060 "pushl 8(%%eax)\n\t" \
1061 "pushl 4(%%eax)\n\t" \
1062 "movl (%%eax), %%eax\n\t"
\
1063 VALGRIND_CALL_NOREDIR_EAX \
1064 "addl $48, %%esp\n" \
1066 :
"a" (&_argvec[0]) \
1067 :
"cc", "memory", __CALLER_SAVED_REGS \
1069 lval = (__typeof__(lval)) _res; \
1072 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
1073 arg6,arg7,arg8,arg9,arg10, \
1076 volatile OrigFn _orig = (orig); \
1077 volatile unsigned long _argvec[12]; \
1078 volatile unsigned long _res; \
1079 _argvec[0] = (unsigned long)_orig.nraddr; \
1080 _argvec[1] = (unsigned long)(arg1); \
1081 _argvec[2] = (unsigned long)(arg2); \
1082 _argvec[3] = (unsigned long)(arg3); \
1083 _argvec[4] = (unsigned long)(arg4); \
1084 _argvec[5] = (unsigned long)(arg5); \
1085 _argvec[6] = (unsigned long)(arg6); \
1086 _argvec[7] = (unsigned long)(arg7); \
1087 _argvec[8] = (unsigned long)(arg8); \
1088 _argvec[9] = (unsigned long)(arg9); \
1089 _argvec[10] = (unsigned long)(arg10); \
1090 _argvec[11] = (unsigned long)(arg11); \
1092 "subl $4, %%esp\n\t" \
1093 "pushl 44(%%eax)\n\t" \
1094 "pushl 40(%%eax)\n\t" \
1095 "pushl 36(%%eax)\n\t" \
1096 "pushl 32(%%eax)\n\t" \
1097 "pushl 28(%%eax)\n\t" \
1098 "pushl 24(%%eax)\n\t" \
1099 "pushl 20(%%eax)\n\t" \
1100 "pushl 16(%%eax)\n\t" \
1101 "pushl 12(%%eax)\n\t" \
1102 "pushl 8(%%eax)\n\t" \
1103 "pushl 4(%%eax)\n\t" \
1104 "movl (%%eax), %%eax\n\t"
\
1105 VALGRIND_CALL_NOREDIR_EAX \
1106 "addl $48, %%esp\n" \
1108 :
"a" (&_argvec[0]) \
1109 :
"cc", "memory", __CALLER_SAVED_REGS \
1111 lval = (__typeof__(lval)) _res; \
1114 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
1115 arg6,arg7,arg8,arg9,arg10, \
1118 volatile OrigFn _orig = (orig); \
1119 volatile unsigned long _argvec[13]; \
1120 volatile unsigned long _res; \
1121 _argvec[0] = (unsigned long)_orig.nraddr; \
1122 _argvec[1] = (unsigned long)(arg1); \
1123 _argvec[2] = (unsigned long)(arg2); \
1124 _argvec[3] = (unsigned long)(arg3); \
1125 _argvec[4] = (unsigned long)(arg4); \
1126 _argvec[5] = (unsigned long)(arg5); \
1127 _argvec[6] = (unsigned long)(arg6); \
1128 _argvec[7] = (unsigned long)(arg7); \
1129 _argvec[8] = (unsigned long)(arg8); \
1130 _argvec[9] = (unsigned long)(arg9); \
1131 _argvec[10] = (unsigned long)(arg10); \
1132 _argvec[11] = (unsigned long)(arg11); \
1133 _argvec[12] = (unsigned long)(arg12); \
1135 "pushl 48(%%eax)\n\t" \
1136 "pushl 44(%%eax)\n\t" \
1137 "pushl 40(%%eax)\n\t" \
1138 "pushl 36(%%eax)\n\t" \
1139 "pushl 32(%%eax)\n\t" \
1140 "pushl 28(%%eax)\n\t" \
1141 "pushl 24(%%eax)\n\t" \
1142 "pushl 20(%%eax)\n\t" \
1143 "pushl 16(%%eax)\n\t" \
1144 "pushl 12(%%eax)\n\t" \
1145 "pushl 8(%%eax)\n\t" \
1146 "pushl 4(%%eax)\n\t" \
1147 "movl (%%eax), %%eax\n\t"
\
1148 VALGRIND_CALL_NOREDIR_EAX \
1149 "addl $48, %%esp\n" \
1151 :
"a" (&_argvec[0]) \
1152 :
"cc", "memory", __CALLER_SAVED_REGS \
1154 lval = (__typeof__(lval)) _res; \
1161 #if defined(PLAT_amd64_linux) || defined(PLAT_amd64_darwin)
1166 #define __CALLER_SAVED_REGS "rcx", "rdx", "rsi", \
1167 "rdi", "r8", "r9", "r10", "r11"
1223 #if defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM)
1224 # define __FRAME_POINTER \
1225 ,"r"(__builtin_dwarf_cfa())
1226 # define VALGRIND_CFI_PROLOGUE \
1227 "movq %%rbp, %%r15\n\t" \
1228 "movq %2, %%rbp\n\t" \
1229 ".cfi_remember_state\n\t" \
1230 ".cfi_def_cfa rbp, 0\n\t"
1231 # define VALGRIND_CFI_EPILOGUE \
1232 "movq %%r15, %%rbp\n\t" \
1233 ".cfi_restore_state\n\t"
1235 # define __FRAME_POINTER
1236 # define VALGRIND_CFI_PROLOGUE
1237 # define VALGRIND_CFI_EPILOGUE
1265 #define CALL_FN_W_v(lval, orig) \
1267 volatile OrigFn _orig = (orig); \
1268 volatile unsigned long _argvec[1]; \
1269 volatile unsigned long _res; \
1270 _argvec[0] = (unsigned long)_orig.nraddr; \
1272 VALGRIND_CFI_PROLOGUE \
1273 "subq $128,%%rsp\n\t" \
1274 "movq (%%rax), %%rax\n\t"
\
1275 VALGRIND_CALL_NOREDIR_RAX \
1276 "addq $128,%%rsp\n\t" \
1277 VALGRIND_CFI_EPILOGUE \
1279 :
"a" (&_argvec[0]) __FRAME_POINTER \
1280 :
"cc", "memory", __CALLER_SAVED_REGS, "r15" \
1282 lval = (__typeof__(lval)) _res; \
1285 #define CALL_FN_W_W(lval, orig, arg1) \
1287 volatile OrigFn _orig = (orig); \
1288 volatile unsigned long _argvec[2]; \
1289 volatile unsigned long _res; \
1290 _argvec[0] = (unsigned long)_orig.nraddr; \
1291 _argvec[1] = (unsigned long)(arg1); \
1293 VALGRIND_CFI_PROLOGUE \
1294 "subq $128,%%rsp\n\t" \
1295 "movq 8(%%rax), %%rdi\n\t" \
1296 "movq (%%rax), %%rax\n\t"
\
1297 VALGRIND_CALL_NOREDIR_RAX \
1298 "addq $128,%%rsp\n\t" \
1299 VALGRIND_CFI_EPILOGUE \
1301 :
"a" (&_argvec[0]) __FRAME_POINTER \
1302 :
"cc", "memory", __CALLER_SAVED_REGS, "r15" \
1304 lval = (__typeof__(lval)) _res; \
1307 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
1309 volatile OrigFn _orig = (orig); \
1310 volatile unsigned long _argvec[3]; \
1311 volatile unsigned long _res; \
1312 _argvec[0] = (unsigned long)_orig.nraddr; \
1313 _argvec[1] = (unsigned long)(arg1); \
1314 _argvec[2] = (unsigned long)(arg2); \
1316 VALGRIND_CFI_PROLOGUE \
1317 "subq $128,%%rsp\n\t" \
1318 "movq 16(%%rax), %%rsi\n\t" \
1319 "movq 8(%%rax), %%rdi\n\t" \
1320 "movq (%%rax), %%rax\n\t"
\
1321 VALGRIND_CALL_NOREDIR_RAX \
1322 "addq $128,%%rsp\n\t" \
1323 VALGRIND_CFI_EPILOGUE \
1325 :
"a" (&_argvec[0]) __FRAME_POINTER \
1326 :
"cc", "memory", __CALLER_SAVED_REGS, "r15" \
1328 lval = (__typeof__(lval)) _res; \
1331 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
1333 volatile OrigFn _orig = (orig); \
1334 volatile unsigned long _argvec[4]; \
1335 volatile unsigned long _res; \
1336 _argvec[0] = (unsigned long)_orig.nraddr; \
1337 _argvec[1] = (unsigned long)(arg1); \
1338 _argvec[2] = (unsigned long)(arg2); \
1339 _argvec[3] = (unsigned long)(arg3); \
1341 VALGRIND_CFI_PROLOGUE \
1342 "subq $128,%%rsp\n\t" \
1343 "movq 24(%%rax), %%rdx\n\t" \
1344 "movq 16(%%rax), %%rsi\n\t" \
1345 "movq 8(%%rax), %%rdi\n\t" \
1346 "movq (%%rax), %%rax\n\t"
\
1347 VALGRIND_CALL_NOREDIR_RAX \
1348 "addq $128,%%rsp\n\t" \
1349 VALGRIND_CFI_EPILOGUE \
1351 :
"a" (&_argvec[0]) __FRAME_POINTER \
1352 :
"cc", "memory", __CALLER_SAVED_REGS, "r15" \
1354 lval = (__typeof__(lval)) _res; \
1357 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
1359 volatile OrigFn _orig = (orig); \
1360 volatile unsigned long _argvec[5]; \
1361 volatile unsigned long _res; \
1362 _argvec[0] = (unsigned long)_orig.nraddr; \
1363 _argvec[1] = (unsigned long)(arg1); \
1364 _argvec[2] = (unsigned long)(arg2); \
1365 _argvec[3] = (unsigned long)(arg3); \
1366 _argvec[4] = (unsigned long)(arg4); \
1368 VALGRIND_CFI_PROLOGUE \
1369 "subq $128,%%rsp\n\t" \
1370 "movq 32(%%rax), %%rcx\n\t" \
1371 "movq 24(%%rax), %%rdx\n\t" \
1372 "movq 16(%%rax), %%rsi\n\t" \
1373 "movq 8(%%rax), %%rdi\n\t" \
1374 "movq (%%rax), %%rax\n\t"
\
1375 VALGRIND_CALL_NOREDIR_RAX \
1376 "addq $128,%%rsp\n\t" \
1377 VALGRIND_CFI_EPILOGUE \
1379 :
"a" (&_argvec[0]) __FRAME_POINTER \
1380 :
"cc", "memory", __CALLER_SAVED_REGS, "r15" \
1382 lval = (__typeof__(lval)) _res; \
1385 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
1387 volatile OrigFn _orig = (orig); \
1388 volatile unsigned long _argvec[6]; \
1389 volatile unsigned long _res; \
1390 _argvec[0] = (unsigned long)_orig.nraddr; \
1391 _argvec[1] = (unsigned long)(arg1); \
1392 _argvec[2] = (unsigned long)(arg2); \
1393 _argvec[3] = (unsigned long)(arg3); \
1394 _argvec[4] = (unsigned long)(arg4); \
1395 _argvec[5] = (unsigned long)(arg5); \
1397 VALGRIND_CFI_PROLOGUE \
1398 "subq $128,%%rsp\n\t" \
1399 "movq 40(%%rax), %%r8\n\t" \
1400 "movq 32(%%rax), %%rcx\n\t" \
1401 "movq 24(%%rax), %%rdx\n\t" \
1402 "movq 16(%%rax), %%rsi\n\t" \
1403 "movq 8(%%rax), %%rdi\n\t" \
1404 "movq (%%rax), %%rax\n\t"
\
1405 VALGRIND_CALL_NOREDIR_RAX \
1406 "addq $128,%%rsp\n\t" \
1407 VALGRIND_CFI_EPILOGUE \
1409 :
"a" (&_argvec[0]) __FRAME_POINTER \
1410 :
"cc", "memory", __CALLER_SAVED_REGS, "r15" \
1412 lval = (__typeof__(lval)) _res; \
1415 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
1417 volatile OrigFn _orig = (orig); \
1418 volatile unsigned long _argvec[7]; \
1419 volatile unsigned long _res; \
1420 _argvec[0] = (unsigned long)_orig.nraddr; \
1421 _argvec[1] = (unsigned long)(arg1); \
1422 _argvec[2] = (unsigned long)(arg2); \
1423 _argvec[3] = (unsigned long)(arg3); \
1424 _argvec[4] = (unsigned long)(arg4); \
1425 _argvec[5] = (unsigned long)(arg5); \
1426 _argvec[6] = (unsigned long)(arg6); \
1428 VALGRIND_CFI_PROLOGUE \
1429 "subq $128,%%rsp\n\t" \
1430 "movq 48(%%rax), %%r9\n\t" \
1431 "movq 40(%%rax), %%r8\n\t" \
1432 "movq 32(%%rax), %%rcx\n\t" \
1433 "movq 24(%%rax), %%rdx\n\t" \
1434 "movq 16(%%rax), %%rsi\n\t" \
1435 "movq 8(%%rax), %%rdi\n\t" \
1436 "movq (%%rax), %%rax\n\t"
\
1437 VALGRIND_CALL_NOREDIR_RAX \
1438 "addq $128,%%rsp\n\t" \
1439 VALGRIND_CFI_EPILOGUE \
1441 :
"a" (&_argvec[0]) __FRAME_POINTER \
1442 :
"cc", "memory", __CALLER_SAVED_REGS, "r15" \
1444 lval = (__typeof__(lval)) _res; \
1447 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1450 volatile OrigFn _orig = (orig); \
1451 volatile unsigned long _argvec[8]; \
1452 volatile unsigned long _res; \
1453 _argvec[0] = (unsigned long)_orig.nraddr; \
1454 _argvec[1] = (unsigned long)(arg1); \
1455 _argvec[2] = (unsigned long)(arg2); \
1456 _argvec[3] = (unsigned long)(arg3); \
1457 _argvec[4] = (unsigned long)(arg4); \
1458 _argvec[5] = (unsigned long)(arg5); \
1459 _argvec[6] = (unsigned long)(arg6); \
1460 _argvec[7] = (unsigned long)(arg7); \
1462 VALGRIND_CFI_PROLOGUE \
1463 "subq $136,%%rsp\n\t" \
1464 "pushq 56(%%rax)\n\t" \
1465 "movq 48(%%rax), %%r9\n\t" \
1466 "movq 40(%%rax), %%r8\n\t" \
1467 "movq 32(%%rax), %%rcx\n\t" \
1468 "movq 24(%%rax), %%rdx\n\t" \
1469 "movq 16(%%rax), %%rsi\n\t" \
1470 "movq 8(%%rax), %%rdi\n\t" \
1471 "movq (%%rax), %%rax\n\t"
\
1472 VALGRIND_CALL_NOREDIR_RAX \
1473 "addq $8, %%rsp\n" \
1474 "addq $136,%%rsp\n\t" \
1475 VALGRIND_CFI_EPILOGUE \
1477 :
"a" (&_argvec[0]) __FRAME_POINTER \
1478 :
"cc", "memory", __CALLER_SAVED_REGS, "r15" \
1480 lval = (__typeof__(lval)) _res; \
1483 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1486 volatile OrigFn _orig = (orig); \
1487 volatile unsigned long _argvec[9]; \
1488 volatile unsigned long _res; \
1489 _argvec[0] = (unsigned long)_orig.nraddr; \
1490 _argvec[1] = (unsigned long)(arg1); \
1491 _argvec[2] = (unsigned long)(arg2); \
1492 _argvec[3] = (unsigned long)(arg3); \
1493 _argvec[4] = (unsigned long)(arg4); \
1494 _argvec[5] = (unsigned long)(arg5); \
1495 _argvec[6] = (unsigned long)(arg6); \
1496 _argvec[7] = (unsigned long)(arg7); \
1497 _argvec[8] = (unsigned long)(arg8); \
1499 VALGRIND_CFI_PROLOGUE \
1500 "subq $128,%%rsp\n\t" \
1501 "pushq 64(%%rax)\n\t" \
1502 "pushq 56(%%rax)\n\t" \
1503 "movq 48(%%rax), %%r9\n\t" \
1504 "movq 40(%%rax), %%r8\n\t" \
1505 "movq 32(%%rax), %%rcx\n\t" \
1506 "movq 24(%%rax), %%rdx\n\t" \
1507 "movq 16(%%rax), %%rsi\n\t" \
1508 "movq 8(%%rax), %%rdi\n\t" \
1509 "movq (%%rax), %%rax\n\t"
\
1510 VALGRIND_CALL_NOREDIR_RAX \
1511 "addq $16, %%rsp\n" \
1512 "addq $128,%%rsp\n\t" \
1513 VALGRIND_CFI_EPILOGUE \
1515 :
"a" (&_argvec[0]) __FRAME_POINTER \
1516 :
"cc", "memory", __CALLER_SAVED_REGS, "r15" \
1518 lval = (__typeof__(lval)) _res; \
1521 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1524 volatile OrigFn _orig = (orig); \
1525 volatile unsigned long _argvec[10]; \
1526 volatile unsigned long _res; \
1527 _argvec[0] = (unsigned long)_orig.nraddr; \
1528 _argvec[1] = (unsigned long)(arg1); \
1529 _argvec[2] = (unsigned long)(arg2); \
1530 _argvec[3] = (unsigned long)(arg3); \
1531 _argvec[4] = (unsigned long)(arg4); \
1532 _argvec[5] = (unsigned long)(arg5); \
1533 _argvec[6] = (unsigned long)(arg6); \
1534 _argvec[7] = (unsigned long)(arg7); \
1535 _argvec[8] = (unsigned long)(arg8); \
1536 _argvec[9] = (unsigned long)(arg9); \
1538 VALGRIND_CFI_PROLOGUE \
1539 "subq $136,%%rsp\n\t" \
1540 "pushq 72(%%rax)\n\t" \
1541 "pushq 64(%%rax)\n\t" \
1542 "pushq 56(%%rax)\n\t" \
1543 "movq 48(%%rax), %%r9\n\t" \
1544 "movq 40(%%rax), %%r8\n\t" \
1545 "movq 32(%%rax), %%rcx\n\t" \
1546 "movq 24(%%rax), %%rdx\n\t" \
1547 "movq 16(%%rax), %%rsi\n\t" \
1548 "movq 8(%%rax), %%rdi\n\t" \
1549 "movq (%%rax), %%rax\n\t"
\
1550 VALGRIND_CALL_NOREDIR_RAX \
1551 "addq $24, %%rsp\n" \
1552 "addq $136,%%rsp\n\t" \
1553 VALGRIND_CFI_EPILOGUE \
1555 :
"a" (&_argvec[0]) __FRAME_POINTER \
1556 :
"cc", "memory", __CALLER_SAVED_REGS, "r15" \
1558 lval = (__typeof__(lval)) _res; \
1561 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1562 arg7,arg8,arg9,arg10) \
1564 volatile OrigFn _orig = (orig); \
1565 volatile unsigned long _argvec[11]; \
1566 volatile unsigned long _res; \
1567 _argvec[0] = (unsigned long)_orig.nraddr; \
1568 _argvec[1] = (unsigned long)(arg1); \
1569 _argvec[2] = (unsigned long)(arg2); \
1570 _argvec[3] = (unsigned long)(arg3); \
1571 _argvec[4] = (unsigned long)(arg4); \
1572 _argvec[5] = (unsigned long)(arg5); \
1573 _argvec[6] = (unsigned long)(arg6); \
1574 _argvec[7] = (unsigned long)(arg7); \
1575 _argvec[8] = (unsigned long)(arg8); \
1576 _argvec[9] = (unsigned long)(arg9); \
1577 _argvec[10] = (unsigned long)(arg10); \
1579 VALGRIND_CFI_PROLOGUE \
1580 "subq $128,%%rsp\n\t" \
1581 "pushq 80(%%rax)\n\t" \
1582 "pushq 72(%%rax)\n\t" \
1583 "pushq 64(%%rax)\n\t" \
1584 "pushq 56(%%rax)\n\t" \
1585 "movq 48(%%rax), %%r9\n\t" \
1586 "movq 40(%%rax), %%r8\n\t" \
1587 "movq 32(%%rax), %%rcx\n\t" \
1588 "movq 24(%%rax), %%rdx\n\t" \
1589 "movq 16(%%rax), %%rsi\n\t" \
1590 "movq 8(%%rax), %%rdi\n\t" \
1591 "movq (%%rax), %%rax\n\t"
\
1592 VALGRIND_CALL_NOREDIR_RAX \
1593 "addq $32, %%rsp\n" \
1594 "addq $128,%%rsp\n\t" \
1595 VALGRIND_CFI_EPILOGUE \
1597 :
"a" (&_argvec[0]) __FRAME_POINTER \
1598 :
"cc", "memory", __CALLER_SAVED_REGS, "r15" \
1600 lval = (__typeof__(lval)) _res; \
1603 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1604 arg7,arg8,arg9,arg10,arg11) \
1606 volatile OrigFn _orig = (orig); \
1607 volatile unsigned long _argvec[12]; \
1608 volatile unsigned long _res; \
1609 _argvec[0] = (unsigned long)_orig.nraddr; \
1610 _argvec[1] = (unsigned long)(arg1); \
1611 _argvec[2] = (unsigned long)(arg2); \
1612 _argvec[3] = (unsigned long)(arg3); \
1613 _argvec[4] = (unsigned long)(arg4); \
1614 _argvec[5] = (unsigned long)(arg5); \
1615 _argvec[6] = (unsigned long)(arg6); \
1616 _argvec[7] = (unsigned long)(arg7); \
1617 _argvec[8] = (unsigned long)(arg8); \
1618 _argvec[9] = (unsigned long)(arg9); \
1619 _argvec[10] = (unsigned long)(arg10); \
1620 _argvec[11] = (unsigned long)(arg11); \
1622 VALGRIND_CFI_PROLOGUE \
1623 "subq $136,%%rsp\n\t" \
1624 "pushq 88(%%rax)\n\t" \
1625 "pushq 80(%%rax)\n\t" \
1626 "pushq 72(%%rax)\n\t" \
1627 "pushq 64(%%rax)\n\t" \
1628 "pushq 56(%%rax)\n\t" \
1629 "movq 48(%%rax), %%r9\n\t" \
1630 "movq 40(%%rax), %%r8\n\t" \
1631 "movq 32(%%rax), %%rcx\n\t" \
1632 "movq 24(%%rax), %%rdx\n\t" \
1633 "movq 16(%%rax), %%rsi\n\t" \
1634 "movq 8(%%rax), %%rdi\n\t" \
1635 "movq (%%rax), %%rax\n\t"
\
1636 VALGRIND_CALL_NOREDIR_RAX \
1637 "addq $40, %%rsp\n" \
1638 "addq $136,%%rsp\n\t" \
1639 VALGRIND_CFI_EPILOGUE \
1641 :
"a" (&_argvec[0]) __FRAME_POINTER \
1642 :
"cc", "memory", __CALLER_SAVED_REGS, "r15" \
1644 lval = (__typeof__(lval)) _res; \
1647 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1648 arg7,arg8,arg9,arg10,arg11,arg12) \
1650 volatile OrigFn _orig = (orig); \
1651 volatile unsigned long _argvec[13]; \
1652 volatile unsigned long _res; \
1653 _argvec[0] = (unsigned long)_orig.nraddr; \
1654 _argvec[1] = (unsigned long)(arg1); \
1655 _argvec[2] = (unsigned long)(arg2); \
1656 _argvec[3] = (unsigned long)(arg3); \
1657 _argvec[4] = (unsigned long)(arg4); \
1658 _argvec[5] = (unsigned long)(arg5); \
1659 _argvec[6] = (unsigned long)(arg6); \
1660 _argvec[7] = (unsigned long)(arg7); \
1661 _argvec[8] = (unsigned long)(arg8); \
1662 _argvec[9] = (unsigned long)(arg9); \
1663 _argvec[10] = (unsigned long)(arg10); \
1664 _argvec[11] = (unsigned long)(arg11); \
1665 _argvec[12] = (unsigned long)(arg12); \
1667 VALGRIND_CFI_PROLOGUE \
1668 "subq $128,%%rsp\n\t" \
1669 "pushq 96(%%rax)\n\t" \
1670 "pushq 88(%%rax)\n\t" \
1671 "pushq 80(%%rax)\n\t" \
1672 "pushq 72(%%rax)\n\t" \
1673 "pushq 64(%%rax)\n\t" \
1674 "pushq 56(%%rax)\n\t" \
1675 "movq 48(%%rax), %%r9\n\t" \
1676 "movq 40(%%rax), %%r8\n\t" \
1677 "movq 32(%%rax), %%rcx\n\t" \
1678 "movq 24(%%rax), %%rdx\n\t" \
1679 "movq 16(%%rax), %%rsi\n\t" \
1680 "movq 8(%%rax), %%rdi\n\t" \
1681 "movq (%%rax), %%rax\n\t"
\
1682 VALGRIND_CALL_NOREDIR_RAX \
1683 "addq $48, %%rsp\n" \
1684 "addq $128,%%rsp\n\t" \
1685 VALGRIND_CFI_EPILOGUE \
1687 :
"a" (&_argvec[0]) __FRAME_POINTER \
1688 :
"cc", "memory", __CALLER_SAVED_REGS, "r15" \
1690 lval = (__typeof__(lval)) _res; \
1697 #if defined(PLAT_ppc32_linux)
1723 #define __CALLER_SAVED_REGS \
1724 "lr", "ctr", "xer", \
1725 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \
1726 "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \
1732 #define CALL_FN_W_v(lval, orig) \
1734 volatile OrigFn _orig = (orig); \
1735 volatile unsigned long _argvec[1]; \
1736 volatile unsigned long _res; \
1737 _argvec[0] = (unsigned long)_orig.nraddr; \
1740 "lwz 11,0(11)\n\t"
\
1741 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1744 :
"r" (&_argvec[0]) \
1745 :
"cc", "memory", __CALLER_SAVED_REGS \
1747 lval = (__typeof__(lval)) _res; \
1750 #define CALL_FN_W_W(lval, orig, arg1) \
1752 volatile OrigFn _orig = (orig); \
1753 volatile unsigned long _argvec[2]; \
1754 volatile unsigned long _res; \
1755 _argvec[0] = (unsigned long)_orig.nraddr; \
1756 _argvec[1] = (unsigned long)arg1; \
1760 "lwz 11,0(11)\n\t" \
1761 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1764 :
"r" (&_argvec[0]) \
1765 :
"cc", "memory", __CALLER_SAVED_REGS \
1767 lval = (__typeof__(lval)) _res; \
1770 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
1772 volatile OrigFn _orig = (orig); \
1773 volatile unsigned long _argvec[3]; \
1774 volatile unsigned long _res; \
1775 _argvec[0] = (unsigned long)_orig.nraddr; \
1776 _argvec[1] = (unsigned long)arg1; \
1777 _argvec[2] = (unsigned long)arg2; \
1782 "lwz 11,0(11)\n\t"
\
1783 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1786 :
"r" (&_argvec[0]) \
1787 :
"cc", "memory", __CALLER_SAVED_REGS \
1789 lval = (__typeof__(lval)) _res; \
1792 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
1794 volatile OrigFn _orig = (orig); \
1795 volatile unsigned long _argvec[4]; \
1796 volatile unsigned long _res; \
1797 _argvec[0] = (unsigned long)_orig.nraddr; \
1798 _argvec[1] = (unsigned long)arg1; \
1799 _argvec[2] = (unsigned long)arg2; \
1800 _argvec[3] = (unsigned long)arg3; \
1805 "lwz 5,12(11)\n\t" \
1806 "lwz 11,0(11)\n\t"
\
1807 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1810 :
"r" (&_argvec[0]) \
1811 :
"cc", "memory", __CALLER_SAVED_REGS \
1813 lval = (__typeof__(lval)) _res; \
1816 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
1818 volatile OrigFn _orig = (orig); \
1819 volatile unsigned long _argvec[5]; \
1820 volatile unsigned long _res; \
1821 _argvec[0] = (unsigned long)_orig.nraddr; \
1822 _argvec[1] = (unsigned long)arg1; \
1823 _argvec[2] = (unsigned long)arg2; \
1824 _argvec[3] = (unsigned long)arg3; \
1825 _argvec[4] = (unsigned long)arg4; \
1830 "lwz 5,12(11)\n\t" \
1831 "lwz 6,16(11)\n\t"
\
1832 "lwz 11,0(11)\n\t" \
1833 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1836 :
"r" (&_argvec[0]) \
1837 :
"cc", "memory", __CALLER_SAVED_REGS \
1839 lval = (__typeof__(lval)) _res; \
1842 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
1844 volatile OrigFn _orig = (orig); \
1845 volatile unsigned long _argvec[6]; \
1846 volatile unsigned long _res; \
1847 _argvec[0] = (unsigned long)_orig.nraddr; \
1848 _argvec[1] = (unsigned long)arg1; \
1849 _argvec[2] = (unsigned long)arg2; \
1850 _argvec[3] = (unsigned long)arg3; \
1851 _argvec[4] = (unsigned long)arg4; \
1852 _argvec[5] = (unsigned long)arg5; \
1857 "lwz 5,12(11)\n\t" \
1858 "lwz 6,16(11)\n\t"
\
1859 "lwz 7,20(11)\n\t" \
1860 "lwz 11,0(11)\n\t"
\
1861 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1864 :
"r" (&_argvec[0]) \
1865 :
"cc", "memory", __CALLER_SAVED_REGS \
1867 lval = (__typeof__(lval)) _res; \
1870 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
1872 volatile OrigFn _orig = (orig); \
1873 volatile unsigned long _argvec[7]; \
1874 volatile unsigned long _res; \
1875 _argvec[0] = (unsigned long)_orig.nraddr; \
1876 _argvec[1] = (unsigned long)arg1; \
1877 _argvec[2] = (unsigned long)arg2; \
1878 _argvec[3] = (unsigned long)arg3; \
1879 _argvec[4] = (unsigned long)arg4; \
1880 _argvec[5] = (unsigned long)arg5; \
1881 _argvec[6] = (unsigned long)arg6; \
1886 "lwz 5,12(11)\n\t" \
1887 "lwz 6,16(11)\n\t"
\
1888 "lwz 7,20(11)\n\t" \
1889 "lwz 8,24(11)\n\t" \
1890 "lwz 11,0(11)\n\t"
\
1891 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1894 :
"r" (&_argvec[0]) \
1895 :
"cc", "memory", __CALLER_SAVED_REGS \
1897 lval = (__typeof__(lval)) _res; \
1900 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1903 volatile OrigFn _orig = (orig); \
1904 volatile unsigned long _argvec[8]; \
1905 volatile unsigned long _res; \
1906 _argvec[0] = (unsigned long)_orig.nraddr; \
1907 _argvec[1] = (unsigned long)arg1; \
1908 _argvec[2] = (unsigned long)arg2; \
1909 _argvec[3] = (unsigned long)arg3; \
1910 _argvec[4] = (unsigned long)arg4; \
1911 _argvec[5] = (unsigned long)arg5; \
1912 _argvec[6] = (unsigned long)arg6; \
1913 _argvec[7] = (unsigned long)arg7; \
1918 "lwz 5,12(11)\n\t" \
1919 "lwz 6,16(11)\n\t"
\
1920 "lwz 7,20(11)\n\t" \
1921 "lwz 8,24(11)\n\t" \
1922 "lwz 9,28(11)\n\t" \
1923 "lwz 11,0(11)\n\t"
\
1924 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1927 :
"r" (&_argvec[0]) \
1928 :
"cc", "memory", __CALLER_SAVED_REGS \
1930 lval = (__typeof__(lval)) _res; \
1933 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1936 volatile OrigFn _orig = (orig); \
1937 volatile unsigned long _argvec[9]; \
1938 volatile unsigned long _res; \
1939 _argvec[0] = (unsigned long)_orig.nraddr; \
1940 _argvec[1] = (unsigned long)arg1; \
1941 _argvec[2] = (unsigned long)arg2; \
1942 _argvec[3] = (unsigned long)arg3; \
1943 _argvec[4] = (unsigned long)arg4; \
1944 _argvec[5] = (unsigned long)arg5; \
1945 _argvec[6] = (unsigned long)arg6; \
1946 _argvec[7] = (unsigned long)arg7; \
1947 _argvec[8] = (unsigned long)arg8; \
1952 "lwz 5,12(11)\n\t" \
1953 "lwz 6,16(11)\n\t"
\
1954 "lwz 7,20(11)\n\t" \
1955 "lwz 8,24(11)\n\t" \
1956 "lwz 9,28(11)\n\t" \
1957 "lwz 10,32(11)\n\t"
\
1958 "lwz 11,0(11)\n\t" \
1959 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1962 :
"r" (&_argvec[0]) \
1963 :
"cc", "memory", __CALLER_SAVED_REGS \
1965 lval = (__typeof__(lval)) _res; \
1968 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1971 volatile OrigFn _orig = (orig); \
1972 volatile unsigned long _argvec[10]; \
1973 volatile unsigned long _res; \
1974 _argvec[0] = (unsigned long)_orig.nraddr; \
1975 _argvec[1] = (unsigned long)arg1; \
1976 _argvec[2] = (unsigned long)arg2; \
1977 _argvec[3] = (unsigned long)arg3; \
1978 _argvec[4] = (unsigned long)arg4; \
1979 _argvec[5] = (unsigned long)arg5; \
1980 _argvec[6] = (unsigned long)arg6; \
1981 _argvec[7] = (unsigned long)arg7; \
1982 _argvec[8] = (unsigned long)arg8; \
1983 _argvec[9] = (unsigned long)arg9; \
1986 "addi 1,1,-16\n\t" \
1988 "lwz 3,36(11)\n\t" \
1993 "lwz 5,12(11)\n\t" \
1994 "lwz 6,16(11)\n\t"
\
1995 "lwz 7,20(11)\n\t" \
1996 "lwz 8,24(11)\n\t" \
1997 "lwz 9,28(11)\n\t" \
1998 "lwz 10,32(11)\n\t"
\
1999 "lwz 11,0(11)\n\t" \
2000 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2004 :
"r" (&_argvec[0]) \
2005 :
"cc", "memory", __CALLER_SAVED_REGS \
2007 lval = (__typeof__(lval)) _res; \
2010 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2011 arg7,arg8,arg9,arg10) \
2013 volatile OrigFn _orig = (orig); \
2014 volatile unsigned long _argvec[11]; \
2015 volatile unsigned long _res; \
2016 _argvec[0] = (unsigned long)_orig.nraddr; \
2017 _argvec[1] = (unsigned long)arg1; \
2018 _argvec[2] = (unsigned long)arg2; \
2019 _argvec[3] = (unsigned long)arg3; \
2020 _argvec[4] = (unsigned long)arg4; \
2021 _argvec[5] = (unsigned long)arg5; \
2022 _argvec[6] = (unsigned long)arg6; \
2023 _argvec[7] = (unsigned long)arg7; \
2024 _argvec[8] = (unsigned long)arg8; \
2025 _argvec[9] = (unsigned long)arg9; \
2026 _argvec[10] = (unsigned long)arg10; \
2029 "addi 1,1,-16\n\t" \
2031 "lwz 3,40(11)\n\t" \
2034 "lwz 3,36(11)\n\t" \
2039 "lwz 5,12(11)\n\t" \
2040 "lwz 6,16(11)\n\t"
\
2041 "lwz 7,20(11)\n\t" \
2042 "lwz 8,24(11)\n\t" \
2043 "lwz 9,28(11)\n\t" \
2044 "lwz 10,32(11)\n\t"
\
2045 "lwz 11,0(11)\n\t" \
2046 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2050 :
"r" (&_argvec[0]) \
2051 :
"cc", "memory", __CALLER_SAVED_REGS \
2053 lval = (__typeof__(lval)) _res; \
2056 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2057 arg7,arg8,arg9,arg10,arg11) \
2059 volatile OrigFn _orig = (orig); \
2060 volatile unsigned long _argvec[12]; \
2061 volatile unsigned long _res; \
2062 _argvec[0] = (unsigned long)_orig.nraddr; \
2063 _argvec[1] = (unsigned long)arg1; \
2064 _argvec[2] = (unsigned long)arg2; \
2065 _argvec[3] = (unsigned long)arg3; \
2066 _argvec[4] = (unsigned long)arg4; \
2067 _argvec[5] = (unsigned long)arg5; \
2068 _argvec[6] = (unsigned long)arg6; \
2069 _argvec[7] = (unsigned long)arg7; \
2070 _argvec[8] = (unsigned long)arg8; \
2071 _argvec[9] = (unsigned long)arg9; \
2072 _argvec[10] = (unsigned long)arg10; \
2073 _argvec[11] = (unsigned long)arg11; \
2076 "addi 1,1,-32\n\t" \
2078 "lwz 3,44(11)\n\t" \
2081 "lwz 3,40(11)\n\t" \
2084 "lwz 3,36(11)\n\t" \
2089 "lwz 5,12(11)\n\t" \
2090 "lwz 6,16(11)\n\t"
\
2091 "lwz 7,20(11)\n\t" \
2092 "lwz 8,24(11)\n\t" \
2093 "lwz 9,28(11)\n\t" \
2094 "lwz 10,32(11)\n\t"
\
2095 "lwz 11,0(11)\n\t" \
2096 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2100 :
"r" (&_argvec[0]) \
2101 :
"cc", "memory", __CALLER_SAVED_REGS \
2103 lval = (__typeof__(lval)) _res; \
2106 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2107 arg7,arg8,arg9,arg10,arg11,arg12) \
2109 volatile OrigFn _orig = (orig); \
2110 volatile unsigned long _argvec[13]; \
2111 volatile unsigned long _res; \
2112 _argvec[0] = (unsigned long)_orig.nraddr; \
2113 _argvec[1] = (unsigned long)arg1; \
2114 _argvec[2] = (unsigned long)arg2; \
2115 _argvec[3] = (unsigned long)arg3; \
2116 _argvec[4] = (unsigned long)arg4; \
2117 _argvec[5] = (unsigned long)arg5; \
2118 _argvec[6] = (unsigned long)arg6; \
2119 _argvec[7] = (unsigned long)arg7; \
2120 _argvec[8] = (unsigned long)arg8; \
2121 _argvec[9] = (unsigned long)arg9; \
2122 _argvec[10] = (unsigned long)arg10; \
2123 _argvec[11] = (unsigned long)arg11; \
2124 _argvec[12] = (unsigned long)arg12; \
2127 "addi 1,1,-32\n\t" \
2129 "lwz 3,48(11)\n\t" \
2132 "lwz 3,44(11)\n\t" \
2135 "lwz 3,40(11)\n\t" \
2138 "lwz 3,36(11)\n\t" \
2143 "lwz 5,12(11)\n\t" \
2144 "lwz 6,16(11)\n\t"
\
2145 "lwz 7,20(11)\n\t" \
2146 "lwz 8,24(11)\n\t" \
2147 "lwz 9,28(11)\n\t" \
2148 "lwz 10,32(11)\n\t"
\
2149 "lwz 11,0(11)\n\t" \
2150 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2154 :
"r" (&_argvec[0]) \
2155 :
"cc", "memory", __CALLER_SAVED_REGS \
2157 lval = (__typeof__(lval)) _res; \
2164 #if defined(PLAT_ppc64_linux)
2169 #define __CALLER_SAVED_REGS \
2170 "lr", "ctr", "xer", \
2171 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \
2172 "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \
2178 #define CALL_FN_W_v(lval, orig) \
2180 volatile OrigFn _orig = (orig); \
2181 volatile unsigned long _argvec[3+0]; \
2182 volatile unsigned long _res; \
2184 _argvec[1] = (unsigned long)_orig.r2; \
2185 _argvec[2] = (unsigned long)_orig.nraddr; \
2188 "std 2,-16(11)\n\t"
\
2190 "ld 11, 0(11)\n\t" \
2191 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2196 :
"r" (&_argvec[2]) \
2197 :
"cc", "memory", __CALLER_SAVED_REGS \
2199 lval = (__typeof__(lval)) _res; \
2202 #define CALL_FN_W_W(lval, orig, arg1) \
2204 volatile OrigFn _orig = (orig); \
2205 volatile unsigned long _argvec[3+1]; \
2206 volatile unsigned long _res; \
2208 _argvec[1] = (unsigned long)_orig.r2; \
2209 _argvec[2] = (unsigned long)_orig.nraddr; \
2210 _argvec[2+1] = (unsigned long)arg1; \
2213 "std 2,-16(11)\n\t"
\
2216 "ld 11, 0(11)\n\t" \
2217 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2222 :
"r" (&_argvec[2]) \
2223 :
"cc", "memory", __CALLER_SAVED_REGS \
2225 lval = (__typeof__(lval)) _res; \
2228 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
2230 volatile OrigFn _orig = (orig); \
2231 volatile unsigned long _argvec[3+2]; \
2232 volatile unsigned long _res; \
2234 _argvec[1] = (unsigned long)_orig.r2; \
2235 _argvec[2] = (unsigned long)_orig.nraddr; \
2236 _argvec[2+1] = (unsigned long)arg1; \
2237 _argvec[2+2] = (unsigned long)arg2; \
2240 "std 2,-16(11)\n\t"
\
2243 "ld 4, 16(11)\n\t" \
2244 "ld 11, 0(11)\n\t" \
2245 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2250 :
"r" (&_argvec[2]) \
2251 :
"cc", "memory", __CALLER_SAVED_REGS \
2253 lval = (__typeof__(lval)) _res; \
2256 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
2258 volatile OrigFn _orig = (orig); \
2259 volatile unsigned long _argvec[3+3]; \
2260 volatile unsigned long _res; \
2262 _argvec[1] = (unsigned long)_orig.r2; \
2263 _argvec[2] = (unsigned long)_orig.nraddr; \
2264 _argvec[2+1] = (unsigned long)arg1; \
2265 _argvec[2+2] = (unsigned long)arg2; \
2266 _argvec[2+3] = (unsigned long)arg3; \
2269 "std 2,-16(11)\n\t"
\
2272 "ld 4, 16(11)\n\t" \
2273 "ld 5, 24(11)\n\t" \
2274 "ld 11, 0(11)\n\t" \
2275 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2280 :
"r" (&_argvec[2]) \
2281 :
"cc", "memory", __CALLER_SAVED_REGS \
2283 lval = (__typeof__(lval)) _res; \
2286 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
2288 volatile OrigFn _orig = (orig); \
2289 volatile unsigned long _argvec[3+4]; \
2290 volatile unsigned long _res; \
2292 _argvec[1] = (unsigned long)_orig.r2; \
2293 _argvec[2] = (unsigned long)_orig.nraddr; \
2294 _argvec[2+1] = (unsigned long)arg1; \
2295 _argvec[2+2] = (unsigned long)arg2; \
2296 _argvec[2+3] = (unsigned long)arg3; \
2297 _argvec[2+4] = (unsigned long)arg4; \
2300 "std 2,-16(11)\n\t"
\
2303 "ld 4, 16(11)\n\t" \
2304 "ld 5, 24(11)\n\t" \
2305 "ld 6, 32(11)\n\t" \
2306 "ld 11, 0(11)\n\t" \
2307 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2312 :
"r" (&_argvec[2]) \
2313 :
"cc", "memory", __CALLER_SAVED_REGS \
2315 lval = (__typeof__(lval)) _res; \
2318 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
2320 volatile OrigFn _orig = (orig); \
2321 volatile unsigned long _argvec[3+5]; \
2322 volatile unsigned long _res; \
2324 _argvec[1] = (unsigned long)_orig.r2; \
2325 _argvec[2] = (unsigned long)_orig.nraddr; \
2326 _argvec[2+1] = (unsigned long)arg1; \
2327 _argvec[2+2] = (unsigned long)arg2; \
2328 _argvec[2+3] = (unsigned long)arg3; \
2329 _argvec[2+4] = (unsigned long)arg4; \
2330 _argvec[2+5] = (unsigned long)arg5; \
2333 "std 2,-16(11)\n\t"
\
2336 "ld 4, 16(11)\n\t" \
2337 "ld 5, 24(11)\n\t" \
2338 "ld 6, 32(11)\n\t" \
2339 "ld 7, 40(11)\n\t" \
2340 "ld 11, 0(11)\n\t" \
2341 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2346 :
"r" (&_argvec[2]) \
2347 :
"cc", "memory", __CALLER_SAVED_REGS \
2349 lval = (__typeof__(lval)) _res; \
2352 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
2354 volatile OrigFn _orig = (orig); \
2355 volatile unsigned long _argvec[3+6]; \
2356 volatile unsigned long _res; \
2358 _argvec[1] = (unsigned long)_orig.r2; \
2359 _argvec[2] = (unsigned long)_orig.nraddr; \
2360 _argvec[2+1] = (unsigned long)arg1; \
2361 _argvec[2+2] = (unsigned long)arg2; \
2362 _argvec[2+3] = (unsigned long)arg3; \
2363 _argvec[2+4] = (unsigned long)arg4; \
2364 _argvec[2+5] = (unsigned long)arg5; \
2365 _argvec[2+6] = (unsigned long)arg6; \
2368 "std 2,-16(11)\n\t"
\
2371 "ld 4, 16(11)\n\t" \
2372 "ld 5, 24(11)\n\t" \
2373 "ld 6, 32(11)\n\t" \
2374 "ld 7, 40(11)\n\t" \
2375 "ld 8, 48(11)\n\t" \
2376 "ld 11, 0(11)\n\t" \
2377 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2382 :
"r" (&_argvec[2]) \
2383 :
"cc", "memory", __CALLER_SAVED_REGS \
2385 lval = (__typeof__(lval)) _res; \
2388 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2391 volatile OrigFn _orig = (orig); \
2392 volatile unsigned long _argvec[3+7]; \
2393 volatile unsigned long _res; \
2395 _argvec[1] = (unsigned long)_orig.r2; \
2396 _argvec[2] = (unsigned long)_orig.nraddr; \
2397 _argvec[2+1] = (unsigned long)arg1; \
2398 _argvec[2+2] = (unsigned long)arg2; \
2399 _argvec[2+3] = (unsigned long)arg3; \
2400 _argvec[2+4] = (unsigned long)arg4; \
2401 _argvec[2+5] = (unsigned long)arg5; \
2402 _argvec[2+6] = (unsigned long)arg6; \
2403 _argvec[2+7] = (unsigned long)arg7; \
2406 "std 2,-16(11)\n\t"
\
2409 "ld 4, 16(11)\n\t" \
2410 "ld 5, 24(11)\n\t" \
2411 "ld 6, 32(11)\n\t" \
2412 "ld 7, 40(11)\n\t" \
2413 "ld 8, 48(11)\n\t" \
2414 "ld 9, 56(11)\n\t" \
2415 "ld 11, 0(11)\n\t" \
2416 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2421 :
"r" (&_argvec[2]) \
2422 :
"cc", "memory", __CALLER_SAVED_REGS \
2424 lval = (__typeof__(lval)) _res; \
2427 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2430 volatile OrigFn _orig = (orig); \
2431 volatile unsigned long _argvec[3+8]; \
2432 volatile unsigned long _res; \
2434 _argvec[1] = (unsigned long)_orig.r2; \
2435 _argvec[2] = (unsigned long)_orig.nraddr; \
2436 _argvec[2+1] = (unsigned long)arg1; \
2437 _argvec[2+2] = (unsigned long)arg2; \
2438 _argvec[2+3] = (unsigned long)arg3; \
2439 _argvec[2+4] = (unsigned long)arg4; \
2440 _argvec[2+5] = (unsigned long)arg5; \
2441 _argvec[2+6] = (unsigned long)arg6; \
2442 _argvec[2+7] = (unsigned long)arg7; \
2443 _argvec[2+8] = (unsigned long)arg8; \
2446 "std 2,-16(11)\n\t"
\
2449 "ld 4, 16(11)\n\t" \
2450 "ld 5, 24(11)\n\t" \
2451 "ld 6, 32(11)\n\t" \
2452 "ld 7, 40(11)\n\t" \
2453 "ld 8, 48(11)\n\t" \
2454 "ld 9, 56(11)\n\t" \
2455 "ld 10, 64(11)\n\t" \
2456 "ld 11, 0(11)\n\t" \
2457 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2462 :
"r" (&_argvec[2]) \
2463 :
"cc", "memory", __CALLER_SAVED_REGS \
2465 lval = (__typeof__(lval)) _res; \
2468 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2471 volatile OrigFn _orig = (orig); \
2472 volatile unsigned long _argvec[3+9]; \
2473 volatile unsigned long _res; \
2475 _argvec[1] = (unsigned long)_orig.r2; \
2476 _argvec[2] = (unsigned long)_orig.nraddr; \
2477 _argvec[2+1] = (unsigned long)arg1; \
2478 _argvec[2+2] = (unsigned long)arg2; \
2479 _argvec[2+3] = (unsigned long)arg3; \
2480 _argvec[2+4] = (unsigned long)arg4; \
2481 _argvec[2+5] = (unsigned long)arg5; \
2482 _argvec[2+6] = (unsigned long)arg6; \
2483 _argvec[2+7] = (unsigned long)arg7; \
2484 _argvec[2+8] = (unsigned long)arg8; \
2485 _argvec[2+9] = (unsigned long)arg9; \
2488 "std 2,-16(11)\n\t"
\
2490 "addi 1,1,-128\n\t" \
2493 "std 3,112(1)\n\t" \
2496 "ld 4, 16(11)\n\t" \
2497 "ld 5, 24(11)\n\t" \
2498 "ld 6, 32(11)\n\t" \
2499 "ld 7, 40(11)\n\t" \
2500 "ld 8, 48(11)\n\t" \
2501 "ld 9, 56(11)\n\t" \
2502 "ld 10, 64(11)\n\t" \
2503 "ld 11, 0(11)\n\t" \
2504 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2507 "ld 2,-16(11)\n\t"
\
2510 :
"r" (&_argvec[2]) \
2511 :
"cc", "memory", __CALLER_SAVED_REGS \
2513 lval = (__typeof__(lval)) _res; \
2516 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2517 arg7,arg8,arg9,arg10) \
2519 volatile OrigFn _orig = (orig); \
2520 volatile unsigned long _argvec[3+10]; \
2521 volatile unsigned long _res; \
2523 _argvec[1] = (unsigned long)_orig.r2; \
2524 _argvec[2] = (unsigned long)_orig.nraddr; \
2525 _argvec[2+1] = (unsigned long)arg1; \
2526 _argvec[2+2] = (unsigned long)arg2; \
2527 _argvec[2+3] = (unsigned long)arg3; \
2528 _argvec[2+4] = (unsigned long)arg4; \
2529 _argvec[2+5] = (unsigned long)arg5; \
2530 _argvec[2+6] = (unsigned long)arg6; \
2531 _argvec[2+7] = (unsigned long)arg7; \
2532 _argvec[2+8] = (unsigned long)arg8; \
2533 _argvec[2+9] = (unsigned long)arg9; \
2534 _argvec[2+10] = (unsigned long)arg10; \
2537 "std 2,-16(11)\n\t"
\
2539 "addi 1,1,-128\n\t" \
2542 "std 3,120(1)\n\t" \
2545 "std 3,112(1)\n\t" \
2548 "ld 4, 16(11)\n\t" \
2549 "ld 5, 24(11)\n\t" \
2550 "ld 6, 32(11)\n\t" \
2551 "ld 7, 40(11)\n\t" \
2552 "ld 8, 48(11)\n\t" \
2553 "ld 9, 56(11)\n\t" \
2554 "ld 10, 64(11)\n\t" \
2555 "ld 11, 0(11)\n\t" \
2556 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2559 "ld 2,-16(11)\n\t"
\
2562 :
"r" (&_argvec[2]) \
2563 :
"cc", "memory", __CALLER_SAVED_REGS \
2565 lval = (__typeof__(lval)) _res; \
2568 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2569 arg7,arg8,arg9,arg10,arg11) \
2571 volatile OrigFn _orig = (orig); \
2572 volatile unsigned long _argvec[3+11]; \
2573 volatile unsigned long _res; \
2575 _argvec[1] = (unsigned long)_orig.r2; \
2576 _argvec[2] = (unsigned long)_orig.nraddr; \
2577 _argvec[2+1] = (unsigned long)arg1; \
2578 _argvec[2+2] = (unsigned long)arg2; \
2579 _argvec[2+3] = (unsigned long)arg3; \
2580 _argvec[2+4] = (unsigned long)arg4; \
2581 _argvec[2+5] = (unsigned long)arg5; \
2582 _argvec[2+6] = (unsigned long)arg6; \
2583 _argvec[2+7] = (unsigned long)arg7; \
2584 _argvec[2+8] = (unsigned long)arg8; \
2585 _argvec[2+9] = (unsigned long)arg9; \
2586 _argvec[2+10] = (unsigned long)arg10; \
2587 _argvec[2+11] = (unsigned long)arg11; \
2590 "std 2,-16(11)\n\t"
\
2592 "addi 1,1,-144\n\t" \
2595 "std 3,128(1)\n\t" \
2598 "std 3,120(1)\n\t" \
2601 "std 3,112(1)\n\t" \
2604 "ld 4, 16(11)\n\t" \
2605 "ld 5, 24(11)\n\t" \
2606 "ld 6, 32(11)\n\t" \
2607 "ld 7, 40(11)\n\t" \
2608 "ld 8, 48(11)\n\t" \
2609 "ld 9, 56(11)\n\t" \
2610 "ld 10, 64(11)\n\t" \
2611 "ld 11, 0(11)\n\t" \
2612 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2615 "ld 2,-16(11)\n\t"
\
2618 :
"r" (&_argvec[2]) \
2619 :
"cc", "memory", __CALLER_SAVED_REGS \
2621 lval = (__typeof__(lval)) _res; \
2624 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2625 arg7,arg8,arg9,arg10,arg11,arg12) \
2627 volatile OrigFn _orig = (orig); \
2628 volatile unsigned long _argvec[3+12]; \
2629 volatile unsigned long _res; \
2631 _argvec[1] = (unsigned long)_orig.r2; \
2632 _argvec[2] = (unsigned long)_orig.nraddr; \
2633 _argvec[2+1] = (unsigned long)arg1; \
2634 _argvec[2+2] = (unsigned long)arg2; \
2635 _argvec[2+3] = (unsigned long)arg3; \
2636 _argvec[2+4] = (unsigned long)arg4; \
2637 _argvec[2+5] = (unsigned long)arg5; \
2638 _argvec[2+6] = (unsigned long)arg6; \
2639 _argvec[2+7] = (unsigned long)arg7; \
2640 _argvec[2+8] = (unsigned long)arg8; \
2641 _argvec[2+9] = (unsigned long)arg9; \
2642 _argvec[2+10] = (unsigned long)arg10; \
2643 _argvec[2+11] = (unsigned long)arg11; \
2644 _argvec[2+12] = (unsigned long)arg12; \
2647 "std 2,-16(11)\n\t"
\
2649 "addi 1,1,-144\n\t" \
2652 "std 3,136(1)\n\t" \
2655 "std 3,128(1)\n\t" \
2658 "std 3,120(1)\n\t" \
2661 "std 3,112(1)\n\t" \
2664 "ld 4, 16(11)\n\t" \
2665 "ld 5, 24(11)\n\t" \
2666 "ld 6, 32(11)\n\t" \
2667 "ld 7, 40(11)\n\t" \
2668 "ld 8, 48(11)\n\t" \
2669 "ld 9, 56(11)\n\t" \
2670 "ld 10, 64(11)\n\t" \
2671 "ld 11, 0(11)\n\t" \
2672 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2675 "ld 2,-16(11)\n\t"
\
2678 :
"r" (&_argvec[2]) \
2679 :
"cc", "memory", __CALLER_SAVED_REGS \
2681 lval = (__typeof__(lval)) _res; \
2688 #if defined(PLAT_arm_linux)
2691 #define __CALLER_SAVED_REGS "r0", "r1", "r2", "r3","r4","r14"
2696 #define CALL_FN_W_v(lval, orig) \
2698 volatile OrigFn _orig = (orig); \
2699 volatile unsigned long _argvec[1]; \
2700 volatile unsigned long _res; \
2701 _argvec[0] = (unsigned long)_orig.nraddr; \
2703 "ldr r4, [%1] \n\t" \
2704 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
2707 :
"0" (&_argvec[0]) \
2708 :
"cc", "memory", __CALLER_SAVED_REGS \
2710 lval = (__typeof__(lval)) _res; \
2713 #define CALL_FN_W_W(lval, orig, arg1) \
2715 volatile OrigFn _orig = (orig); \
2716 volatile unsigned long _argvec[2]; \
2717 volatile unsigned long _res; \
2718 _argvec[0] = (unsigned long)_orig.nraddr; \
2719 _argvec[1] = (unsigned long)(arg1); \
2721 "ldr r0, [%1, #4] \n\t" \
2722 "ldr r4, [%1] \n\t"
\
2723 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
2726 :
"0" (&_argvec[0]) \
2727 :
"cc", "memory", __CALLER_SAVED_REGS \
2729 lval = (__typeof__(lval)) _res; \
2732 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
2734 volatile OrigFn _orig = (orig); \
2735 volatile unsigned long _argvec[3]; \
2736 volatile unsigned long _res; \
2737 _argvec[0] = (unsigned long)_orig.nraddr; \
2738 _argvec[1] = (unsigned long)(arg1); \
2739 _argvec[2] = (unsigned long)(arg2); \
2741 "ldr r0, [%1, #4] \n\t" \
2742 "ldr r1, [%1, #8] \n\t" \
2743 "ldr r4, [%1] \n\t"
\
2744 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
2747 :
"0" (&_argvec[0]) \
2748 :
"cc", "memory", __CALLER_SAVED_REGS \
2750 lval = (__typeof__(lval)) _res; \
2753 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
2755 volatile OrigFn _orig = (orig); \
2756 volatile unsigned long _argvec[4]; \
2757 volatile unsigned long _res; \
2758 _argvec[0] = (unsigned long)_orig.nraddr; \
2759 _argvec[1] = (unsigned long)(arg1); \
2760 _argvec[2] = (unsigned long)(arg2); \
2761 _argvec[3] = (unsigned long)(arg3); \
2763 "ldr r0, [%1, #4] \n\t" \
2764 "ldr r1, [%1, #8] \n\t" \
2765 "ldr r2, [%1, #12] \n\t" \
2766 "ldr r4, [%1] \n\t"
\
2767 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
2770 :
"0" (&_argvec[0]) \
2771 :
"cc", "memory", __CALLER_SAVED_REGS \
2773 lval = (__typeof__(lval)) _res; \
2776 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
2778 volatile OrigFn _orig = (orig); \
2779 volatile unsigned long _argvec[5]; \
2780 volatile unsigned long _res; \
2781 _argvec[0] = (unsigned long)_orig.nraddr; \
2782 _argvec[1] = (unsigned long)(arg1); \
2783 _argvec[2] = (unsigned long)(arg2); \
2784 _argvec[3] = (unsigned long)(arg3); \
2785 _argvec[4] = (unsigned long)(arg4); \
2787 "ldr r0, [%1, #4] \n\t" \
2788 "ldr r1, [%1, #8] \n\t" \
2789 "ldr r2, [%1, #12] \n\t" \
2790 "ldr r3, [%1, #16] \n\t" \
2791 "ldr r4, [%1] \n\t"
\
2792 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
2795 :
"0" (&_argvec[0]) \
2796 :
"cc", "memory", __CALLER_SAVED_REGS \
2798 lval = (__typeof__(lval)) _res; \
2801 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
2803 volatile OrigFn _orig = (orig); \
2804 volatile unsigned long _argvec[6]; \
2805 volatile unsigned long _res; \
2806 _argvec[0] = (unsigned long)_orig.nraddr; \
2807 _argvec[1] = (unsigned long)(arg1); \
2808 _argvec[2] = (unsigned long)(arg2); \
2809 _argvec[3] = (unsigned long)(arg3); \
2810 _argvec[4] = (unsigned long)(arg4); \
2811 _argvec[5] = (unsigned long)(arg5); \
2813 "ldr r0, [%1, #20] \n\t" \
2815 "ldr r0, [%1, #4] \n\t" \
2816 "ldr r1, [%1, #8] \n\t" \
2817 "ldr r2, [%1, #12] \n\t" \
2818 "ldr r3, [%1, #16] \n\t" \
2819 "ldr r4, [%1] \n\t"
\
2820 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
2821 "add sp, sp, #4 \n\t" \
2824 :
"0" (&_argvec[0]) \
2825 :
"cc", "memory", __CALLER_SAVED_REGS \
2827 lval = (__typeof__(lval)) _res; \
2830 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
2832 volatile OrigFn _orig = (orig); \
2833 volatile unsigned long _argvec[7]; \
2834 volatile unsigned long _res; \
2835 _argvec[0] = (unsigned long)_orig.nraddr; \
2836 _argvec[1] = (unsigned long)(arg1); \
2837 _argvec[2] = (unsigned long)(arg2); \
2838 _argvec[3] = (unsigned long)(arg3); \
2839 _argvec[4] = (unsigned long)(arg4); \
2840 _argvec[5] = (unsigned long)(arg5); \
2841 _argvec[6] = (unsigned long)(arg6); \
2843 "ldr r0, [%1, #20] \n\t" \
2844 "ldr r1, [%1, #24] \n\t" \
2845 "push {r0, r1} \n\t" \
2846 "ldr r0, [%1, #4] \n\t" \
2847 "ldr r1, [%1, #8] \n\t" \
2848 "ldr r2, [%1, #12] \n\t" \
2849 "ldr r3, [%1, #16] \n\t" \
2850 "ldr r4, [%1] \n\t"
\
2851 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
2852 "add sp, sp, #8 \n\t" \
2855 :
"0" (&_argvec[0]) \
2856 :
"cc", "memory", __CALLER_SAVED_REGS \
2858 lval = (__typeof__(lval)) _res; \
2861 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2864 volatile OrigFn _orig = (orig); \
2865 volatile unsigned long _argvec[8]; \
2866 volatile unsigned long _res; \
2867 _argvec[0] = (unsigned long)_orig.nraddr; \
2868 _argvec[1] = (unsigned long)(arg1); \
2869 _argvec[2] = (unsigned long)(arg2); \
2870 _argvec[3] = (unsigned long)(arg3); \
2871 _argvec[4] = (unsigned long)(arg4); \
2872 _argvec[5] = (unsigned long)(arg5); \
2873 _argvec[6] = (unsigned long)(arg6); \
2874 _argvec[7] = (unsigned long)(arg7); \
2876 "ldr r0, [%1, #20] \n\t" \
2877 "ldr r1, [%1, #24] \n\t" \
2878 "ldr r2, [%1, #28] \n\t" \
2879 "push {r0, r1, r2} \n\t" \
2880 "ldr r0, [%1, #4] \n\t" \
2881 "ldr r1, [%1, #8] \n\t" \
2882 "ldr r2, [%1, #12] \n\t" \
2883 "ldr r3, [%1, #16] \n\t" \
2884 "ldr r4, [%1] \n\t"
\
2885 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
2886 "add sp, sp, #12 \n\t" \
2889 :
"0" (&_argvec[0]) \
2890 :
"cc", "memory", __CALLER_SAVED_REGS \
2892 lval = (__typeof__(lval)) _res; \
2895 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2898 volatile OrigFn _orig = (orig); \
2899 volatile unsigned long _argvec[9]; \
2900 volatile unsigned long _res; \
2901 _argvec[0] = (unsigned long)_orig.nraddr; \
2902 _argvec[1] = (unsigned long)(arg1); \
2903 _argvec[2] = (unsigned long)(arg2); \
2904 _argvec[3] = (unsigned long)(arg3); \
2905 _argvec[4] = (unsigned long)(arg4); \
2906 _argvec[5] = (unsigned long)(arg5); \
2907 _argvec[6] = (unsigned long)(arg6); \
2908 _argvec[7] = (unsigned long)(arg7); \
2909 _argvec[8] = (unsigned long)(arg8); \
2911 "ldr r0, [%1, #20] \n\t" \
2912 "ldr r1, [%1, #24] \n\t" \
2913 "ldr r2, [%1, #28] \n\t" \
2914 "ldr r3, [%1, #32] \n\t" \
2915 "push {r0, r1, r2, r3} \n\t" \
2916 "ldr r0, [%1, #4] \n\t" \
2917 "ldr r1, [%1, #8] \n\t" \
2918 "ldr r2, [%1, #12] \n\t" \
2919 "ldr r3, [%1, #16] \n\t" \
2920 "ldr r4, [%1] \n\t"
\
2921 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
2922 "add sp, sp, #16 \n\t" \
2925 :
"0" (&_argvec[0]) \
2926 :
"cc", "memory", __CALLER_SAVED_REGS \
2928 lval = (__typeof__(lval)) _res; \
2931 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2934 volatile OrigFn _orig = (orig); \
2935 volatile unsigned long _argvec[10]; \
2936 volatile unsigned long _res; \
2937 _argvec[0] = (unsigned long)_orig.nraddr; \
2938 _argvec[1] = (unsigned long)(arg1); \
2939 _argvec[2] = (unsigned long)(arg2); \
2940 _argvec[3] = (unsigned long)(arg3); \
2941 _argvec[4] = (unsigned long)(arg4); \
2942 _argvec[5] = (unsigned long)(arg5); \
2943 _argvec[6] = (unsigned long)(arg6); \
2944 _argvec[7] = (unsigned long)(arg7); \
2945 _argvec[8] = (unsigned long)(arg8); \
2946 _argvec[9] = (unsigned long)(arg9); \
2948 "ldr r0, [%1, #20] \n\t" \
2949 "ldr r1, [%1, #24] \n\t" \
2950 "ldr r2, [%1, #28] \n\t" \
2951 "ldr r3, [%1, #32] \n\t" \
2952 "ldr r4, [%1, #36] \n\t" \
2953 "push {r0, r1, r2, r3, r4} \n\t" \
2954 "ldr r0, [%1, #4] \n\t" \
2955 "ldr r1, [%1, #8] \n\t" \
2956 "ldr r2, [%1, #12] \n\t" \
2957 "ldr r3, [%1, #16] \n\t" \
2958 "ldr r4, [%1] \n\t"
\
2959 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
2960 "add sp, sp, #20 \n\t" \
2963 :
"0" (&_argvec[0]) \
2964 :
"cc", "memory", __CALLER_SAVED_REGS \
2966 lval = (__typeof__(lval)) _res; \
2969 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2970 arg7,arg8,arg9,arg10) \
2972 volatile OrigFn _orig = (orig); \
2973 volatile unsigned long _argvec[11]; \
2974 volatile unsigned long _res; \
2975 _argvec[0] = (unsigned long)_orig.nraddr; \
2976 _argvec[1] = (unsigned long)(arg1); \
2977 _argvec[2] = (unsigned long)(arg2); \
2978 _argvec[3] = (unsigned long)(arg3); \
2979 _argvec[4] = (unsigned long)(arg4); \
2980 _argvec[5] = (unsigned long)(arg5); \
2981 _argvec[6] = (unsigned long)(arg6); \
2982 _argvec[7] = (unsigned long)(arg7); \
2983 _argvec[8] = (unsigned long)(arg8); \
2984 _argvec[9] = (unsigned long)(arg9); \
2985 _argvec[10] = (unsigned long)(arg10); \
2987 "ldr r0, [%1, #40] \n\t" \
2989 "ldr r0, [%1, #20] \n\t" \
2990 "ldr r1, [%1, #24] \n\t" \
2991 "ldr r2, [%1, #28] \n\t" \
2992 "ldr r3, [%1, #32] \n\t" \
2993 "ldr r4, [%1, #36] \n\t" \
2994 "push {r0, r1, r2, r3, r4} \n\t" \
2995 "ldr r0, [%1, #4] \n\t" \
2996 "ldr r1, [%1, #8] \n\t" \
2997 "ldr r2, [%1, #12] \n\t" \
2998 "ldr r3, [%1, #16] \n\t" \
2999 "ldr r4, [%1] \n\t"
\
3000 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
3001 "add sp, sp, #24 \n\t" \
3004 :
"0" (&_argvec[0]) \
3005 :
"cc", "memory", __CALLER_SAVED_REGS \
3007 lval = (__typeof__(lval)) _res; \
3010 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
3011 arg6,arg7,arg8,arg9,arg10, \
3014 volatile OrigFn _orig = (orig); \
3015 volatile unsigned long _argvec[12]; \
3016 volatile unsigned long _res; \
3017 _argvec[0] = (unsigned long)_orig.nraddr; \
3018 _argvec[1] = (unsigned long)(arg1); \
3019 _argvec[2] = (unsigned long)(arg2); \
3020 _argvec[3] = (unsigned long)(arg3); \
3021 _argvec[4] = (unsigned long)(arg4); \
3022 _argvec[5] = (unsigned long)(arg5); \
3023 _argvec[6] = (unsigned long)(arg6); \
3024 _argvec[7] = (unsigned long)(arg7); \
3025 _argvec[8] = (unsigned long)(arg8); \
3026 _argvec[9] = (unsigned long)(arg9); \
3027 _argvec[10] = (unsigned long)(arg10); \
3028 _argvec[11] = (unsigned long)(arg11); \
3030 "ldr r0, [%1, #40] \n\t" \
3031 "ldr r1, [%1, #44] \n\t" \
3032 "push {r0, r1} \n\t" \
3033 "ldr r0, [%1, #20] \n\t" \
3034 "ldr r1, [%1, #24] \n\t" \
3035 "ldr r2, [%1, #28] \n\t" \
3036 "ldr r3, [%1, #32] \n\t" \
3037 "ldr r4, [%1, #36] \n\t" \
3038 "push {r0, r1, r2, r3, r4} \n\t" \
3039 "ldr r0, [%1, #4] \n\t" \
3040 "ldr r1, [%1, #8] \n\t" \
3041 "ldr r2, [%1, #12] \n\t" \
3042 "ldr r3, [%1, #16] \n\t" \
3043 "ldr r4, [%1] \n\t"
\
3044 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
3045 "add sp, sp, #28 \n\t" \
3048 :
"0" (&_argvec[0]) \
3049 :
"cc", "memory",__CALLER_SAVED_REGS \
3051 lval = (__typeof__(lval)) _res; \
3054 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
3055 arg6,arg7,arg8,arg9,arg10, \
3058 volatile OrigFn _orig = (orig); \
3059 volatile unsigned long _argvec[13]; \
3060 volatile unsigned long _res; \
3061 _argvec[0] = (unsigned long)_orig.nraddr; \
3062 _argvec[1] = (unsigned long)(arg1); \
3063 _argvec[2] = (unsigned long)(arg2); \
3064 _argvec[3] = (unsigned long)(arg3); \
3065 _argvec[4] = (unsigned long)(arg4); \
3066 _argvec[5] = (unsigned long)(arg5); \
3067 _argvec[6] = (unsigned long)(arg6); \
3068 _argvec[7] = (unsigned long)(arg7); \
3069 _argvec[8] = (unsigned long)(arg8); \
3070 _argvec[9] = (unsigned long)(arg9); \
3071 _argvec[10] = (unsigned long)(arg10); \
3072 _argvec[11] = (unsigned long)(arg11); \
3073 _argvec[12] = (unsigned long)(arg12); \
3075 "ldr r0, [%1, #40] \n\t" \
3076 "ldr r1, [%1, #44] \n\t" \
3077 "ldr r2, [%1, #48] \n\t" \
3078 "push {r0, r1, r2} \n\t" \
3079 "ldr r0, [%1, #20] \n\t" \
3080 "ldr r1, [%1, #24] \n\t" \
3081 "ldr r2, [%1, #28] \n\t" \
3082 "ldr r3, [%1, #32] \n\t" \
3083 "ldr r4, [%1, #36] \n\t" \
3084 "push {r0, r1, r2, r3, r4} \n\t" \
3085 "ldr r0, [%1, #4] \n\t" \
3086 "ldr r1, [%1, #8] \n\t" \
3087 "ldr r2, [%1, #12] \n\t" \
3088 "ldr r3, [%1, #16] \n\t" \
3089 "ldr r4, [%1] \n\t"
\
3090 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
3091 "add sp, sp, #32 \n\t" \
3094 :
"0" (&_argvec[0]) \
3095 :
"cc", "memory", __CALLER_SAVED_REGS \
3097 lval = (__typeof__(lval)) _res; \
3104 #if defined(PLAT_s390x_linux)
3110 #if defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM)
3111 # define __FRAME_POINTER \
3112 ,"d"(__builtin_dwarf_cfa())
3113 # define VALGRIND_CFI_PROLOGUE \
3114 ".cfi_remember_state\n\t" \
3118 ".cfi_def_cfa r11, 0\n\t"
3119 # define VALGRIND_CFI_EPILOGUE \
3121 ".cfi_restore_state\n\t"
3123 # define __FRAME_POINTER
3124 # define VALGRIND_CFI_PROLOGUE \
3126 # define VALGRIND_CFI_EPILOGUE
3136 #define __CALLER_SAVED_REGS "0","1","2","3","4","5","14", \
3137 "f0","f1","f2","f3","f4","f5","f6","f7"
3140 #define CALL_FN_W_v(lval, orig) \
3142 volatile OrigFn _orig = (orig); \
3143 volatile unsigned long _argvec[1]; \
3144 volatile unsigned long _res; \
3145 _argvec[0] = (unsigned long)_orig.nraddr; \
3147 VALGRIND_CFI_PROLOGUE \
3148 "aghi 15,-160\n\t" \
3150 VALGRIND_CALL_NOREDIR_R1 \
3153 VALGRIND_CFI_EPILOGUE \
3155 :
"d" (&_argvec[0]) __FRAME_POINTER \
3156 :
"cc", "memory", __CALLER_SAVED_REGS,"7" \
3158 lval = (__typeof__(lval)) _res; \
3162 #define CALL_FN_W_W(lval, orig, arg1) \
3164 volatile OrigFn _orig = (orig); \
3165 volatile unsigned long _argvec[2]; \
3166 volatile unsigned long _res; \
3167 _argvec[0] = (unsigned long)_orig.nraddr; \
3168 _argvec[1] = (unsigned long)arg1; \
3170 VALGRIND_CFI_PROLOGUE \
3171 "aghi 15,-160\n\t" \
3174 VALGRIND_CALL_NOREDIR_R1 \
3177 VALGRIND_CFI_EPILOGUE \
3179 :
"a" (&_argvec[0]) __FRAME_POINTER \
3180 :
"cc", "memory", __CALLER_SAVED_REGS,"7" \
3182 lval = (__typeof__(lval)) _res; \
3185 #define CALL_FN_W_WW(lval, orig, arg1, arg2) \
3187 volatile OrigFn _orig = (orig); \
3188 volatile unsigned long _argvec[3]; \
3189 volatile unsigned long _res; \
3190 _argvec[0] = (unsigned long)_orig.nraddr; \
3191 _argvec[1] = (unsigned long)arg1; \
3192 _argvec[2] = (unsigned long)arg2; \
3194 VALGRIND_CFI_PROLOGUE \
3195 "aghi 15,-160\n\t" \
3199 VALGRIND_CALL_NOREDIR_R1 \
3202 VALGRIND_CFI_EPILOGUE \
3204 :
"a" (&_argvec[0]) __FRAME_POINTER \
3205 :
"cc", "memory", __CALLER_SAVED_REGS,"7" \
3207 lval = (__typeof__(lval)) _res; \
3210 #define CALL_FN_W_WWW(lval, orig, arg1, arg2, arg3) \
3212 volatile OrigFn _orig = (orig); \
3213 volatile unsigned long _argvec[4]; \
3214 volatile unsigned long _res; \
3215 _argvec[0] = (unsigned long)_orig.nraddr; \
3216 _argvec[1] = (unsigned long)arg1; \
3217 _argvec[2] = (unsigned long)arg2; \
3218 _argvec[3] = (unsigned long)arg3; \
3220 VALGRIND_CFI_PROLOGUE \
3221 "aghi 15,-160\n\t" \
3226 VALGRIND_CALL_NOREDIR_R1 \
3229 VALGRIND_CFI_EPILOGUE \
3231 :
"a" (&_argvec[0]) __FRAME_POINTER \
3232 :
"cc", "memory", __CALLER_SAVED_REGS,"7" \
3234 lval = (__typeof__(lval)) _res; \
3237 #define CALL_FN_W_WWWW(lval, orig, arg1, arg2, arg3, arg4) \
3239 volatile OrigFn _orig = (orig); \
3240 volatile unsigned long _argvec[5]; \
3241 volatile unsigned long _res; \
3242 _argvec[0] = (unsigned long)_orig.nraddr; \
3243 _argvec[1] = (unsigned long)arg1; \
3244 _argvec[2] = (unsigned long)arg2; \
3245 _argvec[3] = (unsigned long)arg3; \
3246 _argvec[4] = (unsigned long)arg4; \
3248 VALGRIND_CFI_PROLOGUE \
3249 "aghi 15,-160\n\t" \
3255 VALGRIND_CALL_NOREDIR_R1 \
3258 VALGRIND_CFI_EPILOGUE \
3260 :
"a" (&_argvec[0]) __FRAME_POINTER \
3261 :
"cc", "memory", __CALLER_SAVED_REGS,"7" \
3263 lval = (__typeof__(lval)) _res; \
3266 #define CALL_FN_W_5W(lval, orig, arg1, arg2, arg3, arg4, arg5) \
3268 volatile OrigFn _orig = (orig); \
3269 volatile unsigned long _argvec[6]; \
3270 volatile unsigned long _res; \
3271 _argvec[0] = (unsigned long)_orig.nraddr; \
3272 _argvec[1] = (unsigned long)arg1; \
3273 _argvec[2] = (unsigned long)arg2; \
3274 _argvec[3] = (unsigned long)arg3; \
3275 _argvec[4] = (unsigned long)arg4; \
3276 _argvec[5] = (unsigned long)arg5; \
3278 VALGRIND_CFI_PROLOGUE \
3279 "aghi 15,-160\n\t" \
3286 VALGRIND_CALL_NOREDIR_R1 \
3289 VALGRIND_CFI_EPILOGUE \
3291 :
"a" (&_argvec[0]) __FRAME_POINTER \
3292 :
"cc", "memory", __CALLER_SAVED_REGS,"6","7" \
3294 lval = (__typeof__(lval)) _res; \
3297 #define CALL_FN_W_6W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
3300 volatile OrigFn _orig = (orig); \
3301 volatile unsigned long _argvec[7]; \
3302 volatile unsigned long _res; \
3303 _argvec[0] = (unsigned long)_orig.nraddr; \
3304 _argvec[1] = (unsigned long)arg1; \
3305 _argvec[2] = (unsigned long)arg2; \
3306 _argvec[3] = (unsigned long)arg3; \
3307 _argvec[4] = (unsigned long)arg4; \
3308 _argvec[5] = (unsigned long)arg5; \
3309 _argvec[6] = (unsigned long)arg6; \
3311 VALGRIND_CFI_PROLOGUE \
3312 "aghi 15,-168\n\t" \
3318 "mvc 160(8,15), 48(1)\n\t" \
3320 VALGRIND_CALL_NOREDIR_R1 \
3323 VALGRIND_CFI_EPILOGUE \
3325 :
"a" (&_argvec[0]) __FRAME_POINTER \
3326 :
"cc", "memory", __CALLER_SAVED_REGS,"6","7" \
3328 lval = (__typeof__(lval)) _res; \
3331 #define CALL_FN_W_7W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
3334 volatile OrigFn _orig = (orig); \
3335 volatile unsigned long _argvec[8]; \
3336 volatile unsigned long _res; \
3337 _argvec[0] = (unsigned long)_orig.nraddr; \
3338 _argvec[1] = (unsigned long)arg1; \
3339 _argvec[2] = (unsigned long)arg2; \
3340 _argvec[3] = (unsigned long)arg3; \
3341 _argvec[4] = (unsigned long)arg4; \
3342 _argvec[5] = (unsigned long)arg5; \
3343 _argvec[6] = (unsigned long)arg6; \
3344 _argvec[7] = (unsigned long)arg7; \
3346 VALGRIND_CFI_PROLOGUE \
3347 "aghi 15,-176\n\t" \
3353 "mvc 160(8,15), 48(1)\n\t" \
3354 "mvc 168(8,15), 56(1)\n\t" \
3356 VALGRIND_CALL_NOREDIR_R1 \
3359 VALGRIND_CFI_EPILOGUE \
3361 :
"a" (&_argvec[0]) __FRAME_POINTER \
3362 :
"cc", "memory", __CALLER_SAVED_REGS,"6","7" \
3364 lval = (__typeof__(lval)) _res; \
3367 #define CALL_FN_W_8W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
3370 volatile OrigFn _orig = (orig); \
3371 volatile unsigned long _argvec[9]; \
3372 volatile unsigned long _res; \
3373 _argvec[0] = (unsigned long)_orig.nraddr; \
3374 _argvec[1] = (unsigned long)arg1; \
3375 _argvec[2] = (unsigned long)arg2; \
3376 _argvec[3] = (unsigned long)arg3; \
3377 _argvec[4] = (unsigned long)arg4; \
3378 _argvec[5] = (unsigned long)arg5; \
3379 _argvec[6] = (unsigned long)arg6; \
3380 _argvec[7] = (unsigned long)arg7; \
3381 _argvec[8] = (unsigned long)arg8; \
3383 VALGRIND_CFI_PROLOGUE \
3384 "aghi 15,-184\n\t" \
3390 "mvc 160(8,15), 48(1)\n\t" \
3391 "mvc 168(8,15), 56(1)\n\t" \
3392 "mvc 176(8,15), 64(1)\n\t" \
3394 VALGRIND_CALL_NOREDIR_R1 \
3397 VALGRIND_CFI_EPILOGUE \
3399 :
"a" (&_argvec[0]) __FRAME_POINTER \
3400 :
"cc", "memory", __CALLER_SAVED_REGS,"6","7" \
3402 lval = (__typeof__(lval)) _res; \
3405 #define CALL_FN_W_9W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
3406 arg6, arg7 ,arg8, arg9) \
3408 volatile OrigFn _orig = (orig); \
3409 volatile unsigned long _argvec[10]; \
3410 volatile unsigned long _res; \
3411 _argvec[0] = (unsigned long)_orig.nraddr; \
3412 _argvec[1] = (unsigned long)arg1; \
3413 _argvec[2] = (unsigned long)arg2; \
3414 _argvec[3] = (unsigned long)arg3; \
3415 _argvec[4] = (unsigned long)arg4; \
3416 _argvec[5] = (unsigned long)arg5; \
3417 _argvec[6] = (unsigned long)arg6; \
3418 _argvec[7] = (unsigned long)arg7; \
3419 _argvec[8] = (unsigned long)arg8; \
3420 _argvec[9] = (unsigned long)arg9; \
3422 VALGRIND_CFI_PROLOGUE \
3423 "aghi 15,-192\n\t" \
3429 "mvc 160(8,15), 48(1)\n\t" \
3430 "mvc 168(8,15), 56(1)\n\t" \
3431 "mvc 176(8,15), 64(1)\n\t" \
3432 "mvc 184(8,15), 72(1)\n\t" \
3434 VALGRIND_CALL_NOREDIR_R1 \
3437 VALGRIND_CFI_EPILOGUE \
3439 :
"a" (&_argvec[0]) __FRAME_POINTER \
3440 :
"cc", "memory", __CALLER_SAVED_REGS,"6","7" \
3442 lval = (__typeof__(lval)) _res; \
3445 #define CALL_FN_W_10W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
3446 arg6, arg7 ,arg8, arg9, arg10) \
3448 volatile OrigFn _orig = (orig); \
3449 volatile unsigned long _argvec[11]; \
3450 volatile unsigned long _res; \
3451 _argvec[0] = (unsigned long)_orig.nraddr; \
3452 _argvec[1] = (unsigned long)arg1; \
3453 _argvec[2] = (unsigned long)arg2; \
3454 _argvec[3] = (unsigned long)arg3; \
3455 _argvec[4] = (unsigned long)arg4; \
3456 _argvec[5] = (unsigned long)arg5; \
3457 _argvec[6] = (unsigned long)arg6; \
3458 _argvec[7] = (unsigned long)arg7; \
3459 _argvec[8] = (unsigned long)arg8; \
3460 _argvec[9] = (unsigned long)arg9; \
3461 _argvec[10] = (unsigned long)arg10; \
3463 VALGRIND_CFI_PROLOGUE \
3464 "aghi 15,-200\n\t" \
3470 "mvc 160(8,15), 48(1)\n\t" \
3471 "mvc 168(8,15), 56(1)\n\t" \
3472 "mvc 176(8,15), 64(1)\n\t" \
3473 "mvc 184(8,15), 72(1)\n\t" \
3474 "mvc 192(8,15), 80(1)\n\t" \
3476 VALGRIND_CALL_NOREDIR_R1 \
3479 VALGRIND_CFI_EPILOGUE \
3481 :
"a" (&_argvec[0]) __FRAME_POINTER \
3482 :
"cc", "memory", __CALLER_SAVED_REGS,"6","7" \
3484 lval = (__typeof__(lval)) _res; \
3487 #define CALL_FN_W_11W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
3488 arg6, arg7 ,arg8, arg9, arg10, arg11) \
3490 volatile OrigFn _orig = (orig); \
3491 volatile unsigned long _argvec[12]; \
3492 volatile unsigned long _res; \
3493 _argvec[0] = (unsigned long)_orig.nraddr; \
3494 _argvec[1] = (unsigned long)arg1; \
3495 _argvec[2] = (unsigned long)arg2; \
3496 _argvec[3] = (unsigned long)arg3; \
3497 _argvec[4] = (unsigned long)arg4; \
3498 _argvec[5] = (unsigned long)arg5; \
3499 _argvec[6] = (unsigned long)arg6; \
3500 _argvec[7] = (unsigned long)arg7; \
3501 _argvec[8] = (unsigned long)arg8; \
3502 _argvec[9] = (unsigned long)arg9; \
3503 _argvec[10] = (unsigned long)arg10; \
3504 _argvec[11] = (unsigned long)arg11; \
3506 VALGRIND_CFI_PROLOGUE \
3507 "aghi 15,-208\n\t" \
3513 "mvc 160(8,15), 48(1)\n\t" \
3514 "mvc 168(8,15), 56(1)\n\t" \
3515 "mvc 176(8,15), 64(1)\n\t" \
3516 "mvc 184(8,15), 72(1)\n\t" \
3517 "mvc 192(8,15), 80(1)\n\t" \
3518 "mvc 200(8,15), 88(1)\n\t" \
3520 VALGRIND_CALL_NOREDIR_R1 \
3523 VALGRIND_CFI_EPILOGUE \
3525 :
"a" (&_argvec[0]) __FRAME_POINTER \
3526 :
"cc", "memory", __CALLER_SAVED_REGS,"6","7" \
3528 lval = (__typeof__(lval)) _res; \
3531 #define CALL_FN_W_12W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
3532 arg6, arg7 ,arg8, arg9, arg10, arg11, arg12)\
3534 volatile OrigFn _orig = (orig); \
3535 volatile unsigned long _argvec[13]; \
3536 volatile unsigned long _res; \
3537 _argvec[0] = (unsigned long)_orig.nraddr; \
3538 _argvec[1] = (unsigned long)arg1; \
3539 _argvec[2] = (unsigned long)arg2; \
3540 _argvec[3] = (unsigned long)arg3; \
3541 _argvec[4] = (unsigned long)arg4; \
3542 _argvec[5] = (unsigned long)arg5; \
3543 _argvec[6] = (unsigned long)arg6; \
3544 _argvec[7] = (unsigned long)arg7; \
3545 _argvec[8] = (unsigned long)arg8; \
3546 _argvec[9] = (unsigned long)arg9; \
3547 _argvec[10] = (unsigned long)arg10; \
3548 _argvec[11] = (unsigned long)arg11; \
3549 _argvec[12] = (unsigned long)arg12; \
3551 VALGRIND_CFI_PROLOGUE \
3552 "aghi 15,-216\n\t" \
3558 "mvc 160(8,15), 48(1)\n\t" \
3559 "mvc 168(8,15), 56(1)\n\t" \
3560 "mvc 176(8,15), 64(1)\n\t" \
3561 "mvc 184(8,15), 72(1)\n\t" \
3562 "mvc 192(8,15), 80(1)\n\t" \
3563 "mvc 200(8,15), 88(1)\n\t" \
3564 "mvc 208(8,15), 96(1)\n\t" \
3566 VALGRIND_CALL_NOREDIR_R1 \
3569 VALGRIND_CFI_EPILOGUE \
3571 :
"a" (&_argvec[0]) __FRAME_POINTER \
3572 :
"cc", "memory", __CALLER_SAVED_REGS,"6","7" \
3574 lval = (__typeof__(lval)) _res; \
3596 #define VG_USERREQ_TOOL_BASE(a,b) \
3597 ((unsigned int)(((a)&0xff) << 24 | ((b)&0xff) << 16))
3598 #define VG_IS_TOOL_USERREQ(a, b, v) \
3599 (VG_USERREQ_TOOL_BASE(a,b) == ((v) & 0xffff0000))
3675 #if !defined(__GNUC__)
3676 # define __extension__
3684 #define RUNNING_ON_VALGRIND \
3685 (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0 , \
3686 VG_USERREQ__RUNNING_ON_VALGRIND, \
3694 #define VALGRIND_DISCARD_TRANSLATIONS(_qzz_addr,_qzz_len) \
3695 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DISCARD_TRANSLATIONS, \
3696 _qzz_addr, _qzz_len, 0, 0, 0)
3704 #if defined(__GNUC__) || defined(__INTEL_COMPILER)
3708 __attribute__((format(__printf__, 1, 2), __unused__));
3711 #if defined(_MSC_VER)
3716 #if defined(NVALGRIND)
3719 #if defined(_MSC_VER)
3722 unsigned long _qzz_res;
3725 va_start(vargs, format);
3726 #if defined(_MSC_VER)
3735 (
unsigned long)format,
3736 (
unsigned long)&vargs,
3740 return (
int)_qzz_res;
3744 #if defined(__GNUC__) || defined(__INTEL_COMPILER)
3746 __attribute__((format(__printf__, 1, 2), __unused__));
3749 #if defined(_MSC_VER)
3754 #if defined(NVALGRIND)
3757 #if defined(_MSC_VER)
3760 unsigned long _qzz_res;
3763 va_start(vargs, format);
3764 #if defined(_MSC_VER)
3773 (
unsigned long)format,
3774 (
unsigned long)&vargs,
3778 return (
int)_qzz_res;
3806 #define VALGRIND_NON_SIMD_CALL0(_qyy_fn) \
3807 VALGRIND_DO_CLIENT_REQUEST_EXPR(0 , \
3808 VG_USERREQ__CLIENT_CALL0, \
3812 #define VALGRIND_NON_SIMD_CALL1(_qyy_fn, _qyy_arg1) \
3813 VALGRIND_DO_CLIENT_REQUEST_EXPR(0 , \
3814 VG_USERREQ__CLIENT_CALL1, \
3818 #define VALGRIND_NON_SIMD_CALL2(_qyy_fn, _qyy_arg1, _qyy_arg2) \
3819 VALGRIND_DO_CLIENT_REQUEST_EXPR(0 , \
3820 VG_USERREQ__CLIENT_CALL2, \
3822 _qyy_arg1, _qyy_arg2, 0, 0)
3824 #define VALGRIND_NON_SIMD_CALL3(_qyy_fn, _qyy_arg1, _qyy_arg2, _qyy_arg3) \
3825 VALGRIND_DO_CLIENT_REQUEST_EXPR(0 , \
3826 VG_USERREQ__CLIENT_CALL3, \
3828 _qyy_arg1, _qyy_arg2, \
3835 #define VALGRIND_COUNT_ERRORS \
3836 (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR( \
3838 VG_USERREQ__COUNT_ERRORS, \
3942 #define VALGRIND_MALLOCLIKE_BLOCK(addr, sizeB, rzB, is_zeroed) \
3943 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MALLOCLIKE_BLOCK, \
3944 addr, sizeB, rzB, is_zeroed, 0)
3949 #define VALGRIND_RESIZEINPLACE_BLOCK(addr, oldSizeB, newSizeB, rzB) \
3950 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__RESIZEINPLACE_BLOCK, \
3951 addr, oldSizeB, newSizeB, rzB, 0)
3956 #define VALGRIND_FREELIKE_BLOCK(addr, rzB) \
3957 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__FREELIKE_BLOCK, \
3961 #define VALGRIND_CREATE_MEMPOOL(pool, rzB, is_zeroed) \
3962 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CREATE_MEMPOOL, \
3963 pool, rzB, is_zeroed, 0, 0)
3966 #define VALGRIND_DESTROY_MEMPOOL(pool) \
3967 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DESTROY_MEMPOOL, \
3971 #define VALGRIND_MEMPOOL_ALLOC(pool, addr, size) \
3972 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_ALLOC, \
3973 pool, addr, size, 0, 0)
3976 #define VALGRIND_MEMPOOL_FREE(pool, addr) \
3977 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_FREE, \
3978 pool, addr, 0, 0, 0)
3981 #define VALGRIND_MEMPOOL_TRIM(pool, addr, size) \
3982 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_TRIM, \
3983 pool, addr, size, 0, 0)
3986 #define VALGRIND_MOVE_MEMPOOL(poolA, poolB) \
3987 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MOVE_MEMPOOL, \
3988 poolA, poolB, 0, 0, 0)
3991 #define VALGRIND_MEMPOOL_CHANGE(pool, addrA, addrB, size) \
3992 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_CHANGE, \
3993 pool, addrA, addrB, size, 0)
3996 #define VALGRIND_MEMPOOL_EXISTS(pool) \
3997 (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
3998 VG_USERREQ__MEMPOOL_EXISTS, \
4002 #define VALGRIND_STACK_REGISTER(start, end) \
4003 (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
4004 VG_USERREQ__STACK_REGISTER, \
4005 start, end, 0, 0, 0)
4009 #define VALGRIND_STACK_DEREGISTER(id) \
4010 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__STACK_DEREGISTER, \
4014 #define VALGRIND_STACK_CHANGE(id, start, end) \
4015 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__STACK_CHANGE, \
4016 id, start, end, 0, 0)
4019 #define VALGRIND_LOAD_PDB_DEBUGINFO(fd, ptr, total_size, delta) \
4020 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__LOAD_PDB_DEBUGINFO, \
4021 fd, ptr, total_size, delta, 0)
4027 #define VALGRIND_MAP_IP_TO_SRCLOC(addr, buf64) \
4028 (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
4029 VG_USERREQ__MAP_IP_TO_SRCLOC, \
4030 addr, buf64, 0, 0, 0)
4040 #define VALGRIND_DISABLE_ERROR_REPORTING \
4041 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CHANGE_ERR_DISABLEMENT, \
4046 #define VALGRIND_ENABLE_ERROR_REPORTING \
4047 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CHANGE_ERR_DISABLEMENT, \
4050 #undef PLAT_x86_darwin
4051 #undef PLAT_amd64_darwin
4052 #undef PLAT_x86_win32
4053 #undef PLAT_x86_linux
4054 #undef PLAT_amd64_linux
4055 #undef PLAT_ppc32_linux
4056 #undef PLAT_ppc64_linux
4057 #undef PLAT_arm_linux
4058 #undef PLAT_s390x_linux
_W64 unsigned int uintptr_t
Definition: stdint.h:165
static int VALGRIND_PRINTF_BACKTRACE(const char *format,...)
Definition: valgrind.h:3752
Vg_ClientRequest
Definition: valgrind.h:3606
@ VG_USERREQ__DESTROY_MEMPOOL
Definition: valgrind.h:3635
@ VG_USERREQ__MAP_IP_TO_SRCLOC
Definition: valgrind.h:3665
@ VG_USERREQ__LOAD_PDB_DEBUGINFO
Definition: valgrind.h:3662
@ VG_USERREQ__PRINTF_BACKTRACE
Definition: valgrind.h:3651
@ VG_USERREQ__GDB_MONITOR_COMMAND
Definition: valgrind.h:3626
@ VG_USERREQ__MEMPOOL_ALLOC
Definition: valgrind.h:3636
@ VG_USERREQ__RESIZEINPLACE_BLOCK
Definition: valgrind.h:3631
@ VG_USERREQ__MALLOCLIKE_BLOCK
Definition: valgrind.h:3630
@ VG_USERREQ__COUNT_ERRORS
Definition: valgrind.h:3622
@ VG_USERREQ__STACK_REGISTER
Definition: valgrind.h:3657
@ VG_USERREQ__MEMPOOL_CHANGE
Definition: valgrind.h:3640
@ VG_USERREQ__PRINTF_VALIST_BY_REF
Definition: valgrind.h:3653
@ VG_USERREQ__RUNNING_ON_VALGRIND
Definition: valgrind.h:3606
@ VG_USERREQ__CLIENT_CALL0
Definition: valgrind.h:3614
@ VG_USERREQ__DISCARD_TRANSLATIONS
Definition: valgrind.h:3607
@ VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF
Definition: valgrind.h:3654
@ VG_USERREQ__FREELIKE_BLOCK
Definition: valgrind.h:3632
@ VG_USERREQ__CREATE_MEMPOOL
Definition: valgrind.h:3634
@ VG_USERREQ__MOVE_MEMPOOL
Definition: valgrind.h:3639
@ VG_USERREQ__CLIENT_CALL3
Definition: valgrind.h:3617
@ VG_USERREQ__MEMPOOL_TRIM
Definition: valgrind.h:3638
@ VG_USERREQ__CLIENT_CALL2
Definition: valgrind.h:3616
@ VG_USERREQ__PRINTF
Definition: valgrind.h:3650
@ VG_USERREQ__CHANGE_ERR_DISABLEMENT
Definition: valgrind.h:3672
@ VG_USERREQ__STACK_CHANGE
Definition: valgrind.h:3659
@ VG_USERREQ__STACK_DEREGISTER
Definition: valgrind.h:3658
@ VG_USERREQ__MEMPOOL_FREE
Definition: valgrind.h:3637
@ VG_USERREQ__MEMPOOL_EXISTS
Definition: valgrind.h:3641
@ VG_USERREQ__CLIENT_CALL1
Definition: valgrind.h:3615
static int VALGRIND_PRINTF(const char *format,...)
Definition: valgrind.h:3714
#define VALGRIND_DO_CLIENT_REQUEST_EXPR( _zzq_default, _zzq_request, _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)
Definition: valgrind.h:186