91 #define __VALGRIND_MAJOR__ 3
92 #define __VALGRIND_MINOR__ 6
112 #undef PLAT_x86_darwin
113 #undef PLAT_amd64_darwin
114 #undef PLAT_x86_win32
115 #undef PLAT_x86_linux
116 #undef PLAT_amd64_linux
117 #undef PLAT_ppc32_linux
118 #undef PLAT_ppc64_linux
119 #undef PLAT_arm_linux
120 #undef PLAT_s390x_linux
123 #if defined(__APPLE__) && defined(__i386__)
124 # define PLAT_x86_darwin 1
125 #elif defined(__APPLE__) && defined(__x86_64__)
126 # define PLAT_amd64_darwin 1
127 #elif defined(__MINGW32__) || defined(__CYGWIN32__) \
128 || (defined(_WIN32) && defined(_M_IX86))
129 # define PLAT_x86_win32 1
130 #elif defined(__linux__) && defined(__i386__)
131 # define PLAT_x86_linux 1
132 #elif defined(__linux__) && defined(__x86_64__)
133 # define PLAT_amd64_linux 1
134 #elif defined(__linux__) && defined(__powerpc__) && !defined(__powerpc64__)
135 # define PLAT_ppc32_linux 1
136 #elif defined(__linux__) && defined(__powerpc__) && defined(__powerpc64__)
137 # define PLAT_ppc64_linux 1
138 #elif defined(__linux__) && defined(__arm__)
139 # define PLAT_arm_linux 1
140 #elif defined(__linux__) && defined(__s390__) && defined(__s390x__)
141 # define PLAT_s390x_linux 1
145 # if !defined(NVALGRIND)
165 #define VALGRIND_DO_CLIENT_REQUEST(_zzq_rlval, _zzq_default, \
166 _zzq_request, _zzq_arg1, _zzq_arg2, \
167 _zzq_arg3, _zzq_arg4, _zzq_arg5) \
168 { (_zzq_rlval) = VALGRIND_DO_CLIENT_REQUEST_EXPR((_zzq_default), \
169 (_zzq_request), (_zzq_arg1), (_zzq_arg2), \
170 (_zzq_arg3), (_zzq_arg4), (_zzq_arg5)); }
172 #if defined(NVALGRIND)
177 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
178 _zzq_default, _zzq_request, \
179 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
221 #if defined(PLAT_x86_linux) || defined(PLAT_x86_darwin) \
222 || (defined(PLAT_x86_win32) && defined(__GNUC__))
230 #define __SPECIAL_INSTRUCTION_PREAMBLE \
231 "roll $3, %%edi ; roll $13, %%edi\n\t" \
232 "roll $29, %%edi ; roll $19, %%edi\n\t"
234 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
235 _zzq_default, _zzq_request, \
236 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
238 ({volatile unsigned int _zzq_args[6]; \
239 volatile unsigned int _zzq_result; \
240 _zzq_args[0] = (unsigned int)(_zzq_request); \
241 _zzq_args[1] = (unsigned int)(_zzq_arg1); \
242 _zzq_args[2] = (unsigned int)(_zzq_arg2); \
243 _zzq_args[3] = (unsigned int)(_zzq_arg3); \
244 _zzq_args[4] = (unsigned int)(_zzq_arg4); \
245 _zzq_args[5] = (unsigned int)(_zzq_arg5); \
246 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
248 "xchgl %%ebx,%%ebx" \
249 : "=d" (_zzq_result) \
250 : "a" (&_zzq_args[0]), "0" (_zzq_default) \
256 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
257 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
258 volatile unsigned int __addr; \
259 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
261 "xchgl %%ecx,%%ecx" \
266 _zzq_orig->nraddr = __addr; \
269 #define VALGRIND_CALL_NOREDIR_EAX \
270 __SPECIAL_INSTRUCTION_PREAMBLE \
272 "xchgl %%edx,%%edx\n\t"
277 #if defined(PLAT_x86_win32) && !defined(__GNUC__)
285 #if defined(_MSC_VER)
287 #define __SPECIAL_INSTRUCTION_PREAMBLE \
288 __asm rol edi, 3 __asm rol edi, 13 \
289 __asm rol edi, 29 __asm rol edi, 19
291 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
292 _zzq_default, _zzq_request, \
293 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
294 valgrind_do_client_request_expr((uintptr_t)(_zzq_default), \
295 (uintptr_t)(_zzq_request), (uintptr_t)(_zzq_arg1), \
296 (uintptr_t)(_zzq_arg2), (uintptr_t)(_zzq_arg3), \
297 (uintptr_t)(_zzq_arg4), (uintptr_t)(_zzq_arg5))
306 volatile unsigned int _zzq_result;
307 _zzq_args[0] = (
uintptr_t)(_zzq_request);
313 __asm { __asm lea
eax, _zzq_args __asm mov
edx, _zzq_default
314 __SPECIAL_INSTRUCTION_PREAMBLE
317 __asm mov _zzq_result,
edx
322 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
323 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
324 volatile unsigned int __addr; \
325 __asm { __SPECIAL_INSTRUCTION_PREAMBLE \
328 __asm mov __addr, eax \
330 _zzq_orig->nraddr = __addr; \
333 #define VALGRIND_CALL_NOREDIR_EAX ERROR
336 #error Unsupported compiler.
343 #if defined(PLAT_amd64_linux) || defined(PLAT_amd64_darwin)
351 #define __SPECIAL_INSTRUCTION_PREAMBLE \
352 "rolq $3, %%rdi ; rolq $13, %%rdi\n\t" \
353 "rolq $61, %%rdi ; rolq $51, %%rdi\n\t"
355 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
356 _zzq_default, _zzq_request, \
357 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
359 ({ volatile uint64_t _zzq_args[6]; \
360 volatile uint64_t _zzq_result; \
361 _zzq_args[0] = (uint64_t)(_zzq_request); \
362 _zzq_args[1] = (uint64_t)(_zzq_arg1); \
363 _zzq_args[2] = (uint64_t)(_zzq_arg2); \
364 _zzq_args[3] = (uint64_t)(_zzq_arg3); \
365 _zzq_args[4] = (uint64_t)(_zzq_arg4); \
366 _zzq_args[5] = (uint64_t)(_zzq_arg5); \
367 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
369 "xchgq %%rbx,%%rbx" \
370 : "=d" (_zzq_result) \
371 : "a" (&_zzq_args[0]), "0" (_zzq_default) \
377 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
378 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
379 volatile uint64_t __addr; \
380 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
382 "xchgq %%rcx,%%rcx" \
387 _zzq_orig->nraddr = __addr; \
390 #define VALGRIND_CALL_NOREDIR_RAX \
391 __SPECIAL_INSTRUCTION_PREAMBLE \
393 "xchgq %%rdx,%%rdx\n\t"
398 #if defined(PLAT_ppc32_linux)
406 #define __SPECIAL_INSTRUCTION_PREAMBLE \
407 "rlwinm 0,0,3,0,0 ; rlwinm 0,0,13,0,0\n\t" \
408 "rlwinm 0,0,29,0,0 ; rlwinm 0,0,19,0,0\n\t"
410 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
411 _zzq_default, _zzq_request, \
412 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
415 ({ unsigned int _zzq_args[6]; \
416 unsigned int _zzq_result; \
417 unsigned int* _zzq_ptr; \
418 _zzq_args[0] = (unsigned int)(_zzq_request); \
419 _zzq_args[1] = (unsigned int)(_zzq_arg1); \
420 _zzq_args[2] = (unsigned int)(_zzq_arg2); \
421 _zzq_args[3] = (unsigned int)(_zzq_arg3); \
422 _zzq_args[4] = (unsigned int)(_zzq_arg4); \
423 _zzq_args[5] = (unsigned int)(_zzq_arg5); \
424 _zzq_ptr = _zzq_args; \
425 __asm__ volatile("mr 3,%1\n\t" \
427 __SPECIAL_INSTRUCTION_PREAMBLE \
431 : "=b" (_zzq_result) \
432 : "b" (_zzq_default), "b" (_zzq_ptr) \
433 : "cc", "memory", "r3", "r4"); \
437 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
438 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
439 unsigned int __addr; \
440 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
446 : "cc", "memory", "r3" \
448 _zzq_orig->nraddr = __addr; \
451 #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
452 __SPECIAL_INSTRUCTION_PREAMBLE \
459 #if defined(PLAT_ppc64_linux)
468 #define __SPECIAL_INSTRUCTION_PREAMBLE \
469 "rotldi 0,0,3 ; rotldi 0,0,13\n\t" \
470 "rotldi 0,0,61 ; rotldi 0,0,51\n\t"
472 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
473 _zzq_default, _zzq_request, \
474 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
477 ({ uint64_t _zzq_args[6]; \
478 register uint64_t _zzq_result __asm__("r3"); \
479 register uint64_t* _zzq_ptr __asm__("r4"); \
480 _zzq_args[0] = (uint64_t)(_zzq_request); \
481 _zzq_args[1] = (uint64_t)(_zzq_arg1); \
482 _zzq_args[2] = (uint64_t)(_zzq_arg2); \
483 _zzq_args[3] = (uint64_t)(_zzq_arg3); \
484 _zzq_args[4] = (uint64_t)(_zzq_arg4); \
485 _zzq_args[5] = (uint64_t)(_zzq_arg5); \
486 _zzq_ptr = _zzq_args; \
487 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
490 : "=r" (_zzq_result) \
491 : "0" (_zzq_default), "r" (_zzq_ptr) \
496 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
497 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
498 register uint64_t __addr __asm__("r3"); \
499 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
506 _zzq_orig->nraddr = __addr; \
507 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
514 _zzq_orig->r2 = __addr; \
517 #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
518 __SPECIAL_INSTRUCTION_PREAMBLE \
526 #if defined(PLAT_arm_linux)
534 #define __SPECIAL_INSTRUCTION_PREAMBLE \
535 "mov r12, r12, ror #3 ; mov r12, r12, ror #13 \n\t" \
536 "mov r12, r12, ror #29 ; mov r12, r12, ror #19 \n\t"
538 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
539 _zzq_default, _zzq_request, \
540 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
543 ({volatile unsigned int _zzq_args[6]; \
544 volatile unsigned int _zzq_result; \
545 _zzq_args[0] = (unsigned int)(_zzq_request); \
546 _zzq_args[1] = (unsigned int)(_zzq_arg1); \
547 _zzq_args[2] = (unsigned int)(_zzq_arg2); \
548 _zzq_args[3] = (unsigned int)(_zzq_arg3); \
549 _zzq_args[4] = (unsigned int)(_zzq_arg4); \
550 _zzq_args[5] = (unsigned int)(_zzq_arg5); \
551 __asm__ volatile("mov r3, %1\n\t" \
553 __SPECIAL_INSTRUCTION_PREAMBLE \
555 "orr r10, r10, r10\n\t" \
557 : "=r" (_zzq_result) \
558 : "r" (_zzq_default), "r" (&_zzq_args[0]) \
559 : "cc","memory", "r3", "r4"); \
563 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
564 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
565 unsigned int __addr; \
566 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
568 "orr r11, r11, r11\n\t" \
572 : "cc", "memory", "r3" \
574 _zzq_orig->nraddr = __addr; \
577 #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
578 __SPECIAL_INSTRUCTION_PREAMBLE \
580 "orr r12, r12, r12\n\t"
586 #if defined(PLAT_s390x_linux)
598 #define __SPECIAL_INSTRUCTION_PREAMBLE \
604 #define __CLIENT_REQUEST_CODE "lr 2,2\n\t"
605 #define __GET_NR_CONTEXT_CODE "lr 3,3\n\t"
606 #define __CALL_NO_REDIR_CODE "lr 4,4\n\t"
608 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
609 _zzq_default, _zzq_request, \
610 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
612 ({volatile uint64_t _zzq_args[6]; \
613 volatile uint64_t _zzq_result; \
614 _zzq_args[0] = (uint64_t)(_zzq_request); \
615 _zzq_args[1] = (uint64_t)(_zzq_arg1); \
616 _zzq_args[2] = (uint64_t)(_zzq_arg2); \
617 _zzq_args[3] = (uint64_t)(_zzq_arg3); \
618 _zzq_args[4] = (uint64_t)(_zzq_arg4); \
619 _zzq_args[5] = (uint64_t)(_zzq_arg5); \
624 __SPECIAL_INSTRUCTION_PREAMBLE \
625 __CLIENT_REQUEST_CODE \
628 : "=d" (_zzq_result) \
629 : "a" (&_zzq_args[0]), "0" (_zzq_default) \
630 : "cc", "2", "3", "memory" \
635 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
636 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
637 volatile uint64_t __addr; \
638 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
639 __GET_NR_CONTEXT_CODE \
643 : "cc", "3", "memory" \
645 _zzq_orig->nraddr = __addr; \
648 #define VALGRIND_CALL_NOREDIR_R1 \
649 __SPECIAL_INSTRUCTION_PREAMBLE \
687 #define VG_CONCAT4(_aa,_bb,_cc,_dd) _aa##_bb##_cc##_dd
689 #define I_WRAP_SONAME_FNNAME_ZU(soname,fnname) \
690 VG_CONCAT4(_vgwZU_,soname,_,fnname)
692 #define I_WRAP_SONAME_FNNAME_ZZ(soname,fnname) \
693 VG_CONCAT4(_vgwZZ_,soname,_,fnname)
699 #define VALGRIND_GET_ORIG_FN(_lval) VALGRIND_GET_NR_CONTEXT(_lval)
704 #define CALL_FN_v_v(fnptr) \
705 do { volatile unsigned long _junk; \
706 CALL_FN_W_v(_junk,fnptr); } while (0)
708 #define CALL_FN_v_W(fnptr, arg1) \
709 do { volatile unsigned long _junk; \
710 CALL_FN_W_W(_junk,fnptr,arg1); } while (0)
712 #define CALL_FN_v_WW(fnptr, arg1,arg2) \
713 do { volatile unsigned long _junk; \
714 CALL_FN_W_WW(_junk,fnptr,arg1,arg2); } while (0)
716 #define CALL_FN_v_WWW(fnptr, arg1,arg2,arg3) \
717 do { volatile unsigned long _junk; \
718 CALL_FN_W_WWW(_junk,fnptr,arg1,arg2,arg3); } while (0)
720 #define CALL_FN_v_WWWW(fnptr, arg1,arg2,arg3,arg4) \
721 do { volatile unsigned long _junk; \
722 CALL_FN_W_WWWW(_junk,fnptr,arg1,arg2,arg3,arg4); } while (0)
724 #define CALL_FN_v_5W(fnptr, arg1,arg2,arg3,arg4,arg5) \
725 do { volatile unsigned long _junk; \
726 CALL_FN_W_5W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5); } while (0)
728 #define CALL_FN_v_6W(fnptr, arg1,arg2,arg3,arg4,arg5,arg6) \
729 do { volatile unsigned long _junk; \
730 CALL_FN_W_6W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5,arg6); } while (0)
732 #define CALL_FN_v_7W(fnptr, arg1,arg2,arg3,arg4,arg5,arg6,arg7) \
733 do { volatile unsigned long _junk; \
734 CALL_FN_W_7W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5,arg6,arg7); } while (0)
738 #if defined(PLAT_x86_linux) || defined(PLAT_x86_darwin)
742 #define __CALLER_SAVED_REGS "ecx", "edx"
747 #define CALL_FN_W_v(lval, orig) \
749 volatile OrigFn _orig = (orig); \
750 volatile unsigned long _argvec[1]; \
751 volatile unsigned long _res; \
752 _argvec[0] = (unsigned long)_orig.nraddr; \
754 "movl (%%eax), %%eax\n\t" \
755 VALGRIND_CALL_NOREDIR_EAX \
757 :
"a" (&_argvec[0]) \
758 :
"cc", "memory", __CALLER_SAVED_REGS \
760 lval = (__typeof__(lval)) _res; \
763 #define CALL_FN_W_W(lval, orig, arg1) \
765 volatile OrigFn _orig = (orig); \
766 volatile unsigned long _argvec[2]; \
767 volatile unsigned long _res; \
768 _argvec[0] = (unsigned long)_orig.nraddr; \
769 _argvec[1] = (unsigned long)(arg1); \
771 "subl $12, %%esp\n\t" \
772 "pushl 4(%%eax)\n\t" \
773 "movl (%%eax), %%eax\n\t"
\
774 VALGRIND_CALL_NOREDIR_EAX \
775 "addl $16, %%esp\n" \
777 :
"a" (&_argvec[0]) \
778 :
"cc", "memory", __CALLER_SAVED_REGS \
780 lval = (__typeof__(lval)) _res; \
783 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
785 volatile OrigFn _orig = (orig); \
786 volatile unsigned long _argvec[3]; \
787 volatile unsigned long _res; \
788 _argvec[0] = (unsigned long)_orig.nraddr; \
789 _argvec[1] = (unsigned long)(arg1); \
790 _argvec[2] = (unsigned long)(arg2); \
792 "subl $8, %%esp\n\t" \
793 "pushl 8(%%eax)\n\t" \
794 "pushl 4(%%eax)\n\t" \
795 "movl (%%eax), %%eax\n\t"
\
796 VALGRIND_CALL_NOREDIR_EAX \
797 "addl $16, %%esp\n" \
799 :
"a" (&_argvec[0]) \
800 :
"cc", "memory", __CALLER_SAVED_REGS \
802 lval = (__typeof__(lval)) _res; \
805 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
807 volatile OrigFn _orig = (orig); \
808 volatile unsigned long _argvec[4]; \
809 volatile unsigned long _res; \
810 _argvec[0] = (unsigned long)_orig.nraddr; \
811 _argvec[1] = (unsigned long)(arg1); \
812 _argvec[2] = (unsigned long)(arg2); \
813 _argvec[3] = (unsigned long)(arg3); \
815 "subl $4, %%esp\n\t" \
816 "pushl 12(%%eax)\n\t" \
817 "pushl 8(%%eax)\n\t" \
818 "pushl 4(%%eax)\n\t" \
819 "movl (%%eax), %%eax\n\t"
\
820 VALGRIND_CALL_NOREDIR_EAX \
821 "addl $16, %%esp\n" \
823 :
"a" (&_argvec[0]) \
824 :
"cc", "memory", __CALLER_SAVED_REGS \
826 lval = (__typeof__(lval)) _res; \
829 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
831 volatile OrigFn _orig = (orig); \
832 volatile unsigned long _argvec[5]; \
833 volatile unsigned long _res; \
834 _argvec[0] = (unsigned long)_orig.nraddr; \
835 _argvec[1] = (unsigned long)(arg1); \
836 _argvec[2] = (unsigned long)(arg2); \
837 _argvec[3] = (unsigned long)(arg3); \
838 _argvec[4] = (unsigned long)(arg4); \
840 "pushl 16(%%eax)\n\t" \
841 "pushl 12(%%eax)\n\t" \
842 "pushl 8(%%eax)\n\t" \
843 "pushl 4(%%eax)\n\t" \
844 "movl (%%eax), %%eax\n\t"
\
845 VALGRIND_CALL_NOREDIR_EAX \
846 "addl $16, %%esp\n" \
848 :
"a" (&_argvec[0]) \
849 :
"cc", "memory", __CALLER_SAVED_REGS \
851 lval = (__typeof__(lval)) _res; \
854 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
856 volatile OrigFn _orig = (orig); \
857 volatile unsigned long _argvec[6]; \
858 volatile unsigned long _res; \
859 _argvec[0] = (unsigned long)_orig.nraddr; \
860 _argvec[1] = (unsigned long)(arg1); \
861 _argvec[2] = (unsigned long)(arg2); \
862 _argvec[3] = (unsigned long)(arg3); \
863 _argvec[4] = (unsigned long)(arg4); \
864 _argvec[5] = (unsigned long)(arg5); \
866 "subl $12, %%esp\n\t" \
867 "pushl 20(%%eax)\n\t" \
868 "pushl 16(%%eax)\n\t" \
869 "pushl 12(%%eax)\n\t" \
870 "pushl 8(%%eax)\n\t" \
871 "pushl 4(%%eax)\n\t" \
872 "movl (%%eax), %%eax\n\t"
\
873 VALGRIND_CALL_NOREDIR_EAX \
874 "addl $32, %%esp\n" \
876 :
"a" (&_argvec[0]) \
877 :
"cc", "memory", __CALLER_SAVED_REGS \
879 lval = (__typeof__(lval)) _res; \
882 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
884 volatile OrigFn _orig = (orig); \
885 volatile unsigned long _argvec[7]; \
886 volatile unsigned long _res; \
887 _argvec[0] = (unsigned long)_orig.nraddr; \
888 _argvec[1] = (unsigned long)(arg1); \
889 _argvec[2] = (unsigned long)(arg2); \
890 _argvec[3] = (unsigned long)(arg3); \
891 _argvec[4] = (unsigned long)(arg4); \
892 _argvec[5] = (unsigned long)(arg5); \
893 _argvec[6] = (unsigned long)(arg6); \
895 "subl $8, %%esp\n\t" \
896 "pushl 24(%%eax)\n\t" \
897 "pushl 20(%%eax)\n\t" \
898 "pushl 16(%%eax)\n\t" \
899 "pushl 12(%%eax)\n\t" \
900 "pushl 8(%%eax)\n\t" \
901 "pushl 4(%%eax)\n\t" \
902 "movl (%%eax), %%eax\n\t"
\
903 VALGRIND_CALL_NOREDIR_EAX \
904 "addl $32, %%esp\n" \
906 :
"a" (&_argvec[0]) \
907 :
"cc", "memory", __CALLER_SAVED_REGS \
909 lval = (__typeof__(lval)) _res; \
912 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
915 volatile OrigFn _orig = (orig); \
916 volatile unsigned long _argvec[8]; \
917 volatile unsigned long _res; \
918 _argvec[0] = (unsigned long)_orig.nraddr; \
919 _argvec[1] = (unsigned long)(arg1); \
920 _argvec[2] = (unsigned long)(arg2); \
921 _argvec[3] = (unsigned long)(arg3); \
922 _argvec[4] = (unsigned long)(arg4); \
923 _argvec[5] = (unsigned long)(arg5); \
924 _argvec[6] = (unsigned long)(arg6); \
925 _argvec[7] = (unsigned long)(arg7); \
927 "subl $4, %%esp\n\t" \
928 "pushl 28(%%eax)\n\t" \
929 "pushl 24(%%eax)\n\t" \
930 "pushl 20(%%eax)\n\t" \
931 "pushl 16(%%eax)\n\t" \
932 "pushl 12(%%eax)\n\t" \
933 "pushl 8(%%eax)\n\t" \
934 "pushl 4(%%eax)\n\t" \
935 "movl (%%eax), %%eax\n\t"
\
936 VALGRIND_CALL_NOREDIR_EAX \
937 "addl $32, %%esp\n" \
939 :
"a" (&_argvec[0]) \
940 :
"cc", "memory", __CALLER_SAVED_REGS \
942 lval = (__typeof__(lval)) _res; \
945 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
948 volatile OrigFn _orig = (orig); \
949 volatile unsigned long _argvec[9]; \
950 volatile unsigned long _res; \
951 _argvec[0] = (unsigned long)_orig.nraddr; \
952 _argvec[1] = (unsigned long)(arg1); \
953 _argvec[2] = (unsigned long)(arg2); \
954 _argvec[3] = (unsigned long)(arg3); \
955 _argvec[4] = (unsigned long)(arg4); \
956 _argvec[5] = (unsigned long)(arg5); \
957 _argvec[6] = (unsigned long)(arg6); \
958 _argvec[7] = (unsigned long)(arg7); \
959 _argvec[8] = (unsigned long)(arg8); \
961 "pushl 32(%%eax)\n\t" \
962 "pushl 28(%%eax)\n\t" \
963 "pushl 24(%%eax)\n\t" \
964 "pushl 20(%%eax)\n\t" \
965 "pushl 16(%%eax)\n\t" \
966 "pushl 12(%%eax)\n\t" \
967 "pushl 8(%%eax)\n\t" \
968 "pushl 4(%%eax)\n\t" \
969 "movl (%%eax), %%eax\n\t"
\
970 VALGRIND_CALL_NOREDIR_EAX \
971 "addl $32, %%esp\n" \
973 :
"a" (&_argvec[0]) \
974 :
"cc", "memory", __CALLER_SAVED_REGS \
976 lval = (__typeof__(lval)) _res; \
979 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
982 volatile OrigFn _orig = (orig); \
983 volatile unsigned long _argvec[10]; \
984 volatile unsigned long _res; \
985 _argvec[0] = (unsigned long)_orig.nraddr; \
986 _argvec[1] = (unsigned long)(arg1); \
987 _argvec[2] = (unsigned long)(arg2); \
988 _argvec[3] = (unsigned long)(arg3); \
989 _argvec[4] = (unsigned long)(arg4); \
990 _argvec[5] = (unsigned long)(arg5); \
991 _argvec[6] = (unsigned long)(arg6); \
992 _argvec[7] = (unsigned long)(arg7); \
993 _argvec[8] = (unsigned long)(arg8); \
994 _argvec[9] = (unsigned long)(arg9); \
996 "subl $12, %%esp\n\t" \
997 "pushl 36(%%eax)\n\t" \
998 "pushl 32(%%eax)\n\t" \
999 "pushl 28(%%eax)\n\t" \
1000 "pushl 24(%%eax)\n\t" \
1001 "pushl 20(%%eax)\n\t" \
1002 "pushl 16(%%eax)\n\t" \
1003 "pushl 12(%%eax)\n\t" \
1004 "pushl 8(%%eax)\n\t" \
1005 "pushl 4(%%eax)\n\t" \
1006 "movl (%%eax), %%eax\n\t"
\
1007 VALGRIND_CALL_NOREDIR_EAX \
1008 "addl $48, %%esp\n" \
1010 :
"a" (&_argvec[0]) \
1011 :
"cc", "memory", __CALLER_SAVED_REGS \
1013 lval = (__typeof__(lval)) _res; \
1016 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1017 arg7,arg8,arg9,arg10) \
1019 volatile OrigFn _orig = (orig); \
1020 volatile unsigned long _argvec[11]; \
1021 volatile unsigned long _res; \
1022 _argvec[0] = (unsigned long)_orig.nraddr; \
1023 _argvec[1] = (unsigned long)(arg1); \
1024 _argvec[2] = (unsigned long)(arg2); \
1025 _argvec[3] = (unsigned long)(arg3); \
1026 _argvec[4] = (unsigned long)(arg4); \
1027 _argvec[5] = (unsigned long)(arg5); \
1028 _argvec[6] = (unsigned long)(arg6); \
1029 _argvec[7] = (unsigned long)(arg7); \
1030 _argvec[8] = (unsigned long)(arg8); \
1031 _argvec[9] = (unsigned long)(arg9); \
1032 _argvec[10] = (unsigned long)(arg10); \
1034 "subl $8, %%esp\n\t" \
1035 "pushl 40(%%eax)\n\t" \
1036 "pushl 36(%%eax)\n\t" \
1037 "pushl 32(%%eax)\n\t" \
1038 "pushl 28(%%eax)\n\t" \
1039 "pushl 24(%%eax)\n\t" \
1040 "pushl 20(%%eax)\n\t" \
1041 "pushl 16(%%eax)\n\t" \
1042 "pushl 12(%%eax)\n\t" \
1043 "pushl 8(%%eax)\n\t" \
1044 "pushl 4(%%eax)\n\t" \
1045 "movl (%%eax), %%eax\n\t"
\
1046 VALGRIND_CALL_NOREDIR_EAX \
1047 "addl $48, %%esp\n" \
1049 :
"a" (&_argvec[0]) \
1050 :
"cc", "memory", __CALLER_SAVED_REGS \
1052 lval = (__typeof__(lval)) _res; \
1055 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
1056 arg6,arg7,arg8,arg9,arg10, \
1059 volatile OrigFn _orig = (orig); \
1060 volatile unsigned long _argvec[12]; \
1061 volatile unsigned long _res; \
1062 _argvec[0] = (unsigned long)_orig.nraddr; \
1063 _argvec[1] = (unsigned long)(arg1); \
1064 _argvec[2] = (unsigned long)(arg2); \
1065 _argvec[3] = (unsigned long)(arg3); \
1066 _argvec[4] = (unsigned long)(arg4); \
1067 _argvec[5] = (unsigned long)(arg5); \
1068 _argvec[6] = (unsigned long)(arg6); \
1069 _argvec[7] = (unsigned long)(arg7); \
1070 _argvec[8] = (unsigned long)(arg8); \
1071 _argvec[9] = (unsigned long)(arg9); \
1072 _argvec[10] = (unsigned long)(arg10); \
1073 _argvec[11] = (unsigned long)(arg11); \
1075 "subl $4, %%esp\n\t" \
1076 "pushl 44(%%eax)\n\t" \
1077 "pushl 40(%%eax)\n\t" \
1078 "pushl 36(%%eax)\n\t" \
1079 "pushl 32(%%eax)\n\t" \
1080 "pushl 28(%%eax)\n\t" \
1081 "pushl 24(%%eax)\n\t" \
1082 "pushl 20(%%eax)\n\t" \
1083 "pushl 16(%%eax)\n\t" \
1084 "pushl 12(%%eax)\n\t" \
1085 "pushl 8(%%eax)\n\t" \
1086 "pushl 4(%%eax)\n\t" \
1087 "movl (%%eax), %%eax\n\t"
\
1088 VALGRIND_CALL_NOREDIR_EAX \
1089 "addl $48, %%esp\n" \
1091 :
"a" (&_argvec[0]) \
1092 :
"cc", "memory", __CALLER_SAVED_REGS \
1094 lval = (__typeof__(lval)) _res; \
1097 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
1098 arg6,arg7,arg8,arg9,arg10, \
1101 volatile OrigFn _orig = (orig); \
1102 volatile unsigned long _argvec[13]; \
1103 volatile unsigned long _res; \
1104 _argvec[0] = (unsigned long)_orig.nraddr; \
1105 _argvec[1] = (unsigned long)(arg1); \
1106 _argvec[2] = (unsigned long)(arg2); \
1107 _argvec[3] = (unsigned long)(arg3); \
1108 _argvec[4] = (unsigned long)(arg4); \
1109 _argvec[5] = (unsigned long)(arg5); \
1110 _argvec[6] = (unsigned long)(arg6); \
1111 _argvec[7] = (unsigned long)(arg7); \
1112 _argvec[8] = (unsigned long)(arg8); \
1113 _argvec[9] = (unsigned long)(arg9); \
1114 _argvec[10] = (unsigned long)(arg10); \
1115 _argvec[11] = (unsigned long)(arg11); \
1116 _argvec[12] = (unsigned long)(arg12); \
1118 "pushl 48(%%eax)\n\t" \
1119 "pushl 44(%%eax)\n\t" \
1120 "pushl 40(%%eax)\n\t" \
1121 "pushl 36(%%eax)\n\t" \
1122 "pushl 32(%%eax)\n\t" \
1123 "pushl 28(%%eax)\n\t" \
1124 "pushl 24(%%eax)\n\t" \
1125 "pushl 20(%%eax)\n\t" \
1126 "pushl 16(%%eax)\n\t" \
1127 "pushl 12(%%eax)\n\t" \
1128 "pushl 8(%%eax)\n\t" \
1129 "pushl 4(%%eax)\n\t" \
1130 "movl (%%eax), %%eax\n\t"
\
1131 VALGRIND_CALL_NOREDIR_EAX \
1132 "addl $48, %%esp\n" \
1134 :
"a" (&_argvec[0]) \
1135 :
"cc", "memory", __CALLER_SAVED_REGS \
1137 lval = (__typeof__(lval)) _res; \
1144 #if defined(PLAT_amd64_linux) || defined(PLAT_amd64_darwin)
1149 #define __CALLER_SAVED_REGS "rcx", "rdx", "rsi", \
1150 "rdi", "r8", "r9", "r10", "r11"
1206 #if defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM)
1207 # define __FRAME_POINTER \
1208 ,"r"(__builtin_dwarf_cfa())
1209 # define VALGRIND_CFI_PROLOGUE \
1210 "movq %%rbp, %%r15\n\t" \
1211 "movq %2, %%rbp\n\t" \
1212 ".cfi_remember_state\n\t" \
1213 ".cfi_def_cfa rbp, 0\n\t"
1214 # define VALGRIND_CFI_EPILOGUE \
1215 "movq %%r15, %%rbp\n\t" \
1216 ".cfi_restore_state\n\t"
1218 # define __FRAME_POINTER
1219 # define VALGRIND_CFI_PROLOGUE
1220 # define VALGRIND_CFI_EPILOGUE
1248 #define CALL_FN_W_v(lval, orig) \
1250 volatile OrigFn _orig = (orig); \
1251 volatile unsigned long _argvec[1]; \
1252 volatile unsigned long _res; \
1253 _argvec[0] = (unsigned long)_orig.nraddr; \
1255 VALGRIND_CFI_PROLOGUE \
1256 "subq $128,%%rsp\n\t" \
1257 "movq (%%rax), %%rax\n\t"
\
1258 VALGRIND_CALL_NOREDIR_RAX \
1259 "addq $128,%%rsp\n\t" \
1260 VALGRIND_CFI_EPILOGUE \
1262 :
"a" (&_argvec[0]) __FRAME_POINTER \
1263 :
"cc", "memory", __CALLER_SAVED_REGS, "r15" \
1265 lval = (__typeof__(lval)) _res; \
1268 #define CALL_FN_W_W(lval, orig, arg1) \
1270 volatile OrigFn _orig = (orig); \
1271 volatile unsigned long _argvec[2]; \
1272 volatile unsigned long _res; \
1273 _argvec[0] = (unsigned long)_orig.nraddr; \
1274 _argvec[1] = (unsigned long)(arg1); \
1276 VALGRIND_CFI_PROLOGUE \
1277 "subq $128,%%rsp\n\t" \
1278 "movq 8(%%rax), %%rdi\n\t" \
1279 "movq (%%rax), %%rax\n\t"
\
1280 VALGRIND_CALL_NOREDIR_RAX \
1281 "addq $128,%%rsp\n\t" \
1282 VALGRIND_CFI_EPILOGUE \
1284 :
"a" (&_argvec[0]) __FRAME_POINTER \
1285 :
"cc", "memory", __CALLER_SAVED_REGS, "r15" \
1287 lval = (__typeof__(lval)) _res; \
1290 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
1292 volatile OrigFn _orig = (orig); \
1293 volatile unsigned long _argvec[3]; \
1294 volatile unsigned long _res; \
1295 _argvec[0] = (unsigned long)_orig.nraddr; \
1296 _argvec[1] = (unsigned long)(arg1); \
1297 _argvec[2] = (unsigned long)(arg2); \
1299 VALGRIND_CFI_PROLOGUE \
1300 "subq $128,%%rsp\n\t" \
1301 "movq 16(%%rax), %%rsi\n\t" \
1302 "movq 8(%%rax), %%rdi\n\t" \
1303 "movq (%%rax), %%rax\n\t"
\
1304 VALGRIND_CALL_NOREDIR_RAX \
1305 "addq $128,%%rsp\n\t" \
1306 VALGRIND_CFI_EPILOGUE \
1308 :
"a" (&_argvec[0]) __FRAME_POINTER \
1309 :
"cc", "memory", __CALLER_SAVED_REGS, "r15" \
1311 lval = (__typeof__(lval)) _res; \
1314 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
1316 volatile OrigFn _orig = (orig); \
1317 volatile unsigned long _argvec[4]; \
1318 volatile unsigned long _res; \
1319 _argvec[0] = (unsigned long)_orig.nraddr; \
1320 _argvec[1] = (unsigned long)(arg1); \
1321 _argvec[2] = (unsigned long)(arg2); \
1322 _argvec[3] = (unsigned long)(arg3); \
1324 VALGRIND_CFI_PROLOGUE \
1325 "subq $128,%%rsp\n\t" \
1326 "movq 24(%%rax), %%rdx\n\t" \
1327 "movq 16(%%rax), %%rsi\n\t" \
1328 "movq 8(%%rax), %%rdi\n\t" \
1329 "movq (%%rax), %%rax\n\t"
\
1330 VALGRIND_CALL_NOREDIR_RAX \
1331 "addq $128,%%rsp\n\t" \
1332 VALGRIND_CFI_EPILOGUE \
1334 :
"a" (&_argvec[0]) __FRAME_POINTER \
1335 :
"cc", "memory", __CALLER_SAVED_REGS, "r15" \
1337 lval = (__typeof__(lval)) _res; \
1340 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
1342 volatile OrigFn _orig = (orig); \
1343 volatile unsigned long _argvec[5]; \
1344 volatile unsigned long _res; \
1345 _argvec[0] = (unsigned long)_orig.nraddr; \
1346 _argvec[1] = (unsigned long)(arg1); \
1347 _argvec[2] = (unsigned long)(arg2); \
1348 _argvec[3] = (unsigned long)(arg3); \
1349 _argvec[4] = (unsigned long)(arg4); \
1351 VALGRIND_CFI_PROLOGUE \
1352 "subq $128,%%rsp\n\t" \
1353 "movq 32(%%rax), %%rcx\n\t" \
1354 "movq 24(%%rax), %%rdx\n\t" \
1355 "movq 16(%%rax), %%rsi\n\t" \
1356 "movq 8(%%rax), %%rdi\n\t" \
1357 "movq (%%rax), %%rax\n\t"
\
1358 VALGRIND_CALL_NOREDIR_RAX \
1359 "addq $128,%%rsp\n\t" \
1360 VALGRIND_CFI_EPILOGUE \
1362 :
"a" (&_argvec[0]) __FRAME_POINTER \
1363 :
"cc", "memory", __CALLER_SAVED_REGS, "r15" \
1365 lval = (__typeof__(lval)) _res; \
1368 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
1370 volatile OrigFn _orig = (orig); \
1371 volatile unsigned long _argvec[6]; \
1372 volatile unsigned long _res; \
1373 _argvec[0] = (unsigned long)_orig.nraddr; \
1374 _argvec[1] = (unsigned long)(arg1); \
1375 _argvec[2] = (unsigned long)(arg2); \
1376 _argvec[3] = (unsigned long)(arg3); \
1377 _argvec[4] = (unsigned long)(arg4); \
1378 _argvec[5] = (unsigned long)(arg5); \
1380 VALGRIND_CFI_PROLOGUE \
1381 "subq $128,%%rsp\n\t" \
1382 "movq 40(%%rax), %%r8\n\t" \
1383 "movq 32(%%rax), %%rcx\n\t" \
1384 "movq 24(%%rax), %%rdx\n\t" \
1385 "movq 16(%%rax), %%rsi\n\t" \
1386 "movq 8(%%rax), %%rdi\n\t" \
1387 "movq (%%rax), %%rax\n\t"
\
1388 VALGRIND_CALL_NOREDIR_RAX \
1389 "addq $128,%%rsp\n\t" \
1390 VALGRIND_CFI_EPILOGUE \
1392 :
"a" (&_argvec[0]) __FRAME_POINTER \
1393 :
"cc", "memory", __CALLER_SAVED_REGS, "r15" \
1395 lval = (__typeof__(lval)) _res; \
1398 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
1400 volatile OrigFn _orig = (orig); \
1401 volatile unsigned long _argvec[7]; \
1402 volatile unsigned long _res; \
1403 _argvec[0] = (unsigned long)_orig.nraddr; \
1404 _argvec[1] = (unsigned long)(arg1); \
1405 _argvec[2] = (unsigned long)(arg2); \
1406 _argvec[3] = (unsigned long)(arg3); \
1407 _argvec[4] = (unsigned long)(arg4); \
1408 _argvec[5] = (unsigned long)(arg5); \
1409 _argvec[6] = (unsigned long)(arg6); \
1411 VALGRIND_CFI_PROLOGUE \
1412 "subq $128,%%rsp\n\t" \
1413 "movq 48(%%rax), %%r9\n\t" \
1414 "movq 40(%%rax), %%r8\n\t" \
1415 "movq 32(%%rax), %%rcx\n\t" \
1416 "movq 24(%%rax), %%rdx\n\t" \
1417 "movq 16(%%rax), %%rsi\n\t" \
1418 "movq 8(%%rax), %%rdi\n\t" \
1419 "movq (%%rax), %%rax\n\t"
\
1420 VALGRIND_CALL_NOREDIR_RAX \
1421 "addq $128,%%rsp\n\t" \
1422 VALGRIND_CFI_EPILOGUE \
1424 :
"a" (&_argvec[0]) __FRAME_POINTER \
1425 :
"cc", "memory", __CALLER_SAVED_REGS, "r15" \
1427 lval = (__typeof__(lval)) _res; \
1430 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1433 volatile OrigFn _orig = (orig); \
1434 volatile unsigned long _argvec[8]; \
1435 volatile unsigned long _res; \
1436 _argvec[0] = (unsigned long)_orig.nraddr; \
1437 _argvec[1] = (unsigned long)(arg1); \
1438 _argvec[2] = (unsigned long)(arg2); \
1439 _argvec[3] = (unsigned long)(arg3); \
1440 _argvec[4] = (unsigned long)(arg4); \
1441 _argvec[5] = (unsigned long)(arg5); \
1442 _argvec[6] = (unsigned long)(arg6); \
1443 _argvec[7] = (unsigned long)(arg7); \
1445 VALGRIND_CFI_PROLOGUE \
1446 "subq $136,%%rsp\n\t" \
1447 "pushq 56(%%rax)\n\t" \
1448 "movq 48(%%rax), %%r9\n\t" \
1449 "movq 40(%%rax), %%r8\n\t" \
1450 "movq 32(%%rax), %%rcx\n\t" \
1451 "movq 24(%%rax), %%rdx\n\t" \
1452 "movq 16(%%rax), %%rsi\n\t" \
1453 "movq 8(%%rax), %%rdi\n\t" \
1454 "movq (%%rax), %%rax\n\t"
\
1455 VALGRIND_CALL_NOREDIR_RAX \
1456 "addq $8, %%rsp\n" \
1457 "addq $136,%%rsp\n\t" \
1458 VALGRIND_CFI_EPILOGUE \
1460 :
"a" (&_argvec[0]) __FRAME_POINTER \
1461 :
"cc", "memory", __CALLER_SAVED_REGS, "r15" \
1463 lval = (__typeof__(lval)) _res; \
1466 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1469 volatile OrigFn _orig = (orig); \
1470 volatile unsigned long _argvec[9]; \
1471 volatile unsigned long _res; \
1472 _argvec[0] = (unsigned long)_orig.nraddr; \
1473 _argvec[1] = (unsigned long)(arg1); \
1474 _argvec[2] = (unsigned long)(arg2); \
1475 _argvec[3] = (unsigned long)(arg3); \
1476 _argvec[4] = (unsigned long)(arg4); \
1477 _argvec[5] = (unsigned long)(arg5); \
1478 _argvec[6] = (unsigned long)(arg6); \
1479 _argvec[7] = (unsigned long)(arg7); \
1480 _argvec[8] = (unsigned long)(arg8); \
1482 VALGRIND_CFI_PROLOGUE \
1483 "subq $128,%%rsp\n\t" \
1484 "pushq 64(%%rax)\n\t" \
1485 "pushq 56(%%rax)\n\t" \
1486 "movq 48(%%rax), %%r9\n\t" \
1487 "movq 40(%%rax), %%r8\n\t" \
1488 "movq 32(%%rax), %%rcx\n\t" \
1489 "movq 24(%%rax), %%rdx\n\t" \
1490 "movq 16(%%rax), %%rsi\n\t" \
1491 "movq 8(%%rax), %%rdi\n\t" \
1492 "movq (%%rax), %%rax\n\t"
\
1493 VALGRIND_CALL_NOREDIR_RAX \
1494 "addq $16, %%rsp\n" \
1495 "addq $128,%%rsp\n\t" \
1496 VALGRIND_CFI_EPILOGUE \
1498 :
"a" (&_argvec[0]) __FRAME_POINTER \
1499 :
"cc", "memory", __CALLER_SAVED_REGS, "r15" \
1501 lval = (__typeof__(lval)) _res; \
1504 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1507 volatile OrigFn _orig = (orig); \
1508 volatile unsigned long _argvec[10]; \
1509 volatile unsigned long _res; \
1510 _argvec[0] = (unsigned long)_orig.nraddr; \
1511 _argvec[1] = (unsigned long)(arg1); \
1512 _argvec[2] = (unsigned long)(arg2); \
1513 _argvec[3] = (unsigned long)(arg3); \
1514 _argvec[4] = (unsigned long)(arg4); \
1515 _argvec[5] = (unsigned long)(arg5); \
1516 _argvec[6] = (unsigned long)(arg6); \
1517 _argvec[7] = (unsigned long)(arg7); \
1518 _argvec[8] = (unsigned long)(arg8); \
1519 _argvec[9] = (unsigned long)(arg9); \
1521 VALGRIND_CFI_PROLOGUE \
1522 "subq $136,%%rsp\n\t" \
1523 "pushq 72(%%rax)\n\t" \
1524 "pushq 64(%%rax)\n\t" \
1525 "pushq 56(%%rax)\n\t" \
1526 "movq 48(%%rax), %%r9\n\t" \
1527 "movq 40(%%rax), %%r8\n\t" \
1528 "movq 32(%%rax), %%rcx\n\t" \
1529 "movq 24(%%rax), %%rdx\n\t" \
1530 "movq 16(%%rax), %%rsi\n\t" \
1531 "movq 8(%%rax), %%rdi\n\t" \
1532 "movq (%%rax), %%rax\n\t"
\
1533 VALGRIND_CALL_NOREDIR_RAX \
1534 "addq $24, %%rsp\n" \
1535 "addq $136,%%rsp\n\t" \
1536 VALGRIND_CFI_EPILOGUE \
1538 :
"a" (&_argvec[0]) __FRAME_POINTER \
1539 :
"cc", "memory", __CALLER_SAVED_REGS, "r15" \
1541 lval = (__typeof__(lval)) _res; \
1544 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1545 arg7,arg8,arg9,arg10) \
1547 volatile OrigFn _orig = (orig); \
1548 volatile unsigned long _argvec[11]; \
1549 volatile unsigned long _res; \
1550 _argvec[0] = (unsigned long)_orig.nraddr; \
1551 _argvec[1] = (unsigned long)(arg1); \
1552 _argvec[2] = (unsigned long)(arg2); \
1553 _argvec[3] = (unsigned long)(arg3); \
1554 _argvec[4] = (unsigned long)(arg4); \
1555 _argvec[5] = (unsigned long)(arg5); \
1556 _argvec[6] = (unsigned long)(arg6); \
1557 _argvec[7] = (unsigned long)(arg7); \
1558 _argvec[8] = (unsigned long)(arg8); \
1559 _argvec[9] = (unsigned long)(arg9); \
1560 _argvec[10] = (unsigned long)(arg10); \
1562 VALGRIND_CFI_PROLOGUE \
1563 "subq $128,%%rsp\n\t" \
1564 "pushq 80(%%rax)\n\t" \
1565 "pushq 72(%%rax)\n\t" \
1566 "pushq 64(%%rax)\n\t" \
1567 "pushq 56(%%rax)\n\t" \
1568 "movq 48(%%rax), %%r9\n\t" \
1569 "movq 40(%%rax), %%r8\n\t" \
1570 "movq 32(%%rax), %%rcx\n\t" \
1571 "movq 24(%%rax), %%rdx\n\t" \
1572 "movq 16(%%rax), %%rsi\n\t" \
1573 "movq 8(%%rax), %%rdi\n\t" \
1574 "movq (%%rax), %%rax\n\t"
\
1575 VALGRIND_CALL_NOREDIR_RAX \
1576 "addq $32, %%rsp\n" \
1577 "addq $128,%%rsp\n\t" \
1578 VALGRIND_CFI_EPILOGUE \
1580 :
"a" (&_argvec[0]) __FRAME_POINTER \
1581 :
"cc", "memory", __CALLER_SAVED_REGS, "r15" \
1583 lval = (__typeof__(lval)) _res; \
1586 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1587 arg7,arg8,arg9,arg10,arg11) \
1589 volatile OrigFn _orig = (orig); \
1590 volatile unsigned long _argvec[12]; \
1591 volatile unsigned long _res; \
1592 _argvec[0] = (unsigned long)_orig.nraddr; \
1593 _argvec[1] = (unsigned long)(arg1); \
1594 _argvec[2] = (unsigned long)(arg2); \
1595 _argvec[3] = (unsigned long)(arg3); \
1596 _argvec[4] = (unsigned long)(arg4); \
1597 _argvec[5] = (unsigned long)(arg5); \
1598 _argvec[6] = (unsigned long)(arg6); \
1599 _argvec[7] = (unsigned long)(arg7); \
1600 _argvec[8] = (unsigned long)(arg8); \
1601 _argvec[9] = (unsigned long)(arg9); \
1602 _argvec[10] = (unsigned long)(arg10); \
1603 _argvec[11] = (unsigned long)(arg11); \
1605 VALGRIND_CFI_PROLOGUE \
1606 "subq $136,%%rsp\n\t" \
1607 "pushq 88(%%rax)\n\t" \
1608 "pushq 80(%%rax)\n\t" \
1609 "pushq 72(%%rax)\n\t" \
1610 "pushq 64(%%rax)\n\t" \
1611 "pushq 56(%%rax)\n\t" \
1612 "movq 48(%%rax), %%r9\n\t" \
1613 "movq 40(%%rax), %%r8\n\t" \
1614 "movq 32(%%rax), %%rcx\n\t" \
1615 "movq 24(%%rax), %%rdx\n\t" \
1616 "movq 16(%%rax), %%rsi\n\t" \
1617 "movq 8(%%rax), %%rdi\n\t" \
1618 "movq (%%rax), %%rax\n\t"
\
1619 VALGRIND_CALL_NOREDIR_RAX \
1620 "addq $40, %%rsp\n" \
1621 "addq $136,%%rsp\n\t" \
1622 VALGRIND_CFI_EPILOGUE \
1624 :
"a" (&_argvec[0]) __FRAME_POINTER \
1625 :
"cc", "memory", __CALLER_SAVED_REGS, "r15" \
1627 lval = (__typeof__(lval)) _res; \
1630 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1631 arg7,arg8,arg9,arg10,arg11,arg12) \
1633 volatile OrigFn _orig = (orig); \
1634 volatile unsigned long _argvec[13]; \
1635 volatile unsigned long _res; \
1636 _argvec[0] = (unsigned long)_orig.nraddr; \
1637 _argvec[1] = (unsigned long)(arg1); \
1638 _argvec[2] = (unsigned long)(arg2); \
1639 _argvec[3] = (unsigned long)(arg3); \
1640 _argvec[4] = (unsigned long)(arg4); \
1641 _argvec[5] = (unsigned long)(arg5); \
1642 _argvec[6] = (unsigned long)(arg6); \
1643 _argvec[7] = (unsigned long)(arg7); \
1644 _argvec[8] = (unsigned long)(arg8); \
1645 _argvec[9] = (unsigned long)(arg9); \
1646 _argvec[10] = (unsigned long)(arg10); \
1647 _argvec[11] = (unsigned long)(arg11); \
1648 _argvec[12] = (unsigned long)(arg12); \
1650 VALGRIND_CFI_PROLOGUE \
1651 "subq $128,%%rsp\n\t" \
1652 "pushq 96(%%rax)\n\t" \
1653 "pushq 88(%%rax)\n\t" \
1654 "pushq 80(%%rax)\n\t" \
1655 "pushq 72(%%rax)\n\t" \
1656 "pushq 64(%%rax)\n\t" \
1657 "pushq 56(%%rax)\n\t" \
1658 "movq 48(%%rax), %%r9\n\t" \
1659 "movq 40(%%rax), %%r8\n\t" \
1660 "movq 32(%%rax), %%rcx\n\t" \
1661 "movq 24(%%rax), %%rdx\n\t" \
1662 "movq 16(%%rax), %%rsi\n\t" \
1663 "movq 8(%%rax), %%rdi\n\t" \
1664 "movq (%%rax), %%rax\n\t"
\
1665 VALGRIND_CALL_NOREDIR_RAX \
1666 "addq $48, %%rsp\n" \
1667 "addq $128,%%rsp\n\t" \
1668 VALGRIND_CFI_EPILOGUE \
1670 :
"a" (&_argvec[0]) __FRAME_POINTER \
1671 :
"cc", "memory", __CALLER_SAVED_REGS, "r15" \
1673 lval = (__typeof__(lval)) _res; \
1680 #if defined(PLAT_ppc32_linux)
1706 #define __CALLER_SAVED_REGS \
1707 "lr", "ctr", "xer", \
1708 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \
1709 "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \
1715 #define CALL_FN_W_v(lval, orig) \
1717 volatile OrigFn _orig = (orig); \
1718 volatile unsigned long _argvec[1]; \
1719 volatile unsigned long _res; \
1720 _argvec[0] = (unsigned long)_orig.nraddr; \
1723 "lwz 11,0(11)\n\t"
\
1724 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1727 :
"r" (&_argvec[0]) \
1728 :
"cc", "memory", __CALLER_SAVED_REGS \
1730 lval = (__typeof__(lval)) _res; \
1733 #define CALL_FN_W_W(lval, orig, arg1) \
1735 volatile OrigFn _orig = (orig); \
1736 volatile unsigned long _argvec[2]; \
1737 volatile unsigned long _res; \
1738 _argvec[0] = (unsigned long)_orig.nraddr; \
1739 _argvec[1] = (unsigned long)arg1; \
1743 "lwz 11,0(11)\n\t" \
1744 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1747 :
"r" (&_argvec[0]) \
1748 :
"cc", "memory", __CALLER_SAVED_REGS \
1750 lval = (__typeof__(lval)) _res; \
1753 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
1755 volatile OrigFn _orig = (orig); \
1756 volatile unsigned long _argvec[3]; \
1757 volatile unsigned long _res; \
1758 _argvec[0] = (unsigned long)_orig.nraddr; \
1759 _argvec[1] = (unsigned long)arg1; \
1760 _argvec[2] = (unsigned long)arg2; \
1765 "lwz 11,0(11)\n\t"
\
1766 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1769 :
"r" (&_argvec[0]) \
1770 :
"cc", "memory", __CALLER_SAVED_REGS \
1772 lval = (__typeof__(lval)) _res; \
1775 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
1777 volatile OrigFn _orig = (orig); \
1778 volatile unsigned long _argvec[4]; \
1779 volatile unsigned long _res; \
1780 _argvec[0] = (unsigned long)_orig.nraddr; \
1781 _argvec[1] = (unsigned long)arg1; \
1782 _argvec[2] = (unsigned long)arg2; \
1783 _argvec[3] = (unsigned long)arg3; \
1788 "lwz 5,12(11)\n\t" \
1789 "lwz 11,0(11)\n\t"
\
1790 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1793 :
"r" (&_argvec[0]) \
1794 :
"cc", "memory", __CALLER_SAVED_REGS \
1796 lval = (__typeof__(lval)) _res; \
1799 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
1801 volatile OrigFn _orig = (orig); \
1802 volatile unsigned long _argvec[5]; \
1803 volatile unsigned long _res; \
1804 _argvec[0] = (unsigned long)_orig.nraddr; \
1805 _argvec[1] = (unsigned long)arg1; \
1806 _argvec[2] = (unsigned long)arg2; \
1807 _argvec[3] = (unsigned long)arg3; \
1808 _argvec[4] = (unsigned long)arg4; \
1813 "lwz 5,12(11)\n\t" \
1814 "lwz 6,16(11)\n\t"
\
1815 "lwz 11,0(11)\n\t" \
1816 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1819 :
"r" (&_argvec[0]) \
1820 :
"cc", "memory", __CALLER_SAVED_REGS \
1822 lval = (__typeof__(lval)) _res; \
1825 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
1827 volatile OrigFn _orig = (orig); \
1828 volatile unsigned long _argvec[6]; \
1829 volatile unsigned long _res; \
1830 _argvec[0] = (unsigned long)_orig.nraddr; \
1831 _argvec[1] = (unsigned long)arg1; \
1832 _argvec[2] = (unsigned long)arg2; \
1833 _argvec[3] = (unsigned long)arg3; \
1834 _argvec[4] = (unsigned long)arg4; \
1835 _argvec[5] = (unsigned long)arg5; \
1840 "lwz 5,12(11)\n\t" \
1841 "lwz 6,16(11)\n\t"
\
1842 "lwz 7,20(11)\n\t" \
1843 "lwz 11,0(11)\n\t"
\
1844 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1847 :
"r" (&_argvec[0]) \
1848 :
"cc", "memory", __CALLER_SAVED_REGS \
1850 lval = (__typeof__(lval)) _res; \
1853 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
1855 volatile OrigFn _orig = (orig); \
1856 volatile unsigned long _argvec[7]; \
1857 volatile unsigned long _res; \
1858 _argvec[0] = (unsigned long)_orig.nraddr; \
1859 _argvec[1] = (unsigned long)arg1; \
1860 _argvec[2] = (unsigned long)arg2; \
1861 _argvec[3] = (unsigned long)arg3; \
1862 _argvec[4] = (unsigned long)arg4; \
1863 _argvec[5] = (unsigned long)arg5; \
1864 _argvec[6] = (unsigned long)arg6; \
1869 "lwz 5,12(11)\n\t" \
1870 "lwz 6,16(11)\n\t"
\
1871 "lwz 7,20(11)\n\t" \
1872 "lwz 8,24(11)\n\t" \
1873 "lwz 11,0(11)\n\t"
\
1874 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1877 :
"r" (&_argvec[0]) \
1878 :
"cc", "memory", __CALLER_SAVED_REGS \
1880 lval = (__typeof__(lval)) _res; \
1883 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1886 volatile OrigFn _orig = (orig); \
1887 volatile unsigned long _argvec[8]; \
1888 volatile unsigned long _res; \
1889 _argvec[0] = (unsigned long)_orig.nraddr; \
1890 _argvec[1] = (unsigned long)arg1; \
1891 _argvec[2] = (unsigned long)arg2; \
1892 _argvec[3] = (unsigned long)arg3; \
1893 _argvec[4] = (unsigned long)arg4; \
1894 _argvec[5] = (unsigned long)arg5; \
1895 _argvec[6] = (unsigned long)arg6; \
1896 _argvec[7] = (unsigned long)arg7; \
1901 "lwz 5,12(11)\n\t" \
1902 "lwz 6,16(11)\n\t"
\
1903 "lwz 7,20(11)\n\t" \
1904 "lwz 8,24(11)\n\t" \
1905 "lwz 9,28(11)\n\t" \
1906 "lwz 11,0(11)\n\t"
\
1907 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1910 :
"r" (&_argvec[0]) \
1911 :
"cc", "memory", __CALLER_SAVED_REGS \
1913 lval = (__typeof__(lval)) _res; \
1916 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1919 volatile OrigFn _orig = (orig); \
1920 volatile unsigned long _argvec[9]; \
1921 volatile unsigned long _res; \
1922 _argvec[0] = (unsigned long)_orig.nraddr; \
1923 _argvec[1] = (unsigned long)arg1; \
1924 _argvec[2] = (unsigned long)arg2; \
1925 _argvec[3] = (unsigned long)arg3; \
1926 _argvec[4] = (unsigned long)arg4; \
1927 _argvec[5] = (unsigned long)arg5; \
1928 _argvec[6] = (unsigned long)arg6; \
1929 _argvec[7] = (unsigned long)arg7; \
1930 _argvec[8] = (unsigned long)arg8; \
1935 "lwz 5,12(11)\n\t" \
1936 "lwz 6,16(11)\n\t"
\
1937 "lwz 7,20(11)\n\t" \
1938 "lwz 8,24(11)\n\t" \
1939 "lwz 9,28(11)\n\t" \
1940 "lwz 10,32(11)\n\t"
\
1941 "lwz 11,0(11)\n\t" \
1942 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1945 :
"r" (&_argvec[0]) \
1946 :
"cc", "memory", __CALLER_SAVED_REGS \
1948 lval = (__typeof__(lval)) _res; \
1951 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1954 volatile OrigFn _orig = (orig); \
1955 volatile unsigned long _argvec[10]; \
1956 volatile unsigned long _res; \
1957 _argvec[0] = (unsigned long)_orig.nraddr; \
1958 _argvec[1] = (unsigned long)arg1; \
1959 _argvec[2] = (unsigned long)arg2; \
1960 _argvec[3] = (unsigned long)arg3; \
1961 _argvec[4] = (unsigned long)arg4; \
1962 _argvec[5] = (unsigned long)arg5; \
1963 _argvec[6] = (unsigned long)arg6; \
1964 _argvec[7] = (unsigned long)arg7; \
1965 _argvec[8] = (unsigned long)arg8; \
1966 _argvec[9] = (unsigned long)arg9; \
1969 "addi 1,1,-16\n\t" \
1971 "lwz 3,36(11)\n\t" \
1976 "lwz 5,12(11)\n\t" \
1977 "lwz 6,16(11)\n\t"
\
1978 "lwz 7,20(11)\n\t" \
1979 "lwz 8,24(11)\n\t" \
1980 "lwz 9,28(11)\n\t" \
1981 "lwz 10,32(11)\n\t"
\
1982 "lwz 11,0(11)\n\t" \
1983 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1987 :
"r" (&_argvec[0]) \
1988 :
"cc", "memory", __CALLER_SAVED_REGS \
1990 lval = (__typeof__(lval)) _res; \
1993 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1994 arg7,arg8,arg9,arg10) \
1996 volatile OrigFn _orig = (orig); \
1997 volatile unsigned long _argvec[11]; \
1998 volatile unsigned long _res; \
1999 _argvec[0] = (unsigned long)_orig.nraddr; \
2000 _argvec[1] = (unsigned long)arg1; \
2001 _argvec[2] = (unsigned long)arg2; \
2002 _argvec[3] = (unsigned long)arg3; \
2003 _argvec[4] = (unsigned long)arg4; \
2004 _argvec[5] = (unsigned long)arg5; \
2005 _argvec[6] = (unsigned long)arg6; \
2006 _argvec[7] = (unsigned long)arg7; \
2007 _argvec[8] = (unsigned long)arg8; \
2008 _argvec[9] = (unsigned long)arg9; \
2009 _argvec[10] = (unsigned long)arg10; \
2012 "addi 1,1,-16\n\t" \
2014 "lwz 3,40(11)\n\t" \
2017 "lwz 3,36(11)\n\t" \
2022 "lwz 5,12(11)\n\t" \
2023 "lwz 6,16(11)\n\t"
\
2024 "lwz 7,20(11)\n\t" \
2025 "lwz 8,24(11)\n\t" \
2026 "lwz 9,28(11)\n\t" \
2027 "lwz 10,32(11)\n\t"
\
2028 "lwz 11,0(11)\n\t" \
2029 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2033 :
"r" (&_argvec[0]) \
2034 :
"cc", "memory", __CALLER_SAVED_REGS \
2036 lval = (__typeof__(lval)) _res; \
2039 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2040 arg7,arg8,arg9,arg10,arg11) \
2042 volatile OrigFn _orig = (orig); \
2043 volatile unsigned long _argvec[12]; \
2044 volatile unsigned long _res; \
2045 _argvec[0] = (unsigned long)_orig.nraddr; \
2046 _argvec[1] = (unsigned long)arg1; \
2047 _argvec[2] = (unsigned long)arg2; \
2048 _argvec[3] = (unsigned long)arg3; \
2049 _argvec[4] = (unsigned long)arg4; \
2050 _argvec[5] = (unsigned long)arg5; \
2051 _argvec[6] = (unsigned long)arg6; \
2052 _argvec[7] = (unsigned long)arg7; \
2053 _argvec[8] = (unsigned long)arg8; \
2054 _argvec[9] = (unsigned long)arg9; \
2055 _argvec[10] = (unsigned long)arg10; \
2056 _argvec[11] = (unsigned long)arg11; \
2059 "addi 1,1,-32\n\t" \
2061 "lwz 3,44(11)\n\t" \
2064 "lwz 3,40(11)\n\t" \
2067 "lwz 3,36(11)\n\t" \
2072 "lwz 5,12(11)\n\t" \
2073 "lwz 6,16(11)\n\t"
\
2074 "lwz 7,20(11)\n\t" \
2075 "lwz 8,24(11)\n\t" \
2076 "lwz 9,28(11)\n\t" \
2077 "lwz 10,32(11)\n\t"
\
2078 "lwz 11,0(11)\n\t" \
2079 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2083 :
"r" (&_argvec[0]) \
2084 :
"cc", "memory", __CALLER_SAVED_REGS \
2086 lval = (__typeof__(lval)) _res; \
2089 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2090 arg7,arg8,arg9,arg10,arg11,arg12) \
2092 volatile OrigFn _orig = (orig); \
2093 volatile unsigned long _argvec[13]; \
2094 volatile unsigned long _res; \
2095 _argvec[0] = (unsigned long)_orig.nraddr; \
2096 _argvec[1] = (unsigned long)arg1; \
2097 _argvec[2] = (unsigned long)arg2; \
2098 _argvec[3] = (unsigned long)arg3; \
2099 _argvec[4] = (unsigned long)arg4; \
2100 _argvec[5] = (unsigned long)arg5; \
2101 _argvec[6] = (unsigned long)arg6; \
2102 _argvec[7] = (unsigned long)arg7; \
2103 _argvec[8] = (unsigned long)arg8; \
2104 _argvec[9] = (unsigned long)arg9; \
2105 _argvec[10] = (unsigned long)arg10; \
2106 _argvec[11] = (unsigned long)arg11; \
2107 _argvec[12] = (unsigned long)arg12; \
2110 "addi 1,1,-32\n\t" \
2112 "lwz 3,48(11)\n\t" \
2115 "lwz 3,44(11)\n\t" \
2118 "lwz 3,40(11)\n\t" \
2121 "lwz 3,36(11)\n\t" \
2126 "lwz 5,12(11)\n\t" \
2127 "lwz 6,16(11)\n\t"
\
2128 "lwz 7,20(11)\n\t" \
2129 "lwz 8,24(11)\n\t" \
2130 "lwz 9,28(11)\n\t" \
2131 "lwz 10,32(11)\n\t"
\
2132 "lwz 11,0(11)\n\t" \
2133 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2137 :
"r" (&_argvec[0]) \
2138 :
"cc", "memory", __CALLER_SAVED_REGS \
2140 lval = (__typeof__(lval)) _res; \
2147 #if defined(PLAT_ppc64_linux)
2152 #define __CALLER_SAVED_REGS \
2153 "lr", "ctr", "xer", \
2154 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \
2155 "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \
2161 #define CALL_FN_W_v(lval, orig) \
2163 volatile OrigFn _orig = (orig); \
2164 volatile unsigned long _argvec[3+0]; \
2165 volatile unsigned long _res; \
2167 _argvec[1] = (unsigned long)_orig.r2; \
2168 _argvec[2] = (unsigned long)_orig.nraddr; \
2171 "std 2,-16(11)\n\t"
\
2173 "ld 11, 0(11)\n\t" \
2174 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2179 :
"r" (&_argvec[2]) \
2180 :
"cc", "memory", __CALLER_SAVED_REGS \
2182 lval = (__typeof__(lval)) _res; \
2185 #define CALL_FN_W_W(lval, orig, arg1) \
2187 volatile OrigFn _orig = (orig); \
2188 volatile unsigned long _argvec[3+1]; \
2189 volatile unsigned long _res; \
2191 _argvec[1] = (unsigned long)_orig.r2; \
2192 _argvec[2] = (unsigned long)_orig.nraddr; \
2193 _argvec[2+1] = (unsigned long)arg1; \
2196 "std 2,-16(11)\n\t"
\
2199 "ld 11, 0(11)\n\t" \
2200 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2205 :
"r" (&_argvec[2]) \
2206 :
"cc", "memory", __CALLER_SAVED_REGS \
2208 lval = (__typeof__(lval)) _res; \
2211 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
2213 volatile OrigFn _orig = (orig); \
2214 volatile unsigned long _argvec[3+2]; \
2215 volatile unsigned long _res; \
2217 _argvec[1] = (unsigned long)_orig.r2; \
2218 _argvec[2] = (unsigned long)_orig.nraddr; \
2219 _argvec[2+1] = (unsigned long)arg1; \
2220 _argvec[2+2] = (unsigned long)arg2; \
2223 "std 2,-16(11)\n\t"
\
2226 "ld 4, 16(11)\n\t" \
2227 "ld 11, 0(11)\n\t" \
2228 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2233 :
"r" (&_argvec[2]) \
2234 :
"cc", "memory", __CALLER_SAVED_REGS \
2236 lval = (__typeof__(lval)) _res; \
2239 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
2241 volatile OrigFn _orig = (orig); \
2242 volatile unsigned long _argvec[3+3]; \
2243 volatile unsigned long _res; \
2245 _argvec[1] = (unsigned long)_orig.r2; \
2246 _argvec[2] = (unsigned long)_orig.nraddr; \
2247 _argvec[2+1] = (unsigned long)arg1; \
2248 _argvec[2+2] = (unsigned long)arg2; \
2249 _argvec[2+3] = (unsigned long)arg3; \
2252 "std 2,-16(11)\n\t"
\
2255 "ld 4, 16(11)\n\t" \
2256 "ld 5, 24(11)\n\t" \
2257 "ld 11, 0(11)\n\t" \
2258 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2263 :
"r" (&_argvec[2]) \
2264 :
"cc", "memory", __CALLER_SAVED_REGS \
2266 lval = (__typeof__(lval)) _res; \
2269 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
2271 volatile OrigFn _orig = (orig); \
2272 volatile unsigned long _argvec[3+4]; \
2273 volatile unsigned long _res; \
2275 _argvec[1] = (unsigned long)_orig.r2; \
2276 _argvec[2] = (unsigned long)_orig.nraddr; \
2277 _argvec[2+1] = (unsigned long)arg1; \
2278 _argvec[2+2] = (unsigned long)arg2; \
2279 _argvec[2+3] = (unsigned long)arg3; \
2280 _argvec[2+4] = (unsigned long)arg4; \
2283 "std 2,-16(11)\n\t"
\
2286 "ld 4, 16(11)\n\t" \
2287 "ld 5, 24(11)\n\t" \
2288 "ld 6, 32(11)\n\t" \
2289 "ld 11, 0(11)\n\t" \
2290 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2295 :
"r" (&_argvec[2]) \
2296 :
"cc", "memory", __CALLER_SAVED_REGS \
2298 lval = (__typeof__(lval)) _res; \
2301 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
2303 volatile OrigFn _orig = (orig); \
2304 volatile unsigned long _argvec[3+5]; \
2305 volatile unsigned long _res; \
2307 _argvec[1] = (unsigned long)_orig.r2; \
2308 _argvec[2] = (unsigned long)_orig.nraddr; \
2309 _argvec[2+1] = (unsigned long)arg1; \
2310 _argvec[2+2] = (unsigned long)arg2; \
2311 _argvec[2+3] = (unsigned long)arg3; \
2312 _argvec[2+4] = (unsigned long)arg4; \
2313 _argvec[2+5] = (unsigned long)arg5; \
2316 "std 2,-16(11)\n\t"
\
2319 "ld 4, 16(11)\n\t" \
2320 "ld 5, 24(11)\n\t" \
2321 "ld 6, 32(11)\n\t" \
2322 "ld 7, 40(11)\n\t" \
2323 "ld 11, 0(11)\n\t" \
2324 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2329 :
"r" (&_argvec[2]) \
2330 :
"cc", "memory", __CALLER_SAVED_REGS \
2332 lval = (__typeof__(lval)) _res; \
2335 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
2337 volatile OrigFn _orig = (orig); \
2338 volatile unsigned long _argvec[3+6]; \
2339 volatile unsigned long _res; \
2341 _argvec[1] = (unsigned long)_orig.r2; \
2342 _argvec[2] = (unsigned long)_orig.nraddr; \
2343 _argvec[2+1] = (unsigned long)arg1; \
2344 _argvec[2+2] = (unsigned long)arg2; \
2345 _argvec[2+3] = (unsigned long)arg3; \
2346 _argvec[2+4] = (unsigned long)arg4; \
2347 _argvec[2+5] = (unsigned long)arg5; \
2348 _argvec[2+6] = (unsigned long)arg6; \
2351 "std 2,-16(11)\n\t"
\
2354 "ld 4, 16(11)\n\t" \
2355 "ld 5, 24(11)\n\t" \
2356 "ld 6, 32(11)\n\t" \
2357 "ld 7, 40(11)\n\t" \
2358 "ld 8, 48(11)\n\t" \
2359 "ld 11, 0(11)\n\t" \
2360 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2365 :
"r" (&_argvec[2]) \
2366 :
"cc", "memory", __CALLER_SAVED_REGS \
2368 lval = (__typeof__(lval)) _res; \
2371 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2374 volatile OrigFn _orig = (orig); \
2375 volatile unsigned long _argvec[3+7]; \
2376 volatile unsigned long _res; \
2378 _argvec[1] = (unsigned long)_orig.r2; \
2379 _argvec[2] = (unsigned long)_orig.nraddr; \
2380 _argvec[2+1] = (unsigned long)arg1; \
2381 _argvec[2+2] = (unsigned long)arg2; \
2382 _argvec[2+3] = (unsigned long)arg3; \
2383 _argvec[2+4] = (unsigned long)arg4; \
2384 _argvec[2+5] = (unsigned long)arg5; \
2385 _argvec[2+6] = (unsigned long)arg6; \
2386 _argvec[2+7] = (unsigned long)arg7; \
2389 "std 2,-16(11)\n\t"
\
2392 "ld 4, 16(11)\n\t" \
2393 "ld 5, 24(11)\n\t" \
2394 "ld 6, 32(11)\n\t" \
2395 "ld 7, 40(11)\n\t" \
2396 "ld 8, 48(11)\n\t" \
2397 "ld 9, 56(11)\n\t" \
2398 "ld 11, 0(11)\n\t" \
2399 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2404 :
"r" (&_argvec[2]) \
2405 :
"cc", "memory", __CALLER_SAVED_REGS \
2407 lval = (__typeof__(lval)) _res; \
2410 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2413 volatile OrigFn _orig = (orig); \
2414 volatile unsigned long _argvec[3+8]; \
2415 volatile unsigned long _res; \
2417 _argvec[1] = (unsigned long)_orig.r2; \
2418 _argvec[2] = (unsigned long)_orig.nraddr; \
2419 _argvec[2+1] = (unsigned long)arg1; \
2420 _argvec[2+2] = (unsigned long)arg2; \
2421 _argvec[2+3] = (unsigned long)arg3; \
2422 _argvec[2+4] = (unsigned long)arg4; \
2423 _argvec[2+5] = (unsigned long)arg5; \
2424 _argvec[2+6] = (unsigned long)arg6; \
2425 _argvec[2+7] = (unsigned long)arg7; \
2426 _argvec[2+8] = (unsigned long)arg8; \
2429 "std 2,-16(11)\n\t"
\
2432 "ld 4, 16(11)\n\t" \
2433 "ld 5, 24(11)\n\t" \
2434 "ld 6, 32(11)\n\t" \
2435 "ld 7, 40(11)\n\t" \
2436 "ld 8, 48(11)\n\t" \
2437 "ld 9, 56(11)\n\t" \
2438 "ld 10, 64(11)\n\t" \
2439 "ld 11, 0(11)\n\t" \
2440 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2445 :
"r" (&_argvec[2]) \
2446 :
"cc", "memory", __CALLER_SAVED_REGS \
2448 lval = (__typeof__(lval)) _res; \
2451 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2454 volatile OrigFn _orig = (orig); \
2455 volatile unsigned long _argvec[3+9]; \
2456 volatile unsigned long _res; \
2458 _argvec[1] = (unsigned long)_orig.r2; \
2459 _argvec[2] = (unsigned long)_orig.nraddr; \
2460 _argvec[2+1] = (unsigned long)arg1; \
2461 _argvec[2+2] = (unsigned long)arg2; \
2462 _argvec[2+3] = (unsigned long)arg3; \
2463 _argvec[2+4] = (unsigned long)arg4; \
2464 _argvec[2+5] = (unsigned long)arg5; \
2465 _argvec[2+6] = (unsigned long)arg6; \
2466 _argvec[2+7] = (unsigned long)arg7; \
2467 _argvec[2+8] = (unsigned long)arg8; \
2468 _argvec[2+9] = (unsigned long)arg9; \
2471 "std 2,-16(11)\n\t"
\
2473 "addi 1,1,-128\n\t" \
2476 "std 3,112(1)\n\t" \
2479 "ld 4, 16(11)\n\t" \
2480 "ld 5, 24(11)\n\t" \
2481 "ld 6, 32(11)\n\t" \
2482 "ld 7, 40(11)\n\t" \
2483 "ld 8, 48(11)\n\t" \
2484 "ld 9, 56(11)\n\t" \
2485 "ld 10, 64(11)\n\t" \
2486 "ld 11, 0(11)\n\t" \
2487 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2490 "ld 2,-16(11)\n\t"
\
2493 :
"r" (&_argvec[2]) \
2494 :
"cc", "memory", __CALLER_SAVED_REGS \
2496 lval = (__typeof__(lval)) _res; \
2499 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2500 arg7,arg8,arg9,arg10) \
2502 volatile OrigFn _orig = (orig); \
2503 volatile unsigned long _argvec[3+10]; \
2504 volatile unsigned long _res; \
2506 _argvec[1] = (unsigned long)_orig.r2; \
2507 _argvec[2] = (unsigned long)_orig.nraddr; \
2508 _argvec[2+1] = (unsigned long)arg1; \
2509 _argvec[2+2] = (unsigned long)arg2; \
2510 _argvec[2+3] = (unsigned long)arg3; \
2511 _argvec[2+4] = (unsigned long)arg4; \
2512 _argvec[2+5] = (unsigned long)arg5; \
2513 _argvec[2+6] = (unsigned long)arg6; \
2514 _argvec[2+7] = (unsigned long)arg7; \
2515 _argvec[2+8] = (unsigned long)arg8; \
2516 _argvec[2+9] = (unsigned long)arg9; \
2517 _argvec[2+10] = (unsigned long)arg10; \
2520 "std 2,-16(11)\n\t"
\
2522 "addi 1,1,-128\n\t" \
2525 "std 3,120(1)\n\t" \
2528 "std 3,112(1)\n\t" \
2531 "ld 4, 16(11)\n\t" \
2532 "ld 5, 24(11)\n\t" \
2533 "ld 6, 32(11)\n\t" \
2534 "ld 7, 40(11)\n\t" \
2535 "ld 8, 48(11)\n\t" \
2536 "ld 9, 56(11)\n\t" \
2537 "ld 10, 64(11)\n\t" \
2538 "ld 11, 0(11)\n\t" \
2539 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2542 "ld 2,-16(11)\n\t"
\
2545 :
"r" (&_argvec[2]) \
2546 :
"cc", "memory", __CALLER_SAVED_REGS \
2548 lval = (__typeof__(lval)) _res; \
2551 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2552 arg7,arg8,arg9,arg10,arg11) \
2554 volatile OrigFn _orig = (orig); \
2555 volatile unsigned long _argvec[3+11]; \
2556 volatile unsigned long _res; \
2558 _argvec[1] = (unsigned long)_orig.r2; \
2559 _argvec[2] = (unsigned long)_orig.nraddr; \
2560 _argvec[2+1] = (unsigned long)arg1; \
2561 _argvec[2+2] = (unsigned long)arg2; \
2562 _argvec[2+3] = (unsigned long)arg3; \
2563 _argvec[2+4] = (unsigned long)arg4; \
2564 _argvec[2+5] = (unsigned long)arg5; \
2565 _argvec[2+6] = (unsigned long)arg6; \
2566 _argvec[2+7] = (unsigned long)arg7; \
2567 _argvec[2+8] = (unsigned long)arg8; \
2568 _argvec[2+9] = (unsigned long)arg9; \
2569 _argvec[2+10] = (unsigned long)arg10; \
2570 _argvec[2+11] = (unsigned long)arg11; \
2573 "std 2,-16(11)\n\t"
\
2575 "addi 1,1,-144\n\t" \
2578 "std 3,128(1)\n\t" \
2581 "std 3,120(1)\n\t" \
2584 "std 3,112(1)\n\t" \
2587 "ld 4, 16(11)\n\t" \
2588 "ld 5, 24(11)\n\t" \
2589 "ld 6, 32(11)\n\t" \
2590 "ld 7, 40(11)\n\t" \
2591 "ld 8, 48(11)\n\t" \
2592 "ld 9, 56(11)\n\t" \
2593 "ld 10, 64(11)\n\t" \
2594 "ld 11, 0(11)\n\t" \
2595 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2598 "ld 2,-16(11)\n\t"
\
2601 :
"r" (&_argvec[2]) \
2602 :
"cc", "memory", __CALLER_SAVED_REGS \
2604 lval = (__typeof__(lval)) _res; \
2607 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2608 arg7,arg8,arg9,arg10,arg11,arg12) \
2610 volatile OrigFn _orig = (orig); \
2611 volatile unsigned long _argvec[3+12]; \
2612 volatile unsigned long _res; \
2614 _argvec[1] = (unsigned long)_orig.r2; \
2615 _argvec[2] = (unsigned long)_orig.nraddr; \
2616 _argvec[2+1] = (unsigned long)arg1; \
2617 _argvec[2+2] = (unsigned long)arg2; \
2618 _argvec[2+3] = (unsigned long)arg3; \
2619 _argvec[2+4] = (unsigned long)arg4; \
2620 _argvec[2+5] = (unsigned long)arg5; \
2621 _argvec[2+6] = (unsigned long)arg6; \
2622 _argvec[2+7] = (unsigned long)arg7; \
2623 _argvec[2+8] = (unsigned long)arg8; \
2624 _argvec[2+9] = (unsigned long)arg9; \
2625 _argvec[2+10] = (unsigned long)arg10; \
2626 _argvec[2+11] = (unsigned long)arg11; \
2627 _argvec[2+12] = (unsigned long)arg12; \
2630 "std 2,-16(11)\n\t"
\
2632 "addi 1,1,-144\n\t" \
2635 "std 3,136(1)\n\t" \
2638 "std 3,128(1)\n\t" \
2641 "std 3,120(1)\n\t" \
2644 "std 3,112(1)\n\t" \
2647 "ld 4, 16(11)\n\t" \
2648 "ld 5, 24(11)\n\t" \
2649 "ld 6, 32(11)\n\t" \
2650 "ld 7, 40(11)\n\t" \
2651 "ld 8, 48(11)\n\t" \
2652 "ld 9, 56(11)\n\t" \
2653 "ld 10, 64(11)\n\t" \
2654 "ld 11, 0(11)\n\t" \
2655 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2658 "ld 2,-16(11)\n\t"
\
2661 :
"r" (&_argvec[2]) \
2662 :
"cc", "memory", __CALLER_SAVED_REGS \
2664 lval = (__typeof__(lval)) _res; \
2671 #if defined(PLAT_arm_linux)
2674 #define __CALLER_SAVED_REGS "r0", "r1", "r2", "r3","r4","r14"
2679 #define CALL_FN_W_v(lval, orig) \
2681 volatile OrigFn _orig = (orig); \
2682 volatile unsigned long _argvec[1]; \
2683 volatile unsigned long _res; \
2684 _argvec[0] = (unsigned long)_orig.nraddr; \
2686 "ldr r4, [%1] \n\t" \
2687 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
2690 :
"0" (&_argvec[0]) \
2691 :
"cc", "memory", __CALLER_SAVED_REGS \
2693 lval = (__typeof__(lval)) _res; \
2696 #define CALL_FN_W_W(lval, orig, arg1) \
2698 volatile OrigFn _orig = (orig); \
2699 volatile unsigned long _argvec[2]; \
2700 volatile unsigned long _res; \
2701 _argvec[0] = (unsigned long)_orig.nraddr; \
2702 _argvec[1] = (unsigned long)(arg1); \
2704 "ldr r0, [%1, #4] \n\t" \
2705 "ldr r4, [%1] \n\t"
\
2706 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
2709 :
"0" (&_argvec[0]) \
2710 :
"cc", "memory", __CALLER_SAVED_REGS \
2712 lval = (__typeof__(lval)) _res; \
2715 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
2717 volatile OrigFn _orig = (orig); \
2718 volatile unsigned long _argvec[3]; \
2719 volatile unsigned long _res; \
2720 _argvec[0] = (unsigned long)_orig.nraddr; \
2721 _argvec[1] = (unsigned long)(arg1); \
2722 _argvec[2] = (unsigned long)(arg2); \
2724 "ldr r0, [%1, #4] \n\t" \
2725 "ldr r1, [%1, #8] \n\t" \
2726 "ldr r4, [%1] \n\t"
\
2727 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
2730 :
"0" (&_argvec[0]) \
2731 :
"cc", "memory", __CALLER_SAVED_REGS \
2733 lval = (__typeof__(lval)) _res; \
2736 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
2738 volatile OrigFn _orig = (orig); \
2739 volatile unsigned long _argvec[4]; \
2740 volatile unsigned long _res; \
2741 _argvec[0] = (unsigned long)_orig.nraddr; \
2742 _argvec[1] = (unsigned long)(arg1); \
2743 _argvec[2] = (unsigned long)(arg2); \
2744 _argvec[3] = (unsigned long)(arg3); \
2746 "ldr r0, [%1, #4] \n\t" \
2747 "ldr r1, [%1, #8] \n\t" \
2748 "ldr r2, [%1, #12] \n\t" \
2749 "ldr r4, [%1] \n\t"
\
2750 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
2753 :
"0" (&_argvec[0]) \
2754 :
"cc", "memory", __CALLER_SAVED_REGS \
2756 lval = (__typeof__(lval)) _res; \
2759 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
2761 volatile OrigFn _orig = (orig); \
2762 volatile unsigned long _argvec[5]; \
2763 volatile unsigned long _res; \
2764 _argvec[0] = (unsigned long)_orig.nraddr; \
2765 _argvec[1] = (unsigned long)(arg1); \
2766 _argvec[2] = (unsigned long)(arg2); \
2767 _argvec[3] = (unsigned long)(arg3); \
2768 _argvec[4] = (unsigned long)(arg4); \
2770 "ldr r0, [%1, #4] \n\t" \
2771 "ldr r1, [%1, #8] \n\t" \
2772 "ldr r2, [%1, #12] \n\t" \
2773 "ldr r3, [%1, #16] \n\t" \
2774 "ldr r4, [%1] \n\t"
\
2775 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
2778 :
"0" (&_argvec[0]) \
2779 :
"cc", "memory", __CALLER_SAVED_REGS \
2781 lval = (__typeof__(lval)) _res; \
2784 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
2786 volatile OrigFn _orig = (orig); \
2787 volatile unsigned long _argvec[6]; \
2788 volatile unsigned long _res; \
2789 _argvec[0] = (unsigned long)_orig.nraddr; \
2790 _argvec[1] = (unsigned long)(arg1); \
2791 _argvec[2] = (unsigned long)(arg2); \
2792 _argvec[3] = (unsigned long)(arg3); \
2793 _argvec[4] = (unsigned long)(arg4); \
2794 _argvec[5] = (unsigned long)(arg5); \
2796 "ldr r0, [%1, #20] \n\t" \
2798 "ldr r0, [%1, #4] \n\t" \
2799 "ldr r1, [%1, #8] \n\t" \
2800 "ldr r2, [%1, #12] \n\t" \
2801 "ldr r3, [%1, #16] \n\t" \
2802 "ldr r4, [%1] \n\t"
\
2803 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
2804 "add sp, sp, #4 \n\t" \
2807 :
"0" (&_argvec[0]) \
2808 :
"cc", "memory", __CALLER_SAVED_REGS \
2810 lval = (__typeof__(lval)) _res; \
2813 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
2815 volatile OrigFn _orig = (orig); \
2816 volatile unsigned long _argvec[7]; \
2817 volatile unsigned long _res; \
2818 _argvec[0] = (unsigned long)_orig.nraddr; \
2819 _argvec[1] = (unsigned long)(arg1); \
2820 _argvec[2] = (unsigned long)(arg2); \
2821 _argvec[3] = (unsigned long)(arg3); \
2822 _argvec[4] = (unsigned long)(arg4); \
2823 _argvec[5] = (unsigned long)(arg5); \
2824 _argvec[6] = (unsigned long)(arg6); \
2826 "ldr r0, [%1, #20] \n\t" \
2827 "ldr r1, [%1, #24] \n\t" \
2828 "push {r0, r1} \n\t" \
2829 "ldr r0, [%1, #4] \n\t" \
2830 "ldr r1, [%1, #8] \n\t" \
2831 "ldr r2, [%1, #12] \n\t" \
2832 "ldr r3, [%1, #16] \n\t" \
2833 "ldr r4, [%1] \n\t"
\
2834 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
2835 "add sp, sp, #8 \n\t" \
2838 :
"0" (&_argvec[0]) \
2839 :
"cc", "memory", __CALLER_SAVED_REGS \
2841 lval = (__typeof__(lval)) _res; \
2844 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2847 volatile OrigFn _orig = (orig); \
2848 volatile unsigned long _argvec[8]; \
2849 volatile unsigned long _res; \
2850 _argvec[0] = (unsigned long)_orig.nraddr; \
2851 _argvec[1] = (unsigned long)(arg1); \
2852 _argvec[2] = (unsigned long)(arg2); \
2853 _argvec[3] = (unsigned long)(arg3); \
2854 _argvec[4] = (unsigned long)(arg4); \
2855 _argvec[5] = (unsigned long)(arg5); \
2856 _argvec[6] = (unsigned long)(arg6); \
2857 _argvec[7] = (unsigned long)(arg7); \
2859 "ldr r0, [%1, #20] \n\t" \
2860 "ldr r1, [%1, #24] \n\t" \
2861 "ldr r2, [%1, #28] \n\t" \
2862 "push {r0, r1, r2} \n\t" \
2863 "ldr r0, [%1, #4] \n\t" \
2864 "ldr r1, [%1, #8] \n\t" \
2865 "ldr r2, [%1, #12] \n\t" \
2866 "ldr r3, [%1, #16] \n\t" \
2867 "ldr r4, [%1] \n\t"
\
2868 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
2869 "add sp, sp, #12 \n\t" \
2872 :
"0" (&_argvec[0]) \
2873 :
"cc", "memory", __CALLER_SAVED_REGS \
2875 lval = (__typeof__(lval)) _res; \
2878 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2881 volatile OrigFn _orig = (orig); \
2882 volatile unsigned long _argvec[9]; \
2883 volatile unsigned long _res; \
2884 _argvec[0] = (unsigned long)_orig.nraddr; \
2885 _argvec[1] = (unsigned long)(arg1); \
2886 _argvec[2] = (unsigned long)(arg2); \
2887 _argvec[3] = (unsigned long)(arg3); \
2888 _argvec[4] = (unsigned long)(arg4); \
2889 _argvec[5] = (unsigned long)(arg5); \
2890 _argvec[6] = (unsigned long)(arg6); \
2891 _argvec[7] = (unsigned long)(arg7); \
2892 _argvec[8] = (unsigned long)(arg8); \
2894 "ldr r0, [%1, #20] \n\t" \
2895 "ldr r1, [%1, #24] \n\t" \
2896 "ldr r2, [%1, #28] \n\t" \
2897 "ldr r3, [%1, #32] \n\t" \
2898 "push {r0, r1, r2, r3} \n\t" \
2899 "ldr r0, [%1, #4] \n\t" \
2900 "ldr r1, [%1, #8] \n\t" \
2901 "ldr r2, [%1, #12] \n\t" \
2902 "ldr r3, [%1, #16] \n\t" \
2903 "ldr r4, [%1] \n\t"
\
2904 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
2905 "add sp, sp, #16 \n\t" \
2908 :
"0" (&_argvec[0]) \
2909 :
"cc", "memory", __CALLER_SAVED_REGS \
2911 lval = (__typeof__(lval)) _res; \
2914 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2917 volatile OrigFn _orig = (orig); \
2918 volatile unsigned long _argvec[10]; \
2919 volatile unsigned long _res; \
2920 _argvec[0] = (unsigned long)_orig.nraddr; \
2921 _argvec[1] = (unsigned long)(arg1); \
2922 _argvec[2] = (unsigned long)(arg2); \
2923 _argvec[3] = (unsigned long)(arg3); \
2924 _argvec[4] = (unsigned long)(arg4); \
2925 _argvec[5] = (unsigned long)(arg5); \
2926 _argvec[6] = (unsigned long)(arg6); \
2927 _argvec[7] = (unsigned long)(arg7); \
2928 _argvec[8] = (unsigned long)(arg8); \
2929 _argvec[9] = (unsigned long)(arg9); \
2931 "ldr r0, [%1, #20] \n\t" \
2932 "ldr r1, [%1, #24] \n\t" \
2933 "ldr r2, [%1, #28] \n\t" \
2934 "ldr r3, [%1, #32] \n\t" \
2935 "ldr r4, [%1, #36] \n\t" \
2936 "push {r0, r1, r2, r3, r4} \n\t" \
2937 "ldr r0, [%1, #4] \n\t" \
2938 "ldr r1, [%1, #8] \n\t" \
2939 "ldr r2, [%1, #12] \n\t" \
2940 "ldr r3, [%1, #16] \n\t" \
2941 "ldr r4, [%1] \n\t"
\
2942 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
2943 "add sp, sp, #20 \n\t" \
2946 :
"0" (&_argvec[0]) \
2947 :
"cc", "memory", __CALLER_SAVED_REGS \
2949 lval = (__typeof__(lval)) _res; \
2952 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2953 arg7,arg8,arg9,arg10) \
2955 volatile OrigFn _orig = (orig); \
2956 volatile unsigned long _argvec[11]; \
2957 volatile unsigned long _res; \
2958 _argvec[0] = (unsigned long)_orig.nraddr; \
2959 _argvec[1] = (unsigned long)(arg1); \
2960 _argvec[2] = (unsigned long)(arg2); \
2961 _argvec[3] = (unsigned long)(arg3); \
2962 _argvec[4] = (unsigned long)(arg4); \
2963 _argvec[5] = (unsigned long)(arg5); \
2964 _argvec[6] = (unsigned long)(arg6); \
2965 _argvec[7] = (unsigned long)(arg7); \
2966 _argvec[8] = (unsigned long)(arg8); \
2967 _argvec[9] = (unsigned long)(arg9); \
2968 _argvec[10] = (unsigned long)(arg10); \
2970 "ldr r0, [%1, #40] \n\t" \
2972 "ldr r0, [%1, #20] \n\t" \
2973 "ldr r1, [%1, #24] \n\t" \
2974 "ldr r2, [%1, #28] \n\t" \
2975 "ldr r3, [%1, #32] \n\t" \
2976 "ldr r4, [%1, #36] \n\t" \
2977 "push {r0, r1, r2, r3, r4} \n\t" \
2978 "ldr r0, [%1, #4] \n\t" \
2979 "ldr r1, [%1, #8] \n\t" \
2980 "ldr r2, [%1, #12] \n\t" \
2981 "ldr r3, [%1, #16] \n\t" \
2982 "ldr r4, [%1] \n\t"
\
2983 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
2984 "add sp, sp, #24 \n\t" \
2987 :
"0" (&_argvec[0]) \
2988 :
"cc", "memory", __CALLER_SAVED_REGS \
2990 lval = (__typeof__(lval)) _res; \
2993 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
2994 arg6,arg7,arg8,arg9,arg10, \
2997 volatile OrigFn _orig = (orig); \
2998 volatile unsigned long _argvec[12]; \
2999 volatile unsigned long _res; \
3000 _argvec[0] = (unsigned long)_orig.nraddr; \
3001 _argvec[1] = (unsigned long)(arg1); \
3002 _argvec[2] = (unsigned long)(arg2); \
3003 _argvec[3] = (unsigned long)(arg3); \
3004 _argvec[4] = (unsigned long)(arg4); \
3005 _argvec[5] = (unsigned long)(arg5); \
3006 _argvec[6] = (unsigned long)(arg6); \
3007 _argvec[7] = (unsigned long)(arg7); \
3008 _argvec[8] = (unsigned long)(arg8); \
3009 _argvec[9] = (unsigned long)(arg9); \
3010 _argvec[10] = (unsigned long)(arg10); \
3011 _argvec[11] = (unsigned long)(arg11); \
3013 "ldr r0, [%1, #40] \n\t" \
3014 "ldr r1, [%1, #44] \n\t" \
3015 "push {r0, r1} \n\t" \
3016 "ldr r0, [%1, #20] \n\t" \
3017 "ldr r1, [%1, #24] \n\t" \
3018 "ldr r2, [%1, #28] \n\t" \
3019 "ldr r3, [%1, #32] \n\t" \
3020 "ldr r4, [%1, #36] \n\t" \
3021 "push {r0, r1, r2, r3, r4} \n\t" \
3022 "ldr r0, [%1, #4] \n\t" \
3023 "ldr r1, [%1, #8] \n\t" \
3024 "ldr r2, [%1, #12] \n\t" \
3025 "ldr r3, [%1, #16] \n\t" \
3026 "ldr r4, [%1] \n\t"
\
3027 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
3028 "add sp, sp, #28 \n\t" \
3031 :
"0" (&_argvec[0]) \
3032 :
"cc", "memory",__CALLER_SAVED_REGS \
3034 lval = (__typeof__(lval)) _res; \
3037 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
3038 arg6,arg7,arg8,arg9,arg10, \
3041 volatile OrigFn _orig = (orig); \
3042 volatile unsigned long _argvec[13]; \
3043 volatile unsigned long _res; \
3044 _argvec[0] = (unsigned long)_orig.nraddr; \
3045 _argvec[1] = (unsigned long)(arg1); \
3046 _argvec[2] = (unsigned long)(arg2); \
3047 _argvec[3] = (unsigned long)(arg3); \
3048 _argvec[4] = (unsigned long)(arg4); \
3049 _argvec[5] = (unsigned long)(arg5); \
3050 _argvec[6] = (unsigned long)(arg6); \
3051 _argvec[7] = (unsigned long)(arg7); \
3052 _argvec[8] = (unsigned long)(arg8); \
3053 _argvec[9] = (unsigned long)(arg9); \
3054 _argvec[10] = (unsigned long)(arg10); \
3055 _argvec[11] = (unsigned long)(arg11); \
3056 _argvec[12] = (unsigned long)(arg12); \
3058 "ldr r0, [%1, #40] \n\t" \
3059 "ldr r1, [%1, #44] \n\t" \
3060 "ldr r2, [%1, #48] \n\t" \
3061 "push {r0, r1, r2} \n\t" \
3062 "ldr r0, [%1, #20] \n\t" \
3063 "ldr r1, [%1, #24] \n\t" \
3064 "ldr r2, [%1, #28] \n\t" \
3065 "ldr r3, [%1, #32] \n\t" \
3066 "ldr r4, [%1, #36] \n\t" \
3067 "push {r0, r1, r2, r3, r4} \n\t" \
3068 "ldr r0, [%1, #4] \n\t" \
3069 "ldr r1, [%1, #8] \n\t" \
3070 "ldr r2, [%1, #12] \n\t" \
3071 "ldr r3, [%1, #16] \n\t" \
3072 "ldr r4, [%1] \n\t"
\
3073 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
3074 "add sp, sp, #32 \n\t" \
3077 :
"0" (&_argvec[0]) \
3078 :
"cc", "memory", __CALLER_SAVED_REGS \
3080 lval = (__typeof__(lval)) _res; \
3087 #if defined(PLAT_s390x_linux)
3093 #if defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM)
3094 # define __FRAME_POINTER \
3095 ,"d"(__builtin_dwarf_cfa())
3096 # define VALGRIND_CFI_PROLOGUE \
3097 ".cfi_remember_state\n\t" \
3101 ".cfi_def_cfa r11, 0\n\t"
3102 # define VALGRIND_CFI_EPILOGUE \
3104 ".cfi_restore_state\n\t"
3106 # define __FRAME_POINTER
3107 # define VALGRIND_CFI_PROLOGUE \
3109 # define VALGRIND_CFI_EPILOGUE
3119 #define __CALLER_SAVED_REGS "0","1","2","3","4","5","14", \
3120 "f0","f1","f2","f3","f4","f5","f6","f7"
3123 #define CALL_FN_W_v(lval, orig) \
3125 volatile OrigFn _orig = (orig); \
3126 volatile unsigned long _argvec[1]; \
3127 volatile unsigned long _res; \
3128 _argvec[0] = (unsigned long)_orig.nraddr; \
3130 VALGRIND_CFI_PROLOGUE \
3131 "aghi 15,-160\n\t" \
3133 VALGRIND_CALL_NOREDIR_R1 \
3136 VALGRIND_CFI_EPILOGUE \
3138 :
"d" (&_argvec[0]) __FRAME_POINTER \
3139 :
"cc", "memory", __CALLER_SAVED_REGS,"7" \
3141 lval = (__typeof__(lval)) _res; \
3145 #define CALL_FN_W_W(lval, orig, arg1) \
3147 volatile OrigFn _orig = (orig); \
3148 volatile unsigned long _argvec[2]; \
3149 volatile unsigned long _res; \
3150 _argvec[0] = (unsigned long)_orig.nraddr; \
3151 _argvec[1] = (unsigned long)arg1; \
3153 VALGRIND_CFI_PROLOGUE \
3154 "aghi 15,-160\n\t" \
3157 VALGRIND_CALL_NOREDIR_R1 \
3160 VALGRIND_CFI_EPILOGUE \
3162 :
"a" (&_argvec[0]) __FRAME_POINTER \
3163 :
"cc", "memory", __CALLER_SAVED_REGS,"7" \
3165 lval = (__typeof__(lval)) _res; \
3168 #define CALL_FN_W_WW(lval, orig, arg1, arg2) \
3170 volatile OrigFn _orig = (orig); \
3171 volatile unsigned long _argvec[3]; \
3172 volatile unsigned long _res; \
3173 _argvec[0] = (unsigned long)_orig.nraddr; \
3174 _argvec[1] = (unsigned long)arg1; \
3175 _argvec[2] = (unsigned long)arg2; \
3177 VALGRIND_CFI_PROLOGUE \
3178 "aghi 15,-160\n\t" \
3182 VALGRIND_CALL_NOREDIR_R1 \
3185 VALGRIND_CFI_EPILOGUE \
3187 :
"a" (&_argvec[0]) __FRAME_POINTER \
3188 :
"cc", "memory", __CALLER_SAVED_REGS,"7" \
3190 lval = (__typeof__(lval)) _res; \
3193 #define CALL_FN_W_WWW(lval, orig, arg1, arg2, arg3) \
3195 volatile OrigFn _orig = (orig); \
3196 volatile unsigned long _argvec[4]; \
3197 volatile unsigned long _res; \
3198 _argvec[0] = (unsigned long)_orig.nraddr; \
3199 _argvec[1] = (unsigned long)arg1; \
3200 _argvec[2] = (unsigned long)arg2; \
3201 _argvec[3] = (unsigned long)arg3; \
3203 VALGRIND_CFI_PROLOGUE \
3204 "aghi 15,-160\n\t" \
3209 VALGRIND_CALL_NOREDIR_R1 \
3212 VALGRIND_CFI_EPILOGUE \
3214 :
"a" (&_argvec[0]) __FRAME_POINTER \
3215 :
"cc", "memory", __CALLER_SAVED_REGS,"7" \
3217 lval = (__typeof__(lval)) _res; \
3220 #define CALL_FN_W_WWWW(lval, orig, arg1, arg2, arg3, arg4) \
3222 volatile OrigFn _orig = (orig); \
3223 volatile unsigned long _argvec[5]; \
3224 volatile unsigned long _res; \
3225 _argvec[0] = (unsigned long)_orig.nraddr; \
3226 _argvec[1] = (unsigned long)arg1; \
3227 _argvec[2] = (unsigned long)arg2; \
3228 _argvec[3] = (unsigned long)arg3; \
3229 _argvec[4] = (unsigned long)arg4; \
3231 VALGRIND_CFI_PROLOGUE \
3232 "aghi 15,-160\n\t" \
3238 VALGRIND_CALL_NOREDIR_R1 \
3241 VALGRIND_CFI_EPILOGUE \
3243 :
"a" (&_argvec[0]) __FRAME_POINTER \
3244 :
"cc", "memory", __CALLER_SAVED_REGS,"7" \
3246 lval = (__typeof__(lval)) _res; \
3249 #define CALL_FN_W_5W(lval, orig, arg1, arg2, arg3, arg4, arg5) \
3251 volatile OrigFn _orig = (orig); \
3252 volatile unsigned long _argvec[6]; \
3253 volatile unsigned long _res; \
3254 _argvec[0] = (unsigned long)_orig.nraddr; \
3255 _argvec[1] = (unsigned long)arg1; \
3256 _argvec[2] = (unsigned long)arg2; \
3257 _argvec[3] = (unsigned long)arg3; \
3258 _argvec[4] = (unsigned long)arg4; \
3259 _argvec[5] = (unsigned long)arg5; \
3261 VALGRIND_CFI_PROLOGUE \
3262 "aghi 15,-160\n\t" \
3269 VALGRIND_CALL_NOREDIR_R1 \
3272 VALGRIND_CFI_EPILOGUE \
3274 :
"a" (&_argvec[0]) __FRAME_POINTER \
3275 :
"cc", "memory", __CALLER_SAVED_REGS,"6","7" \
3277 lval = (__typeof__(lval)) _res; \
3280 #define CALL_FN_W_6W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
3283 volatile OrigFn _orig = (orig); \
3284 volatile unsigned long _argvec[7]; \
3285 volatile unsigned long _res; \
3286 _argvec[0] = (unsigned long)_orig.nraddr; \
3287 _argvec[1] = (unsigned long)arg1; \
3288 _argvec[2] = (unsigned long)arg2; \
3289 _argvec[3] = (unsigned long)arg3; \
3290 _argvec[4] = (unsigned long)arg4; \
3291 _argvec[5] = (unsigned long)arg5; \
3292 _argvec[6] = (unsigned long)arg6; \
3294 VALGRIND_CFI_PROLOGUE \
3295 "aghi 15,-168\n\t" \
3301 "mvc 160(8,15), 48(1)\n\t" \
3303 VALGRIND_CALL_NOREDIR_R1 \
3306 VALGRIND_CFI_EPILOGUE \
3308 :
"a" (&_argvec[0]) __FRAME_POINTER \
3309 :
"cc", "memory", __CALLER_SAVED_REGS,"6","7" \
3311 lval = (__typeof__(lval)) _res; \
3314 #define CALL_FN_W_7W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
3317 volatile OrigFn _orig = (orig); \
3318 volatile unsigned long _argvec[8]; \
3319 volatile unsigned long _res; \
3320 _argvec[0] = (unsigned long)_orig.nraddr; \
3321 _argvec[1] = (unsigned long)arg1; \
3322 _argvec[2] = (unsigned long)arg2; \
3323 _argvec[3] = (unsigned long)arg3; \
3324 _argvec[4] = (unsigned long)arg4; \
3325 _argvec[5] = (unsigned long)arg5; \
3326 _argvec[6] = (unsigned long)arg6; \
3327 _argvec[7] = (unsigned long)arg7; \
3329 VALGRIND_CFI_PROLOGUE \
3330 "aghi 15,-176\n\t" \
3336 "mvc 160(8,15), 48(1)\n\t" \
3337 "mvc 168(8,15), 56(1)\n\t" \
3339 VALGRIND_CALL_NOREDIR_R1 \
3342 VALGRIND_CFI_EPILOGUE \
3344 :
"a" (&_argvec[0]) __FRAME_POINTER \
3345 :
"cc", "memory", __CALLER_SAVED_REGS,"6","7" \
3347 lval = (__typeof__(lval)) _res; \
3350 #define CALL_FN_W_8W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
3353 volatile OrigFn _orig = (orig); \
3354 volatile unsigned long _argvec[9]; \
3355 volatile unsigned long _res; \
3356 _argvec[0] = (unsigned long)_orig.nraddr; \
3357 _argvec[1] = (unsigned long)arg1; \
3358 _argvec[2] = (unsigned long)arg2; \
3359 _argvec[3] = (unsigned long)arg3; \
3360 _argvec[4] = (unsigned long)arg4; \
3361 _argvec[5] = (unsigned long)arg5; \
3362 _argvec[6] = (unsigned long)arg6; \
3363 _argvec[7] = (unsigned long)arg7; \
3364 _argvec[8] = (unsigned long)arg8; \
3366 VALGRIND_CFI_PROLOGUE \
3367 "aghi 15,-184\n\t" \
3373 "mvc 160(8,15), 48(1)\n\t" \
3374 "mvc 168(8,15), 56(1)\n\t" \
3375 "mvc 176(8,15), 64(1)\n\t" \
3377 VALGRIND_CALL_NOREDIR_R1 \
3380 VALGRIND_CFI_EPILOGUE \
3382 :
"a" (&_argvec[0]) __FRAME_POINTER \
3383 :
"cc", "memory", __CALLER_SAVED_REGS,"6","7" \
3385 lval = (__typeof__(lval)) _res; \
3388 #define CALL_FN_W_9W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
3389 arg6, arg7 ,arg8, arg9) \
3391 volatile OrigFn _orig = (orig); \
3392 volatile unsigned long _argvec[10]; \
3393 volatile unsigned long _res; \
3394 _argvec[0] = (unsigned long)_orig.nraddr; \
3395 _argvec[1] = (unsigned long)arg1; \
3396 _argvec[2] = (unsigned long)arg2; \
3397 _argvec[3] = (unsigned long)arg3; \
3398 _argvec[4] = (unsigned long)arg4; \
3399 _argvec[5] = (unsigned long)arg5; \
3400 _argvec[6] = (unsigned long)arg6; \
3401 _argvec[7] = (unsigned long)arg7; \
3402 _argvec[8] = (unsigned long)arg8; \
3403 _argvec[9] = (unsigned long)arg9; \
3405 VALGRIND_CFI_PROLOGUE \
3406 "aghi 15,-192\n\t" \
3412 "mvc 160(8,15), 48(1)\n\t" \
3413 "mvc 168(8,15), 56(1)\n\t" \
3414 "mvc 176(8,15), 64(1)\n\t" \
3415 "mvc 184(8,15), 72(1)\n\t" \
3417 VALGRIND_CALL_NOREDIR_R1 \
3420 VALGRIND_CFI_EPILOGUE \
3422 :
"a" (&_argvec[0]) __FRAME_POINTER \
3423 :
"cc", "memory", __CALLER_SAVED_REGS,"6","7" \
3425 lval = (__typeof__(lval)) _res; \
3428 #define CALL_FN_W_10W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
3429 arg6, arg7 ,arg8, arg9, arg10) \
3431 volatile OrigFn _orig = (orig); \
3432 volatile unsigned long _argvec[11]; \
3433 volatile unsigned long _res; \
3434 _argvec[0] = (unsigned long)_orig.nraddr; \
3435 _argvec[1] = (unsigned long)arg1; \
3436 _argvec[2] = (unsigned long)arg2; \
3437 _argvec[3] = (unsigned long)arg3; \
3438 _argvec[4] = (unsigned long)arg4; \
3439 _argvec[5] = (unsigned long)arg5; \
3440 _argvec[6] = (unsigned long)arg6; \
3441 _argvec[7] = (unsigned long)arg7; \
3442 _argvec[8] = (unsigned long)arg8; \
3443 _argvec[9] = (unsigned long)arg9; \
3444 _argvec[10] = (unsigned long)arg10; \
3446 VALGRIND_CFI_PROLOGUE \
3447 "aghi 15,-200\n\t" \
3453 "mvc 160(8,15), 48(1)\n\t" \
3454 "mvc 168(8,15), 56(1)\n\t" \
3455 "mvc 176(8,15), 64(1)\n\t" \
3456 "mvc 184(8,15), 72(1)\n\t" \
3457 "mvc 192(8,15), 80(1)\n\t" \
3459 VALGRIND_CALL_NOREDIR_R1 \
3462 VALGRIND_CFI_EPILOGUE \
3464 :
"a" (&_argvec[0]) __FRAME_POINTER \
3465 :
"cc", "memory", __CALLER_SAVED_REGS,"6","7" \
3467 lval = (__typeof__(lval)) _res; \
3470 #define CALL_FN_W_11W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
3471 arg6, arg7 ,arg8, arg9, arg10, arg11) \
3473 volatile OrigFn _orig = (orig); \
3474 volatile unsigned long _argvec[12]; \
3475 volatile unsigned long _res; \
3476 _argvec[0] = (unsigned long)_orig.nraddr; \
3477 _argvec[1] = (unsigned long)arg1; \
3478 _argvec[2] = (unsigned long)arg2; \
3479 _argvec[3] = (unsigned long)arg3; \
3480 _argvec[4] = (unsigned long)arg4; \
3481 _argvec[5] = (unsigned long)arg5; \
3482 _argvec[6] = (unsigned long)arg6; \
3483 _argvec[7] = (unsigned long)arg7; \
3484 _argvec[8] = (unsigned long)arg8; \
3485 _argvec[9] = (unsigned long)arg9; \
3486 _argvec[10] = (unsigned long)arg10; \
3487 _argvec[11] = (unsigned long)arg11; \
3489 VALGRIND_CFI_PROLOGUE \
3490 "aghi 15,-208\n\t" \
3496 "mvc 160(8,15), 48(1)\n\t" \
3497 "mvc 168(8,15), 56(1)\n\t" \
3498 "mvc 176(8,15), 64(1)\n\t" \
3499 "mvc 184(8,15), 72(1)\n\t" \
3500 "mvc 192(8,15), 80(1)\n\t" \
3501 "mvc 200(8,15), 88(1)\n\t" \
3503 VALGRIND_CALL_NOREDIR_R1 \
3506 VALGRIND_CFI_EPILOGUE \
3508 :
"a" (&_argvec[0]) __FRAME_POINTER \
3509 :
"cc", "memory", __CALLER_SAVED_REGS,"6","7" \
3511 lval = (__typeof__(lval)) _res; \
3514 #define CALL_FN_W_12W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
3515 arg6, arg7 ,arg8, arg9, arg10, arg11, arg12)\
3517 volatile OrigFn _orig = (orig); \
3518 volatile unsigned long _argvec[13]; \
3519 volatile unsigned long _res; \
3520 _argvec[0] = (unsigned long)_orig.nraddr; \
3521 _argvec[1] = (unsigned long)arg1; \
3522 _argvec[2] = (unsigned long)arg2; \
3523 _argvec[3] = (unsigned long)arg3; \
3524 _argvec[4] = (unsigned long)arg4; \
3525 _argvec[5] = (unsigned long)arg5; \
3526 _argvec[6] = (unsigned long)arg6; \
3527 _argvec[7] = (unsigned long)arg7; \
3528 _argvec[8] = (unsigned long)arg8; \
3529 _argvec[9] = (unsigned long)arg9; \
3530 _argvec[10] = (unsigned long)arg10; \
3531 _argvec[11] = (unsigned long)arg11; \
3532 _argvec[12] = (unsigned long)arg12; \
3534 VALGRIND_CFI_PROLOGUE \
3535 "aghi 15,-216\n\t" \
3541 "mvc 160(8,15), 48(1)\n\t" \
3542 "mvc 168(8,15), 56(1)\n\t" \
3543 "mvc 176(8,15), 64(1)\n\t" \
3544 "mvc 184(8,15), 72(1)\n\t" \
3545 "mvc 192(8,15), 80(1)\n\t" \
3546 "mvc 200(8,15), 88(1)\n\t" \
3547 "mvc 208(8,15), 96(1)\n\t" \
3549 VALGRIND_CALL_NOREDIR_R1 \
3552 VALGRIND_CFI_EPILOGUE \
3554 :
"a" (&_argvec[0]) __FRAME_POINTER \
3555 :
"cc", "memory", __CALLER_SAVED_REGS,"6","7" \
3557 lval = (__typeof__(lval)) _res; \
3579 #define VG_USERREQ_TOOL_BASE(a,b) \
3580 ((unsigned int)(((a)&0xff) << 24 | ((b)&0xff) << 16))
3581 #define VG_IS_TOOL_USERREQ(a, b, v) \
3582 (VG_USERREQ_TOOL_BASE(a,b) == ((v) & 0xffff0000))
3651 #if !defined(__GNUC__)
3652 # define __extension__
3660 #define RUNNING_ON_VALGRIND \
3661 (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0 , \
3662 VG_USERREQ__RUNNING_ON_VALGRIND, \
3670 #define VALGRIND_DISCARD_TRANSLATIONS(_qzz_addr,_qzz_len) \
3671 (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
3672 VG_USERREQ__DISCARD_TRANSLATIONS, \
3673 _qzz_addr, _qzz_len, 0, 0, 0)
3681 #if defined(__GNUC__) || defined(__INTEL_COMPILER)
3685 __attribute__((format(__printf__, 1, 2), __unused__));
3688 #if defined(_MSC_VER)
3693 #if defined(NVALGRIND)
3696 #if defined(_MSC_VER)
3699 unsigned long _qzz_res;
3702 va_start(vargs, format);
3703 #if defined(_MSC_VER)
3712 (
unsigned long)format,
3713 (
unsigned long)&vargs,
3717 return (
int)_qzz_res;
3721 #if defined(__GNUC__) || defined(__INTEL_COMPILER)
3723 __attribute__((format(__printf__, 1, 2), __unused__));
3726 #if defined(_MSC_VER)
3731 #if defined(NVALGRIND)
3734 #if defined(_MSC_VER)
3737 unsigned long _qzz_res;
3740 va_start(vargs, format);
3741 #if defined(_MSC_VER)
3750 (
unsigned long)format,
3751 (
unsigned long)&vargs,
3755 return (
int)_qzz_res;
3783 #define VALGRIND_NON_SIMD_CALL0(_qyy_fn) \
3784 VALGRIND_DO_CLIENT_REQUEST_EXPR(0 , \
3785 VG_USERREQ__CLIENT_CALL0, \
3789 #define VALGRIND_NON_SIMD_CALL1(_qyy_fn, _qyy_arg1) \
3790 VALGRIND_DO_CLIENT_REQUEST_EXPR(0 , \
3791 VG_USERREQ__CLIENT_CALL1, \
3795 #define VALGRIND_NON_SIMD_CALL2(_qyy_fn, _qyy_arg1, _qyy_arg2) \
3796 VALGRIND_DO_CLIENT_REQUEST_EXPR(0 , \
3797 VG_USERREQ__CLIENT_CALL2, \
3799 _qyy_arg1, _qyy_arg2, 0, 0)
3801 #define VALGRIND_NON_SIMD_CALL3(_qyy_fn, _qyy_arg1, _qyy_arg2, _qyy_arg3) \
3802 VALGRIND_DO_CLIENT_REQUEST_EXPR(0 , \
3803 VG_USERREQ__CLIENT_CALL3, \
3805 _qyy_arg1, _qyy_arg2, \
3812 #define VALGRIND_COUNT_ERRORS \
3813 (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR( \
3815 VG_USERREQ__COUNT_ERRORS, \
3919 #define VALGRIND_MALLOCLIKE_BLOCK(addr, sizeB, rzB, is_zeroed) \
3920 VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
3921 VG_USERREQ__MALLOCLIKE_BLOCK, \
3922 addr, sizeB, rzB, is_zeroed, 0)
3927 #define VALGRIND_RESIZEINPLACE_BLOCK(addr, oldSizeB, newSizeB, rzB) \
3928 VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
3929 VG_USERREQ__RESIZEINPLACE_BLOCK, \
3930 addr, oldSizeB, newSizeB, rzB, 0)
3935 #define VALGRIND_FREELIKE_BLOCK(addr, rzB) \
3936 VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
3937 VG_USERREQ__FREELIKE_BLOCK, \
3941 #define VALGRIND_CREATE_MEMPOOL(pool, rzB, is_zeroed) \
3942 VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
3943 VG_USERREQ__CREATE_MEMPOOL, \
3944 pool, rzB, is_zeroed, 0, 0)
3947 #define VALGRIND_DESTROY_MEMPOOL(pool) \
3948 VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
3949 VG_USERREQ__DESTROY_MEMPOOL, \
3953 #define VALGRIND_MEMPOOL_ALLOC(pool, addr, size) \
3954 VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
3955 VG_USERREQ__MEMPOOL_ALLOC, \
3956 pool, addr, size, 0, 0)
3959 #define VALGRIND_MEMPOOL_FREE(pool, addr) \
3960 VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
3961 VG_USERREQ__MEMPOOL_FREE, \
3962 pool, addr, 0, 0, 0)
3965 #define VALGRIND_MEMPOOL_TRIM(pool, addr, size) \
3966 VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
3967 VG_USERREQ__MEMPOOL_TRIM, \
3968 pool, addr, size, 0, 0)
3971 #define VALGRIND_MOVE_MEMPOOL(poolA, poolB) \
3972 VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
3973 VG_USERREQ__MOVE_MEMPOOL, \
3974 poolA, poolB, 0, 0, 0)
3977 #define VALGRIND_MEMPOOL_CHANGE(pool, addrA, addrB, size) \
3978 VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
3979 VG_USERREQ__MEMPOOL_CHANGE, \
3980 pool, addrA, addrB, size, 0)
3983 #define VALGRIND_MEMPOOL_EXISTS(pool) \
3984 (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
3985 VG_USERREQ__MEMPOOL_EXISTS, \
3989 #define VALGRIND_STACK_REGISTER(start, end) \
3990 (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
3991 VG_USERREQ__STACK_REGISTER, \
3992 start, end, 0, 0, 0)
3996 #define VALGRIND_STACK_DEREGISTER(id) \
3997 (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
3998 VG_USERREQ__STACK_DEREGISTER, \
4002 #define VALGRIND_STACK_CHANGE(id, start, end) \
4003 VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
4004 VG_USERREQ__STACK_CHANGE, \
4005 id, start, end, 0, 0)
4008 #define VALGRIND_LOAD_PDB_DEBUGINFO(fd, ptr, total_size, delta) \
4009 VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
4010 VG_USERREQ__LOAD_PDB_DEBUGINFO, \
4011 fd, ptr, total_size, delta, 0)
4017 #define VALGRIND_MAP_IP_TO_SRCLOC(addr, buf64) \
4018 (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
4019 VG_USERREQ__MAP_IP_TO_SRCLOC, \
4020 addr, buf64, 0, 0, 0)
4023 #undef PLAT_x86_darwin
4024 #undef PLAT_amd64_darwin
4025 #undef PLAT_x86_win32
4026 #undef PLAT_x86_linux
4027 #undef PLAT_amd64_linux
4028 #undef PLAT_ppc32_linux
4029 #undef PLAT_ppc64_linux
4030 #undef PLAT_arm_linux
4031 #undef PLAT_s390x_linux
static int VALGRIND_PRINTF_BACKTRACE(const char *format,...)
@ VG_USERREQ__DESTROY_MEMPOOL
@ VG_USERREQ__MAP_IP_TO_SRCLOC
@ VG_USERREQ__LOAD_PDB_DEBUGINFO
@ VG_USERREQ__PRINTF_BACKTRACE
@ VG_USERREQ__GDB_MONITOR_COMMAND
@ VG_USERREQ__MEMPOOL_ALLOC
@ VG_USERREQ__RESIZEINPLACE_BLOCK
@ VG_USERREQ__MALLOCLIKE_BLOCK
@ VG_USERREQ__COUNT_ERRORS
@ VG_USERREQ__STACK_REGISTER
@ VG_USERREQ__MEMPOOL_CHANGE
@ VG_USERREQ__PRINTF_VALIST_BY_REF
@ VG_USERREQ__RUNNING_ON_VALGRIND
@ VG_USERREQ__CLIENT_CALL0
@ VG_USERREQ__DISCARD_TRANSLATIONS
@ VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF
@ VG_USERREQ__FREELIKE_BLOCK
@ VG_USERREQ__CREATE_MEMPOOL
@ VG_USERREQ__MOVE_MEMPOOL
@ VG_USERREQ__CLIENT_CALL3
@ VG_USERREQ__MEMPOOL_TRIM
@ VG_USERREQ__CLIENT_CALL2
@ VG_USERREQ__STACK_CHANGE
@ VG_USERREQ__STACK_DEREGISTER
@ VG_USERREQ__MEMPOOL_FREE
@ VG_USERREQ__MEMPOOL_EXISTS
@ VG_USERREQ__CLIENT_CALL1
static int VALGRIND_PRINTF(const char *format,...)
#define VALGRIND_DO_CLIENT_REQUEST_EXPR( _zzq_default, _zzq_request, _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)