90#undef PLAT_amd64_linux
91#undef PLAT_ppc32_linux
92#undef PLAT_ppc64_linux
96#if !defined(_AIX) && defined(__i386__)
97# define PLAT_x86_linux 1
98#elif !defined(_AIX) && defined(__x86_64__)
99# define PLAT_amd64_linux 1
100#elif !defined(_AIX) && defined(__powerpc__) && !defined(__powerpc64__)
101# define PLAT_ppc32_linux 1
102#elif !defined(_AIX) && defined(__powerpc__) && defined(__powerpc64__)
103# define PLAT_ppc64_linux 1
104#elif defined(_AIX) && defined(__64BIT__)
105# define PLAT_ppc64_aix5 1
106#elif defined(_AIX) && !defined(__64BIT__)
107# define PLAT_ppc32_aix5 1
113#if !defined(PLAT_x86_linux) && !defined(PLAT_amd64_linux) \
114 && !defined(PLAT_ppc32_linux) && !defined(PLAT_ppc64_linux) \
115 && !defined(PLAT_ppc32_aix5) && !defined(PLAT_ppc64_aix5)
116# if !defined(NVALGRIND)
127#if defined(NVALGRIND)
132#define VALGRIND_DO_CLIENT_REQUEST( \
133 _zzq_rlval, _zzq_default, _zzq_request, \
134 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
136 (_zzq_rlval) = (_zzq_default); \
178#if defined(PLAT_x86_linux)
186#define __SPECIAL_INSTRUCTION_PREAMBLE \
187 "roll $3, %%edi ; roll $13, %%edi\n\t" \
188 "roll $29, %%edi ; roll $19, %%edi\n\t"
190#define VALGRIND_DO_CLIENT_REQUEST( \
191 _zzq_rlval, _zzq_default, _zzq_request, \
192 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
193 { volatile unsigned int _zzq_args[6]; \
194 volatile unsigned int _zzq_result; \
195 _zzq_args[0] = (unsigned int)(_zzq_request); \
196 _zzq_args[1] = (unsigned int)(_zzq_arg1); \
197 _zzq_args[2] = (unsigned int)(_zzq_arg2); \
198 _zzq_args[3] = (unsigned int)(_zzq_arg3); \
199 _zzq_args[4] = (unsigned int)(_zzq_arg4); \
200 _zzq_args[5] = (unsigned int)(_zzq_arg5); \
201 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
203 "xchgl %%ebx,%%ebx" \
204 : "=d" (_zzq_result) \
205 : "a" (&_zzq_args[0]), "0" (_zzq_default) \
208 _zzq_rlval = _zzq_result; \
211#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
212 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
213 volatile unsigned int __addr; \
214 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
216 "xchgl %%ecx,%%ecx" \
221 _zzq_orig->nraddr = __addr; \
224#define VALGRIND_CALL_NOREDIR_EAX \
225 __SPECIAL_INSTRUCTION_PREAMBLE \
227 "xchgl %%edx,%%edx\n\t"
232#if defined(PLAT_amd64_linux)
236 unsigned long long int nraddr;
240#define __SPECIAL_INSTRUCTION_PREAMBLE \
241 "rolq $3, %%rdi ; rolq $13, %%rdi\n\t" \
242 "rolq $61, %%rdi ; rolq $51, %%rdi\n\t"
244#define VALGRIND_DO_CLIENT_REQUEST( \
245 _zzq_rlval, _zzq_default, _zzq_request, \
246 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
247 { volatile unsigned long long int _zzq_args[6]; \
248 volatile unsigned long long int _zzq_result; \
249 _zzq_args[0] = (unsigned long long int)(_zzq_request); \
250 _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \
251 _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \
252 _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \
253 _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \
254 _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \
255 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
257 "xchgq %%rbx,%%rbx" \
258 : "=d" (_zzq_result) \
259 : "a" (&_zzq_args[0]), "0" (_zzq_default) \
262 _zzq_rlval = _zzq_result; \
265#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
266 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
267 volatile unsigned long long int __addr; \
268 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
270 "xchgq %%rcx,%%rcx" \
275 _zzq_orig->nraddr = __addr; \
278#define VALGRIND_CALL_NOREDIR_RAX \
279 __SPECIAL_INSTRUCTION_PREAMBLE \
281 "xchgq %%rdx,%%rdx\n\t"
286#if defined(PLAT_ppc32_linux)
294#define __SPECIAL_INSTRUCTION_PREAMBLE \
295 "rlwinm 0,0,3,0,0 ; rlwinm 0,0,13,0,0\n\t" \
296 "rlwinm 0,0,29,0,0 ; rlwinm 0,0,19,0,0\n\t"
298#define VALGRIND_DO_CLIENT_REQUEST( \
299 _zzq_rlval, _zzq_default, _zzq_request, \
300 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
302 { unsigned int _zzq_args[6]; \
303 unsigned int _zzq_result; \
304 unsigned int* _zzq_ptr; \
305 _zzq_args[0] = (unsigned int)(_zzq_request); \
306 _zzq_args[1] = (unsigned int)(_zzq_arg1); \
307 _zzq_args[2] = (unsigned int)(_zzq_arg2); \
308 _zzq_args[3] = (unsigned int)(_zzq_arg3); \
309 _zzq_args[4] = (unsigned int)(_zzq_arg4); \
310 _zzq_args[5] = (unsigned int)(_zzq_arg5); \
311 _zzq_ptr = _zzq_args; \
312 __asm__ volatile("mr 3,%1\n\t" \
314 __SPECIAL_INSTRUCTION_PREAMBLE \
318 : "=b" (_zzq_result) \
319 : "b" (_zzq_default), "b" (_zzq_ptr) \
320 : "cc", "memory", "r3", "r4"); \
321 _zzq_rlval = _zzq_result; \
324#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
325 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
326 unsigned int __addr; \
327 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
333 : "cc", "memory", "r3" \
335 _zzq_orig->nraddr = __addr; \
338#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
339 __SPECIAL_INSTRUCTION_PREAMBLE \
346#if defined(PLAT_ppc64_linux)
350 unsigned long long int nraddr;
351 unsigned long long int r2;
355#define __SPECIAL_INSTRUCTION_PREAMBLE \
356 "rotldi 0,0,3 ; rotldi 0,0,13\n\t" \
357 "rotldi 0,0,61 ; rotldi 0,0,51\n\t"
359#define VALGRIND_DO_CLIENT_REQUEST( \
360 _zzq_rlval, _zzq_default, _zzq_request, \
361 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
363 { unsigned long long int _zzq_args[6]; \
364 register unsigned long long int _zzq_result __asm__("r3"); \
365 register unsigned long long int* _zzq_ptr __asm__("r4"); \
366 _zzq_args[0] = (unsigned long long int)(_zzq_request); \
367 _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \
368 _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \
369 _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \
370 _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \
371 _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \
372 _zzq_ptr = _zzq_args; \
373 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
376 : "=r" (_zzq_result) \
377 : "0" (_zzq_default), "r" (_zzq_ptr) \
379 _zzq_rlval = _zzq_result; \
382#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
383 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
384 register unsigned long long int __addr __asm__("r3"); \
385 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
392 _zzq_orig->nraddr = __addr; \
393 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
400 _zzq_orig->r2 = __addr; \
403#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
404 __SPECIAL_INSTRUCTION_PREAMBLE \
412#if defined(PLAT_ppc32_aix5)
421#define __SPECIAL_INSTRUCTION_PREAMBLE \
422 "rlwinm 0,0,3,0,0 ; rlwinm 0,0,13,0,0\n\t" \
423 "rlwinm 0,0,29,0,0 ; rlwinm 0,0,19,0,0\n\t"
425#define VALGRIND_DO_CLIENT_REQUEST( \
426 _zzq_rlval, _zzq_default, _zzq_request, \
427 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
429 { unsigned int _zzq_args[7]; \
430 register unsigned int _zzq_result; \
431 register unsigned int* _zzq_ptr; \
432 _zzq_args[0] = (unsigned int)(_zzq_request); \
433 _zzq_args[1] = (unsigned int)(_zzq_arg1); \
434 _zzq_args[2] = (unsigned int)(_zzq_arg2); \
435 _zzq_args[3] = (unsigned int)(_zzq_arg3); \
436 _zzq_args[4] = (unsigned int)(_zzq_arg4); \
437 _zzq_args[5] = (unsigned int)(_zzq_arg5); \
438 _zzq_args[6] = (unsigned int)(_zzq_default); \
439 _zzq_ptr = _zzq_args; \
440 __asm__ volatile("mr 4,%1\n\t" \
442 __SPECIAL_INSTRUCTION_PREAMBLE \
446 : "=b" (_zzq_result) \
448 : "r3", "r4", "cc", "memory"); \
449 _zzq_rlval = _zzq_result; \
452#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
453 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
454 register unsigned int __addr; \
455 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
461 : "r3", "cc", "memory" \
463 _zzq_orig->nraddr = __addr; \
464 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
470 : "r3", "cc", "memory" \
472 _zzq_orig->r2 = __addr; \
475#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
476 __SPECIAL_INSTRUCTION_PREAMBLE \
484#if defined(PLAT_ppc64_aix5)
488 unsigned long long int nraddr;
489 unsigned long long int r2;
493#define __SPECIAL_INSTRUCTION_PREAMBLE \
494 "rotldi 0,0,3 ; rotldi 0,0,13\n\t" \
495 "rotldi 0,0,61 ; rotldi 0,0,51\n\t"
497#define VALGRIND_DO_CLIENT_REQUEST( \
498 _zzq_rlval, _zzq_default, _zzq_request, \
499 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
501 { unsigned long long int _zzq_args[7]; \
502 register unsigned long long int _zzq_result; \
503 register unsigned long long int* _zzq_ptr; \
504 _zzq_args[0] = (unsigned int long long)(_zzq_request); \
505 _zzq_args[1] = (unsigned int long long)(_zzq_arg1); \
506 _zzq_args[2] = (unsigned int long long)(_zzq_arg2); \
507 _zzq_args[3] = (unsigned int long long)(_zzq_arg3); \
508 _zzq_args[4] = (unsigned int long long)(_zzq_arg4); \
509 _zzq_args[5] = (unsigned int long long)(_zzq_arg5); \
510 _zzq_args[6] = (unsigned int long long)(_zzq_default); \
511 _zzq_ptr = _zzq_args; \
512 __asm__ volatile("mr 4,%1\n\t" \
514 __SPECIAL_INSTRUCTION_PREAMBLE \
518 : "=b" (_zzq_result) \
520 : "r3", "r4", "cc", "memory"); \
521 _zzq_rlval = _zzq_result; \
524#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
525 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
526 register unsigned long long int __addr; \
527 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
533 : "r3", "cc", "memory" \
535 _zzq_orig->nraddr = __addr; \
536 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
542 : "r3", "cc", "memory" \
544 _zzq_orig->r2 = __addr; \
547#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
548 __SPECIAL_INSTRUCTION_PREAMBLE \
585#define I_WRAP_SONAME_FNNAME_ZU(soname,fnname) \
586 _vgwZU_##soname##_##fnname
588#define I_WRAP_SONAME_FNNAME_ZZ(soname,fnname) \
589 _vgwZZ_##soname##_##fnname
595#define VALGRIND_GET_ORIG_FN(_lval) VALGRIND_GET_NR_CONTEXT(_lval)
600#define CALL_FN_v_v(fnptr) \
601 do { volatile unsigned long _junk; \
602 CALL_FN_W_v(_junk,fnptr); } while (0)
604#define CALL_FN_v_W(fnptr, arg1) \
605 do { volatile unsigned long _junk; \
606 CALL_FN_W_W(_junk,fnptr,arg1); } while (0)
608#define CALL_FN_v_WW(fnptr, arg1,arg2) \
609 do { volatile unsigned long _junk; \
610 CALL_FN_W_WW(_junk,fnptr,arg1,arg2); } while (0)
612#define CALL_FN_v_WWW(fnptr, arg1,arg2,arg3) \
613 do { volatile unsigned long _junk; \
614 CALL_FN_W_WWW(_junk,fnptr,arg1,arg2,arg3); } while (0)
618#if defined(PLAT_x86_linux)
622#define __CALLER_SAVED_REGS "ecx", "edx"
627#define CALL_FN_W_v(lval, orig) \
629 volatile OrigFn _orig = (orig); \
630 volatile unsigned long _argvec[1]; \
631 volatile unsigned long _res; \
632 _argvec[0] = (unsigned long)_orig.nraddr; \
634 "movl (%%eax), %%eax\n\t" \
635 VALGRIND_CALL_NOREDIR_EAX \
637 :
"a" (&_argvec[0]) \
638 :
"cc", "memory", __CALLER_SAVED_REGS \
640 lval = (__typeof__(lval)) _res; \
643#define CALL_FN_W_W(lval, orig, arg1) \
645 volatile OrigFn _orig = (orig); \
646 volatile unsigned long _argvec[2]; \
647 volatile unsigned long _res; \
648 _argvec[0] = (unsigned long)_orig.nraddr; \
649 _argvec[1] = (unsigned long)(arg1); \
651 "pushl 4(%%eax)\n\t" \
652 "movl (%%eax), %%eax\n\t"
\
653 VALGRIND_CALL_NOREDIR_EAX \
656 :
"a" (&_argvec[0]) \
657 :
"cc", "memory", __CALLER_SAVED_REGS \
659 lval = (__typeof__(lval)) _res; \
662#define CALL_FN_W_WW(lval, orig, arg1,arg2) \
664 volatile OrigFn _orig = (orig); \
665 volatile unsigned long _argvec[3]; \
666 volatile unsigned long _res; \
667 _argvec[0] = (unsigned long)_orig.nraddr; \
668 _argvec[1] = (unsigned long)(arg1); \
669 _argvec[2] = (unsigned long)(arg2); \
671 "pushl 8(%%eax)\n\t" \
672 "pushl 4(%%eax)\n\t" \
673 "movl (%%eax), %%eax\n\t"
\
674 VALGRIND_CALL_NOREDIR_EAX \
677 :
"a" (&_argvec[0]) \
678 :
"cc", "memory", __CALLER_SAVED_REGS \
680 lval = (__typeof__(lval)) _res; \
683#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
685 volatile OrigFn _orig = (orig); \
686 volatile unsigned long _argvec[4]; \
687 volatile unsigned long _res; \
688 _argvec[0] = (unsigned long)_orig.nraddr; \
689 _argvec[1] = (unsigned long)(arg1); \
690 _argvec[2] = (unsigned long)(arg2); \
691 _argvec[3] = (unsigned long)(arg3); \
693 "pushl 12(%%eax)\n\t" \
694 "pushl 8(%%eax)\n\t" \
695 "pushl 4(%%eax)\n\t" \
696 "movl (%%eax), %%eax\n\t"
\
697 VALGRIND_CALL_NOREDIR_EAX \
698 "addl $12, %%esp\n" \
700 :
"a" (&_argvec[0]) \
701 :
"cc", "memory", __CALLER_SAVED_REGS \
703 lval = (__typeof__(lval)) _res; \
706#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
708 volatile OrigFn _orig = (orig); \
709 volatile unsigned long _argvec[5]; \
710 volatile unsigned long _res; \
711 _argvec[0] = (unsigned long)_orig.nraddr; \
712 _argvec[1] = (unsigned long)(arg1); \
713 _argvec[2] = (unsigned long)(arg2); \
714 _argvec[3] = (unsigned long)(arg3); \
715 _argvec[4] = (unsigned long)(arg4); \
717 "pushl 16(%%eax)\n\t" \
718 "pushl 12(%%eax)\n\t" \
719 "pushl 8(%%eax)\n\t" \
720 "pushl 4(%%eax)\n\t" \
721 "movl (%%eax), %%eax\n\t"
\
722 VALGRIND_CALL_NOREDIR_EAX \
723 "addl $16, %%esp\n" \
725 :
"a" (&_argvec[0]) \
726 :
"cc", "memory", __CALLER_SAVED_REGS \
728 lval = (__typeof__(lval)) _res; \
731#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
733 volatile OrigFn _orig = (orig); \
734 volatile unsigned long _argvec[6]; \
735 volatile unsigned long _res; \
736 _argvec[0] = (unsigned long)_orig.nraddr; \
737 _argvec[1] = (unsigned long)(arg1); \
738 _argvec[2] = (unsigned long)(arg2); \
739 _argvec[3] = (unsigned long)(arg3); \
740 _argvec[4] = (unsigned long)(arg4); \
741 _argvec[5] = (unsigned long)(arg5); \
743 "pushl 20(%%eax)\n\t" \
744 "pushl 16(%%eax)\n\t" \
745 "pushl 12(%%eax)\n\t" \
746 "pushl 8(%%eax)\n\t" \
747 "pushl 4(%%eax)\n\t" \
748 "movl (%%eax), %%eax\n\t"
\
749 VALGRIND_CALL_NOREDIR_EAX \
750 "addl $20, %%esp\n" \
752 :
"a" (&_argvec[0]) \
753 :
"cc", "memory", __CALLER_SAVED_REGS \
755 lval = (__typeof__(lval)) _res; \
758#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
760 volatile OrigFn _orig = (orig); \
761 volatile unsigned long _argvec[7]; \
762 volatile unsigned long _res; \
763 _argvec[0] = (unsigned long)_orig.nraddr; \
764 _argvec[1] = (unsigned long)(arg1); \
765 _argvec[2] = (unsigned long)(arg2); \
766 _argvec[3] = (unsigned long)(arg3); \
767 _argvec[4] = (unsigned long)(arg4); \
768 _argvec[5] = (unsigned long)(arg5); \
769 _argvec[6] = (unsigned long)(arg6); \
771 "pushl 24(%%eax)\n\t" \
772 "pushl 20(%%eax)\n\t" \
773 "pushl 16(%%eax)\n\t" \
774 "pushl 12(%%eax)\n\t" \
775 "pushl 8(%%eax)\n\t" \
776 "pushl 4(%%eax)\n\t" \
777 "movl (%%eax), %%eax\n\t"
\
778 VALGRIND_CALL_NOREDIR_EAX \
779 "addl $24, %%esp\n" \
781 :
"a" (&_argvec[0]) \
782 :
"cc", "memory", __CALLER_SAVED_REGS \
784 lval = (__typeof__(lval)) _res; \
787#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
790 volatile OrigFn _orig = (orig); \
791 volatile unsigned long _argvec[8]; \
792 volatile unsigned long _res; \
793 _argvec[0] = (unsigned long)_orig.nraddr; \
794 _argvec[1] = (unsigned long)(arg1); \
795 _argvec[2] = (unsigned long)(arg2); \
796 _argvec[3] = (unsigned long)(arg3); \
797 _argvec[4] = (unsigned long)(arg4); \
798 _argvec[5] = (unsigned long)(arg5); \
799 _argvec[6] = (unsigned long)(arg6); \
800 _argvec[7] = (unsigned long)(arg7); \
802 "pushl 28(%%eax)\n\t" \
803 "pushl 24(%%eax)\n\t" \
804 "pushl 20(%%eax)\n\t" \
805 "pushl 16(%%eax)\n\t" \
806 "pushl 12(%%eax)\n\t" \
807 "pushl 8(%%eax)\n\t" \
808 "pushl 4(%%eax)\n\t" \
809 "movl (%%eax), %%eax\n\t"
\
810 VALGRIND_CALL_NOREDIR_EAX \
811 "addl $28, %%esp\n" \
813 :
"a" (&_argvec[0]) \
814 :
"cc", "memory", __CALLER_SAVED_REGS \
816 lval = (__typeof__(lval)) _res; \
819#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
822 volatile OrigFn _orig = (orig); \
823 volatile unsigned long _argvec[9]; \
824 volatile unsigned long _res; \
825 _argvec[0] = (unsigned long)_orig.nraddr; \
826 _argvec[1] = (unsigned long)(arg1); \
827 _argvec[2] = (unsigned long)(arg2); \
828 _argvec[3] = (unsigned long)(arg3); \
829 _argvec[4] = (unsigned long)(arg4); \
830 _argvec[5] = (unsigned long)(arg5); \
831 _argvec[6] = (unsigned long)(arg6); \
832 _argvec[7] = (unsigned long)(arg7); \
833 _argvec[8] = (unsigned long)(arg8); \
835 "pushl 32(%%eax)\n\t" \
836 "pushl 28(%%eax)\n\t" \
837 "pushl 24(%%eax)\n\t" \
838 "pushl 20(%%eax)\n\t" \
839 "pushl 16(%%eax)\n\t" \
840 "pushl 12(%%eax)\n\t" \
841 "pushl 8(%%eax)\n\t" \
842 "pushl 4(%%eax)\n\t" \
843 "movl (%%eax), %%eax\n\t"
\
844 VALGRIND_CALL_NOREDIR_EAX \
845 "addl $32, %%esp\n" \
847 :
"a" (&_argvec[0]) \
848 :
"cc", "memory", __CALLER_SAVED_REGS \
850 lval = (__typeof__(lval)) _res; \
853#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
856 volatile OrigFn _orig = (orig); \
857 volatile unsigned long _argvec[10]; \
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); \
865 _argvec[6] = (unsigned long)(arg6); \
866 _argvec[7] = (unsigned long)(arg7); \
867 _argvec[8] = (unsigned long)(arg8); \
868 _argvec[9] = (unsigned long)(arg9); \
870 "pushl 36(%%eax)\n\t" \
871 "pushl 32(%%eax)\n\t" \
872 "pushl 28(%%eax)\n\t" \
873 "pushl 24(%%eax)\n\t" \
874 "pushl 20(%%eax)\n\t" \
875 "pushl 16(%%eax)\n\t" \
876 "pushl 12(%%eax)\n\t" \
877 "pushl 8(%%eax)\n\t" \
878 "pushl 4(%%eax)\n\t" \
879 "movl (%%eax), %%eax\n\t"
\
880 VALGRIND_CALL_NOREDIR_EAX \
881 "addl $36, %%esp\n" \
883 :
"a" (&_argvec[0]) \
884 :
"cc", "memory", __CALLER_SAVED_REGS \
886 lval = (__typeof__(lval)) _res; \
889#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
890 arg7,arg8,arg9,arg10) \
892 volatile OrigFn _orig = (orig); \
893 volatile unsigned long _argvec[11]; \
894 volatile unsigned long _res; \
895 _argvec[0] = (unsigned long)_orig.nraddr; \
896 _argvec[1] = (unsigned long)(arg1); \
897 _argvec[2] = (unsigned long)(arg2); \
898 _argvec[3] = (unsigned long)(arg3); \
899 _argvec[4] = (unsigned long)(arg4); \
900 _argvec[5] = (unsigned long)(arg5); \
901 _argvec[6] = (unsigned long)(arg6); \
902 _argvec[7] = (unsigned long)(arg7); \
903 _argvec[8] = (unsigned long)(arg8); \
904 _argvec[9] = (unsigned long)(arg9); \
905 _argvec[10] = (unsigned long)(arg10); \
907 "pushl 40(%%eax)\n\t" \
908 "pushl 36(%%eax)\n\t" \
909 "pushl 32(%%eax)\n\t" \
910 "pushl 28(%%eax)\n\t" \
911 "pushl 24(%%eax)\n\t" \
912 "pushl 20(%%eax)\n\t" \
913 "pushl 16(%%eax)\n\t" \
914 "pushl 12(%%eax)\n\t" \
915 "pushl 8(%%eax)\n\t" \
916 "pushl 4(%%eax)\n\t" \
917 "movl (%%eax), %%eax\n\t"
\
918 VALGRIND_CALL_NOREDIR_EAX \
919 "addl $40, %%esp\n" \
921 :
"a" (&_argvec[0]) \
922 :
"cc", "memory", __CALLER_SAVED_REGS \
924 lval = (__typeof__(lval)) _res; \
927#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
928 arg6,arg7,arg8,arg9,arg10, \
931 volatile OrigFn _orig = (orig); \
932 volatile unsigned long _argvec[12]; \
933 volatile unsigned long _res; \
934 _argvec[0] = (unsigned long)_orig.nraddr; \
935 _argvec[1] = (unsigned long)(arg1); \
936 _argvec[2] = (unsigned long)(arg2); \
937 _argvec[3] = (unsigned long)(arg3); \
938 _argvec[4] = (unsigned long)(arg4); \
939 _argvec[5] = (unsigned long)(arg5); \
940 _argvec[6] = (unsigned long)(arg6); \
941 _argvec[7] = (unsigned long)(arg7); \
942 _argvec[8] = (unsigned long)(arg8); \
943 _argvec[9] = (unsigned long)(arg9); \
944 _argvec[10] = (unsigned long)(arg10); \
945 _argvec[11] = (unsigned long)(arg11); \
947 "pushl 44(%%eax)\n\t" \
948 "pushl 40(%%eax)\n\t" \
949 "pushl 36(%%eax)\n\t" \
950 "pushl 32(%%eax)\n\t" \
951 "pushl 28(%%eax)\n\t" \
952 "pushl 24(%%eax)\n\t" \
953 "pushl 20(%%eax)\n\t" \
954 "pushl 16(%%eax)\n\t" \
955 "pushl 12(%%eax)\n\t" \
956 "pushl 8(%%eax)\n\t" \
957 "pushl 4(%%eax)\n\t" \
958 "movl (%%eax), %%eax\n\t"
\
959 VALGRIND_CALL_NOREDIR_EAX \
960 "addl $44, %%esp\n" \
962 :
"a" (&_argvec[0]) \
963 :
"cc", "memory", __CALLER_SAVED_REGS \
965 lval = (__typeof__(lval)) _res; \
968#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
969 arg6,arg7,arg8,arg9,arg10, \
972 volatile OrigFn _orig = (orig); \
973 volatile unsigned long _argvec[13]; \
974 volatile unsigned long _res; \
975 _argvec[0] = (unsigned long)_orig.nraddr; \
976 _argvec[1] = (unsigned long)(arg1); \
977 _argvec[2] = (unsigned long)(arg2); \
978 _argvec[3] = (unsigned long)(arg3); \
979 _argvec[4] = (unsigned long)(arg4); \
980 _argvec[5] = (unsigned long)(arg5); \
981 _argvec[6] = (unsigned long)(arg6); \
982 _argvec[7] = (unsigned long)(arg7); \
983 _argvec[8] = (unsigned long)(arg8); \
984 _argvec[9] = (unsigned long)(arg9); \
985 _argvec[10] = (unsigned long)(arg10); \
986 _argvec[11] = (unsigned long)(arg11); \
987 _argvec[12] = (unsigned long)(arg12); \
989 "pushl 48(%%eax)\n\t" \
990 "pushl 44(%%eax)\n\t" \
991 "pushl 40(%%eax)\n\t" \
992 "pushl 36(%%eax)\n\t" \
993 "pushl 32(%%eax)\n\t" \
994 "pushl 28(%%eax)\n\t" \
995 "pushl 24(%%eax)\n\t" \
996 "pushl 20(%%eax)\n\t" \
997 "pushl 16(%%eax)\n\t" \
998 "pushl 12(%%eax)\n\t" \
999 "pushl 8(%%eax)\n\t" \
1000 "pushl 4(%%eax)\n\t" \
1001 "movl (%%eax), %%eax\n\t"
\
1002 VALGRIND_CALL_NOREDIR_EAX \
1003 "addl $48, %%esp\n" \
1005 :
"a" (&_argvec[0]) \
1006 :
"cc", "memory", __CALLER_SAVED_REGS \
1008 lval = (__typeof__(lval)) _res; \
1015#if defined(PLAT_amd64_linux)
1020#define __CALLER_SAVED_REGS "rcx", "rdx", "rsi", \
1021 "rdi", "r8", "r9", "r10", "r11"
1047#define CALL_FN_W_v(lval, orig) \
1049 volatile OrigFn _orig = (orig); \
1050 volatile unsigned long _argvec[1]; \
1051 volatile unsigned long _res; \
1052 _argvec[0] = (unsigned long)_orig.nraddr; \
1054 "subq $128,%%rsp\n\t" \
1055 "movq (%%rax), %%rax\n\t"
\
1056 VALGRIND_CALL_NOREDIR_RAX \
1057 "addq $128,%%rsp\n\t" \
1059 :
"a" (&_argvec[0]) \
1060 :
"cc", "memory", __CALLER_SAVED_REGS \
1062 lval = (__typeof__(lval)) _res; \
1065#define CALL_FN_W_W(lval, orig, arg1) \
1067 volatile OrigFn _orig = (orig); \
1068 volatile unsigned long _argvec[2]; \
1069 volatile unsigned long _res; \
1070 _argvec[0] = (unsigned long)_orig.nraddr; \
1071 _argvec[1] = (unsigned long)(arg1); \
1073 "subq $128,%%rsp\n\t" \
1074 "movq 8(%%rax), %%rdi\n\t" \
1075 "movq (%%rax), %%rax\n\t"
\
1076 VALGRIND_CALL_NOREDIR_RAX \
1077 "addq $128,%%rsp\n\t" \
1079 :
"a" (&_argvec[0]) \
1080 :
"cc", "memory", __CALLER_SAVED_REGS \
1082 lval = (__typeof__(lval)) _res; \
1085#define CALL_FN_W_WW(lval, orig, arg1,arg2) \
1087 volatile OrigFn _orig = (orig); \
1088 volatile unsigned long _argvec[3]; \
1089 volatile unsigned long _res; \
1090 _argvec[0] = (unsigned long)_orig.nraddr; \
1091 _argvec[1] = (unsigned long)(arg1); \
1092 _argvec[2] = (unsigned long)(arg2); \
1094 "subq $128,%%rsp\n\t" \
1095 "movq 16(%%rax), %%rsi\n\t" \
1096 "movq 8(%%rax), %%rdi\n\t" \
1097 "movq (%%rax), %%rax\n\t"
\
1098 VALGRIND_CALL_NOREDIR_RAX \
1099 "addq $128,%%rsp\n\t" \
1101 :
"a" (&_argvec[0]) \
1102 :
"cc", "memory", __CALLER_SAVED_REGS \
1104 lval = (__typeof__(lval)) _res; \
1107#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
1109 volatile OrigFn _orig = (orig); \
1110 volatile unsigned long _argvec[4]; \
1111 volatile unsigned long _res; \
1112 _argvec[0] = (unsigned long)_orig.nraddr; \
1113 _argvec[1] = (unsigned long)(arg1); \
1114 _argvec[2] = (unsigned long)(arg2); \
1115 _argvec[3] = (unsigned long)(arg3); \
1117 "subq $128,%%rsp\n\t" \
1118 "movq 24(%%rax), %%rdx\n\t" \
1119 "movq 16(%%rax), %%rsi\n\t" \
1120 "movq 8(%%rax), %%rdi\n\t" \
1121 "movq (%%rax), %%rax\n\t"
\
1122 VALGRIND_CALL_NOREDIR_RAX \
1123 "addq $128,%%rsp\n\t" \
1125 :
"a" (&_argvec[0]) \
1126 :
"cc", "memory", __CALLER_SAVED_REGS \
1128 lval = (__typeof__(lval)) _res; \
1131#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
1133 volatile OrigFn _orig = (orig); \
1134 volatile unsigned long _argvec[5]; \
1135 volatile unsigned long _res; \
1136 _argvec[0] = (unsigned long)_orig.nraddr; \
1137 _argvec[1] = (unsigned long)(arg1); \
1138 _argvec[2] = (unsigned long)(arg2); \
1139 _argvec[3] = (unsigned long)(arg3); \
1140 _argvec[4] = (unsigned long)(arg4); \
1142 "subq $128,%%rsp\n\t" \
1143 "movq 32(%%rax), %%rcx\n\t" \
1144 "movq 24(%%rax), %%rdx\n\t" \
1145 "movq 16(%%rax), %%rsi\n\t" \
1146 "movq 8(%%rax), %%rdi\n\t" \
1147 "movq (%%rax), %%rax\n\t"
\
1148 VALGRIND_CALL_NOREDIR_RAX \
1149 "addq $128,%%rsp\n\t" \
1151 :
"a" (&_argvec[0]) \
1152 :
"cc", "memory", __CALLER_SAVED_REGS \
1154 lval = (__typeof__(lval)) _res; \
1157#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
1159 volatile OrigFn _orig = (orig); \
1160 volatile unsigned long _argvec[6]; \
1161 volatile unsigned long _res; \
1162 _argvec[0] = (unsigned long)_orig.nraddr; \
1163 _argvec[1] = (unsigned long)(arg1); \
1164 _argvec[2] = (unsigned long)(arg2); \
1165 _argvec[3] = (unsigned long)(arg3); \
1166 _argvec[4] = (unsigned long)(arg4); \
1167 _argvec[5] = (unsigned long)(arg5); \
1169 "subq $128,%%rsp\n\t" \
1170 "movq 40(%%rax), %%r8\n\t" \
1171 "movq 32(%%rax), %%rcx\n\t" \
1172 "movq 24(%%rax), %%rdx\n\t" \
1173 "movq 16(%%rax), %%rsi\n\t" \
1174 "movq 8(%%rax), %%rdi\n\t" \
1175 "movq (%%rax), %%rax\n\t"
\
1176 VALGRIND_CALL_NOREDIR_RAX \
1177 "addq $128,%%rsp\n\t" \
1179 :
"a" (&_argvec[0]) \
1180 :
"cc", "memory", __CALLER_SAVED_REGS \
1182 lval = (__typeof__(lval)) _res; \
1185#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
1187 volatile OrigFn _orig = (orig); \
1188 volatile unsigned long _argvec[7]; \
1189 volatile unsigned long _res; \
1190 _argvec[0] = (unsigned long)_orig.nraddr; \
1191 _argvec[1] = (unsigned long)(arg1); \
1192 _argvec[2] = (unsigned long)(arg2); \
1193 _argvec[3] = (unsigned long)(arg3); \
1194 _argvec[4] = (unsigned long)(arg4); \
1195 _argvec[5] = (unsigned long)(arg5); \
1196 _argvec[6] = (unsigned long)(arg6); \
1198 "subq $128,%%rsp\n\t" \
1199 "movq 48(%%rax), %%r9\n\t" \
1200 "movq 40(%%rax), %%r8\n\t" \
1201 "movq 32(%%rax), %%rcx\n\t" \
1202 "movq 24(%%rax), %%rdx\n\t" \
1203 "movq 16(%%rax), %%rsi\n\t" \
1204 "movq 8(%%rax), %%rdi\n\t" \
1205 "movq (%%rax), %%rax\n\t"
\
1206 "addq $128,%%rsp\n\t" \
1207 VALGRIND_CALL_NOREDIR_RAX \
1209 :
"a" (&_argvec[0]) \
1210 :
"cc", "memory", __CALLER_SAVED_REGS \
1212 lval = (__typeof__(lval)) _res; \
1215#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1218 volatile OrigFn _orig = (orig); \
1219 volatile unsigned long _argvec[8]; \
1220 volatile unsigned long _res; \
1221 _argvec[0] = (unsigned long)_orig.nraddr; \
1222 _argvec[1] = (unsigned long)(arg1); \
1223 _argvec[2] = (unsigned long)(arg2); \
1224 _argvec[3] = (unsigned long)(arg3); \
1225 _argvec[4] = (unsigned long)(arg4); \
1226 _argvec[5] = (unsigned long)(arg5); \
1227 _argvec[6] = (unsigned long)(arg6); \
1228 _argvec[7] = (unsigned long)(arg7); \
1230 "subq $128,%%rsp\n\t" \
1231 "pushq 56(%%rax)\n\t" \
1232 "movq 48(%%rax), %%r9\n\t" \
1233 "movq 40(%%rax), %%r8\n\t" \
1234 "movq 32(%%rax), %%rcx\n\t" \
1235 "movq 24(%%rax), %%rdx\n\t" \
1236 "movq 16(%%rax), %%rsi\n\t" \
1237 "movq 8(%%rax), %%rdi\n\t" \
1238 "movq (%%rax), %%rax\n\t"
\
1239 VALGRIND_CALL_NOREDIR_RAX \
1240 "addq $8, %%rsp\n" \
1241 "addq $128,%%rsp\n\t" \
1243 :
"a" (&_argvec[0]) \
1244 :
"cc", "memory", __CALLER_SAVED_REGS \
1246 lval = (__typeof__(lval)) _res; \
1249#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1252 volatile OrigFn _orig = (orig); \
1253 volatile unsigned long _argvec[9]; \
1254 volatile unsigned long _res; \
1255 _argvec[0] = (unsigned long)_orig.nraddr; \
1256 _argvec[1] = (unsigned long)(arg1); \
1257 _argvec[2] = (unsigned long)(arg2); \
1258 _argvec[3] = (unsigned long)(arg3); \
1259 _argvec[4] = (unsigned long)(arg4); \
1260 _argvec[5] = (unsigned long)(arg5); \
1261 _argvec[6] = (unsigned long)(arg6); \
1262 _argvec[7] = (unsigned long)(arg7); \
1263 _argvec[8] = (unsigned long)(arg8); \
1265 "subq $128,%%rsp\n\t" \
1266 "pushq 64(%%rax)\n\t" \
1267 "pushq 56(%%rax)\n\t" \
1268 "movq 48(%%rax), %%r9\n\t" \
1269 "movq 40(%%rax), %%r8\n\t" \
1270 "movq 32(%%rax), %%rcx\n\t" \
1271 "movq 24(%%rax), %%rdx\n\t" \
1272 "movq 16(%%rax), %%rsi\n\t" \
1273 "movq 8(%%rax), %%rdi\n\t" \
1274 "movq (%%rax), %%rax\n\t"
\
1275 VALGRIND_CALL_NOREDIR_RAX \
1276 "addq $16, %%rsp\n" \
1277 "addq $128,%%rsp\n\t" \
1279 :
"a" (&_argvec[0]) \
1280 :
"cc", "memory", __CALLER_SAVED_REGS \
1282 lval = (__typeof__(lval)) _res; \
1285#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1288 volatile OrigFn _orig = (orig); \
1289 volatile unsigned long _argvec[10]; \
1290 volatile unsigned long _res; \
1291 _argvec[0] = (unsigned long)_orig.nraddr; \
1292 _argvec[1] = (unsigned long)(arg1); \
1293 _argvec[2] = (unsigned long)(arg2); \
1294 _argvec[3] = (unsigned long)(arg3); \
1295 _argvec[4] = (unsigned long)(arg4); \
1296 _argvec[5] = (unsigned long)(arg5); \
1297 _argvec[6] = (unsigned long)(arg6); \
1298 _argvec[7] = (unsigned long)(arg7); \
1299 _argvec[8] = (unsigned long)(arg8); \
1300 _argvec[9] = (unsigned long)(arg9); \
1302 "subq $128,%%rsp\n\t" \
1303 "pushq 72(%%rax)\n\t" \
1304 "pushq 64(%%rax)\n\t" \
1305 "pushq 56(%%rax)\n\t" \
1306 "movq 48(%%rax), %%r9\n\t" \
1307 "movq 40(%%rax), %%r8\n\t" \
1308 "movq 32(%%rax), %%rcx\n\t" \
1309 "movq 24(%%rax), %%rdx\n\t" \
1310 "movq 16(%%rax), %%rsi\n\t" \
1311 "movq 8(%%rax), %%rdi\n\t" \
1312 "movq (%%rax), %%rax\n\t"
\
1313 VALGRIND_CALL_NOREDIR_RAX \
1314 "addq $24, %%rsp\n" \
1315 "addq $128,%%rsp\n\t" \
1317 :
"a" (&_argvec[0]) \
1318 :
"cc", "memory", __CALLER_SAVED_REGS \
1320 lval = (__typeof__(lval)) _res; \
1323#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1324 arg7,arg8,arg9,arg10) \
1326 volatile OrigFn _orig = (orig); \
1327 volatile unsigned long _argvec[11]; \
1328 volatile unsigned long _res; \
1329 _argvec[0] = (unsigned long)_orig.nraddr; \
1330 _argvec[1] = (unsigned long)(arg1); \
1331 _argvec[2] = (unsigned long)(arg2); \
1332 _argvec[3] = (unsigned long)(arg3); \
1333 _argvec[4] = (unsigned long)(arg4); \
1334 _argvec[5] = (unsigned long)(arg5); \
1335 _argvec[6] = (unsigned long)(arg6); \
1336 _argvec[7] = (unsigned long)(arg7); \
1337 _argvec[8] = (unsigned long)(arg8); \
1338 _argvec[9] = (unsigned long)(arg9); \
1339 _argvec[10] = (unsigned long)(arg10); \
1341 "subq $128,%%rsp\n\t" \
1342 "pushq 80(%%rax)\n\t" \
1343 "pushq 72(%%rax)\n\t" \
1344 "pushq 64(%%rax)\n\t" \
1345 "pushq 56(%%rax)\n\t" \
1346 "movq 48(%%rax), %%r9\n\t" \
1347 "movq 40(%%rax), %%r8\n\t" \
1348 "movq 32(%%rax), %%rcx\n\t" \
1349 "movq 24(%%rax), %%rdx\n\t" \
1350 "movq 16(%%rax), %%rsi\n\t" \
1351 "movq 8(%%rax), %%rdi\n\t" \
1352 "movq (%%rax), %%rax\n\t"
\
1353 VALGRIND_CALL_NOREDIR_RAX \
1354 "addq $32, %%rsp\n" \
1355 "addq $128,%%rsp\n\t" \
1357 :
"a" (&_argvec[0]) \
1358 :
"cc", "memory", __CALLER_SAVED_REGS \
1360 lval = (__typeof__(lval)) _res; \
1363#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1364 arg7,arg8,arg9,arg10,arg11) \
1366 volatile OrigFn _orig = (orig); \
1367 volatile unsigned long _argvec[12]; \
1368 volatile unsigned long _res; \
1369 _argvec[0] = (unsigned long)_orig.nraddr; \
1370 _argvec[1] = (unsigned long)(arg1); \
1371 _argvec[2] = (unsigned long)(arg2); \
1372 _argvec[3] = (unsigned long)(arg3); \
1373 _argvec[4] = (unsigned long)(arg4); \
1374 _argvec[5] = (unsigned long)(arg5); \
1375 _argvec[6] = (unsigned long)(arg6); \
1376 _argvec[7] = (unsigned long)(arg7); \
1377 _argvec[8] = (unsigned long)(arg8); \
1378 _argvec[9] = (unsigned long)(arg9); \
1379 _argvec[10] = (unsigned long)(arg10); \
1380 _argvec[11] = (unsigned long)(arg11); \
1382 "subq $128,%%rsp\n\t" \
1383 "pushq 88(%%rax)\n\t" \
1384 "pushq 80(%%rax)\n\t" \
1385 "pushq 72(%%rax)\n\t" \
1386 "pushq 64(%%rax)\n\t" \
1387 "pushq 56(%%rax)\n\t" \
1388 "movq 48(%%rax), %%r9\n\t" \
1389 "movq 40(%%rax), %%r8\n\t" \
1390 "movq 32(%%rax), %%rcx\n\t" \
1391 "movq 24(%%rax), %%rdx\n\t" \
1392 "movq 16(%%rax), %%rsi\n\t" \
1393 "movq 8(%%rax), %%rdi\n\t" \
1394 "movq (%%rax), %%rax\n\t"
\
1395 VALGRIND_CALL_NOREDIR_RAX \
1396 "addq $40, %%rsp\n" \
1397 "addq $128,%%rsp\n\t" \
1399 :
"a" (&_argvec[0]) \
1400 :
"cc", "memory", __CALLER_SAVED_REGS \
1402 lval = (__typeof__(lval)) _res; \
1405#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1406 arg7,arg8,arg9,arg10,arg11,arg12) \
1408 volatile OrigFn _orig = (orig); \
1409 volatile unsigned long _argvec[13]; \
1410 volatile unsigned long _res; \
1411 _argvec[0] = (unsigned long)_orig.nraddr; \
1412 _argvec[1] = (unsigned long)(arg1); \
1413 _argvec[2] = (unsigned long)(arg2); \
1414 _argvec[3] = (unsigned long)(arg3); \
1415 _argvec[4] = (unsigned long)(arg4); \
1416 _argvec[5] = (unsigned long)(arg5); \
1417 _argvec[6] = (unsigned long)(arg6); \
1418 _argvec[7] = (unsigned long)(arg7); \
1419 _argvec[8] = (unsigned long)(arg8); \
1420 _argvec[9] = (unsigned long)(arg9); \
1421 _argvec[10] = (unsigned long)(arg10); \
1422 _argvec[11] = (unsigned long)(arg11); \
1423 _argvec[12] = (unsigned long)(arg12); \
1425 "subq $128,%%rsp\n\t" \
1426 "pushq 96(%%rax)\n\t" \
1427 "pushq 88(%%rax)\n\t" \
1428 "pushq 80(%%rax)\n\t" \
1429 "pushq 72(%%rax)\n\t" \
1430 "pushq 64(%%rax)\n\t" \
1431 "pushq 56(%%rax)\n\t" \
1432 "movq 48(%%rax), %%r9\n\t" \
1433 "movq 40(%%rax), %%r8\n\t" \
1434 "movq 32(%%rax), %%rcx\n\t" \
1435 "movq 24(%%rax), %%rdx\n\t" \
1436 "movq 16(%%rax), %%rsi\n\t" \
1437 "movq 8(%%rax), %%rdi\n\t" \
1438 "movq (%%rax), %%rax\n\t"
\
1439 VALGRIND_CALL_NOREDIR_RAX \
1440 "addq $48, %%rsp\n" \
1441 "addq $128,%%rsp\n\t" \
1443 :
"a" (&_argvec[0]) \
1444 :
"cc", "memory", __CALLER_SAVED_REGS \
1446 lval = (__typeof__(lval)) _res; \
1453#if defined(PLAT_ppc32_linux)
1479#define __CALLER_SAVED_REGS \
1480 "lr", "ctr", "xer", \
1481 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \
1482 "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \
1488#define CALL_FN_W_v(lval, orig) \
1490 volatile OrigFn _orig = (orig); \
1491 volatile unsigned long _argvec[1]; \
1492 volatile unsigned long _res; \
1493 _argvec[0] = (unsigned long)_orig.nraddr; \
1496 "lwz 11,0(11)\n\t"
\
1497 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1500 :
"r" (&_argvec[0]) \
1501 :
"cc", "memory", __CALLER_SAVED_REGS \
1503 lval = (__typeof__(lval)) _res; \
1506#define CALL_FN_W_W(lval, orig, arg1) \
1508 volatile OrigFn _orig = (orig); \
1509 volatile unsigned long _argvec[2]; \
1510 volatile unsigned long _res; \
1511 _argvec[0] = (unsigned long)_orig.nraddr; \
1512 _argvec[1] = (unsigned long)arg1; \
1516 "lwz 11,0(11)\n\t" \
1517 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1520 :
"r" (&_argvec[0]) \
1521 :
"cc", "memory", __CALLER_SAVED_REGS \
1523 lval = (__typeof__(lval)) _res; \
1526#define CALL_FN_W_WW(lval, orig, arg1,arg2) \
1528 volatile OrigFn _orig = (orig); \
1529 volatile unsigned long _argvec[3]; \
1530 volatile unsigned long _res; \
1531 _argvec[0] = (unsigned long)_orig.nraddr; \
1532 _argvec[1] = (unsigned long)arg1; \
1533 _argvec[2] = (unsigned long)arg2; \
1538 "lwz 11,0(11)\n\t"
\
1539 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1542 :
"r" (&_argvec[0]) \
1543 :
"cc", "memory", __CALLER_SAVED_REGS \
1545 lval = (__typeof__(lval)) _res; \
1548#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
1550 volatile OrigFn _orig = (orig); \
1551 volatile unsigned long _argvec[4]; \
1552 volatile unsigned long _res; \
1553 _argvec[0] = (unsigned long)_orig.nraddr; \
1554 _argvec[1] = (unsigned long)arg1; \
1555 _argvec[2] = (unsigned long)arg2; \
1556 _argvec[3] = (unsigned long)arg3; \
1561 "lwz 5,12(11)\n\t" \
1562 "lwz 11,0(11)\n\t"
\
1563 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1566 :
"r" (&_argvec[0]) \
1567 :
"cc", "memory", __CALLER_SAVED_REGS \
1569 lval = (__typeof__(lval)) _res; \
1572#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
1574 volatile OrigFn _orig = (orig); \
1575 volatile unsigned long _argvec[5]; \
1576 volatile unsigned long _res; \
1577 _argvec[0] = (unsigned long)_orig.nraddr; \
1578 _argvec[1] = (unsigned long)arg1; \
1579 _argvec[2] = (unsigned long)arg2; \
1580 _argvec[3] = (unsigned long)arg3; \
1581 _argvec[4] = (unsigned long)arg4; \
1586 "lwz 5,12(11)\n\t" \
1587 "lwz 6,16(11)\n\t"
\
1588 "lwz 11,0(11)\n\t" \
1589 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1592 :
"r" (&_argvec[0]) \
1593 :
"cc", "memory", __CALLER_SAVED_REGS \
1595 lval = (__typeof__(lval)) _res; \
1598#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
1600 volatile OrigFn _orig = (orig); \
1601 volatile unsigned long _argvec[6]; \
1602 volatile unsigned long _res; \
1603 _argvec[0] = (unsigned long)_orig.nraddr; \
1604 _argvec[1] = (unsigned long)arg1; \
1605 _argvec[2] = (unsigned long)arg2; \
1606 _argvec[3] = (unsigned long)arg3; \
1607 _argvec[4] = (unsigned long)arg4; \
1608 _argvec[5] = (unsigned long)arg5; \
1613 "lwz 5,12(11)\n\t" \
1614 "lwz 6,16(11)\n\t"
\
1615 "lwz 7,20(11)\n\t" \
1616 "lwz 11,0(11)\n\t"
\
1617 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1620 :
"r" (&_argvec[0]) \
1621 :
"cc", "memory", __CALLER_SAVED_REGS \
1623 lval = (__typeof__(lval)) _res; \
1626#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
1628 volatile OrigFn _orig = (orig); \
1629 volatile unsigned long _argvec[7]; \
1630 volatile unsigned long _res; \
1631 _argvec[0] = (unsigned long)_orig.nraddr; \
1632 _argvec[1] = (unsigned long)arg1; \
1633 _argvec[2] = (unsigned long)arg2; \
1634 _argvec[3] = (unsigned long)arg3; \
1635 _argvec[4] = (unsigned long)arg4; \
1636 _argvec[5] = (unsigned long)arg5; \
1637 _argvec[6] = (unsigned long)arg6; \
1642 "lwz 5,12(11)\n\t" \
1643 "lwz 6,16(11)\n\t"
\
1644 "lwz 7,20(11)\n\t" \
1645 "lwz 8,24(11)\n\t" \
1646 "lwz 11,0(11)\n\t"
\
1647 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1650 :
"r" (&_argvec[0]) \
1651 :
"cc", "memory", __CALLER_SAVED_REGS \
1653 lval = (__typeof__(lval)) _res; \
1656#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1659 volatile OrigFn _orig = (orig); \
1660 volatile unsigned long _argvec[8]; \
1661 volatile unsigned long _res; \
1662 _argvec[0] = (unsigned long)_orig.nraddr; \
1663 _argvec[1] = (unsigned long)arg1; \
1664 _argvec[2] = (unsigned long)arg2; \
1665 _argvec[3] = (unsigned long)arg3; \
1666 _argvec[4] = (unsigned long)arg4; \
1667 _argvec[5] = (unsigned long)arg5; \
1668 _argvec[6] = (unsigned long)arg6; \
1669 _argvec[7] = (unsigned long)arg7; \
1674 "lwz 5,12(11)\n\t" \
1675 "lwz 6,16(11)\n\t"
\
1676 "lwz 7,20(11)\n\t" \
1677 "lwz 8,24(11)\n\t" \
1678 "lwz 9,28(11)\n\t" \
1679 "lwz 11,0(11)\n\t"
\
1680 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1683 :
"r" (&_argvec[0]) \
1684 :
"cc", "memory", __CALLER_SAVED_REGS \
1686 lval = (__typeof__(lval)) _res; \
1689#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1692 volatile OrigFn _orig = (orig); \
1693 volatile unsigned long _argvec[9]; \
1694 volatile unsigned long _res; \
1695 _argvec[0] = (unsigned long)_orig.nraddr; \
1696 _argvec[1] = (unsigned long)arg1; \
1697 _argvec[2] = (unsigned long)arg2; \
1698 _argvec[3] = (unsigned long)arg3; \
1699 _argvec[4] = (unsigned long)arg4; \
1700 _argvec[5] = (unsigned long)arg5; \
1701 _argvec[6] = (unsigned long)arg6; \
1702 _argvec[7] = (unsigned long)arg7; \
1703 _argvec[8] = (unsigned long)arg8; \
1708 "lwz 5,12(11)\n\t" \
1709 "lwz 6,16(11)\n\t"
\
1710 "lwz 7,20(11)\n\t" \
1711 "lwz 8,24(11)\n\t" \
1712 "lwz 9,28(11)\n\t" \
1713 "lwz 10,32(11)\n\t"
\
1714 "lwz 11,0(11)\n\t" \
1715 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1718 :
"r" (&_argvec[0]) \
1719 :
"cc", "memory", __CALLER_SAVED_REGS \
1721 lval = (__typeof__(lval)) _res; \
1724#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1727 volatile OrigFn _orig = (orig); \
1728 volatile unsigned long _argvec[10]; \
1729 volatile unsigned long _res; \
1730 _argvec[0] = (unsigned long)_orig.nraddr; \
1731 _argvec[1] = (unsigned long)arg1; \
1732 _argvec[2] = (unsigned long)arg2; \
1733 _argvec[3] = (unsigned long)arg3; \
1734 _argvec[4] = (unsigned long)arg4; \
1735 _argvec[5] = (unsigned long)arg5; \
1736 _argvec[6] = (unsigned long)arg6; \
1737 _argvec[7] = (unsigned long)arg7; \
1738 _argvec[8] = (unsigned long)arg8; \
1739 _argvec[9] = (unsigned long)arg9; \
1742 "addi 1,1,-16\n\t" \
1744 "lwz 3,36(11)\n\t" \
1749 "lwz 5,12(11)\n\t" \
1750 "lwz 6,16(11)\n\t"
\
1751 "lwz 7,20(11)\n\t" \
1752 "lwz 8,24(11)\n\t" \
1753 "lwz 9,28(11)\n\t" \
1754 "lwz 10,32(11)\n\t"
\
1755 "lwz 11,0(11)\n\t" \
1756 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1760 :
"r" (&_argvec[0]) \
1761 :
"cc", "memory", __CALLER_SAVED_REGS \
1763 lval = (__typeof__(lval)) _res; \
1766#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1767 arg7,arg8,arg9,arg10) \
1769 volatile OrigFn _orig = (orig); \
1770 volatile unsigned long _argvec[11]; \
1771 volatile unsigned long _res; \
1772 _argvec[0] = (unsigned long)_orig.nraddr; \
1773 _argvec[1] = (unsigned long)arg1; \
1774 _argvec[2] = (unsigned long)arg2; \
1775 _argvec[3] = (unsigned long)arg3; \
1776 _argvec[4] = (unsigned long)arg4; \
1777 _argvec[5] = (unsigned long)arg5; \
1778 _argvec[6] = (unsigned long)arg6; \
1779 _argvec[7] = (unsigned long)arg7; \
1780 _argvec[8] = (unsigned long)arg8; \
1781 _argvec[9] = (unsigned long)arg9; \
1782 _argvec[10] = (unsigned long)arg10; \
1785 "addi 1,1,-16\n\t" \
1787 "lwz 3,40(11)\n\t" \
1790 "lwz 3,36(11)\n\t" \
1795 "lwz 5,12(11)\n\t" \
1796 "lwz 6,16(11)\n\t"
\
1797 "lwz 7,20(11)\n\t" \
1798 "lwz 8,24(11)\n\t" \
1799 "lwz 9,28(11)\n\t" \
1800 "lwz 10,32(11)\n\t"
\
1801 "lwz 11,0(11)\n\t" \
1802 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1806 :
"r" (&_argvec[0]) \
1807 :
"cc", "memory", __CALLER_SAVED_REGS \
1809 lval = (__typeof__(lval)) _res; \
1812#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1813 arg7,arg8,arg9,arg10,arg11) \
1815 volatile OrigFn _orig = (orig); \
1816 volatile unsigned long _argvec[12]; \
1817 volatile unsigned long _res; \
1818 _argvec[0] = (unsigned long)_orig.nraddr; \
1819 _argvec[1] = (unsigned long)arg1; \
1820 _argvec[2] = (unsigned long)arg2; \
1821 _argvec[3] = (unsigned long)arg3; \
1822 _argvec[4] = (unsigned long)arg4; \
1823 _argvec[5] = (unsigned long)arg5; \
1824 _argvec[6] = (unsigned long)arg6; \
1825 _argvec[7] = (unsigned long)arg7; \
1826 _argvec[8] = (unsigned long)arg8; \
1827 _argvec[9] = (unsigned long)arg9; \
1828 _argvec[10] = (unsigned long)arg10; \
1829 _argvec[11] = (unsigned long)arg11; \
1832 "addi 1,1,-32\n\t" \
1834 "lwz 3,44(11)\n\t" \
1837 "lwz 3,40(11)\n\t" \
1840 "lwz 3,36(11)\n\t" \
1845 "lwz 5,12(11)\n\t" \
1846 "lwz 6,16(11)\n\t"
\
1847 "lwz 7,20(11)\n\t" \
1848 "lwz 8,24(11)\n\t" \
1849 "lwz 9,28(11)\n\t" \
1850 "lwz 10,32(11)\n\t"
\
1851 "lwz 11,0(11)\n\t" \
1852 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1856 :
"r" (&_argvec[0]) \
1857 :
"cc", "memory", __CALLER_SAVED_REGS \
1859 lval = (__typeof__(lval)) _res; \
1862#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1863 arg7,arg8,arg9,arg10,arg11,arg12) \
1865 volatile OrigFn _orig = (orig); \
1866 volatile unsigned long _argvec[13]; \
1867 volatile unsigned long _res; \
1868 _argvec[0] = (unsigned long)_orig.nraddr; \
1869 _argvec[1] = (unsigned long)arg1; \
1870 _argvec[2] = (unsigned long)arg2; \
1871 _argvec[3] = (unsigned long)arg3; \
1872 _argvec[4] = (unsigned long)arg4; \
1873 _argvec[5] = (unsigned long)arg5; \
1874 _argvec[6] = (unsigned long)arg6; \
1875 _argvec[7] = (unsigned long)arg7; \
1876 _argvec[8] = (unsigned long)arg8; \
1877 _argvec[9] = (unsigned long)arg9; \
1878 _argvec[10] = (unsigned long)arg10; \
1879 _argvec[11] = (unsigned long)arg11; \
1880 _argvec[12] = (unsigned long)arg12; \
1883 "addi 1,1,-32\n\t" \
1885 "lwz 3,48(11)\n\t" \
1888 "lwz 3,44(11)\n\t" \
1891 "lwz 3,40(11)\n\t" \
1894 "lwz 3,36(11)\n\t" \
1899 "lwz 5,12(11)\n\t" \
1900 "lwz 6,16(11)\n\t"
\
1901 "lwz 7,20(11)\n\t" \
1902 "lwz 8,24(11)\n\t" \
1903 "lwz 9,28(11)\n\t" \
1904 "lwz 10,32(11)\n\t"
\
1905 "lwz 11,0(11)\n\t" \
1906 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1910 :
"r" (&_argvec[0]) \
1911 :
"cc", "memory", __CALLER_SAVED_REGS \
1913 lval = (__typeof__(lval)) _res; \
1920#if defined(PLAT_ppc64_linux)
1925#define __CALLER_SAVED_REGS \
1926 "lr", "ctr", "xer", \
1927 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \
1928 "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \
1934#define CALL_FN_W_v(lval, orig) \
1936 volatile OrigFn _orig = (orig); \
1937 volatile unsigned long _argvec[3+0]; \
1938 volatile unsigned long _res; \
1940 _argvec[1] = (unsigned long)_orig.r2; \
1941 _argvec[2] = (unsigned long)_orig.nraddr; \
1944 "std 2,-16(11)\n\t"
\
1946 "ld 11, 0(11)\n\t" \
1947 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1952 :
"r" (&_argvec[2]) \
1953 :
"cc", "memory", __CALLER_SAVED_REGS \
1955 lval = (__typeof__(lval)) _res; \
1958#define CALL_FN_W_W(lval, orig, arg1) \
1960 volatile OrigFn _orig = (orig); \
1961 volatile unsigned long _argvec[3+1]; \
1962 volatile unsigned long _res; \
1964 _argvec[1] = (unsigned long)_orig.r2; \
1965 _argvec[2] = (unsigned long)_orig.nraddr; \
1966 _argvec[2+1] = (unsigned long)arg1; \
1969 "std 2,-16(11)\n\t"
\
1972 "ld 11, 0(11)\n\t" \
1973 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1978 :
"r" (&_argvec[2]) \
1979 :
"cc", "memory", __CALLER_SAVED_REGS \
1981 lval = (__typeof__(lval)) _res; \
1984#define CALL_FN_W_WW(lval, orig, arg1,arg2) \
1986 volatile OrigFn _orig = (orig); \
1987 volatile unsigned long _argvec[3+2]; \
1988 volatile unsigned long _res; \
1990 _argvec[1] = (unsigned long)_orig.r2; \
1991 _argvec[2] = (unsigned long)_orig.nraddr; \
1992 _argvec[2+1] = (unsigned long)arg1; \
1993 _argvec[2+2] = (unsigned long)arg2; \
1996 "std 2,-16(11)\n\t"
\
1999 "ld 4, 16(11)\n\t" \
2000 "ld 11, 0(11)\n\t" \
2001 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2006 :
"r" (&_argvec[2]) \
2007 :
"cc", "memory", __CALLER_SAVED_REGS \
2009 lval = (__typeof__(lval)) _res; \
2012#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
2014 volatile OrigFn _orig = (orig); \
2015 volatile unsigned long _argvec[3+3]; \
2016 volatile unsigned long _res; \
2018 _argvec[1] = (unsigned long)_orig.r2; \
2019 _argvec[2] = (unsigned long)_orig.nraddr; \
2020 _argvec[2+1] = (unsigned long)arg1; \
2021 _argvec[2+2] = (unsigned long)arg2; \
2022 _argvec[2+3] = (unsigned long)arg3; \
2025 "std 2,-16(11)\n\t"
\
2028 "ld 4, 16(11)\n\t" \
2029 "ld 5, 24(11)\n\t" \
2030 "ld 11, 0(11)\n\t" \
2031 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2036 :
"r" (&_argvec[2]) \
2037 :
"cc", "memory", __CALLER_SAVED_REGS \
2039 lval = (__typeof__(lval)) _res; \
2042#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
2044 volatile OrigFn _orig = (orig); \
2045 volatile unsigned long _argvec[3+4]; \
2046 volatile unsigned long _res; \
2048 _argvec[1] = (unsigned long)_orig.r2; \
2049 _argvec[2] = (unsigned long)_orig.nraddr; \
2050 _argvec[2+1] = (unsigned long)arg1; \
2051 _argvec[2+2] = (unsigned long)arg2; \
2052 _argvec[2+3] = (unsigned long)arg3; \
2053 _argvec[2+4] = (unsigned long)arg4; \
2056 "std 2,-16(11)\n\t"
\
2059 "ld 4, 16(11)\n\t" \
2060 "ld 5, 24(11)\n\t" \
2061 "ld 6, 32(11)\n\t" \
2062 "ld 11, 0(11)\n\t" \
2063 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2068 :
"r" (&_argvec[2]) \
2069 :
"cc", "memory", __CALLER_SAVED_REGS \
2071 lval = (__typeof__(lval)) _res; \
2074#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
2076 volatile OrigFn _orig = (orig); \
2077 volatile unsigned long _argvec[3+5]; \
2078 volatile unsigned long _res; \
2080 _argvec[1] = (unsigned long)_orig.r2; \
2081 _argvec[2] = (unsigned long)_orig.nraddr; \
2082 _argvec[2+1] = (unsigned long)arg1; \
2083 _argvec[2+2] = (unsigned long)arg2; \
2084 _argvec[2+3] = (unsigned long)arg3; \
2085 _argvec[2+4] = (unsigned long)arg4; \
2086 _argvec[2+5] = (unsigned long)arg5; \
2089 "std 2,-16(11)\n\t"
\
2092 "ld 4, 16(11)\n\t" \
2093 "ld 5, 24(11)\n\t" \
2094 "ld 6, 32(11)\n\t" \
2095 "ld 7, 40(11)\n\t" \
2096 "ld 11, 0(11)\n\t" \
2097 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2102 :
"r" (&_argvec[2]) \
2103 :
"cc", "memory", __CALLER_SAVED_REGS \
2105 lval = (__typeof__(lval)) _res; \
2108#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
2110 volatile OrigFn _orig = (orig); \
2111 volatile unsigned long _argvec[3+6]; \
2112 volatile unsigned long _res; \
2114 _argvec[1] = (unsigned long)_orig.r2; \
2115 _argvec[2] = (unsigned long)_orig.nraddr; \
2116 _argvec[2+1] = (unsigned long)arg1; \
2117 _argvec[2+2] = (unsigned long)arg2; \
2118 _argvec[2+3] = (unsigned long)arg3; \
2119 _argvec[2+4] = (unsigned long)arg4; \
2120 _argvec[2+5] = (unsigned long)arg5; \
2121 _argvec[2+6] = (unsigned long)arg6; \
2124 "std 2,-16(11)\n\t"
\
2127 "ld 4, 16(11)\n\t" \
2128 "ld 5, 24(11)\n\t" \
2129 "ld 6, 32(11)\n\t" \
2130 "ld 7, 40(11)\n\t" \
2131 "ld 8, 48(11)\n\t" \
2132 "ld 11, 0(11)\n\t" \
2133 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2138 :
"r" (&_argvec[2]) \
2139 :
"cc", "memory", __CALLER_SAVED_REGS \
2141 lval = (__typeof__(lval)) _res; \
2144#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2147 volatile OrigFn _orig = (orig); \
2148 volatile unsigned long _argvec[3+7]; \
2149 volatile unsigned long _res; \
2151 _argvec[1] = (unsigned long)_orig.r2; \
2152 _argvec[2] = (unsigned long)_orig.nraddr; \
2153 _argvec[2+1] = (unsigned long)arg1; \
2154 _argvec[2+2] = (unsigned long)arg2; \
2155 _argvec[2+3] = (unsigned long)arg3; \
2156 _argvec[2+4] = (unsigned long)arg4; \
2157 _argvec[2+5] = (unsigned long)arg5; \
2158 _argvec[2+6] = (unsigned long)arg6; \
2159 _argvec[2+7] = (unsigned long)arg7; \
2162 "std 2,-16(11)\n\t"
\
2165 "ld 4, 16(11)\n\t" \
2166 "ld 5, 24(11)\n\t" \
2167 "ld 6, 32(11)\n\t" \
2168 "ld 7, 40(11)\n\t" \
2169 "ld 8, 48(11)\n\t" \
2170 "ld 9, 56(11)\n\t" \
2171 "ld 11, 0(11)\n\t" \
2172 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2177 :
"r" (&_argvec[2]) \
2178 :
"cc", "memory", __CALLER_SAVED_REGS \
2180 lval = (__typeof__(lval)) _res; \
2183#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2186 volatile OrigFn _orig = (orig); \
2187 volatile unsigned long _argvec[3+8]; \
2188 volatile unsigned long _res; \
2190 _argvec[1] = (unsigned long)_orig.r2; \
2191 _argvec[2] = (unsigned long)_orig.nraddr; \
2192 _argvec[2+1] = (unsigned long)arg1; \
2193 _argvec[2+2] = (unsigned long)arg2; \
2194 _argvec[2+3] = (unsigned long)arg3; \
2195 _argvec[2+4] = (unsigned long)arg4; \
2196 _argvec[2+5] = (unsigned long)arg5; \
2197 _argvec[2+6] = (unsigned long)arg6; \
2198 _argvec[2+7] = (unsigned long)arg7; \
2199 _argvec[2+8] = (unsigned long)arg8; \
2202 "std 2,-16(11)\n\t"
\
2205 "ld 4, 16(11)\n\t" \
2206 "ld 5, 24(11)\n\t" \
2207 "ld 6, 32(11)\n\t" \
2208 "ld 7, 40(11)\n\t" \
2209 "ld 8, 48(11)\n\t" \
2210 "ld 9, 56(11)\n\t" \
2211 "ld 10, 64(11)\n\t" \
2212 "ld 11, 0(11)\n\t" \
2213 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2218 :
"r" (&_argvec[2]) \
2219 :
"cc", "memory", __CALLER_SAVED_REGS \
2221 lval = (__typeof__(lval)) _res; \
2224#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2227 volatile OrigFn _orig = (orig); \
2228 volatile unsigned long _argvec[3+9]; \
2229 volatile unsigned long _res; \
2231 _argvec[1] = (unsigned long)_orig.r2; \
2232 _argvec[2] = (unsigned long)_orig.nraddr; \
2233 _argvec[2+1] = (unsigned long)arg1; \
2234 _argvec[2+2] = (unsigned long)arg2; \
2235 _argvec[2+3] = (unsigned long)arg3; \
2236 _argvec[2+4] = (unsigned long)arg4; \
2237 _argvec[2+5] = (unsigned long)arg5; \
2238 _argvec[2+6] = (unsigned long)arg6; \
2239 _argvec[2+7] = (unsigned long)arg7; \
2240 _argvec[2+8] = (unsigned long)arg8; \
2241 _argvec[2+9] = (unsigned long)arg9; \
2244 "std 2,-16(11)\n\t"
\
2246 "addi 1,1,-128\n\t" \
2249 "std 3,112(1)\n\t" \
2252 "ld 4, 16(11)\n\t" \
2253 "ld 5, 24(11)\n\t" \
2254 "ld 6, 32(11)\n\t" \
2255 "ld 7, 40(11)\n\t" \
2256 "ld 8, 48(11)\n\t" \
2257 "ld 9, 56(11)\n\t" \
2258 "ld 10, 64(11)\n\t" \
2259 "ld 11, 0(11)\n\t" \
2260 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2263 "ld 2,-16(11)\n\t"
\
2266 :
"r" (&_argvec[2]) \
2267 :
"cc", "memory", __CALLER_SAVED_REGS \
2269 lval = (__typeof__(lval)) _res; \
2272#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2273 arg7,arg8,arg9,arg10) \
2275 volatile OrigFn _orig = (orig); \
2276 volatile unsigned long _argvec[3+10]; \
2277 volatile unsigned long _res; \
2279 _argvec[1] = (unsigned long)_orig.r2; \
2280 _argvec[2] = (unsigned long)_orig.nraddr; \
2281 _argvec[2+1] = (unsigned long)arg1; \
2282 _argvec[2+2] = (unsigned long)arg2; \
2283 _argvec[2+3] = (unsigned long)arg3; \
2284 _argvec[2+4] = (unsigned long)arg4; \
2285 _argvec[2+5] = (unsigned long)arg5; \
2286 _argvec[2+6] = (unsigned long)arg6; \
2287 _argvec[2+7] = (unsigned long)arg7; \
2288 _argvec[2+8] = (unsigned long)arg8; \
2289 _argvec[2+9] = (unsigned long)arg9; \
2290 _argvec[2+10] = (unsigned long)arg10; \
2293 "std 2,-16(11)\n\t"
\
2295 "addi 1,1,-128\n\t" \
2298 "std 3,120(1)\n\t" \
2301 "std 3,112(1)\n\t" \
2304 "ld 4, 16(11)\n\t" \
2305 "ld 5, 24(11)\n\t" \
2306 "ld 6, 32(11)\n\t" \
2307 "ld 7, 40(11)\n\t" \
2308 "ld 8, 48(11)\n\t" \
2309 "ld 9, 56(11)\n\t" \
2310 "ld 10, 64(11)\n\t" \
2311 "ld 11, 0(11)\n\t" \
2312 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2315 "ld 2,-16(11)\n\t"
\
2318 :
"r" (&_argvec[2]) \
2319 :
"cc", "memory", __CALLER_SAVED_REGS \
2321 lval = (__typeof__(lval)) _res; \
2324#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2325 arg7,arg8,arg9,arg10,arg11) \
2327 volatile OrigFn _orig = (orig); \
2328 volatile unsigned long _argvec[3+11]; \
2329 volatile unsigned long _res; \
2331 _argvec[1] = (unsigned long)_orig.r2; \
2332 _argvec[2] = (unsigned long)_orig.nraddr; \
2333 _argvec[2+1] = (unsigned long)arg1; \
2334 _argvec[2+2] = (unsigned long)arg2; \
2335 _argvec[2+3] = (unsigned long)arg3; \
2336 _argvec[2+4] = (unsigned long)arg4; \
2337 _argvec[2+5] = (unsigned long)arg5; \
2338 _argvec[2+6] = (unsigned long)arg6; \
2339 _argvec[2+7] = (unsigned long)arg7; \
2340 _argvec[2+8] = (unsigned long)arg8; \
2341 _argvec[2+9] = (unsigned long)arg9; \
2342 _argvec[2+10] = (unsigned long)arg10; \
2343 _argvec[2+11] = (unsigned long)arg11; \
2346 "std 2,-16(11)\n\t"
\
2348 "addi 1,1,-144\n\t" \
2351 "std 3,128(1)\n\t" \
2354 "std 3,120(1)\n\t" \
2357 "std 3,112(1)\n\t" \
2360 "ld 4, 16(11)\n\t" \
2361 "ld 5, 24(11)\n\t" \
2362 "ld 6, 32(11)\n\t" \
2363 "ld 7, 40(11)\n\t" \
2364 "ld 8, 48(11)\n\t" \
2365 "ld 9, 56(11)\n\t" \
2366 "ld 10, 64(11)\n\t" \
2367 "ld 11, 0(11)\n\t" \
2368 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2371 "ld 2,-16(11)\n\t"
\
2374 :
"r" (&_argvec[2]) \
2375 :
"cc", "memory", __CALLER_SAVED_REGS \
2377 lval = (__typeof__(lval)) _res; \
2380#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2381 arg7,arg8,arg9,arg10,arg11,arg12) \
2383 volatile OrigFn _orig = (orig); \
2384 volatile unsigned long _argvec[3+12]; \
2385 volatile unsigned long _res; \
2387 _argvec[1] = (unsigned long)_orig.r2; \
2388 _argvec[2] = (unsigned long)_orig.nraddr; \
2389 _argvec[2+1] = (unsigned long)arg1; \
2390 _argvec[2+2] = (unsigned long)arg2; \
2391 _argvec[2+3] = (unsigned long)arg3; \
2392 _argvec[2+4] = (unsigned long)arg4; \
2393 _argvec[2+5] = (unsigned long)arg5; \
2394 _argvec[2+6] = (unsigned long)arg6; \
2395 _argvec[2+7] = (unsigned long)arg7; \
2396 _argvec[2+8] = (unsigned long)arg8; \
2397 _argvec[2+9] = (unsigned long)arg9; \
2398 _argvec[2+10] = (unsigned long)arg10; \
2399 _argvec[2+11] = (unsigned long)arg11; \
2400 _argvec[2+12] = (unsigned long)arg12; \
2403 "std 2,-16(11)\n\t"
\
2405 "addi 1,1,-144\n\t" \
2408 "std 3,136(1)\n\t" \
2411 "std 3,128(1)\n\t" \
2414 "std 3,120(1)\n\t" \
2417 "std 3,112(1)\n\t" \
2420 "ld 4, 16(11)\n\t" \
2421 "ld 5, 24(11)\n\t" \
2422 "ld 6, 32(11)\n\t" \
2423 "ld 7, 40(11)\n\t" \
2424 "ld 8, 48(11)\n\t" \
2425 "ld 9, 56(11)\n\t" \
2426 "ld 10, 64(11)\n\t" \
2427 "ld 11, 0(11)\n\t" \
2428 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2431 "ld 2,-16(11)\n\t"
\
2434 :
"r" (&_argvec[2]) \
2435 :
"cc", "memory", __CALLER_SAVED_REGS \
2437 lval = (__typeof__(lval)) _res; \
2444#if defined(PLAT_ppc32_aix5)
2449#define __CALLER_SAVED_REGS \
2450 "lr", "ctr", "xer", \
2451 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \
2452 "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \
2458#define VG_EXPAND_FRAME_BY_trashes_r3(_n_fr) \
2459 "addi 1,1,-" #_n_fr "\n\t" \
2460 "lwz 3," #_n_fr "(1)\n\t" \
2463#define VG_CONTRACT_FRAME_BY(_n_fr) \
2464 "addi 1,1," #_n_fr "\n\t"
2469#define CALL_FN_W_v(lval, orig) \
2471 volatile OrigFn _orig = (orig); \
2472 volatile unsigned long _argvec[3+0]; \
2473 volatile unsigned long _res; \
2475 _argvec[1] = (unsigned long)_orig.r2; \
2476 _argvec[2] = (unsigned long)_orig.nraddr; \
2479 VG_EXPAND_FRAME_BY_trashes_r3(512) \
2480 "stw 2,-8(11)\n\t"
\
2481 "lwz 2,-4(11)\n\t" \
2482 "lwz 11, 0(11)\n\t" \
2483 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2486 "lwz 2,-8(11)\n\t"
\
2487 VG_CONTRACT_FRAME_BY(512) \
2489 :
"r" (&_argvec[2]) \
2490 :
"cc", "memory", __CALLER_SAVED_REGS \
2492 lval = (__typeof__(lval)) _res; \
2495#define CALL_FN_W_W(lval, orig, arg1) \
2497 volatile OrigFn _orig = (orig); \
2498 volatile unsigned long _argvec[3+1]; \
2499 volatile unsigned long _res; \
2501 _argvec[1] = (unsigned long)_orig.r2; \
2502 _argvec[2] = (unsigned long)_orig.nraddr; \
2503 _argvec[2+1] = (unsigned long)arg1; \
2506 VG_EXPAND_FRAME_BY_trashes_r3(512) \
2507 "stw 2,-8(11)\n\t"
\
2508 "lwz 2,-4(11)\n\t" \
2509 "lwz 3, 4(11)\n\t" \
2510 "lwz 11, 0(11)\n\t" \
2511 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2514 "lwz 2,-8(11)\n\t"
\
2515 VG_CONTRACT_FRAME_BY(512) \
2517 :
"r" (&_argvec[2]) \
2518 :
"cc", "memory", __CALLER_SAVED_REGS \
2520 lval = (__typeof__(lval)) _res; \
2523#define CALL_FN_W_WW(lval, orig, arg1,arg2) \
2525 volatile OrigFn _orig = (orig); \
2526 volatile unsigned long _argvec[3+2]; \
2527 volatile unsigned long _res; \
2529 _argvec[1] = (unsigned long)_orig.r2; \
2530 _argvec[2] = (unsigned long)_orig.nraddr; \
2531 _argvec[2+1] = (unsigned long)arg1; \
2532 _argvec[2+2] = (unsigned long)arg2; \
2535 VG_EXPAND_FRAME_BY_trashes_r3(512) \
2536 "stw 2,-8(11)\n\t"
\
2537 "lwz 2,-4(11)\n\t" \
2538 "lwz 3, 4(11)\n\t" \
2539 "lwz 4, 8(11)\n\t" \
2540 "lwz 11, 0(11)\n\t" \
2541 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2544 "lwz 2,-8(11)\n\t"
\
2545 VG_CONTRACT_FRAME_BY(512) \
2547 :
"r" (&_argvec[2]) \
2548 :
"cc", "memory", __CALLER_SAVED_REGS \
2550 lval = (__typeof__(lval)) _res; \
2553#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
2555 volatile OrigFn _orig = (orig); \
2556 volatile unsigned long _argvec[3+3]; \
2557 volatile unsigned long _res; \
2559 _argvec[1] = (unsigned long)_orig.r2; \
2560 _argvec[2] = (unsigned long)_orig.nraddr; \
2561 _argvec[2+1] = (unsigned long)arg1; \
2562 _argvec[2+2] = (unsigned long)arg2; \
2563 _argvec[2+3] = (unsigned long)arg3; \
2566 VG_EXPAND_FRAME_BY_trashes_r3(512) \
2567 "stw 2,-8(11)\n\t"
\
2568 "lwz 2,-4(11)\n\t" \
2569 "lwz 3, 4(11)\n\t" \
2570 "lwz 4, 8(11)\n\t" \
2571 "lwz 5, 12(11)\n\t" \
2572 "lwz 11, 0(11)\n\t" \
2573 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2576 "lwz 2,-8(11)\n\t"
\
2577 VG_CONTRACT_FRAME_BY(512) \
2579 :
"r" (&_argvec[2]) \
2580 :
"cc", "memory", __CALLER_SAVED_REGS \
2582 lval = (__typeof__(lval)) _res; \
2585#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
2587 volatile OrigFn _orig = (orig); \
2588 volatile unsigned long _argvec[3+4]; \
2589 volatile unsigned long _res; \
2591 _argvec[1] = (unsigned long)_orig.r2; \
2592 _argvec[2] = (unsigned long)_orig.nraddr; \
2593 _argvec[2+1] = (unsigned long)arg1; \
2594 _argvec[2+2] = (unsigned long)arg2; \
2595 _argvec[2+3] = (unsigned long)arg3; \
2596 _argvec[2+4] = (unsigned long)arg4; \
2599 VG_EXPAND_FRAME_BY_trashes_r3(512) \
2600 "stw 2,-8(11)\n\t"
\
2601 "lwz 2,-4(11)\n\t" \
2602 "lwz 3, 4(11)\n\t" \
2603 "lwz 4, 8(11)\n\t" \
2604 "lwz 5, 12(11)\n\t" \
2605 "lwz 6, 16(11)\n\t" \
2606 "lwz 11, 0(11)\n\t" \
2607 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2610 "lwz 2,-8(11)\n\t"
\
2611 VG_CONTRACT_FRAME_BY(512) \
2613 :
"r" (&_argvec[2]) \
2614 :
"cc", "memory", __CALLER_SAVED_REGS \
2616 lval = (__typeof__(lval)) _res; \
2619#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
2621 volatile OrigFn _orig = (orig); \
2622 volatile unsigned long _argvec[3+5]; \
2623 volatile unsigned long _res; \
2625 _argvec[1] = (unsigned long)_orig.r2; \
2626 _argvec[2] = (unsigned long)_orig.nraddr; \
2627 _argvec[2+1] = (unsigned long)arg1; \
2628 _argvec[2+2] = (unsigned long)arg2; \
2629 _argvec[2+3] = (unsigned long)arg3; \
2630 _argvec[2+4] = (unsigned long)arg4; \
2631 _argvec[2+5] = (unsigned long)arg5; \
2634 VG_EXPAND_FRAME_BY_trashes_r3(512) \
2635 "stw 2,-8(11)\n\t"
\
2636 "lwz 2,-4(11)\n\t" \
2637 "lwz 3, 4(11)\n\t" \
2638 "lwz 4, 8(11)\n\t" \
2639 "lwz 5, 12(11)\n\t" \
2640 "lwz 6, 16(11)\n\t" \
2641 "lwz 7, 20(11)\n\t" \
2642 "lwz 11, 0(11)\n\t" \
2643 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2646 "lwz 2,-8(11)\n\t"
\
2647 VG_CONTRACT_FRAME_BY(512) \
2649 :
"r" (&_argvec[2]) \
2650 :
"cc", "memory", __CALLER_SAVED_REGS \
2652 lval = (__typeof__(lval)) _res; \
2655#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
2657 volatile OrigFn _orig = (orig); \
2658 volatile unsigned long _argvec[3+6]; \
2659 volatile unsigned long _res; \
2661 _argvec[1] = (unsigned long)_orig.r2; \
2662 _argvec[2] = (unsigned long)_orig.nraddr; \
2663 _argvec[2+1] = (unsigned long)arg1; \
2664 _argvec[2+2] = (unsigned long)arg2; \
2665 _argvec[2+3] = (unsigned long)arg3; \
2666 _argvec[2+4] = (unsigned long)arg4; \
2667 _argvec[2+5] = (unsigned long)arg5; \
2668 _argvec[2+6] = (unsigned long)arg6; \
2671 VG_EXPAND_FRAME_BY_trashes_r3(512) \
2672 "stw 2,-8(11)\n\t"
\
2673 "lwz 2,-4(11)\n\t" \
2674 "lwz 3, 4(11)\n\t" \
2675 "lwz 4, 8(11)\n\t" \
2676 "lwz 5, 12(11)\n\t" \
2677 "lwz 6, 16(11)\n\t" \
2678 "lwz 7, 20(11)\n\t" \
2679 "lwz 8, 24(11)\n\t" \
2680 "lwz 11, 0(11)\n\t" \
2681 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2684 "lwz 2,-8(11)\n\t"
\
2685 VG_CONTRACT_FRAME_BY(512) \
2687 :
"r" (&_argvec[2]) \
2688 :
"cc", "memory", __CALLER_SAVED_REGS \
2690 lval = (__typeof__(lval)) _res; \
2693#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2696 volatile OrigFn _orig = (orig); \
2697 volatile unsigned long _argvec[3+7]; \
2698 volatile unsigned long _res; \
2700 _argvec[1] = (unsigned long)_orig.r2; \
2701 _argvec[2] = (unsigned long)_orig.nraddr; \
2702 _argvec[2+1] = (unsigned long)arg1; \
2703 _argvec[2+2] = (unsigned long)arg2; \
2704 _argvec[2+3] = (unsigned long)arg3; \
2705 _argvec[2+4] = (unsigned long)arg4; \
2706 _argvec[2+5] = (unsigned long)arg5; \
2707 _argvec[2+6] = (unsigned long)arg6; \
2708 _argvec[2+7] = (unsigned long)arg7; \
2711 VG_EXPAND_FRAME_BY_trashes_r3(512) \
2712 "stw 2,-8(11)\n\t"
\
2713 "lwz 2,-4(11)\n\t" \
2714 "lwz 3, 4(11)\n\t" \
2715 "lwz 4, 8(11)\n\t" \
2716 "lwz 5, 12(11)\n\t" \
2717 "lwz 6, 16(11)\n\t" \
2718 "lwz 7, 20(11)\n\t" \
2719 "lwz 8, 24(11)\n\t" \
2720 "lwz 9, 28(11)\n\t" \
2721 "lwz 11, 0(11)\n\t" \
2722 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2725 "lwz 2,-8(11)\n\t"
\
2726 VG_CONTRACT_FRAME_BY(512) \
2728 :
"r" (&_argvec[2]) \
2729 :
"cc", "memory", __CALLER_SAVED_REGS \
2731 lval = (__typeof__(lval)) _res; \
2734#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2737 volatile OrigFn _orig = (orig); \
2738 volatile unsigned long _argvec[3+8]; \
2739 volatile unsigned long _res; \
2741 _argvec[1] = (unsigned long)_orig.r2; \
2742 _argvec[2] = (unsigned long)_orig.nraddr; \
2743 _argvec[2+1] = (unsigned long)arg1; \
2744 _argvec[2+2] = (unsigned long)arg2; \
2745 _argvec[2+3] = (unsigned long)arg3; \
2746 _argvec[2+4] = (unsigned long)arg4; \
2747 _argvec[2+5] = (unsigned long)arg5; \
2748 _argvec[2+6] = (unsigned long)arg6; \
2749 _argvec[2+7] = (unsigned long)arg7; \
2750 _argvec[2+8] = (unsigned long)arg8; \
2753 VG_EXPAND_FRAME_BY_trashes_r3(512) \
2754 "stw 2,-8(11)\n\t"
\
2755 "lwz 2,-4(11)\n\t" \
2756 "lwz 3, 4(11)\n\t" \
2757 "lwz 4, 8(11)\n\t" \
2758 "lwz 5, 12(11)\n\t" \
2759 "lwz 6, 16(11)\n\t" \
2760 "lwz 7, 20(11)\n\t" \
2761 "lwz 8, 24(11)\n\t" \
2762 "lwz 9, 28(11)\n\t" \
2763 "lwz 10, 32(11)\n\t" \
2764 "lwz 11, 0(11)\n\t" \
2765 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2768 "lwz 2,-8(11)\n\t"
\
2769 VG_CONTRACT_FRAME_BY(512) \
2771 :
"r" (&_argvec[2]) \
2772 :
"cc", "memory", __CALLER_SAVED_REGS \
2774 lval = (__typeof__(lval)) _res; \
2777#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2780 volatile OrigFn _orig = (orig); \
2781 volatile unsigned long _argvec[3+9]; \
2782 volatile unsigned long _res; \
2784 _argvec[1] = (unsigned long)_orig.r2; \
2785 _argvec[2] = (unsigned long)_orig.nraddr; \
2786 _argvec[2+1] = (unsigned long)arg1; \
2787 _argvec[2+2] = (unsigned long)arg2; \
2788 _argvec[2+3] = (unsigned long)arg3; \
2789 _argvec[2+4] = (unsigned long)arg4; \
2790 _argvec[2+5] = (unsigned long)arg5; \
2791 _argvec[2+6] = (unsigned long)arg6; \
2792 _argvec[2+7] = (unsigned long)arg7; \
2793 _argvec[2+8] = (unsigned long)arg8; \
2794 _argvec[2+9] = (unsigned long)arg9; \
2797 VG_EXPAND_FRAME_BY_trashes_r3(512) \
2798 "stw 2,-8(11)\n\t"
\
2799 "lwz 2,-4(11)\n\t" \
2800 VG_EXPAND_FRAME_BY_trashes_r3(64) \
2802 "lwz 3,36(11)\n\t" \
2805 "lwz 3, 4(11)\n\t" \
2806 "lwz 4, 8(11)\n\t" \
2807 "lwz 5, 12(11)\n\t" \
2808 "lwz 6, 16(11)\n\t" \
2809 "lwz 7, 20(11)\n\t" \
2810 "lwz 8, 24(11)\n\t" \
2811 "lwz 9, 28(11)\n\t" \
2812 "lwz 10, 32(11)\n\t" \
2813 "lwz 11, 0(11)\n\t" \
2814 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2817 "lwz 2,-8(11)\n\t"
\
2818 VG_CONTRACT_FRAME_BY(64) \
2819 VG_CONTRACT_FRAME_BY(512) \
2821 :
"r" (&_argvec[2]) \
2822 :
"cc", "memory", __CALLER_SAVED_REGS \
2824 lval = (__typeof__(lval)) _res; \
2827#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2828 arg7,arg8,arg9,arg10) \
2830 volatile OrigFn _orig = (orig); \
2831 volatile unsigned long _argvec[3+10]; \
2832 volatile unsigned long _res; \
2834 _argvec[1] = (unsigned long)_orig.r2; \
2835 _argvec[2] = (unsigned long)_orig.nraddr; \
2836 _argvec[2+1] = (unsigned long)arg1; \
2837 _argvec[2+2] = (unsigned long)arg2; \
2838 _argvec[2+3] = (unsigned long)arg3; \
2839 _argvec[2+4] = (unsigned long)arg4; \
2840 _argvec[2+5] = (unsigned long)arg5; \
2841 _argvec[2+6] = (unsigned long)arg6; \
2842 _argvec[2+7] = (unsigned long)arg7; \
2843 _argvec[2+8] = (unsigned long)arg8; \
2844 _argvec[2+9] = (unsigned long)arg9; \
2845 _argvec[2+10] = (unsigned long)arg10; \
2848 VG_EXPAND_FRAME_BY_trashes_r3(512) \
2849 "stw 2,-8(11)\n\t"
\
2850 "lwz 2,-4(11)\n\t" \
2851 VG_EXPAND_FRAME_BY_trashes_r3(64) \
2853 "lwz 3,40(11)\n\t" \
2856 "lwz 3,36(11)\n\t" \
2859 "lwz 3, 4(11)\n\t" \
2860 "lwz 4, 8(11)\n\t" \
2861 "lwz 5, 12(11)\n\t" \
2862 "lwz 6, 16(11)\n\t" \
2863 "lwz 7, 20(11)\n\t" \
2864 "lwz 8, 24(11)\n\t" \
2865 "lwz 9, 28(11)\n\t" \
2866 "lwz 10, 32(11)\n\t" \
2867 "lwz 11, 0(11)\n\t" \
2868 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2871 "lwz 2,-8(11)\n\t"
\
2872 VG_CONTRACT_FRAME_BY(64) \
2873 VG_CONTRACT_FRAME_BY(512) \
2875 :
"r" (&_argvec[2]) \
2876 :
"cc", "memory", __CALLER_SAVED_REGS \
2878 lval = (__typeof__(lval)) _res; \
2881#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2882 arg7,arg8,arg9,arg10,arg11) \
2884 volatile OrigFn _orig = (orig); \
2885 volatile unsigned long _argvec[3+11]; \
2886 volatile unsigned long _res; \
2888 _argvec[1] = (unsigned long)_orig.r2; \
2889 _argvec[2] = (unsigned long)_orig.nraddr; \
2890 _argvec[2+1] = (unsigned long)arg1; \
2891 _argvec[2+2] = (unsigned long)arg2; \
2892 _argvec[2+3] = (unsigned long)arg3; \
2893 _argvec[2+4] = (unsigned long)arg4; \
2894 _argvec[2+5] = (unsigned long)arg5; \
2895 _argvec[2+6] = (unsigned long)arg6; \
2896 _argvec[2+7] = (unsigned long)arg7; \
2897 _argvec[2+8] = (unsigned long)arg8; \
2898 _argvec[2+9] = (unsigned long)arg9; \
2899 _argvec[2+10] = (unsigned long)arg10; \
2900 _argvec[2+11] = (unsigned long)arg11; \
2903 VG_EXPAND_FRAME_BY_trashes_r3(512) \
2904 "stw 2,-8(11)\n\t"
\
2905 "lwz 2,-4(11)\n\t" \
2906 VG_EXPAND_FRAME_BY_trashes_r3(72) \
2908 "lwz 3,44(11)\n\t" \
2911 "lwz 3,40(11)\n\t" \
2914 "lwz 3,36(11)\n\t" \
2917 "lwz 3, 4(11)\n\t" \
2918 "lwz 4, 8(11)\n\t" \
2919 "lwz 5, 12(11)\n\t" \
2920 "lwz 6, 16(11)\n\t" \
2921 "lwz 7, 20(11)\n\t" \
2922 "lwz 8, 24(11)\n\t" \
2923 "lwz 9, 28(11)\n\t" \
2924 "lwz 10, 32(11)\n\t" \
2925 "lwz 11, 0(11)\n\t" \
2926 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2929 "lwz 2,-8(11)\n\t"
\
2930 VG_CONTRACT_FRAME_BY(72) \
2931 VG_CONTRACT_FRAME_BY(512) \
2933 :
"r" (&_argvec[2]) \
2934 :
"cc", "memory", __CALLER_SAVED_REGS \
2936 lval = (__typeof__(lval)) _res; \
2939#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2940 arg7,arg8,arg9,arg10,arg11,arg12) \
2942 volatile OrigFn _orig = (orig); \
2943 volatile unsigned long _argvec[3+12]; \
2944 volatile unsigned long _res; \
2946 _argvec[1] = (unsigned long)_orig.r2; \
2947 _argvec[2] = (unsigned long)_orig.nraddr; \
2948 _argvec[2+1] = (unsigned long)arg1; \
2949 _argvec[2+2] = (unsigned long)arg2; \
2950 _argvec[2+3] = (unsigned long)arg3; \
2951 _argvec[2+4] = (unsigned long)arg4; \
2952 _argvec[2+5] = (unsigned long)arg5; \
2953 _argvec[2+6] = (unsigned long)arg6; \
2954 _argvec[2+7] = (unsigned long)arg7; \
2955 _argvec[2+8] = (unsigned long)arg8; \
2956 _argvec[2+9] = (unsigned long)arg9; \
2957 _argvec[2+10] = (unsigned long)arg10; \
2958 _argvec[2+11] = (unsigned long)arg11; \
2959 _argvec[2+12] = (unsigned long)arg12; \
2962 VG_EXPAND_FRAME_BY_trashes_r3(512) \
2963 "stw 2,-8(11)\n\t"
\
2964 "lwz 2,-4(11)\n\t" \
2965 VG_EXPAND_FRAME_BY_trashes_r3(72) \
2967 "lwz 3,48(11)\n\t" \
2970 "lwz 3,44(11)\n\t" \
2973 "lwz 3,40(11)\n\t" \
2976 "lwz 3,36(11)\n\t" \
2979 "lwz 3, 4(11)\n\t" \
2980 "lwz 4, 8(11)\n\t" \
2981 "lwz 5, 12(11)\n\t" \
2982 "lwz 6, 16(11)\n\t" \
2983 "lwz 7, 20(11)\n\t" \
2984 "lwz 8, 24(11)\n\t" \
2985 "lwz 9, 28(11)\n\t" \
2986 "lwz 10, 32(11)\n\t" \
2987 "lwz 11, 0(11)\n\t" \
2988 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2991 "lwz 2,-8(11)\n\t"
\
2992 VG_CONTRACT_FRAME_BY(72) \
2993 VG_CONTRACT_FRAME_BY(512) \
2995 :
"r" (&_argvec[2]) \
2996 :
"cc", "memory", __CALLER_SAVED_REGS \
2998 lval = (__typeof__(lval)) _res; \
3005#if defined(PLAT_ppc64_aix5)
3010#define __CALLER_SAVED_REGS \
3011 "lr", "ctr", "xer", \
3012 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \
3013 "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \
3019#define VG_EXPAND_FRAME_BY_trashes_r3(_n_fr) \
3020 "addi 1,1,-" #_n_fr "\n\t" \
3021 "ld 3," #_n_fr "(1)\n\t" \
3024#define VG_CONTRACT_FRAME_BY(_n_fr) \
3025 "addi 1,1," #_n_fr "\n\t"
3030#define CALL_FN_W_v(lval, orig) \
3032 volatile OrigFn _orig = (orig); \
3033 volatile unsigned long _argvec[3+0]; \
3034 volatile unsigned long _res; \
3036 _argvec[1] = (unsigned long)_orig.r2; \
3037 _argvec[2] = (unsigned long)_orig.nraddr; \
3040 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3041 "std 2,-16(11)\n\t"
\
3043 "ld 11, 0(11)\n\t" \
3044 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3047 "ld 2,-16(11)\n\t"
\
3048 VG_CONTRACT_FRAME_BY(512) \
3050 :
"r" (&_argvec[2]) \
3051 :
"cc", "memory", __CALLER_SAVED_REGS \
3053 lval = (__typeof__(lval)) _res; \
3056#define CALL_FN_W_W(lval, orig, arg1) \
3058 volatile OrigFn _orig = (orig); \
3059 volatile unsigned long _argvec[3+1]; \
3060 volatile unsigned long _res; \
3062 _argvec[1] = (unsigned long)_orig.r2; \
3063 _argvec[2] = (unsigned long)_orig.nraddr; \
3064 _argvec[2+1] = (unsigned long)arg1; \
3067 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3068 "std 2,-16(11)\n\t"
\
3071 "ld 11, 0(11)\n\t" \
3072 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3075 "ld 2,-16(11)\n\t"
\
3076 VG_CONTRACT_FRAME_BY(512) \
3078 :
"r" (&_argvec[2]) \
3079 :
"cc", "memory", __CALLER_SAVED_REGS \
3081 lval = (__typeof__(lval)) _res; \
3084#define CALL_FN_W_WW(lval, orig, arg1,arg2) \
3086 volatile OrigFn _orig = (orig); \
3087 volatile unsigned long _argvec[3+2]; \
3088 volatile unsigned long _res; \
3090 _argvec[1] = (unsigned long)_orig.r2; \
3091 _argvec[2] = (unsigned long)_orig.nraddr; \
3092 _argvec[2+1] = (unsigned long)arg1; \
3093 _argvec[2+2] = (unsigned long)arg2; \
3096 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3097 "std 2,-16(11)\n\t"
\
3100 "ld 4, 16(11)\n\t" \
3101 "ld 11, 0(11)\n\t" \
3102 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3105 "ld 2,-16(11)\n\t"
\
3106 VG_CONTRACT_FRAME_BY(512) \
3108 :
"r" (&_argvec[2]) \
3109 :
"cc", "memory", __CALLER_SAVED_REGS \
3111 lval = (__typeof__(lval)) _res; \
3114#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
3116 volatile OrigFn _orig = (orig); \
3117 volatile unsigned long _argvec[3+3]; \
3118 volatile unsigned long _res; \
3120 _argvec[1] = (unsigned long)_orig.r2; \
3121 _argvec[2] = (unsigned long)_orig.nraddr; \
3122 _argvec[2+1] = (unsigned long)arg1; \
3123 _argvec[2+2] = (unsigned long)arg2; \
3124 _argvec[2+3] = (unsigned long)arg3; \
3127 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3128 "std 2,-16(11)\n\t"
\
3131 "ld 4, 16(11)\n\t" \
3132 "ld 5, 24(11)\n\t" \
3133 "ld 11, 0(11)\n\t" \
3134 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3137 "ld 2,-16(11)\n\t"
\
3138 VG_CONTRACT_FRAME_BY(512) \
3140 :
"r" (&_argvec[2]) \
3141 :
"cc", "memory", __CALLER_SAVED_REGS \
3143 lval = (__typeof__(lval)) _res; \
3146#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
3148 volatile OrigFn _orig = (orig); \
3149 volatile unsigned long _argvec[3+4]; \
3150 volatile unsigned long _res; \
3152 _argvec[1] = (unsigned long)_orig.r2; \
3153 _argvec[2] = (unsigned long)_orig.nraddr; \
3154 _argvec[2+1] = (unsigned long)arg1; \
3155 _argvec[2+2] = (unsigned long)arg2; \
3156 _argvec[2+3] = (unsigned long)arg3; \
3157 _argvec[2+4] = (unsigned long)arg4; \
3160 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3161 "std 2,-16(11)\n\t"
\
3164 "ld 4, 16(11)\n\t" \
3165 "ld 5, 24(11)\n\t" \
3166 "ld 6, 32(11)\n\t" \
3167 "ld 11, 0(11)\n\t" \
3168 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3171 "ld 2,-16(11)\n\t"
\
3172 VG_CONTRACT_FRAME_BY(512) \
3174 :
"r" (&_argvec[2]) \
3175 :
"cc", "memory", __CALLER_SAVED_REGS \
3177 lval = (__typeof__(lval)) _res; \
3180#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
3182 volatile OrigFn _orig = (orig); \
3183 volatile unsigned long _argvec[3+5]; \
3184 volatile unsigned long _res; \
3186 _argvec[1] = (unsigned long)_orig.r2; \
3187 _argvec[2] = (unsigned long)_orig.nraddr; \
3188 _argvec[2+1] = (unsigned long)arg1; \
3189 _argvec[2+2] = (unsigned long)arg2; \
3190 _argvec[2+3] = (unsigned long)arg3; \
3191 _argvec[2+4] = (unsigned long)arg4; \
3192 _argvec[2+5] = (unsigned long)arg5; \
3195 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3196 "std 2,-16(11)\n\t"
\
3199 "ld 4, 16(11)\n\t" \
3200 "ld 5, 24(11)\n\t" \
3201 "ld 6, 32(11)\n\t" \
3202 "ld 7, 40(11)\n\t" \
3203 "ld 11, 0(11)\n\t" \
3204 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3207 "ld 2,-16(11)\n\t"
\
3208 VG_CONTRACT_FRAME_BY(512) \
3210 :
"r" (&_argvec[2]) \
3211 :
"cc", "memory", __CALLER_SAVED_REGS \
3213 lval = (__typeof__(lval)) _res; \
3216#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
3218 volatile OrigFn _orig = (orig); \
3219 volatile unsigned long _argvec[3+6]; \
3220 volatile unsigned long _res; \
3222 _argvec[1] = (unsigned long)_orig.r2; \
3223 _argvec[2] = (unsigned long)_orig.nraddr; \
3224 _argvec[2+1] = (unsigned long)arg1; \
3225 _argvec[2+2] = (unsigned long)arg2; \
3226 _argvec[2+3] = (unsigned long)arg3; \
3227 _argvec[2+4] = (unsigned long)arg4; \
3228 _argvec[2+5] = (unsigned long)arg5; \
3229 _argvec[2+6] = (unsigned long)arg6; \
3232 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3233 "std 2,-16(11)\n\t"
\
3236 "ld 4, 16(11)\n\t" \
3237 "ld 5, 24(11)\n\t" \
3238 "ld 6, 32(11)\n\t" \
3239 "ld 7, 40(11)\n\t" \
3240 "ld 8, 48(11)\n\t" \
3241 "ld 11, 0(11)\n\t" \
3242 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3245 "ld 2,-16(11)\n\t"
\
3246 VG_CONTRACT_FRAME_BY(512) \
3248 :
"r" (&_argvec[2]) \
3249 :
"cc", "memory", __CALLER_SAVED_REGS \
3251 lval = (__typeof__(lval)) _res; \
3254#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3257 volatile OrigFn _orig = (orig); \
3258 volatile unsigned long _argvec[3+7]; \
3259 volatile unsigned long _res; \
3261 _argvec[1] = (unsigned long)_orig.r2; \
3262 _argvec[2] = (unsigned long)_orig.nraddr; \
3263 _argvec[2+1] = (unsigned long)arg1; \
3264 _argvec[2+2] = (unsigned long)arg2; \
3265 _argvec[2+3] = (unsigned long)arg3; \
3266 _argvec[2+4] = (unsigned long)arg4; \
3267 _argvec[2+5] = (unsigned long)arg5; \
3268 _argvec[2+6] = (unsigned long)arg6; \
3269 _argvec[2+7] = (unsigned long)arg7; \
3272 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3273 "std 2,-16(11)\n\t"
\
3276 "ld 4, 16(11)\n\t" \
3277 "ld 5, 24(11)\n\t" \
3278 "ld 6, 32(11)\n\t" \
3279 "ld 7, 40(11)\n\t" \
3280 "ld 8, 48(11)\n\t" \
3281 "ld 9, 56(11)\n\t" \
3282 "ld 11, 0(11)\n\t" \
3283 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3286 "ld 2,-16(11)\n\t"
\
3287 VG_CONTRACT_FRAME_BY(512) \
3289 :
"r" (&_argvec[2]) \
3290 :
"cc", "memory", __CALLER_SAVED_REGS \
3292 lval = (__typeof__(lval)) _res; \
3295#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3298 volatile OrigFn _orig = (orig); \
3299 volatile unsigned long _argvec[3+8]; \
3300 volatile unsigned long _res; \
3302 _argvec[1] = (unsigned long)_orig.r2; \
3303 _argvec[2] = (unsigned long)_orig.nraddr; \
3304 _argvec[2+1] = (unsigned long)arg1; \
3305 _argvec[2+2] = (unsigned long)arg2; \
3306 _argvec[2+3] = (unsigned long)arg3; \
3307 _argvec[2+4] = (unsigned long)arg4; \
3308 _argvec[2+5] = (unsigned long)arg5; \
3309 _argvec[2+6] = (unsigned long)arg6; \
3310 _argvec[2+7] = (unsigned long)arg7; \
3311 _argvec[2+8] = (unsigned long)arg8; \
3314 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3315 "std 2,-16(11)\n\t"
\
3318 "ld 4, 16(11)\n\t" \
3319 "ld 5, 24(11)\n\t" \
3320 "ld 6, 32(11)\n\t" \
3321 "ld 7, 40(11)\n\t" \
3322 "ld 8, 48(11)\n\t" \
3323 "ld 9, 56(11)\n\t" \
3324 "ld 10, 64(11)\n\t" \
3325 "ld 11, 0(11)\n\t" \
3326 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3329 "ld 2,-16(11)\n\t"
\
3330 VG_CONTRACT_FRAME_BY(512) \
3332 :
"r" (&_argvec[2]) \
3333 :
"cc", "memory", __CALLER_SAVED_REGS \
3335 lval = (__typeof__(lval)) _res; \
3338#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3341 volatile OrigFn _orig = (orig); \
3342 volatile unsigned long _argvec[3+9]; \
3343 volatile unsigned long _res; \
3345 _argvec[1] = (unsigned long)_orig.r2; \
3346 _argvec[2] = (unsigned long)_orig.nraddr; \
3347 _argvec[2+1] = (unsigned long)arg1; \
3348 _argvec[2+2] = (unsigned long)arg2; \
3349 _argvec[2+3] = (unsigned long)arg3; \
3350 _argvec[2+4] = (unsigned long)arg4; \
3351 _argvec[2+5] = (unsigned long)arg5; \
3352 _argvec[2+6] = (unsigned long)arg6; \
3353 _argvec[2+7] = (unsigned long)arg7; \
3354 _argvec[2+8] = (unsigned long)arg8; \
3355 _argvec[2+9] = (unsigned long)arg9; \
3358 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3359 "std 2,-16(11)\n\t"
\
3361 VG_EXPAND_FRAME_BY_trashes_r3(128) \
3364 "std 3,112(1)\n\t" \
3367 "ld 4, 16(11)\n\t" \
3368 "ld 5, 24(11)\n\t" \
3369 "ld 6, 32(11)\n\t" \
3370 "ld 7, 40(11)\n\t" \
3371 "ld 8, 48(11)\n\t" \
3372 "ld 9, 56(11)\n\t" \
3373 "ld 10, 64(11)\n\t" \
3374 "ld 11, 0(11)\n\t" \
3375 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3378 "ld 2,-16(11)\n\t"
\
3379 VG_CONTRACT_FRAME_BY(128) \
3380 VG_CONTRACT_FRAME_BY(512) \
3382 :
"r" (&_argvec[2]) \
3383 :
"cc", "memory", __CALLER_SAVED_REGS \
3385 lval = (__typeof__(lval)) _res; \
3388#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3389 arg7,arg8,arg9,arg10) \
3391 volatile OrigFn _orig = (orig); \
3392 volatile unsigned long _argvec[3+10]; \
3393 volatile unsigned long _res; \
3395 _argvec[1] = (unsigned long)_orig.r2; \
3396 _argvec[2] = (unsigned long)_orig.nraddr; \
3397 _argvec[2+1] = (unsigned long)arg1; \
3398 _argvec[2+2] = (unsigned long)arg2; \
3399 _argvec[2+3] = (unsigned long)arg3; \
3400 _argvec[2+4] = (unsigned long)arg4; \
3401 _argvec[2+5] = (unsigned long)arg5; \
3402 _argvec[2+6] = (unsigned long)arg6; \
3403 _argvec[2+7] = (unsigned long)arg7; \
3404 _argvec[2+8] = (unsigned long)arg8; \
3405 _argvec[2+9] = (unsigned long)arg9; \
3406 _argvec[2+10] = (unsigned long)arg10; \
3409 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3410 "std 2,-16(11)\n\t"
\
3412 VG_EXPAND_FRAME_BY_trashes_r3(128) \
3415 "std 3,120(1)\n\t" \
3418 "std 3,112(1)\n\t" \
3421 "ld 4, 16(11)\n\t" \
3422 "ld 5, 24(11)\n\t" \
3423 "ld 6, 32(11)\n\t" \
3424 "ld 7, 40(11)\n\t" \
3425 "ld 8, 48(11)\n\t" \
3426 "ld 9, 56(11)\n\t" \
3427 "ld 10, 64(11)\n\t" \
3428 "ld 11, 0(11)\n\t" \
3429 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3432 "ld 2,-16(11)\n\t"
\
3433 VG_CONTRACT_FRAME_BY(128) \
3434 VG_CONTRACT_FRAME_BY(512) \
3436 :
"r" (&_argvec[2]) \
3437 :
"cc", "memory", __CALLER_SAVED_REGS \
3439 lval = (__typeof__(lval)) _res; \
3442#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3443 arg7,arg8,arg9,arg10,arg11) \
3445 volatile OrigFn _orig = (orig); \
3446 volatile unsigned long _argvec[3+11]; \
3447 volatile unsigned long _res; \
3449 _argvec[1] = (unsigned long)_orig.r2; \
3450 _argvec[2] = (unsigned long)_orig.nraddr; \
3451 _argvec[2+1] = (unsigned long)arg1; \
3452 _argvec[2+2] = (unsigned long)arg2; \
3453 _argvec[2+3] = (unsigned long)arg3; \
3454 _argvec[2+4] = (unsigned long)arg4; \
3455 _argvec[2+5] = (unsigned long)arg5; \
3456 _argvec[2+6] = (unsigned long)arg6; \
3457 _argvec[2+7] = (unsigned long)arg7; \
3458 _argvec[2+8] = (unsigned long)arg8; \
3459 _argvec[2+9] = (unsigned long)arg9; \
3460 _argvec[2+10] = (unsigned long)arg10; \
3461 _argvec[2+11] = (unsigned long)arg11; \
3464 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3465 "std 2,-16(11)\n\t"
\
3467 VG_EXPAND_FRAME_BY_trashes_r3(144) \
3470 "std 3,128(1)\n\t" \
3473 "std 3,120(1)\n\t" \
3476 "std 3,112(1)\n\t" \
3479 "ld 4, 16(11)\n\t" \
3480 "ld 5, 24(11)\n\t" \
3481 "ld 6, 32(11)\n\t" \
3482 "ld 7, 40(11)\n\t" \
3483 "ld 8, 48(11)\n\t" \
3484 "ld 9, 56(11)\n\t" \
3485 "ld 10, 64(11)\n\t" \
3486 "ld 11, 0(11)\n\t" \
3487 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3490 "ld 2,-16(11)\n\t"
\
3491 VG_CONTRACT_FRAME_BY(144) \
3492 VG_CONTRACT_FRAME_BY(512) \
3494 :
"r" (&_argvec[2]) \
3495 :
"cc", "memory", __CALLER_SAVED_REGS \
3497 lval = (__typeof__(lval)) _res; \
3500#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3501 arg7,arg8,arg9,arg10,arg11,arg12) \
3503 volatile OrigFn _orig = (orig); \
3504 volatile unsigned long _argvec[3+12]; \
3505 volatile unsigned long _res; \
3507 _argvec[1] = (unsigned long)_orig.r2; \
3508 _argvec[2] = (unsigned long)_orig.nraddr; \
3509 _argvec[2+1] = (unsigned long)arg1; \
3510 _argvec[2+2] = (unsigned long)arg2; \
3511 _argvec[2+3] = (unsigned long)arg3; \
3512 _argvec[2+4] = (unsigned long)arg4; \
3513 _argvec[2+5] = (unsigned long)arg5; \
3514 _argvec[2+6] = (unsigned long)arg6; \
3515 _argvec[2+7] = (unsigned long)arg7; \
3516 _argvec[2+8] = (unsigned long)arg8; \
3517 _argvec[2+9] = (unsigned long)arg9; \
3518 _argvec[2+10] = (unsigned long)arg10; \
3519 _argvec[2+11] = (unsigned long)arg11; \
3520 _argvec[2+12] = (unsigned long)arg12; \
3523 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3524 "std 2,-16(11)\n\t"
\
3526 VG_EXPAND_FRAME_BY_trashes_r3(144) \
3529 "std 3,136(1)\n\t" \
3532 "std 3,128(1)\n\t" \
3535 "std 3,120(1)\n\t" \
3538 "std 3,112(1)\n\t" \
3541 "ld 4, 16(11)\n\t" \
3542 "ld 5, 24(11)\n\t" \
3543 "ld 6, 32(11)\n\t" \
3544 "ld 7, 40(11)\n\t" \
3545 "ld 8, 48(11)\n\t" \
3546 "ld 9, 56(11)\n\t" \
3547 "ld 10, 64(11)\n\t" \
3548 "ld 11, 0(11)\n\t" \
3549 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3552 "ld 2,-16(11)\n\t"
\
3553 VG_CONTRACT_FRAME_BY(144) \
3554 VG_CONTRACT_FRAME_BY(512) \
3556 :
"r" (&_argvec[2]) \
3557 :
"cc", "memory", __CALLER_SAVED_REGS \
3559 lval = (__typeof__(lval)) _res; \
3580#define VG_USERREQ_TOOL_BASE(a,b) \
3581 ((unsigned int)(((a)&0xff) << 24 | ((b)&0xff) << 16))
3582#define VG_IS_TOOL_USERREQ(a, b, v) \
3583 (VG_USERREQ_TOOL_BASE(a,b) == ((v) & 0xffff0000))
3632#if !defined(__GNUC__)
3633# define __extension__
3640#define RUNNING_ON_VALGRIND __extension__ \
3641 ({unsigned int _qzz_res; \
3642 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0 , \
3643 VG_USERREQ__RUNNING_ON_VALGRIND, \
3653#define VALGRIND_DISCARD_TRANSLATIONS(_qzz_addr,_qzz_len) \
3654 {unsigned int _qzz_res; \
3655 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
3656 VG_USERREQ__DISCARD_TRANSLATIONS, \
3657 _qzz_addr, _qzz_len, 0, 0, 0); \
3664#if defined(NVALGRIND)
3666# define VALGRIND_PRINTF(...)
3667# define VALGRIND_PRINTF_BACKTRACE(...)
3674 __attribute__((
format(__printf__, 1, 2), __unused__));
3678 unsigned long _qzz_res;
3682 (
unsigned long)
format, (
unsigned long)vargs,
3685 return (
int)_qzz_res;
3689 __attribute__((
format(__printf__, 1, 2), __unused__));
3693 unsigned long _qzz_res;
3697 (
unsigned long)
format, (
unsigned long)vargs,
3700 return (
int)_qzz_res;
3729#define VALGRIND_NON_SIMD_CALL0(_qyy_fn) \
3731 ({unsigned long _qyy_res; \
3732 VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 , \
3733 VG_USERREQ__CLIENT_CALL0, \
3739#define VALGRIND_NON_SIMD_CALL1(_qyy_fn, _qyy_arg1) \
3741 ({unsigned long _qyy_res; \
3742 VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 , \
3743 VG_USERREQ__CLIENT_CALL1, \
3745 _qyy_arg1, 0, 0, 0); \
3749#define VALGRIND_NON_SIMD_CALL2(_qyy_fn, _qyy_arg1, _qyy_arg2) \
3751 ({unsigned long _qyy_res; \
3752 VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 , \
3753 VG_USERREQ__CLIENT_CALL2, \
3755 _qyy_arg1, _qyy_arg2, 0, 0); \
3759#define VALGRIND_NON_SIMD_CALL3(_qyy_fn, _qyy_arg1, _qyy_arg2, _qyy_arg3) \
3761 ({unsigned long _qyy_res; \
3762 VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 , \
3763 VG_USERREQ__CLIENT_CALL3, \
3765 _qyy_arg1, _qyy_arg2, \
3774#define VALGRIND_COUNT_ERRORS \
3776 ({unsigned int _qyy_res; \
3777 VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 , \
3778 VG_USERREQ__COUNT_ERRORS, \
3808#define VALGRIND_MALLOCLIKE_BLOCK(addr, sizeB, rzB, is_zeroed) \
3809 {unsigned int _qzz_res; \
3810 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
3811 VG_USERREQ__MALLOCLIKE_BLOCK, \
3812 addr, sizeB, rzB, is_zeroed, 0); \
3819#define VALGRIND_FREELIKE_BLOCK(addr, rzB) \
3820 {unsigned int _qzz_res; \
3821 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
3822 VG_USERREQ__FREELIKE_BLOCK, \
3823 addr, rzB, 0, 0, 0); \
3827#define VALGRIND_CREATE_MEMPOOL(pool, rzB, is_zeroed) \
3828 {unsigned int _qzz_res; \
3829 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
3830 VG_USERREQ__CREATE_MEMPOOL, \
3831 pool, rzB, is_zeroed, 0, 0); \
3835#define VALGRIND_DESTROY_MEMPOOL(pool) \
3836 {unsigned int _qzz_res; \
3837 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
3838 VG_USERREQ__DESTROY_MEMPOOL, \
3839 pool, 0, 0, 0, 0); \
3843#define VALGRIND_MEMPOOL_ALLOC(pool, addr, size) \
3844 {unsigned int _qzz_res; \
3845 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
3846 VG_USERREQ__MEMPOOL_ALLOC, \
3847 pool, addr, size, 0, 0); \
3851#define VALGRIND_MEMPOOL_FREE(pool, addr) \
3852 {unsigned int _qzz_res; \
3853 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
3854 VG_USERREQ__MEMPOOL_FREE, \
3855 pool, addr, 0, 0, 0); \
3859#define VALGRIND_MEMPOOL_TRIM(pool, addr, size) \
3860 {unsigned int _qzz_res; \
3861 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
3862 VG_USERREQ__MEMPOOL_TRIM, \
3863 pool, addr, size, 0, 0); \
3867#define VALGRIND_MOVE_MEMPOOL(poolA, poolB) \
3868 {unsigned int _qzz_res; \
3869 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
3870 VG_USERREQ__MOVE_MEMPOOL, \
3871 poolA, poolB, 0, 0, 0); \
3875#define VALGRIND_MEMPOOL_CHANGE(pool, addrA, addrB, size) \
3876 {unsigned int _qzz_res; \
3877 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
3878 VG_USERREQ__MEMPOOL_CHANGE, \
3879 pool, addrA, addrB, size, 0); \
3883#define VALGRIND_MEMPOOL_EXISTS(pool) \
3884 ({unsigned int _qzz_res; \
3885 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
3886 VG_USERREQ__MEMPOOL_EXISTS, \
3887 pool, 0, 0, 0, 0); \
3892#define VALGRIND_STACK_REGISTER(start, end) \
3893 ({unsigned int _qzz_res; \
3894 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
3895 VG_USERREQ__STACK_REGISTER, \
3896 start, end, 0, 0, 0); \
3902#define VALGRIND_STACK_DEREGISTER(id) \
3903 {unsigned int _qzz_res __attribute__ ((unused)); \
3904 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
3905 VG_USERREQ__STACK_DEREGISTER, \
3910#define VALGRIND_STACK_CHANGE(id, start, end) \
3911 {unsigned int _qzz_res; \
3912 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
3913 VG_USERREQ__STACK_CHANGE, \
3914 id, start, end, 0, 0); \
3918#undef PLAT_x86_linux
3919#undef PLAT_amd64_linux
3920#undef PLAT_ppc32_linux
3921#undef PLAT_ppc64_linux
3922#undef PLAT_ppc32_aix5
3923#undef PLAT_ppc64_aix5
format
Definition: make_certs.py:99
#define VALGRIND_PRINTF_BACKTRACE(...)
Definition: valgrind.h:3667
#define VALGRIND_PRINTF(...)
Definition: valgrind.h:3666
Vg_ClientRequest
Definition: valgrind.h:3590
@ VG_USERREQ__DESTROY_MEMPOOL
Definition: valgrind.h:3614
@ VG_USERREQ__PRINTF_BACKTRACE
Definition: valgrind.h:3624
@ VG_USERREQ__MEMPOOL_ALLOC
Definition: valgrind.h:3615
@ VG_USERREQ__MALLOCLIKE_BLOCK
Definition: valgrind.h:3610
@ VG_USERREQ__COUNT_ERRORS
Definition: valgrind.h:3606
@ VG_USERREQ__STACK_REGISTER
Definition: valgrind.h:3627
@ VG_USERREQ__MEMPOOL_CHANGE
Definition: valgrind.h:3619
@ VG_USERREQ__RUNNING_ON_VALGRIND
Definition: valgrind.h:3590
@ VG_USERREQ__CLIENT_CALL0
Definition: valgrind.h:3598
@ VG_USERREQ__DISCARD_TRANSLATIONS
Definition: valgrind.h:3591
@ VG_USERREQ__FREELIKE_BLOCK
Definition: valgrind.h:3611
@ VG_USERREQ__CREATE_MEMPOOL
Definition: valgrind.h:3613
@ VG_USERREQ__MOVE_MEMPOOL
Definition: valgrind.h:3618
@ VG_USERREQ__CLIENT_CALL3
Definition: valgrind.h:3601
@ VG_USERREQ__MEMPOOL_TRIM
Definition: valgrind.h:3617
@ VG_USERREQ__CLIENT_CALL2
Definition: valgrind.h:3600
@ VG_USERREQ__PRINTF
Definition: valgrind.h:3623
@ VG_USERREQ__STACK_CHANGE
Definition: valgrind.h:3629
@ VG_USERREQ__STACK_DEREGISTER
Definition: valgrind.h:3628
@ VG_USERREQ__MEMPOOL_FREE
Definition: valgrind.h:3616
@ VG_USERREQ__MEMPOOL_EXISTS
Definition: valgrind.h:3620
@ VG_USERREQ__CLIENT_CALL1
Definition: valgrind.h:3599
#define VALGRIND_DO_CLIENT_REQUEST( _zzq_rlval, _zzq_default, _zzq_request, _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)
Definition: valgrind.h:132