94#define __VALGRIND_MAJOR__ 3
95#define __VALGRIND_MINOR__ 6
114#undef PLAT_ppc64_aix5
115#undef PLAT_ppc32_aix5
116#undef PLAT_x86_darwin
117#undef PLAT_amd64_darwin
119#undef PLAT_amd64_linux
120#undef PLAT_ppc32_linux
121#undef PLAT_ppc64_linux
124#if defined(_AIX) && defined(__64BIT__)
125# define PLAT_ppc64_aix5 1
126#elif defined(_AIX) && !defined(__64BIT__)
127# define PLAT_ppc32_aix5 1
128#elif defined(__APPLE__) && defined(__i386__)
129# define PLAT_x86_darwin 1
130#elif defined(__APPLE__) && defined(__x86_64__)
131# define PLAT_amd64_darwin 1
132#elif defined(__linux__) && defined(__i386__)
133# define PLAT_x86_linux 1
134#elif defined(__linux__) && defined(__x86_64__)
135# define PLAT_amd64_linux 1
136#elif defined(__linux__) && defined(__powerpc__) && !defined(__powerpc64__)
137# define PLAT_ppc32_linux 1
138#elif defined(__linux__) && defined(__powerpc__) && defined(__powerpc64__)
139# define PLAT_ppc64_linux 1
140#elif defined(__linux__) && defined(__arm__)
141# define PLAT_arm_linux 1
145# if !defined(NVALGRIND)
156#if defined(NVALGRIND)
161#define VALGRIND_DO_CLIENT_REQUEST( \
162 _zzq_rlval, _zzq_default, _zzq_request, \
163 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
165 (_zzq_rlval) = (_zzq_default); \
207#if defined(PLAT_x86_linux) || defined(PLAT_x86_darwin)
215#define __SPECIAL_INSTRUCTION_PREAMBLE \
216 "roll $3, %%edi ; roll $13, %%edi\n\t" \
217 "roll $29, %%edi ; roll $19, %%edi\n\t"
219#define VALGRIND_DO_CLIENT_REQUEST( \
220 _zzq_rlval, _zzq_default, _zzq_request, \
221 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
222 { volatile unsigned int _zzq_args[6]; \
223 volatile unsigned int _zzq_result; \
224 _zzq_args[0] = (unsigned int)(_zzq_request); \
225 _zzq_args[1] = (unsigned int)(_zzq_arg1); \
226 _zzq_args[2] = (unsigned int)(_zzq_arg2); \
227 _zzq_args[3] = (unsigned int)(_zzq_arg3); \
228 _zzq_args[4] = (unsigned int)(_zzq_arg4); \
229 _zzq_args[5] = (unsigned int)(_zzq_arg5); \
230 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
232 "xchgl %%ebx,%%ebx" \
233 : "=d" (_zzq_result) \
234 : "a" (&_zzq_args[0]), "0" (_zzq_default) \
237 _zzq_rlval = _zzq_result; \
240#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
241 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
242 volatile unsigned int __addr; \
243 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
245 "xchgl %%ecx,%%ecx" \
250 _zzq_orig->nraddr = __addr; \
253#define VALGRIND_CALL_NOREDIR_EAX \
254 __SPECIAL_INSTRUCTION_PREAMBLE \
256 "xchgl %%edx,%%edx\n\t"
261#if defined(PLAT_amd64_linux) || defined(PLAT_amd64_darwin)
265 unsigned long long int nraddr;
269#define __SPECIAL_INSTRUCTION_PREAMBLE \
270 "rolq $3, %%rdi ; rolq $13, %%rdi\n\t" \
271 "rolq $61, %%rdi ; rolq $51, %%rdi\n\t"
273#define VALGRIND_DO_CLIENT_REQUEST( \
274 _zzq_rlval, _zzq_default, _zzq_request, \
275 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
276 { volatile unsigned long long int _zzq_args[6]; \
277 volatile unsigned long long int _zzq_result; \
278 _zzq_args[0] = (unsigned long long int)(_zzq_request); \
279 _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \
280 _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \
281 _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \
282 _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \
283 _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \
284 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
286 "xchgq %%rbx,%%rbx" \
287 : "=d" (_zzq_result) \
288 : "a" (&_zzq_args[0]), "0" (_zzq_default) \
291 _zzq_rlval = _zzq_result; \
294#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
295 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
296 volatile unsigned long long int __addr; \
297 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
299 "xchgq %%rcx,%%rcx" \
304 _zzq_orig->nraddr = __addr; \
307#define VALGRIND_CALL_NOREDIR_RAX \
308 __SPECIAL_INSTRUCTION_PREAMBLE \
310 "xchgq %%rdx,%%rdx\n\t"
315#if defined(PLAT_ppc32_linux)
323#define __SPECIAL_INSTRUCTION_PREAMBLE \
324 "rlwinm 0,0,3,0,0 ; rlwinm 0,0,13,0,0\n\t" \
325 "rlwinm 0,0,29,0,0 ; rlwinm 0,0,19,0,0\n\t"
327#define VALGRIND_DO_CLIENT_REQUEST( \
328 _zzq_rlval, _zzq_default, _zzq_request, \
329 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
331 { unsigned int _zzq_args[6]; \
332 unsigned int _zzq_result; \
333 unsigned int* _zzq_ptr; \
334 _zzq_args[0] = (unsigned int)(_zzq_request); \
335 _zzq_args[1] = (unsigned int)(_zzq_arg1); \
336 _zzq_args[2] = (unsigned int)(_zzq_arg2); \
337 _zzq_args[3] = (unsigned int)(_zzq_arg3); \
338 _zzq_args[4] = (unsigned int)(_zzq_arg4); \
339 _zzq_args[5] = (unsigned int)(_zzq_arg5); \
340 _zzq_ptr = _zzq_args; \
341 __asm__ volatile("mr 3,%1\n\t" \
343 __SPECIAL_INSTRUCTION_PREAMBLE \
347 : "=b" (_zzq_result) \
348 : "b" (_zzq_default), "b" (_zzq_ptr) \
349 : "cc", "memory", "r3", "r4"); \
350 _zzq_rlval = _zzq_result; \
353#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
354 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
355 unsigned int __addr; \
356 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
362 : "cc", "memory", "r3" \
364 _zzq_orig->nraddr = __addr; \
367#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
368 __SPECIAL_INSTRUCTION_PREAMBLE \
375#if defined(PLAT_ppc64_linux)
379 unsigned long long int nraddr;
380 unsigned long long int r2;
384#define __SPECIAL_INSTRUCTION_PREAMBLE \
385 "rotldi 0,0,3 ; rotldi 0,0,13\n\t" \
386 "rotldi 0,0,61 ; rotldi 0,0,51\n\t"
388#define VALGRIND_DO_CLIENT_REQUEST( \
389 _zzq_rlval, _zzq_default, _zzq_request, \
390 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
392 { unsigned long long int _zzq_args[6]; \
393 register unsigned long long int _zzq_result __asm__("r3"); \
394 register unsigned long long int* _zzq_ptr __asm__("r4"); \
395 _zzq_args[0] = (unsigned long long int)(_zzq_request); \
396 _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \
397 _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \
398 _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \
399 _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \
400 _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \
401 _zzq_ptr = _zzq_args; \
402 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
405 : "=r" (_zzq_result) \
406 : "0" (_zzq_default), "r" (_zzq_ptr) \
408 _zzq_rlval = _zzq_result; \
411#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
412 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
413 register unsigned long long int __addr __asm__("r3"); \
414 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
421 _zzq_orig->nraddr = __addr; \
422 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
429 _zzq_orig->r2 = __addr; \
432#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
433 __SPECIAL_INSTRUCTION_PREAMBLE \
441#if defined(PLAT_arm_linux)
449#define __SPECIAL_INSTRUCTION_PREAMBLE \
450 "mov r12, r12, ror #3 ; mov r12, r12, ror #13 \n\t" \
451 "mov r12, r12, ror #29 ; mov r12, r12, ror #19 \n\t"
453#define VALGRIND_DO_CLIENT_REQUEST( \
454 _zzq_rlval, _zzq_default, _zzq_request, \
455 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
457 { volatile unsigned int _zzq_args[6]; \
458 volatile unsigned int _zzq_result; \
459 _zzq_args[0] = (unsigned int)(_zzq_request); \
460 _zzq_args[1] = (unsigned int)(_zzq_arg1); \
461 _zzq_args[2] = (unsigned int)(_zzq_arg2); \
462 _zzq_args[3] = (unsigned int)(_zzq_arg3); \
463 _zzq_args[4] = (unsigned int)(_zzq_arg4); \
464 _zzq_args[5] = (unsigned int)(_zzq_arg5); \
465 __asm__ volatile("mov r3, %1\n\t" \
467 __SPECIAL_INSTRUCTION_PREAMBLE \
469 "orr r10, r10, r10\n\t" \
471 : "=r" (_zzq_result) \
472 : "r" (_zzq_default), "r" (&_zzq_args[0]) \
473 : "cc","memory", "r3", "r4"); \
474 _zzq_rlval = _zzq_result; \
477#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
478 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
479 unsigned int __addr; \
480 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
482 "orr r11, r11, r11\n\t" \
486 : "cc", "memory", "r3" \
488 _zzq_orig->nraddr = __addr; \
491#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
492 __SPECIAL_INSTRUCTION_PREAMBLE \
494 "orr r12, r12, r12\n\t"
500#if defined(PLAT_ppc32_aix5)
509#define __SPECIAL_INSTRUCTION_PREAMBLE \
510 "rlwinm 0,0,3,0,0 ; rlwinm 0,0,13,0,0\n\t" \
511 "rlwinm 0,0,29,0,0 ; rlwinm 0,0,19,0,0\n\t"
513#define VALGRIND_DO_CLIENT_REQUEST( \
514 _zzq_rlval, _zzq_default, _zzq_request, \
515 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
517 { unsigned int _zzq_args[7]; \
518 register unsigned int _zzq_result; \
519 register unsigned int* _zzq_ptr; \
520 _zzq_args[0] = (unsigned int)(_zzq_request); \
521 _zzq_args[1] = (unsigned int)(_zzq_arg1); \
522 _zzq_args[2] = (unsigned int)(_zzq_arg2); \
523 _zzq_args[3] = (unsigned int)(_zzq_arg3); \
524 _zzq_args[4] = (unsigned int)(_zzq_arg4); \
525 _zzq_args[5] = (unsigned int)(_zzq_arg5); \
526 _zzq_args[6] = (unsigned int)(_zzq_default); \
527 _zzq_ptr = _zzq_args; \
528 __asm__ volatile("mr 4,%1\n\t" \
530 __SPECIAL_INSTRUCTION_PREAMBLE \
534 : "=b" (_zzq_result) \
536 : "r3", "r4", "cc", "memory"); \
537 _zzq_rlval = _zzq_result; \
540#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
541 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
542 register unsigned int __addr; \
543 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
549 : "r3", "cc", "memory" \
551 _zzq_orig->nraddr = __addr; \
552 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
558 : "r3", "cc", "memory" \
560 _zzq_orig->r2 = __addr; \
563#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
564 __SPECIAL_INSTRUCTION_PREAMBLE \
572#if defined(PLAT_ppc64_aix5)
576 unsigned long long int nraddr;
577 unsigned long long int r2;
581#define __SPECIAL_INSTRUCTION_PREAMBLE \
582 "rotldi 0,0,3 ; rotldi 0,0,13\n\t" \
583 "rotldi 0,0,61 ; rotldi 0,0,51\n\t"
585#define VALGRIND_DO_CLIENT_REQUEST( \
586 _zzq_rlval, _zzq_default, _zzq_request, \
587 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
589 { unsigned long long int _zzq_args[7]; \
590 register unsigned long long int _zzq_result; \
591 register unsigned long long int* _zzq_ptr; \
592 _zzq_args[0] = (unsigned int long long)(_zzq_request); \
593 _zzq_args[1] = (unsigned int long long)(_zzq_arg1); \
594 _zzq_args[2] = (unsigned int long long)(_zzq_arg2); \
595 _zzq_args[3] = (unsigned int long long)(_zzq_arg3); \
596 _zzq_args[4] = (unsigned int long long)(_zzq_arg4); \
597 _zzq_args[5] = (unsigned int long long)(_zzq_arg5); \
598 _zzq_args[6] = (unsigned int long long)(_zzq_default); \
599 _zzq_ptr = _zzq_args; \
600 __asm__ volatile("mr 4,%1\n\t" \
602 __SPECIAL_INSTRUCTION_PREAMBLE \
606 : "=b" (_zzq_result) \
608 : "r3", "r4", "cc", "memory"); \
609 _zzq_rlval = _zzq_result; \
612#define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
613 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
614 register unsigned long long int __addr; \
615 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
621 : "r3", "cc", "memory" \
623 _zzq_orig->nraddr = __addr; \
624 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
630 : "r3", "cc", "memory" \
632 _zzq_orig->r2 = __addr; \
635#define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
636 __SPECIAL_INSTRUCTION_PREAMBLE \
675#define VG_CONCAT4(_aa,_bb,_cc,_dd) _aa##_bb##_cc##_dd
677#define I_WRAP_SONAME_FNNAME_ZU(soname,fnname) \
678 VG_CONCAT4(_vgwZU_,soname,_,fnname)
680#define I_WRAP_SONAME_FNNAME_ZZ(soname,fnname) \
681 VG_CONCAT4(_vgwZZ_,soname,_,fnname)
687#define VALGRIND_GET_ORIG_FN(_lval) VALGRIND_GET_NR_CONTEXT(_lval)
692#define CALL_FN_v_v(fnptr) \
693 do { volatile unsigned long _junk; \
694 CALL_FN_W_v(_junk,fnptr); } while (0)
696#define CALL_FN_v_W(fnptr, arg1) \
697 do { volatile unsigned long _junk; \
698 CALL_FN_W_W(_junk,fnptr,arg1); } while (0)
700#define CALL_FN_v_WW(fnptr, arg1,arg2) \
701 do { volatile unsigned long _junk; \
702 CALL_FN_W_WW(_junk,fnptr,arg1,arg2); } while (0)
704#define CALL_FN_v_WWW(fnptr, arg1,arg2,arg3) \
705 do { volatile unsigned long _junk; \
706 CALL_FN_W_WWW(_junk,fnptr,arg1,arg2,arg3); } while (0)
708#define CALL_FN_v_WWWW(fnptr, arg1,arg2,arg3,arg4) \
709 do { volatile unsigned long _junk; \
710 CALL_FN_W_WWWW(_junk,fnptr,arg1,arg2,arg3,arg4); } while (0)
712#define CALL_FN_v_5W(fnptr, arg1,arg2,arg3,arg4,arg5) \
713 do { volatile unsigned long _junk; \
714 CALL_FN_W_5W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5); } while (0)
716#define CALL_FN_v_6W(fnptr, arg1,arg2,arg3,arg4,arg5,arg6) \
717 do { volatile unsigned long _junk; \
718 CALL_FN_W_6W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5,arg6); } while (0)
720#define CALL_FN_v_7W(fnptr, arg1,arg2,arg3,arg4,arg5,arg6,arg7) \
721 do { volatile unsigned long _junk; \
722 CALL_FN_W_7W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5,arg6,arg7); } while (0)
726#if defined(PLAT_x86_linux) || defined(PLAT_x86_darwin)
730#define __CALLER_SAVED_REGS "ecx", "edx"
735#define CALL_FN_W_v(lval, orig) \
737 volatile OrigFn _orig = (orig); \
738 volatile unsigned long _argvec[1]; \
739 volatile unsigned long _res; \
740 _argvec[0] = (unsigned long)_orig.nraddr; \
742 "movl (%%eax), %%eax\n\t" \
743 VALGRIND_CALL_NOREDIR_EAX \
745 : "a" (&_argvec[0]) \
746 : "cc", "memory", __CALLER_SAVED_REGS \
748 lval = (__typeof__(lval)) _res; \
751#define CALL_FN_W_W(lval, orig, arg1) \
753 volatile OrigFn _orig = (orig); \
754 volatile unsigned long _argvec[2]; \
755 volatile unsigned long _res; \
756 _argvec[0] = (unsigned long)_orig.nraddr; \
757 _argvec[1] = (unsigned long)(arg1); \
759 "pushl 4(%%eax)\n\t" \
760 "movl (%%eax), %%eax\n\t" \
761 VALGRIND_CALL_NOREDIR_EAX \
764 : "a" (&_argvec[0]) \
765 : "cc", "memory", __CALLER_SAVED_REGS \
767 lval = (__typeof__(lval)) _res; \
770#define CALL_FN_W_WW(lval, orig, arg1,arg2) \
772 volatile OrigFn _orig = (orig); \
773 volatile unsigned long _argvec[3]; \
774 volatile unsigned long _res; \
775 _argvec[0] = (unsigned long)_orig.nraddr; \
776 _argvec[1] = (unsigned long)(arg1); \
777 _argvec[2] = (unsigned long)(arg2); \
779 "pushl 8(%%eax)\n\t" \
780 "pushl 4(%%eax)\n\t" \
781 "movl (%%eax), %%eax\n\t" \
782 VALGRIND_CALL_NOREDIR_EAX \
785 : "a" (&_argvec[0]) \
786 : "cc", "memory", __CALLER_SAVED_REGS \
788 lval = (__typeof__(lval)) _res; \
791#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
793 volatile OrigFn _orig = (orig); \
794 volatile unsigned long _argvec[4]; \
795 volatile unsigned long _res; \
796 _argvec[0] = (unsigned long)_orig.nraddr; \
797 _argvec[1] = (unsigned long)(arg1); \
798 _argvec[2] = (unsigned long)(arg2); \
799 _argvec[3] = (unsigned long)(arg3); \
801 "pushl 12(%%eax)\n\t" \
802 "pushl 8(%%eax)\n\t" \
803 "pushl 4(%%eax)\n\t" \
804 "movl (%%eax), %%eax\n\t" \
805 VALGRIND_CALL_NOREDIR_EAX \
806 "addl $12, %%esp\n" \
808 : "a" (&_argvec[0]) \
809 : "cc", "memory", __CALLER_SAVED_REGS \
811 lval = (__typeof__(lval)) _res; \
814#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
816 volatile OrigFn _orig = (orig); \
817 volatile unsigned long _argvec[5]; \
818 volatile unsigned long _res; \
819 _argvec[0] = (unsigned long)_orig.nraddr; \
820 _argvec[1] = (unsigned long)(arg1); \
821 _argvec[2] = (unsigned long)(arg2); \
822 _argvec[3] = (unsigned long)(arg3); \
823 _argvec[4] = (unsigned long)(arg4); \
825 "pushl 16(%%eax)\n\t" \
826 "pushl 12(%%eax)\n\t" \
827 "pushl 8(%%eax)\n\t" \
828 "pushl 4(%%eax)\n\t" \
829 "movl (%%eax), %%eax\n\t" \
830 VALGRIND_CALL_NOREDIR_EAX \
831 "addl $16, %%esp\n" \
833 : "a" (&_argvec[0]) \
834 : "cc", "memory", __CALLER_SAVED_REGS \
836 lval = (__typeof__(lval)) _res; \
839#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
841 volatile OrigFn _orig = (orig); \
842 volatile unsigned long _argvec[6]; \
843 volatile unsigned long _res; \
844 _argvec[0] = (unsigned long)_orig.nraddr; \
845 _argvec[1] = (unsigned long)(arg1); \
846 _argvec[2] = (unsigned long)(arg2); \
847 _argvec[3] = (unsigned long)(arg3); \
848 _argvec[4] = (unsigned long)(arg4); \
849 _argvec[5] = (unsigned long)(arg5); \
851 "pushl 20(%%eax)\n\t" \
852 "pushl 16(%%eax)\n\t" \
853 "pushl 12(%%eax)\n\t" \
854 "pushl 8(%%eax)\n\t" \
855 "pushl 4(%%eax)\n\t" \
856 "movl (%%eax), %%eax\n\t" \
857 VALGRIND_CALL_NOREDIR_EAX \
858 "addl $20, %%esp\n" \
860 : "a" (&_argvec[0]) \
861 : "cc", "memory", __CALLER_SAVED_REGS \
863 lval = (__typeof__(lval)) _res; \
866#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
868 volatile OrigFn _orig = (orig); \
869 volatile unsigned long _argvec[7]; \
870 volatile unsigned long _res; \
871 _argvec[0] = (unsigned long)_orig.nraddr; \
872 _argvec[1] = (unsigned long)(arg1); \
873 _argvec[2] = (unsigned long)(arg2); \
874 _argvec[3] = (unsigned long)(arg3); \
875 _argvec[4] = (unsigned long)(arg4); \
876 _argvec[5] = (unsigned long)(arg5); \
877 _argvec[6] = (unsigned long)(arg6); \
879 "pushl 24(%%eax)\n\t" \
880 "pushl 20(%%eax)\n\t" \
881 "pushl 16(%%eax)\n\t" \
882 "pushl 12(%%eax)\n\t" \
883 "pushl 8(%%eax)\n\t" \
884 "pushl 4(%%eax)\n\t" \
885 "movl (%%eax), %%eax\n\t" \
886 VALGRIND_CALL_NOREDIR_EAX \
887 "addl $24, %%esp\n" \
889 : "a" (&_argvec[0]) \
890 : "cc", "memory", __CALLER_SAVED_REGS \
892 lval = (__typeof__(lval)) _res; \
895#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
898 volatile OrigFn _orig = (orig); \
899 volatile unsigned long _argvec[8]; \
900 volatile unsigned long _res; \
901 _argvec[0] = (unsigned long)_orig.nraddr; \
902 _argvec[1] = (unsigned long)(arg1); \
903 _argvec[2] = (unsigned long)(arg2); \
904 _argvec[3] = (unsigned long)(arg3); \
905 _argvec[4] = (unsigned long)(arg4); \
906 _argvec[5] = (unsigned long)(arg5); \
907 _argvec[6] = (unsigned long)(arg6); \
908 _argvec[7] = (unsigned long)(arg7); \
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 $28, %%esp\n" \
921 : "a" (&_argvec[0]) \
922 : "cc", "memory", __CALLER_SAVED_REGS \
924 lval = (__typeof__(lval)) _res; \
927#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
930 volatile OrigFn _orig = (orig); \
931 volatile unsigned long _argvec[9]; \
932 volatile unsigned long _res; \
933 _argvec[0] = (unsigned long)_orig.nraddr; \
934 _argvec[1] = (unsigned long)(arg1); \
935 _argvec[2] = (unsigned long)(arg2); \
936 _argvec[3] = (unsigned long)(arg3); \
937 _argvec[4] = (unsigned long)(arg4); \
938 _argvec[5] = (unsigned long)(arg5); \
939 _argvec[6] = (unsigned long)(arg6); \
940 _argvec[7] = (unsigned long)(arg7); \
941 _argvec[8] = (unsigned long)(arg8); \
943 "pushl 32(%%eax)\n\t" \
944 "pushl 28(%%eax)\n\t" \
945 "pushl 24(%%eax)\n\t" \
946 "pushl 20(%%eax)\n\t" \
947 "pushl 16(%%eax)\n\t" \
948 "pushl 12(%%eax)\n\t" \
949 "pushl 8(%%eax)\n\t" \
950 "pushl 4(%%eax)\n\t" \
951 "movl (%%eax), %%eax\n\t" \
952 VALGRIND_CALL_NOREDIR_EAX \
953 "addl $32, %%esp\n" \
955 : "a" (&_argvec[0]) \
956 : "cc", "memory", __CALLER_SAVED_REGS \
958 lval = (__typeof__(lval)) _res; \
961#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
964 volatile OrigFn _orig = (orig); \
965 volatile unsigned long _argvec[10]; \
966 volatile unsigned long _res; \
967 _argvec[0] = (unsigned long)_orig.nraddr; \
968 _argvec[1] = (unsigned long)(arg1); \
969 _argvec[2] = (unsigned long)(arg2); \
970 _argvec[3] = (unsigned long)(arg3); \
971 _argvec[4] = (unsigned long)(arg4); \
972 _argvec[5] = (unsigned long)(arg5); \
973 _argvec[6] = (unsigned long)(arg6); \
974 _argvec[7] = (unsigned long)(arg7); \
975 _argvec[8] = (unsigned long)(arg8); \
976 _argvec[9] = (unsigned long)(arg9); \
978 "pushl 36(%%eax)\n\t" \
979 "pushl 32(%%eax)\n\t" \
980 "pushl 28(%%eax)\n\t" \
981 "pushl 24(%%eax)\n\t" \
982 "pushl 20(%%eax)\n\t" \
983 "pushl 16(%%eax)\n\t" \
984 "pushl 12(%%eax)\n\t" \
985 "pushl 8(%%eax)\n\t" \
986 "pushl 4(%%eax)\n\t" \
987 "movl (%%eax), %%eax\n\t" \
988 VALGRIND_CALL_NOREDIR_EAX \
989 "addl $36, %%esp\n" \
991 : "a" (&_argvec[0]) \
992 : "cc", "memory", __CALLER_SAVED_REGS \
994 lval = (__typeof__(lval)) _res; \
997#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
998 arg7,arg8,arg9,arg10) \
1000 volatile OrigFn _orig = (orig); \
1001 volatile unsigned long _argvec[11]; \
1002 volatile unsigned long _res; \
1003 _argvec[0] = (unsigned long)_orig.nraddr; \
1004 _argvec[1] = (unsigned long)(arg1); \
1005 _argvec[2] = (unsigned long)(arg2); \
1006 _argvec[3] = (unsigned long)(arg3); \
1007 _argvec[4] = (unsigned long)(arg4); \
1008 _argvec[5] = (unsigned long)(arg5); \
1009 _argvec[6] = (unsigned long)(arg6); \
1010 _argvec[7] = (unsigned long)(arg7); \
1011 _argvec[8] = (unsigned long)(arg8); \
1012 _argvec[9] = (unsigned long)(arg9); \
1013 _argvec[10] = (unsigned long)(arg10); \
1015 "pushl 40(%%eax)\n\t" \
1016 "pushl 36(%%eax)\n\t" \
1017 "pushl 32(%%eax)\n\t" \
1018 "pushl 28(%%eax)\n\t" \
1019 "pushl 24(%%eax)\n\t" \
1020 "pushl 20(%%eax)\n\t" \
1021 "pushl 16(%%eax)\n\t" \
1022 "pushl 12(%%eax)\n\t" \
1023 "pushl 8(%%eax)\n\t" \
1024 "pushl 4(%%eax)\n\t" \
1025 "movl (%%eax), %%eax\n\t" \
1026 VALGRIND_CALL_NOREDIR_EAX \
1027 "addl $40, %%esp\n" \
1029 : "a" (&_argvec[0]) \
1030 : "cc", "memory", __CALLER_SAVED_REGS \
1032 lval = (__typeof__(lval)) _res; \
1035#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
1036 arg6,arg7,arg8,arg9,arg10, \
1039 volatile OrigFn _orig = (orig); \
1040 volatile unsigned long _argvec[12]; \
1041 volatile unsigned long _res; \
1042 _argvec[0] = (unsigned long)_orig.nraddr; \
1043 _argvec[1] = (unsigned long)(arg1); \
1044 _argvec[2] = (unsigned long)(arg2); \
1045 _argvec[3] = (unsigned long)(arg3); \
1046 _argvec[4] = (unsigned long)(arg4); \
1047 _argvec[5] = (unsigned long)(arg5); \
1048 _argvec[6] = (unsigned long)(arg6); \
1049 _argvec[7] = (unsigned long)(arg7); \
1050 _argvec[8] = (unsigned long)(arg8); \
1051 _argvec[9] = (unsigned long)(arg9); \
1052 _argvec[10] = (unsigned long)(arg10); \
1053 _argvec[11] = (unsigned long)(arg11); \
1055 "pushl 44(%%eax)\n\t" \
1056 "pushl 40(%%eax)\n\t" \
1057 "pushl 36(%%eax)\n\t" \
1058 "pushl 32(%%eax)\n\t" \
1059 "pushl 28(%%eax)\n\t" \
1060 "pushl 24(%%eax)\n\t" \
1061 "pushl 20(%%eax)\n\t" \
1062 "pushl 16(%%eax)\n\t" \
1063 "pushl 12(%%eax)\n\t" \
1064 "pushl 8(%%eax)\n\t" \
1065 "pushl 4(%%eax)\n\t" \
1066 "movl (%%eax), %%eax\n\t" \
1067 VALGRIND_CALL_NOREDIR_EAX \
1068 "addl $44, %%esp\n" \
1070 : "a" (&_argvec[0]) \
1071 : "cc", "memory", __CALLER_SAVED_REGS \
1073 lval = (__typeof__(lval)) _res; \
1076#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
1077 arg6,arg7,arg8,arg9,arg10, \
1080 volatile OrigFn _orig = (orig); \
1081 volatile unsigned long _argvec[13]; \
1082 volatile unsigned long _res; \
1083 _argvec[0] = (unsigned long)_orig.nraddr; \
1084 _argvec[1] = (unsigned long)(arg1); \
1085 _argvec[2] = (unsigned long)(arg2); \
1086 _argvec[3] = (unsigned long)(arg3); \
1087 _argvec[4] = (unsigned long)(arg4); \
1088 _argvec[5] = (unsigned long)(arg5); \
1089 _argvec[6] = (unsigned long)(arg6); \
1090 _argvec[7] = (unsigned long)(arg7); \
1091 _argvec[8] = (unsigned long)(arg8); \
1092 _argvec[9] = (unsigned long)(arg9); \
1093 _argvec[10] = (unsigned long)(arg10); \
1094 _argvec[11] = (unsigned long)(arg11); \
1095 _argvec[12] = (unsigned long)(arg12); \
1097 "pushl 48(%%eax)\n\t" \
1098 "pushl 44(%%eax)\n\t" \
1099 "pushl 40(%%eax)\n\t" \
1100 "pushl 36(%%eax)\n\t" \
1101 "pushl 32(%%eax)\n\t" \
1102 "pushl 28(%%eax)\n\t" \
1103 "pushl 24(%%eax)\n\t" \
1104 "pushl 20(%%eax)\n\t" \
1105 "pushl 16(%%eax)\n\t" \
1106 "pushl 12(%%eax)\n\t" \
1107 "pushl 8(%%eax)\n\t" \
1108 "pushl 4(%%eax)\n\t" \
1109 "movl (%%eax), %%eax\n\t" \
1110 VALGRIND_CALL_NOREDIR_EAX \
1111 "addl $48, %%esp\n" \
1113 : "a" (&_argvec[0]) \
1114 : "cc", "memory", __CALLER_SAVED_REGS \
1116 lval = (__typeof__(lval)) _res; \
1123#if defined(PLAT_amd64_linux) || defined(PLAT_amd64_darwin)
1128#define __CALLER_SAVED_REGS "rcx", "rdx", "rsi", \
1129 "rdi", "r8", "r9", "r10", "r11"
1155#define CALL_FN_W_v(lval, orig) \
1157 volatile OrigFn _orig = (orig); \
1158 volatile unsigned long _argvec[1]; \
1159 volatile unsigned long _res; \
1160 _argvec[0] = (unsigned long)_orig.nraddr; \
1162 "subq $128,%%rsp\n\t" \
1163 "movq (%%rax), %%rax\n\t" \
1164 VALGRIND_CALL_NOREDIR_RAX \
1165 "addq $128,%%rsp\n\t" \
1167 : "a" (&_argvec[0]) \
1168 : "cc", "memory", __CALLER_SAVED_REGS \
1170 lval = (__typeof__(lval)) _res; \
1173#define CALL_FN_W_W(lval, orig, arg1) \
1175 volatile OrigFn _orig = (orig); \
1176 volatile unsigned long _argvec[2]; \
1177 volatile unsigned long _res; \
1178 _argvec[0] = (unsigned long)_orig.nraddr; \
1179 _argvec[1] = (unsigned long)(arg1); \
1181 "subq $128,%%rsp\n\t" \
1182 "movq 8(%%rax), %%rdi\n\t" \
1183 "movq (%%rax), %%rax\n\t" \
1184 VALGRIND_CALL_NOREDIR_RAX \
1185 "addq $128,%%rsp\n\t" \
1187 : "a" (&_argvec[0]) \
1188 : "cc", "memory", __CALLER_SAVED_REGS \
1190 lval = (__typeof__(lval)) _res; \
1193#define CALL_FN_W_WW(lval, orig, arg1,arg2) \
1195 volatile OrigFn _orig = (orig); \
1196 volatile unsigned long _argvec[3]; \
1197 volatile unsigned long _res; \
1198 _argvec[0] = (unsigned long)_orig.nraddr; \
1199 _argvec[1] = (unsigned long)(arg1); \
1200 _argvec[2] = (unsigned long)(arg2); \
1202 "subq $128,%%rsp\n\t" \
1203 "movq 16(%%rax), %%rsi\n\t" \
1204 "movq 8(%%rax), %%rdi\n\t" \
1205 "movq (%%rax), %%rax\n\t" \
1206 VALGRIND_CALL_NOREDIR_RAX \
1207 "addq $128,%%rsp\n\t" \
1209 : "a" (&_argvec[0]) \
1210 : "cc", "memory", __CALLER_SAVED_REGS \
1212 lval = (__typeof__(lval)) _res; \
1215#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
1217 volatile OrigFn _orig = (orig); \
1218 volatile unsigned long _argvec[4]; \
1219 volatile unsigned long _res; \
1220 _argvec[0] = (unsigned long)_orig.nraddr; \
1221 _argvec[1] = (unsigned long)(arg1); \
1222 _argvec[2] = (unsigned long)(arg2); \
1223 _argvec[3] = (unsigned long)(arg3); \
1225 "subq $128,%%rsp\n\t" \
1226 "movq 24(%%rax), %%rdx\n\t" \
1227 "movq 16(%%rax), %%rsi\n\t" \
1228 "movq 8(%%rax), %%rdi\n\t" \
1229 "movq (%%rax), %%rax\n\t" \
1230 VALGRIND_CALL_NOREDIR_RAX \
1231 "addq $128,%%rsp\n\t" \
1233 : "a" (&_argvec[0]) \
1234 : "cc", "memory", __CALLER_SAVED_REGS \
1236 lval = (__typeof__(lval)) _res; \
1239#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
1241 volatile OrigFn _orig = (orig); \
1242 volatile unsigned long _argvec[5]; \
1243 volatile unsigned long _res; \
1244 _argvec[0] = (unsigned long)_orig.nraddr; \
1245 _argvec[1] = (unsigned long)(arg1); \
1246 _argvec[2] = (unsigned long)(arg2); \
1247 _argvec[3] = (unsigned long)(arg3); \
1248 _argvec[4] = (unsigned long)(arg4); \
1250 "subq $128,%%rsp\n\t" \
1251 "movq 32(%%rax), %%rcx\n\t" \
1252 "movq 24(%%rax), %%rdx\n\t" \
1253 "movq 16(%%rax), %%rsi\n\t" \
1254 "movq 8(%%rax), %%rdi\n\t" \
1255 "movq (%%rax), %%rax\n\t" \
1256 VALGRIND_CALL_NOREDIR_RAX \
1257 "addq $128,%%rsp\n\t" \
1259 : "a" (&_argvec[0]) \
1260 : "cc", "memory", __CALLER_SAVED_REGS \
1262 lval = (__typeof__(lval)) _res; \
1265#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
1267 volatile OrigFn _orig = (orig); \
1268 volatile unsigned long _argvec[6]; \
1269 volatile unsigned long _res; \
1270 _argvec[0] = (unsigned long)_orig.nraddr; \
1271 _argvec[1] = (unsigned long)(arg1); \
1272 _argvec[2] = (unsigned long)(arg2); \
1273 _argvec[3] = (unsigned long)(arg3); \
1274 _argvec[4] = (unsigned long)(arg4); \
1275 _argvec[5] = (unsigned long)(arg5); \
1277 "subq $128,%%rsp\n\t" \
1278 "movq 40(%%rax), %%r8\n\t" \
1279 "movq 32(%%rax), %%rcx\n\t" \
1280 "movq 24(%%rax), %%rdx\n\t" \
1281 "movq 16(%%rax), %%rsi\n\t" \
1282 "movq 8(%%rax), %%rdi\n\t" \
1283 "movq (%%rax), %%rax\n\t" \
1284 VALGRIND_CALL_NOREDIR_RAX \
1285 "addq $128,%%rsp\n\t" \
1287 : "a" (&_argvec[0]) \
1288 : "cc", "memory", __CALLER_SAVED_REGS \
1290 lval = (__typeof__(lval)) _res; \
1293#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
1295 volatile OrigFn _orig = (orig); \
1296 volatile unsigned long _argvec[7]; \
1297 volatile unsigned long _res; \
1298 _argvec[0] = (unsigned long)_orig.nraddr; \
1299 _argvec[1] = (unsigned long)(arg1); \
1300 _argvec[2] = (unsigned long)(arg2); \
1301 _argvec[3] = (unsigned long)(arg3); \
1302 _argvec[4] = (unsigned long)(arg4); \
1303 _argvec[5] = (unsigned long)(arg5); \
1304 _argvec[6] = (unsigned long)(arg6); \
1306 "subq $128,%%rsp\n\t" \
1307 "movq 48(%%rax), %%r9\n\t" \
1308 "movq 40(%%rax), %%r8\n\t" \
1309 "movq 32(%%rax), %%rcx\n\t" \
1310 "movq 24(%%rax), %%rdx\n\t" \
1311 "movq 16(%%rax), %%rsi\n\t" \
1312 "movq 8(%%rax), %%rdi\n\t" \
1313 "movq (%%rax), %%rax\n\t" \
1314 "addq $128,%%rsp\n\t" \
1315 VALGRIND_CALL_NOREDIR_RAX \
1317 : "a" (&_argvec[0]) \
1318 : "cc", "memory", __CALLER_SAVED_REGS \
1320 lval = (__typeof__(lval)) _res; \
1323#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1326 volatile OrigFn _orig = (orig); \
1327 volatile unsigned long _argvec[8]; \
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); \
1338 "subq $128,%%rsp\n\t" \
1339 "pushq 56(%%rax)\n\t" \
1340 "movq 48(%%rax), %%r9\n\t" \
1341 "movq 40(%%rax), %%r8\n\t" \
1342 "movq 32(%%rax), %%rcx\n\t" \
1343 "movq 24(%%rax), %%rdx\n\t" \
1344 "movq 16(%%rax), %%rsi\n\t" \
1345 "movq 8(%%rax), %%rdi\n\t" \
1346 "movq (%%rax), %%rax\n\t" \
1347 VALGRIND_CALL_NOREDIR_RAX \
1348 "addq $8, %%rsp\n" \
1349 "addq $128,%%rsp\n\t" \
1351 : "a" (&_argvec[0]) \
1352 : "cc", "memory", __CALLER_SAVED_REGS \
1354 lval = (__typeof__(lval)) _res; \
1357#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1360 volatile OrigFn _orig = (orig); \
1361 volatile unsigned long _argvec[9]; \
1362 volatile unsigned long _res; \
1363 _argvec[0] = (unsigned long)_orig.nraddr; \
1364 _argvec[1] = (unsigned long)(arg1); \
1365 _argvec[2] = (unsigned long)(arg2); \
1366 _argvec[3] = (unsigned long)(arg3); \
1367 _argvec[4] = (unsigned long)(arg4); \
1368 _argvec[5] = (unsigned long)(arg5); \
1369 _argvec[6] = (unsigned long)(arg6); \
1370 _argvec[7] = (unsigned long)(arg7); \
1371 _argvec[8] = (unsigned long)(arg8); \
1373 "subq $128,%%rsp\n\t" \
1374 "pushq 64(%%rax)\n\t" \
1375 "pushq 56(%%rax)\n\t" \
1376 "movq 48(%%rax), %%r9\n\t" \
1377 "movq 40(%%rax), %%r8\n\t" \
1378 "movq 32(%%rax), %%rcx\n\t" \
1379 "movq 24(%%rax), %%rdx\n\t" \
1380 "movq 16(%%rax), %%rsi\n\t" \
1381 "movq 8(%%rax), %%rdi\n\t" \
1382 "movq (%%rax), %%rax\n\t" \
1383 VALGRIND_CALL_NOREDIR_RAX \
1384 "addq $16, %%rsp\n" \
1385 "addq $128,%%rsp\n\t" \
1387 : "a" (&_argvec[0]) \
1388 : "cc", "memory", __CALLER_SAVED_REGS \
1390 lval = (__typeof__(lval)) _res; \
1393#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1396 volatile OrigFn _orig = (orig); \
1397 volatile unsigned long _argvec[10]; \
1398 volatile unsigned long _res; \
1399 _argvec[0] = (unsigned long)_orig.nraddr; \
1400 _argvec[1] = (unsigned long)(arg1); \
1401 _argvec[2] = (unsigned long)(arg2); \
1402 _argvec[3] = (unsigned long)(arg3); \
1403 _argvec[4] = (unsigned long)(arg4); \
1404 _argvec[5] = (unsigned long)(arg5); \
1405 _argvec[6] = (unsigned long)(arg6); \
1406 _argvec[7] = (unsigned long)(arg7); \
1407 _argvec[8] = (unsigned long)(arg8); \
1408 _argvec[9] = (unsigned long)(arg9); \
1410 "subq $128,%%rsp\n\t" \
1411 "pushq 72(%%rax)\n\t" \
1412 "pushq 64(%%rax)\n\t" \
1413 "pushq 56(%%rax)\n\t" \
1414 "movq 48(%%rax), %%r9\n\t" \
1415 "movq 40(%%rax), %%r8\n\t" \
1416 "movq 32(%%rax), %%rcx\n\t" \
1417 "movq 24(%%rax), %%rdx\n\t" \
1418 "movq 16(%%rax), %%rsi\n\t" \
1419 "movq 8(%%rax), %%rdi\n\t" \
1420 "movq (%%rax), %%rax\n\t" \
1421 VALGRIND_CALL_NOREDIR_RAX \
1422 "addq $24, %%rsp\n" \
1423 "addq $128,%%rsp\n\t" \
1425 : "a" (&_argvec[0]) \
1426 : "cc", "memory", __CALLER_SAVED_REGS \
1428 lval = (__typeof__(lval)) _res; \
1431#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1432 arg7,arg8,arg9,arg10) \
1434 volatile OrigFn _orig = (orig); \
1435 volatile unsigned long _argvec[11]; \
1436 volatile unsigned long _res; \
1437 _argvec[0] = (unsigned long)_orig.nraddr; \
1438 _argvec[1] = (unsigned long)(arg1); \
1439 _argvec[2] = (unsigned long)(arg2); \
1440 _argvec[3] = (unsigned long)(arg3); \
1441 _argvec[4] = (unsigned long)(arg4); \
1442 _argvec[5] = (unsigned long)(arg5); \
1443 _argvec[6] = (unsigned long)(arg6); \
1444 _argvec[7] = (unsigned long)(arg7); \
1445 _argvec[8] = (unsigned long)(arg8); \
1446 _argvec[9] = (unsigned long)(arg9); \
1447 _argvec[10] = (unsigned long)(arg10); \
1449 "subq $128,%%rsp\n\t" \
1450 "pushq 80(%%rax)\n\t" \
1451 "pushq 72(%%rax)\n\t" \
1452 "pushq 64(%%rax)\n\t" \
1453 "pushq 56(%%rax)\n\t" \
1454 "movq 48(%%rax), %%r9\n\t" \
1455 "movq 40(%%rax), %%r8\n\t" \
1456 "movq 32(%%rax), %%rcx\n\t" \
1457 "movq 24(%%rax), %%rdx\n\t" \
1458 "movq 16(%%rax), %%rsi\n\t" \
1459 "movq 8(%%rax), %%rdi\n\t" \
1460 "movq (%%rax), %%rax\n\t" \
1461 VALGRIND_CALL_NOREDIR_RAX \
1462 "addq $32, %%rsp\n" \
1463 "addq $128,%%rsp\n\t" \
1465 : "a" (&_argvec[0]) \
1466 : "cc", "memory", __CALLER_SAVED_REGS \
1468 lval = (__typeof__(lval)) _res; \
1471#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1472 arg7,arg8,arg9,arg10,arg11) \
1474 volatile OrigFn _orig = (orig); \
1475 volatile unsigned long _argvec[12]; \
1476 volatile unsigned long _res; \
1477 _argvec[0] = (unsigned long)_orig.nraddr; \
1478 _argvec[1] = (unsigned long)(arg1); \
1479 _argvec[2] = (unsigned long)(arg2); \
1480 _argvec[3] = (unsigned long)(arg3); \
1481 _argvec[4] = (unsigned long)(arg4); \
1482 _argvec[5] = (unsigned long)(arg5); \
1483 _argvec[6] = (unsigned long)(arg6); \
1484 _argvec[7] = (unsigned long)(arg7); \
1485 _argvec[8] = (unsigned long)(arg8); \
1486 _argvec[9] = (unsigned long)(arg9); \
1487 _argvec[10] = (unsigned long)(arg10); \
1488 _argvec[11] = (unsigned long)(arg11); \
1490 "subq $128,%%rsp\n\t" \
1491 "pushq 88(%%rax)\n\t" \
1492 "pushq 80(%%rax)\n\t" \
1493 "pushq 72(%%rax)\n\t" \
1494 "pushq 64(%%rax)\n\t" \
1495 "pushq 56(%%rax)\n\t" \
1496 "movq 48(%%rax), %%r9\n\t" \
1497 "movq 40(%%rax), %%r8\n\t" \
1498 "movq 32(%%rax), %%rcx\n\t" \
1499 "movq 24(%%rax), %%rdx\n\t" \
1500 "movq 16(%%rax), %%rsi\n\t" \
1501 "movq 8(%%rax), %%rdi\n\t" \
1502 "movq (%%rax), %%rax\n\t" \
1503 VALGRIND_CALL_NOREDIR_RAX \
1504 "addq $40, %%rsp\n" \
1505 "addq $128,%%rsp\n\t" \
1507 : "a" (&_argvec[0]) \
1508 : "cc", "memory", __CALLER_SAVED_REGS \
1510 lval = (__typeof__(lval)) _res; \
1513#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1514 arg7,arg8,arg9,arg10,arg11,arg12) \
1516 volatile OrigFn _orig = (orig); \
1517 volatile unsigned long _argvec[13]; \
1518 volatile unsigned long _res; \
1519 _argvec[0] = (unsigned long)_orig.nraddr; \
1520 _argvec[1] = (unsigned long)(arg1); \
1521 _argvec[2] = (unsigned long)(arg2); \
1522 _argvec[3] = (unsigned long)(arg3); \
1523 _argvec[4] = (unsigned long)(arg4); \
1524 _argvec[5] = (unsigned long)(arg5); \
1525 _argvec[6] = (unsigned long)(arg6); \
1526 _argvec[7] = (unsigned long)(arg7); \
1527 _argvec[8] = (unsigned long)(arg8); \
1528 _argvec[9] = (unsigned long)(arg9); \
1529 _argvec[10] = (unsigned long)(arg10); \
1530 _argvec[11] = (unsigned long)(arg11); \
1531 _argvec[12] = (unsigned long)(arg12); \
1533 "subq $128,%%rsp\n\t" \
1534 "pushq 96(%%rax)\n\t" \
1535 "pushq 88(%%rax)\n\t" \
1536 "pushq 80(%%rax)\n\t" \
1537 "pushq 72(%%rax)\n\t" \
1538 "pushq 64(%%rax)\n\t" \
1539 "pushq 56(%%rax)\n\t" \
1540 "movq 48(%%rax), %%r9\n\t" \
1541 "movq 40(%%rax), %%r8\n\t" \
1542 "movq 32(%%rax), %%rcx\n\t" \
1543 "movq 24(%%rax), %%rdx\n\t" \
1544 "movq 16(%%rax), %%rsi\n\t" \
1545 "movq 8(%%rax), %%rdi\n\t" \
1546 "movq (%%rax), %%rax\n\t" \
1547 VALGRIND_CALL_NOREDIR_RAX \
1548 "addq $48, %%rsp\n" \
1549 "addq $128,%%rsp\n\t" \
1551 : "a" (&_argvec[0]) \
1552 : "cc", "memory", __CALLER_SAVED_REGS \
1554 lval = (__typeof__(lval)) _res; \
1561#if defined(PLAT_ppc32_linux)
1587#define __CALLER_SAVED_REGS \
1588 "lr", "ctr", "xer", \
1589 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \
1590 "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \
1596#define CALL_FN_W_v(lval, orig) \
1598 volatile OrigFn _orig = (orig); \
1599 volatile unsigned long _argvec[1]; \
1600 volatile unsigned long _res; \
1601 _argvec[0] = (unsigned long)_orig.nraddr; \
1604 "lwz 11,0(11)\n\t" \
1605 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1608 : "r" (&_argvec[0]) \
1609 : "cc", "memory", __CALLER_SAVED_REGS \
1611 lval = (__typeof__(lval)) _res; \
1614#define CALL_FN_W_W(lval, orig, arg1) \
1616 volatile OrigFn _orig = (orig); \
1617 volatile unsigned long _argvec[2]; \
1618 volatile unsigned long _res; \
1619 _argvec[0] = (unsigned long)_orig.nraddr; \
1620 _argvec[1] = (unsigned long)arg1; \
1624 "lwz 11,0(11)\n\t" \
1625 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1628 : "r" (&_argvec[0]) \
1629 : "cc", "memory", __CALLER_SAVED_REGS \
1631 lval = (__typeof__(lval)) _res; \
1634#define CALL_FN_W_WW(lval, orig, arg1,arg2) \
1636 volatile OrigFn _orig = (orig); \
1637 volatile unsigned long _argvec[3]; \
1638 volatile unsigned long _res; \
1639 _argvec[0] = (unsigned long)_orig.nraddr; \
1640 _argvec[1] = (unsigned long)arg1; \
1641 _argvec[2] = (unsigned long)arg2; \
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_WWW(lval, orig, arg1,arg2,arg3) \
1658 volatile OrigFn _orig = (orig); \
1659 volatile unsigned long _argvec[4]; \
1660 volatile unsigned long _res; \
1661 _argvec[0] = (unsigned long)_orig.nraddr; \
1662 _argvec[1] = (unsigned long)arg1; \
1663 _argvec[2] = (unsigned long)arg2; \
1664 _argvec[3] = (unsigned long)arg3; \
1669 "lwz 5,12(11)\n\t" \
1670 "lwz 11,0(11)\n\t" \
1671 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1674 : "r" (&_argvec[0]) \
1675 : "cc", "memory", __CALLER_SAVED_REGS \
1677 lval = (__typeof__(lval)) _res; \
1680#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
1682 volatile OrigFn _orig = (orig); \
1683 volatile unsigned long _argvec[5]; \
1684 volatile unsigned long _res; \
1685 _argvec[0] = (unsigned long)_orig.nraddr; \
1686 _argvec[1] = (unsigned long)arg1; \
1687 _argvec[2] = (unsigned long)arg2; \
1688 _argvec[3] = (unsigned long)arg3; \
1689 _argvec[4] = (unsigned long)arg4; \
1694 "lwz 5,12(11)\n\t" \
1695 "lwz 6,16(11)\n\t" \
1696 "lwz 11,0(11)\n\t" \
1697 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1700 : "r" (&_argvec[0]) \
1701 : "cc", "memory", __CALLER_SAVED_REGS \
1703 lval = (__typeof__(lval)) _res; \
1706#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
1708 volatile OrigFn _orig = (orig); \
1709 volatile unsigned long _argvec[6]; \
1710 volatile unsigned long _res; \
1711 _argvec[0] = (unsigned long)_orig.nraddr; \
1712 _argvec[1] = (unsigned long)arg1; \
1713 _argvec[2] = (unsigned long)arg2; \
1714 _argvec[3] = (unsigned long)arg3; \
1715 _argvec[4] = (unsigned long)arg4; \
1716 _argvec[5] = (unsigned long)arg5; \
1721 "lwz 5,12(11)\n\t" \
1722 "lwz 6,16(11)\n\t" \
1723 "lwz 7,20(11)\n\t" \
1724 "lwz 11,0(11)\n\t" \
1725 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1728 : "r" (&_argvec[0]) \
1729 : "cc", "memory", __CALLER_SAVED_REGS \
1731 lval = (__typeof__(lval)) _res; \
1734#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
1736 volatile OrigFn _orig = (orig); \
1737 volatile unsigned long _argvec[7]; \
1738 volatile unsigned long _res; \
1739 _argvec[0] = (unsigned long)_orig.nraddr; \
1740 _argvec[1] = (unsigned long)arg1; \
1741 _argvec[2] = (unsigned long)arg2; \
1742 _argvec[3] = (unsigned long)arg3; \
1743 _argvec[4] = (unsigned long)arg4; \
1744 _argvec[5] = (unsigned long)arg5; \
1745 _argvec[6] = (unsigned long)arg6; \
1750 "lwz 5,12(11)\n\t" \
1751 "lwz 6,16(11)\n\t" \
1752 "lwz 7,20(11)\n\t" \
1753 "lwz 8,24(11)\n\t" \
1754 "lwz 11,0(11)\n\t" \
1755 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1758 : "r" (&_argvec[0]) \
1759 : "cc", "memory", __CALLER_SAVED_REGS \
1761 lval = (__typeof__(lval)) _res; \
1764#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1767 volatile OrigFn _orig = (orig); \
1768 volatile unsigned long _argvec[8]; \
1769 volatile unsigned long _res; \
1770 _argvec[0] = (unsigned long)_orig.nraddr; \
1771 _argvec[1] = (unsigned long)arg1; \
1772 _argvec[2] = (unsigned long)arg2; \
1773 _argvec[3] = (unsigned long)arg3; \
1774 _argvec[4] = (unsigned long)arg4; \
1775 _argvec[5] = (unsigned long)arg5; \
1776 _argvec[6] = (unsigned long)arg6; \
1777 _argvec[7] = (unsigned long)arg7; \
1782 "lwz 5,12(11)\n\t" \
1783 "lwz 6,16(11)\n\t" \
1784 "lwz 7,20(11)\n\t" \
1785 "lwz 8,24(11)\n\t" \
1786 "lwz 9,28(11)\n\t" \
1787 "lwz 11,0(11)\n\t" \
1788 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1791 : "r" (&_argvec[0]) \
1792 : "cc", "memory", __CALLER_SAVED_REGS \
1794 lval = (__typeof__(lval)) _res; \
1797#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1800 volatile OrigFn _orig = (orig); \
1801 volatile unsigned long _argvec[9]; \
1802 volatile unsigned long _res; \
1803 _argvec[0] = (unsigned long)_orig.nraddr; \
1804 _argvec[1] = (unsigned long)arg1; \
1805 _argvec[2] = (unsigned long)arg2; \
1806 _argvec[3] = (unsigned long)arg3; \
1807 _argvec[4] = (unsigned long)arg4; \
1808 _argvec[5] = (unsigned long)arg5; \
1809 _argvec[6] = (unsigned long)arg6; \
1810 _argvec[7] = (unsigned long)arg7; \
1811 _argvec[8] = (unsigned long)arg8; \
1816 "lwz 5,12(11)\n\t" \
1817 "lwz 6,16(11)\n\t" \
1818 "lwz 7,20(11)\n\t" \
1819 "lwz 8,24(11)\n\t" \
1820 "lwz 9,28(11)\n\t" \
1821 "lwz 10,32(11)\n\t" \
1822 "lwz 11,0(11)\n\t" \
1823 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1826 : "r" (&_argvec[0]) \
1827 : "cc", "memory", __CALLER_SAVED_REGS \
1829 lval = (__typeof__(lval)) _res; \
1832#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1835 volatile OrigFn _orig = (orig); \
1836 volatile unsigned long _argvec[10]; \
1837 volatile unsigned long _res; \
1838 _argvec[0] = (unsigned long)_orig.nraddr; \
1839 _argvec[1] = (unsigned long)arg1; \
1840 _argvec[2] = (unsigned long)arg2; \
1841 _argvec[3] = (unsigned long)arg3; \
1842 _argvec[4] = (unsigned long)arg4; \
1843 _argvec[5] = (unsigned long)arg5; \
1844 _argvec[6] = (unsigned long)arg6; \
1845 _argvec[7] = (unsigned long)arg7; \
1846 _argvec[8] = (unsigned long)arg8; \
1847 _argvec[9] = (unsigned long)arg9; \
1850 "addi 1,1,-16\n\t" \
1852 "lwz 3,36(11)\n\t" \
1857 "lwz 5,12(11)\n\t" \
1858 "lwz 6,16(11)\n\t" \
1859 "lwz 7,20(11)\n\t" \
1860 "lwz 8,24(11)\n\t" \
1861 "lwz 9,28(11)\n\t" \
1862 "lwz 10,32(11)\n\t" \
1863 "lwz 11,0(11)\n\t" \
1864 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1868 : "r" (&_argvec[0]) \
1869 : "cc", "memory", __CALLER_SAVED_REGS \
1871 lval = (__typeof__(lval)) _res; \
1874#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1875 arg7,arg8,arg9,arg10) \
1877 volatile OrigFn _orig = (orig); \
1878 volatile unsigned long _argvec[11]; \
1879 volatile unsigned long _res; \
1880 _argvec[0] = (unsigned long)_orig.nraddr; \
1881 _argvec[1] = (unsigned long)arg1; \
1882 _argvec[2] = (unsigned long)arg2; \
1883 _argvec[3] = (unsigned long)arg3; \
1884 _argvec[4] = (unsigned long)arg4; \
1885 _argvec[5] = (unsigned long)arg5; \
1886 _argvec[6] = (unsigned long)arg6; \
1887 _argvec[7] = (unsigned long)arg7; \
1888 _argvec[8] = (unsigned long)arg8; \
1889 _argvec[9] = (unsigned long)arg9; \
1890 _argvec[10] = (unsigned long)arg10; \
1893 "addi 1,1,-16\n\t" \
1895 "lwz 3,40(11)\n\t" \
1898 "lwz 3,36(11)\n\t" \
1903 "lwz 5,12(11)\n\t" \
1904 "lwz 6,16(11)\n\t" \
1905 "lwz 7,20(11)\n\t" \
1906 "lwz 8,24(11)\n\t" \
1907 "lwz 9,28(11)\n\t" \
1908 "lwz 10,32(11)\n\t" \
1909 "lwz 11,0(11)\n\t" \
1910 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1914 : "r" (&_argvec[0]) \
1915 : "cc", "memory", __CALLER_SAVED_REGS \
1917 lval = (__typeof__(lval)) _res; \
1920#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1921 arg7,arg8,arg9,arg10,arg11) \
1923 volatile OrigFn _orig = (orig); \
1924 volatile unsigned long _argvec[12]; \
1925 volatile unsigned long _res; \
1926 _argvec[0] = (unsigned long)_orig.nraddr; \
1927 _argvec[1] = (unsigned long)arg1; \
1928 _argvec[2] = (unsigned long)arg2; \
1929 _argvec[3] = (unsigned long)arg3; \
1930 _argvec[4] = (unsigned long)arg4; \
1931 _argvec[5] = (unsigned long)arg5; \
1932 _argvec[6] = (unsigned long)arg6; \
1933 _argvec[7] = (unsigned long)arg7; \
1934 _argvec[8] = (unsigned long)arg8; \
1935 _argvec[9] = (unsigned long)arg9; \
1936 _argvec[10] = (unsigned long)arg10; \
1937 _argvec[11] = (unsigned long)arg11; \
1940 "addi 1,1,-32\n\t" \
1942 "lwz 3,44(11)\n\t" \
1945 "lwz 3,40(11)\n\t" \
1948 "lwz 3,36(11)\n\t" \
1953 "lwz 5,12(11)\n\t" \
1954 "lwz 6,16(11)\n\t" \
1955 "lwz 7,20(11)\n\t" \
1956 "lwz 8,24(11)\n\t" \
1957 "lwz 9,28(11)\n\t" \
1958 "lwz 10,32(11)\n\t" \
1959 "lwz 11,0(11)\n\t" \
1960 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1964 : "r" (&_argvec[0]) \
1965 : "cc", "memory", __CALLER_SAVED_REGS \
1967 lval = (__typeof__(lval)) _res; \
1970#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1971 arg7,arg8,arg9,arg10,arg11,arg12) \
1973 volatile OrigFn _orig = (orig); \
1974 volatile unsigned long _argvec[13]; \
1975 volatile unsigned long _res; \
1976 _argvec[0] = (unsigned long)_orig.nraddr; \
1977 _argvec[1] = (unsigned long)arg1; \
1978 _argvec[2] = (unsigned long)arg2; \
1979 _argvec[3] = (unsigned long)arg3; \
1980 _argvec[4] = (unsigned long)arg4; \
1981 _argvec[5] = (unsigned long)arg5; \
1982 _argvec[6] = (unsigned long)arg6; \
1983 _argvec[7] = (unsigned long)arg7; \
1984 _argvec[8] = (unsigned long)arg8; \
1985 _argvec[9] = (unsigned long)arg9; \
1986 _argvec[10] = (unsigned long)arg10; \
1987 _argvec[11] = (unsigned long)arg11; \
1988 _argvec[12] = (unsigned long)arg12; \
1991 "addi 1,1,-32\n\t" \
1993 "lwz 3,48(11)\n\t" \
1996 "lwz 3,44(11)\n\t" \
1999 "lwz 3,40(11)\n\t" \
2002 "lwz 3,36(11)\n\t" \
2007 "lwz 5,12(11)\n\t" \
2008 "lwz 6,16(11)\n\t" \
2009 "lwz 7,20(11)\n\t" \
2010 "lwz 8,24(11)\n\t" \
2011 "lwz 9,28(11)\n\t" \
2012 "lwz 10,32(11)\n\t" \
2013 "lwz 11,0(11)\n\t" \
2014 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2018 : "r" (&_argvec[0]) \
2019 : "cc", "memory", __CALLER_SAVED_REGS \
2021 lval = (__typeof__(lval)) _res; \
2028#if defined(PLAT_ppc64_linux)
2033#define __CALLER_SAVED_REGS \
2034 "lr", "ctr", "xer", \
2035 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \
2036 "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \
2042#define CALL_FN_W_v(lval, orig) \
2044 volatile OrigFn _orig = (orig); \
2045 volatile unsigned long _argvec[3+0]; \
2046 volatile unsigned long _res; \
2048 _argvec[1] = (unsigned long)_orig.r2; \
2049 _argvec[2] = (unsigned long)_orig.nraddr; \
2052 "std 2,-16(11)\n\t" \
2054 "ld 11, 0(11)\n\t" \
2055 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2060 : "r" (&_argvec[2]) \
2061 : "cc", "memory", __CALLER_SAVED_REGS \
2063 lval = (__typeof__(lval)) _res; \
2066#define CALL_FN_W_W(lval, orig, arg1) \
2068 volatile OrigFn _orig = (orig); \
2069 volatile unsigned long _argvec[3+1]; \
2070 volatile unsigned long _res; \
2072 _argvec[1] = (unsigned long)_orig.r2; \
2073 _argvec[2] = (unsigned long)_orig.nraddr; \
2074 _argvec[2+1] = (unsigned long)arg1; \
2077 "std 2,-16(11)\n\t" \
2080 "ld 11, 0(11)\n\t" \
2081 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2086 : "r" (&_argvec[2]) \
2087 : "cc", "memory", __CALLER_SAVED_REGS \
2089 lval = (__typeof__(lval)) _res; \
2092#define CALL_FN_W_WW(lval, orig, arg1,arg2) \
2094 volatile OrigFn _orig = (orig); \
2095 volatile unsigned long _argvec[3+2]; \
2096 volatile unsigned long _res; \
2098 _argvec[1] = (unsigned long)_orig.r2; \
2099 _argvec[2] = (unsigned long)_orig.nraddr; \
2100 _argvec[2+1] = (unsigned long)arg1; \
2101 _argvec[2+2] = (unsigned long)arg2; \
2104 "std 2,-16(11)\n\t" \
2107 "ld 4, 16(11)\n\t" \
2108 "ld 11, 0(11)\n\t" \
2109 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2114 : "r" (&_argvec[2]) \
2115 : "cc", "memory", __CALLER_SAVED_REGS \
2117 lval = (__typeof__(lval)) _res; \
2120#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
2122 volatile OrigFn _orig = (orig); \
2123 volatile unsigned long _argvec[3+3]; \
2124 volatile unsigned long _res; \
2126 _argvec[1] = (unsigned long)_orig.r2; \
2127 _argvec[2] = (unsigned long)_orig.nraddr; \
2128 _argvec[2+1] = (unsigned long)arg1; \
2129 _argvec[2+2] = (unsigned long)arg2; \
2130 _argvec[2+3] = (unsigned long)arg3; \
2133 "std 2,-16(11)\n\t" \
2136 "ld 4, 16(11)\n\t" \
2137 "ld 5, 24(11)\n\t" \
2138 "ld 11, 0(11)\n\t" \
2139 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2144 : "r" (&_argvec[2]) \
2145 : "cc", "memory", __CALLER_SAVED_REGS \
2147 lval = (__typeof__(lval)) _res; \
2150#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
2152 volatile OrigFn _orig = (orig); \
2153 volatile unsigned long _argvec[3+4]; \
2154 volatile unsigned long _res; \
2156 _argvec[1] = (unsigned long)_orig.r2; \
2157 _argvec[2] = (unsigned long)_orig.nraddr; \
2158 _argvec[2+1] = (unsigned long)arg1; \
2159 _argvec[2+2] = (unsigned long)arg2; \
2160 _argvec[2+3] = (unsigned long)arg3; \
2161 _argvec[2+4] = (unsigned long)arg4; \
2164 "std 2,-16(11)\n\t" \
2167 "ld 4, 16(11)\n\t" \
2168 "ld 5, 24(11)\n\t" \
2169 "ld 6, 32(11)\n\t" \
2170 "ld 11, 0(11)\n\t" \
2171 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2176 : "r" (&_argvec[2]) \
2177 : "cc", "memory", __CALLER_SAVED_REGS \
2179 lval = (__typeof__(lval)) _res; \
2182#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
2184 volatile OrigFn _orig = (orig); \
2185 volatile unsigned long _argvec[3+5]; \
2186 volatile unsigned long _res; \
2188 _argvec[1] = (unsigned long)_orig.r2; \
2189 _argvec[2] = (unsigned long)_orig.nraddr; \
2190 _argvec[2+1] = (unsigned long)arg1; \
2191 _argvec[2+2] = (unsigned long)arg2; \
2192 _argvec[2+3] = (unsigned long)arg3; \
2193 _argvec[2+4] = (unsigned long)arg4; \
2194 _argvec[2+5] = (unsigned long)arg5; \
2197 "std 2,-16(11)\n\t" \
2200 "ld 4, 16(11)\n\t" \
2201 "ld 5, 24(11)\n\t" \
2202 "ld 6, 32(11)\n\t" \
2203 "ld 7, 40(11)\n\t" \
2204 "ld 11, 0(11)\n\t" \
2205 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2210 : "r" (&_argvec[2]) \
2211 : "cc", "memory", __CALLER_SAVED_REGS \
2213 lval = (__typeof__(lval)) _res; \
2216#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
2218 volatile OrigFn _orig = (orig); \
2219 volatile unsigned long _argvec[3+6]; \
2220 volatile unsigned long _res; \
2222 _argvec[1] = (unsigned long)_orig.r2; \
2223 _argvec[2] = (unsigned long)_orig.nraddr; \
2224 _argvec[2+1] = (unsigned long)arg1; \
2225 _argvec[2+2] = (unsigned long)arg2; \
2226 _argvec[2+3] = (unsigned long)arg3; \
2227 _argvec[2+4] = (unsigned long)arg4; \
2228 _argvec[2+5] = (unsigned long)arg5; \
2229 _argvec[2+6] = (unsigned long)arg6; \
2232 "std 2,-16(11)\n\t" \
2235 "ld 4, 16(11)\n\t" \
2236 "ld 5, 24(11)\n\t" \
2237 "ld 6, 32(11)\n\t" \
2238 "ld 7, 40(11)\n\t" \
2239 "ld 8, 48(11)\n\t" \
2240 "ld 11, 0(11)\n\t" \
2241 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2246 : "r" (&_argvec[2]) \
2247 : "cc", "memory", __CALLER_SAVED_REGS \
2249 lval = (__typeof__(lval)) _res; \
2252#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2255 volatile OrigFn _orig = (orig); \
2256 volatile unsigned long _argvec[3+7]; \
2257 volatile unsigned long _res; \
2259 _argvec[1] = (unsigned long)_orig.r2; \
2260 _argvec[2] = (unsigned long)_orig.nraddr; \
2261 _argvec[2+1] = (unsigned long)arg1; \
2262 _argvec[2+2] = (unsigned long)arg2; \
2263 _argvec[2+3] = (unsigned long)arg3; \
2264 _argvec[2+4] = (unsigned long)arg4; \
2265 _argvec[2+5] = (unsigned long)arg5; \
2266 _argvec[2+6] = (unsigned long)arg6; \
2267 _argvec[2+7] = (unsigned long)arg7; \
2270 "std 2,-16(11)\n\t" \
2273 "ld 4, 16(11)\n\t" \
2274 "ld 5, 24(11)\n\t" \
2275 "ld 6, 32(11)\n\t" \
2276 "ld 7, 40(11)\n\t" \
2277 "ld 8, 48(11)\n\t" \
2278 "ld 9, 56(11)\n\t" \
2279 "ld 11, 0(11)\n\t" \
2280 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2285 : "r" (&_argvec[2]) \
2286 : "cc", "memory", __CALLER_SAVED_REGS \
2288 lval = (__typeof__(lval)) _res; \
2291#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2294 volatile OrigFn _orig = (orig); \
2295 volatile unsigned long _argvec[3+8]; \
2296 volatile unsigned long _res; \
2298 _argvec[1] = (unsigned long)_orig.r2; \
2299 _argvec[2] = (unsigned long)_orig.nraddr; \
2300 _argvec[2+1] = (unsigned long)arg1; \
2301 _argvec[2+2] = (unsigned long)arg2; \
2302 _argvec[2+3] = (unsigned long)arg3; \
2303 _argvec[2+4] = (unsigned long)arg4; \
2304 _argvec[2+5] = (unsigned long)arg5; \
2305 _argvec[2+6] = (unsigned long)arg6; \
2306 _argvec[2+7] = (unsigned long)arg7; \
2307 _argvec[2+8] = (unsigned long)arg8; \
2310 "std 2,-16(11)\n\t" \
2313 "ld 4, 16(11)\n\t" \
2314 "ld 5, 24(11)\n\t" \
2315 "ld 6, 32(11)\n\t" \
2316 "ld 7, 40(11)\n\t" \
2317 "ld 8, 48(11)\n\t" \
2318 "ld 9, 56(11)\n\t" \
2319 "ld 10, 64(11)\n\t" \
2320 "ld 11, 0(11)\n\t" \
2321 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2326 : "r" (&_argvec[2]) \
2327 : "cc", "memory", __CALLER_SAVED_REGS \
2329 lval = (__typeof__(lval)) _res; \
2332#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2335 volatile OrigFn _orig = (orig); \
2336 volatile unsigned long _argvec[3+9]; \
2337 volatile unsigned long _res; \
2339 _argvec[1] = (unsigned long)_orig.r2; \
2340 _argvec[2] = (unsigned long)_orig.nraddr; \
2341 _argvec[2+1] = (unsigned long)arg1; \
2342 _argvec[2+2] = (unsigned long)arg2; \
2343 _argvec[2+3] = (unsigned long)arg3; \
2344 _argvec[2+4] = (unsigned long)arg4; \
2345 _argvec[2+5] = (unsigned long)arg5; \
2346 _argvec[2+6] = (unsigned long)arg6; \
2347 _argvec[2+7] = (unsigned long)arg7; \
2348 _argvec[2+8] = (unsigned long)arg8; \
2349 _argvec[2+9] = (unsigned long)arg9; \
2352 "std 2,-16(11)\n\t" \
2354 "addi 1,1,-128\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_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2381 arg7,arg8,arg9,arg10) \
2383 volatile OrigFn _orig = (orig); \
2384 volatile unsigned long _argvec[3+10]; \
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; \
2401 "std 2,-16(11)\n\t" \
2403 "addi 1,1,-128\n\t" \
2406 "std 3,120(1)\n\t" \
2409 "std 3,112(1)\n\t" \
2412 "ld 4, 16(11)\n\t" \
2413 "ld 5, 24(11)\n\t" \
2414 "ld 6, 32(11)\n\t" \
2415 "ld 7, 40(11)\n\t" \
2416 "ld 8, 48(11)\n\t" \
2417 "ld 9, 56(11)\n\t" \
2418 "ld 10, 64(11)\n\t" \
2419 "ld 11, 0(11)\n\t" \
2420 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2423 "ld 2,-16(11)\n\t" \
2426 : "r" (&_argvec[2]) \
2427 : "cc", "memory", __CALLER_SAVED_REGS \
2429 lval = (__typeof__(lval)) _res; \
2432#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2433 arg7,arg8,arg9,arg10,arg11) \
2435 volatile OrigFn _orig = (orig); \
2436 volatile unsigned long _argvec[3+11]; \
2437 volatile unsigned long _res; \
2439 _argvec[1] = (unsigned long)_orig.r2; \
2440 _argvec[2] = (unsigned long)_orig.nraddr; \
2441 _argvec[2+1] = (unsigned long)arg1; \
2442 _argvec[2+2] = (unsigned long)arg2; \
2443 _argvec[2+3] = (unsigned long)arg3; \
2444 _argvec[2+4] = (unsigned long)arg4; \
2445 _argvec[2+5] = (unsigned long)arg5; \
2446 _argvec[2+6] = (unsigned long)arg6; \
2447 _argvec[2+7] = (unsigned long)arg7; \
2448 _argvec[2+8] = (unsigned long)arg8; \
2449 _argvec[2+9] = (unsigned long)arg9; \
2450 _argvec[2+10] = (unsigned long)arg10; \
2451 _argvec[2+11] = (unsigned long)arg11; \
2454 "std 2,-16(11)\n\t" \
2456 "addi 1,1,-144\n\t" \
2459 "std 3,128(1)\n\t" \
2462 "std 3,120(1)\n\t" \
2465 "std 3,112(1)\n\t" \
2468 "ld 4, 16(11)\n\t" \
2469 "ld 5, 24(11)\n\t" \
2470 "ld 6, 32(11)\n\t" \
2471 "ld 7, 40(11)\n\t" \
2472 "ld 8, 48(11)\n\t" \
2473 "ld 9, 56(11)\n\t" \
2474 "ld 10, 64(11)\n\t" \
2475 "ld 11, 0(11)\n\t" \
2476 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2479 "ld 2,-16(11)\n\t" \
2482 : "r" (&_argvec[2]) \
2483 : "cc", "memory", __CALLER_SAVED_REGS \
2485 lval = (__typeof__(lval)) _res; \
2488#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2489 arg7,arg8,arg9,arg10,arg11,arg12) \
2491 volatile OrigFn _orig = (orig); \
2492 volatile unsigned long _argvec[3+12]; \
2493 volatile unsigned long _res; \
2495 _argvec[1] = (unsigned long)_orig.r2; \
2496 _argvec[2] = (unsigned long)_orig.nraddr; \
2497 _argvec[2+1] = (unsigned long)arg1; \
2498 _argvec[2+2] = (unsigned long)arg2; \
2499 _argvec[2+3] = (unsigned long)arg3; \
2500 _argvec[2+4] = (unsigned long)arg4; \
2501 _argvec[2+5] = (unsigned long)arg5; \
2502 _argvec[2+6] = (unsigned long)arg6; \
2503 _argvec[2+7] = (unsigned long)arg7; \
2504 _argvec[2+8] = (unsigned long)arg8; \
2505 _argvec[2+9] = (unsigned long)arg9; \
2506 _argvec[2+10] = (unsigned long)arg10; \
2507 _argvec[2+11] = (unsigned long)arg11; \
2508 _argvec[2+12] = (unsigned long)arg12; \
2511 "std 2,-16(11)\n\t" \
2513 "addi 1,1,-144\n\t" \
2516 "std 3,136(1)\n\t" \
2519 "std 3,128(1)\n\t" \
2522 "std 3,120(1)\n\t" \
2525 "std 3,112(1)\n\t" \
2528 "ld 4, 16(11)\n\t" \
2529 "ld 5, 24(11)\n\t" \
2530 "ld 6, 32(11)\n\t" \
2531 "ld 7, 40(11)\n\t" \
2532 "ld 8, 48(11)\n\t" \
2533 "ld 9, 56(11)\n\t" \
2534 "ld 10, 64(11)\n\t" \
2535 "ld 11, 0(11)\n\t" \
2536 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2539 "ld 2,-16(11)\n\t" \
2542 : "r" (&_argvec[2]) \
2543 : "cc", "memory", __CALLER_SAVED_REGS \
2545 lval = (__typeof__(lval)) _res; \
2552#if defined(PLAT_arm_linux)
2555#define __CALLER_SAVED_REGS "r0", "r1", "r2", "r3","r4","r14"
2560#define CALL_FN_W_v(lval, orig) \
2562 volatile OrigFn _orig = (orig); \
2563 volatile unsigned long _argvec[1]; \
2564 volatile unsigned long _res; \
2565 _argvec[0] = (unsigned long)_orig.nraddr; \
2567 "ldr r4, [%1] \n\t" \
2568 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
2571 : "0" (&_argvec[0]) \
2572 : "cc", "memory", __CALLER_SAVED_REGS \
2574 lval = (__typeof__(lval)) _res; \
2577#define CALL_FN_W_W(lval, orig, arg1) \
2579 volatile OrigFn _orig = (orig); \
2580 volatile unsigned long _argvec[2]; \
2581 volatile unsigned long _res; \
2582 _argvec[0] = (unsigned long)_orig.nraddr; \
2583 _argvec[1] = (unsigned long)(arg1); \
2585 "ldr r0, [%1, #4] \n\t" \
2586 "ldr r4, [%1] \n\t" \
2587 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
2590 : "0" (&_argvec[0]) \
2591 : "cc", "memory", __CALLER_SAVED_REGS \
2593 lval = (__typeof__(lval)) _res; \
2596#define CALL_FN_W_WW(lval, orig, arg1,arg2) \
2598 volatile OrigFn _orig = (orig); \
2599 volatile unsigned long _argvec[3]; \
2600 volatile unsigned long _res; \
2601 _argvec[0] = (unsigned long)_orig.nraddr; \
2602 _argvec[1] = (unsigned long)(arg1); \
2603 _argvec[2] = (unsigned long)(arg2); \
2605 "ldr r0, [%1, #4] \n\t" \
2606 "ldr r1, [%1, #8] \n\t" \
2607 "ldr r4, [%1] \n\t" \
2608 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
2611 : "0" (&_argvec[0]) \
2612 : "cc", "memory", __CALLER_SAVED_REGS \
2614 lval = (__typeof__(lval)) _res; \
2617#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
2619 volatile OrigFn _orig = (orig); \
2620 volatile unsigned long _argvec[4]; \
2621 volatile unsigned long _res; \
2622 _argvec[0] = (unsigned long)_orig.nraddr; \
2623 _argvec[1] = (unsigned long)(arg1); \
2624 _argvec[2] = (unsigned long)(arg2); \
2625 _argvec[3] = (unsigned long)(arg3); \
2627 "ldr r0, [%1, #4] \n\t" \
2628 "ldr r1, [%1, #8] \n\t" \
2629 "ldr r2, [%1, #12] \n\t" \
2630 "ldr r4, [%1] \n\t" \
2631 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
2634 : "0" (&_argvec[0]) \
2635 : "cc", "memory", __CALLER_SAVED_REGS \
2637 lval = (__typeof__(lval)) _res; \
2640#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
2642 volatile OrigFn _orig = (orig); \
2643 volatile unsigned long _argvec[5]; \
2644 volatile unsigned long _res; \
2645 _argvec[0] = (unsigned long)_orig.nraddr; \
2646 _argvec[1] = (unsigned long)(arg1); \
2647 _argvec[2] = (unsigned long)(arg2); \
2648 _argvec[3] = (unsigned long)(arg3); \
2649 _argvec[4] = (unsigned long)(arg4); \
2651 "ldr r0, [%1, #4] \n\t" \
2652 "ldr r1, [%1, #8] \n\t" \
2653 "ldr r2, [%1, #12] \n\t" \
2654 "ldr r3, [%1, #16] \n\t" \
2655 "ldr r4, [%1] \n\t" \
2656 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
2659 : "0" (&_argvec[0]) \
2660 : "cc", "memory", __CALLER_SAVED_REGS \
2662 lval = (__typeof__(lval)) _res; \
2665#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
2667 volatile OrigFn _orig = (orig); \
2668 volatile unsigned long _argvec[6]; \
2669 volatile unsigned long _res; \
2670 _argvec[0] = (unsigned long)_orig.nraddr; \
2671 _argvec[1] = (unsigned long)(arg1); \
2672 _argvec[2] = (unsigned long)(arg2); \
2673 _argvec[3] = (unsigned long)(arg3); \
2674 _argvec[4] = (unsigned long)(arg4); \
2675 _argvec[5] = (unsigned long)(arg5); \
2677 "ldr r0, [%1, #20] \n\t" \
2679 "ldr r0, [%1, #4] \n\t" \
2680 "ldr r1, [%1, #8] \n\t" \
2681 "ldr r2, [%1, #12] \n\t" \
2682 "ldr r3, [%1, #16] \n\t" \
2683 "ldr r4, [%1] \n\t" \
2684 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
2685 "add sp, sp, #4 \n\t" \
2688 : "0" (&_argvec[0]) \
2689 : "cc", "memory", __CALLER_SAVED_REGS \
2691 lval = (__typeof__(lval)) _res; \
2694#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
2696 volatile OrigFn _orig = (orig); \
2697 volatile unsigned long _argvec[7]; \
2698 volatile unsigned long _res; \
2699 _argvec[0] = (unsigned long)_orig.nraddr; \
2700 _argvec[1] = (unsigned long)(arg1); \
2701 _argvec[2] = (unsigned long)(arg2); \
2702 _argvec[3] = (unsigned long)(arg3); \
2703 _argvec[4] = (unsigned long)(arg4); \
2704 _argvec[5] = (unsigned long)(arg5); \
2705 _argvec[6] = (unsigned long)(arg6); \
2707 "ldr r0, [%1, #20] \n\t" \
2708 "ldr r1, [%1, #24] \n\t" \
2709 "push {r0, r1} \n\t" \
2710 "ldr r0, [%1, #4] \n\t" \
2711 "ldr r1, [%1, #8] \n\t" \
2712 "ldr r2, [%1, #12] \n\t" \
2713 "ldr r3, [%1, #16] \n\t" \
2714 "ldr r4, [%1] \n\t" \
2715 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
2716 "add sp, sp, #8 \n\t" \
2719 : "0" (&_argvec[0]) \
2720 : "cc", "memory", __CALLER_SAVED_REGS \
2722 lval = (__typeof__(lval)) _res; \
2725#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2728 volatile OrigFn _orig = (orig); \
2729 volatile unsigned long _argvec[8]; \
2730 volatile unsigned long _res; \
2731 _argvec[0] = (unsigned long)_orig.nraddr; \
2732 _argvec[1] = (unsigned long)(arg1); \
2733 _argvec[2] = (unsigned long)(arg2); \
2734 _argvec[3] = (unsigned long)(arg3); \
2735 _argvec[4] = (unsigned long)(arg4); \
2736 _argvec[5] = (unsigned long)(arg5); \
2737 _argvec[6] = (unsigned long)(arg6); \
2738 _argvec[7] = (unsigned long)(arg7); \
2740 "ldr r0, [%1, #20] \n\t" \
2741 "ldr r1, [%1, #24] \n\t" \
2742 "ldr r2, [%1, #28] \n\t" \
2743 "push {r0, r1, r2} \n\t" \
2744 "ldr r0, [%1, #4] \n\t" \
2745 "ldr r1, [%1, #8] \n\t" \
2746 "ldr r2, [%1, #12] \n\t" \
2747 "ldr r3, [%1, #16] \n\t" \
2748 "ldr r4, [%1] \n\t" \
2749 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
2750 "add sp, sp, #12 \n\t" \
2753 : "0" (&_argvec[0]) \
2754 : "cc", "memory", __CALLER_SAVED_REGS \
2756 lval = (__typeof__(lval)) _res; \
2759#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2762 volatile OrigFn _orig = (orig); \
2763 volatile unsigned long _argvec[9]; \
2764 volatile unsigned long _res; \
2765 _argvec[0] = (unsigned long)_orig.nraddr; \
2766 _argvec[1] = (unsigned long)(arg1); \
2767 _argvec[2] = (unsigned long)(arg2); \
2768 _argvec[3] = (unsigned long)(arg3); \
2769 _argvec[4] = (unsigned long)(arg4); \
2770 _argvec[5] = (unsigned long)(arg5); \
2771 _argvec[6] = (unsigned long)(arg6); \
2772 _argvec[7] = (unsigned long)(arg7); \
2773 _argvec[8] = (unsigned long)(arg8); \
2775 "ldr r0, [%1, #20] \n\t" \
2776 "ldr r1, [%1, #24] \n\t" \
2777 "ldr r2, [%1, #28] \n\t" \
2778 "ldr r3, [%1, #32] \n\t" \
2779 "push {r0, r1, r2, r3} \n\t" \
2780 "ldr r0, [%1, #4] \n\t" \
2781 "ldr r1, [%1, #8] \n\t" \
2782 "ldr r2, [%1, #12] \n\t" \
2783 "ldr r3, [%1, #16] \n\t" \
2784 "ldr r4, [%1] \n\t" \
2785 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
2786 "add sp, sp, #16 \n\t" \
2789 : "0" (&_argvec[0]) \
2790 : "cc", "memory", __CALLER_SAVED_REGS \
2792 lval = (__typeof__(lval)) _res; \
2795#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2798 volatile OrigFn _orig = (orig); \
2799 volatile unsigned long _argvec[10]; \
2800 volatile unsigned long _res; \
2801 _argvec[0] = (unsigned long)_orig.nraddr; \
2802 _argvec[1] = (unsigned long)(arg1); \
2803 _argvec[2] = (unsigned long)(arg2); \
2804 _argvec[3] = (unsigned long)(arg3); \
2805 _argvec[4] = (unsigned long)(arg4); \
2806 _argvec[5] = (unsigned long)(arg5); \
2807 _argvec[6] = (unsigned long)(arg6); \
2808 _argvec[7] = (unsigned long)(arg7); \
2809 _argvec[8] = (unsigned long)(arg8); \
2810 _argvec[9] = (unsigned long)(arg9); \
2812 "ldr r0, [%1, #20] \n\t" \
2813 "ldr r1, [%1, #24] \n\t" \
2814 "ldr r2, [%1, #28] \n\t" \
2815 "ldr r3, [%1, #32] \n\t" \
2816 "ldr r4, [%1, #36] \n\t" \
2817 "push {r0, r1, r2, r3, r4} \n\t" \
2818 "ldr r0, [%1, #4] \n\t" \
2819 "ldr r1, [%1, #8] \n\t" \
2820 "ldr r2, [%1, #12] \n\t" \
2821 "ldr r3, [%1, #16] \n\t" \
2822 "ldr r4, [%1] \n\t" \
2823 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
2824 "add sp, sp, #20 \n\t" \
2827 : "0" (&_argvec[0]) \
2828 : "cc", "memory", __CALLER_SAVED_REGS \
2830 lval = (__typeof__(lval)) _res; \
2833#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2834 arg7,arg8,arg9,arg10) \
2836 volatile OrigFn _orig = (orig); \
2837 volatile unsigned long _argvec[11]; \
2838 volatile unsigned long _res; \
2839 _argvec[0] = (unsigned long)_orig.nraddr; \
2840 _argvec[1] = (unsigned long)(arg1); \
2841 _argvec[2] = (unsigned long)(arg2); \
2842 _argvec[3] = (unsigned long)(arg3); \
2843 _argvec[4] = (unsigned long)(arg4); \
2844 _argvec[5] = (unsigned long)(arg5); \
2845 _argvec[6] = (unsigned long)(arg6); \
2846 _argvec[7] = (unsigned long)(arg7); \
2847 _argvec[8] = (unsigned long)(arg8); \
2848 _argvec[9] = (unsigned long)(arg9); \
2849 _argvec[10] = (unsigned long)(arg10); \
2851 "ldr r0, [%1, #40] \n\t" \
2853 "ldr r0, [%1, #20] \n\t" \
2854 "ldr r1, [%1, #24] \n\t" \
2855 "ldr r2, [%1, #28] \n\t" \
2856 "ldr r3, [%1, #32] \n\t" \
2857 "ldr r4, [%1, #36] \n\t" \
2858 "push {r0, r1, r2, r3, r4} \n\t" \
2859 "ldr r0, [%1, #4] \n\t" \
2860 "ldr r1, [%1, #8] \n\t" \
2861 "ldr r2, [%1, #12] \n\t" \
2862 "ldr r3, [%1, #16] \n\t" \
2863 "ldr r4, [%1] \n\t" \
2864 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
2865 "add sp, sp, #24 \n\t" \
2868 : "0" (&_argvec[0]) \
2869 : "cc", "memory", __CALLER_SAVED_REGS \
2871 lval = (__typeof__(lval)) _res; \
2874#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
2875 arg6,arg7,arg8,arg9,arg10, \
2878 volatile OrigFn _orig = (orig); \
2879 volatile unsigned long _argvec[12]; \
2880 volatile unsigned long _res; \
2881 _argvec[0] = (unsigned long)_orig.nraddr; \
2882 _argvec[1] = (unsigned long)(arg1); \
2883 _argvec[2] = (unsigned long)(arg2); \
2884 _argvec[3] = (unsigned long)(arg3); \
2885 _argvec[4] = (unsigned long)(arg4); \
2886 _argvec[5] = (unsigned long)(arg5); \
2887 _argvec[6] = (unsigned long)(arg6); \
2888 _argvec[7] = (unsigned long)(arg7); \
2889 _argvec[8] = (unsigned long)(arg8); \
2890 _argvec[9] = (unsigned long)(arg9); \
2891 _argvec[10] = (unsigned long)(arg10); \
2892 _argvec[11] = (unsigned long)(arg11); \
2894 "ldr r0, [%1, #40] \n\t" \
2895 "ldr r1, [%1, #44] \n\t" \
2896 "push {r0, r1} \n\t" \
2897 "ldr r0, [%1, #20] \n\t" \
2898 "ldr r1, [%1, #24] \n\t" \
2899 "ldr r2, [%1, #28] \n\t" \
2900 "ldr r3, [%1, #32] \n\t" \
2901 "ldr r4, [%1, #36] \n\t" \
2902 "push {r0, r1, r2, r3, r4} \n\t" \
2903 "ldr r0, [%1, #4] \n\t" \
2904 "ldr r1, [%1, #8] \n\t" \
2905 "ldr r2, [%1, #12] \n\t" \
2906 "ldr r3, [%1, #16] \n\t" \
2907 "ldr r4, [%1] \n\t" \
2908 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
2909 "add sp, sp, #28 \n\t" \
2912 : "0" (&_argvec[0]) \
2913 : "cc", "memory",__CALLER_SAVED_REGS \
2915 lval = (__typeof__(lval)) _res; \
2918#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
2919 arg6,arg7,arg8,arg9,arg10, \
2922 volatile OrigFn _orig = (orig); \
2923 volatile unsigned long _argvec[13]; \
2924 volatile unsigned long _res; \
2925 _argvec[0] = (unsigned long)_orig.nraddr; \
2926 _argvec[1] = (unsigned long)(arg1); \
2927 _argvec[2] = (unsigned long)(arg2); \
2928 _argvec[3] = (unsigned long)(arg3); \
2929 _argvec[4] = (unsigned long)(arg4); \
2930 _argvec[5] = (unsigned long)(arg5); \
2931 _argvec[6] = (unsigned long)(arg6); \
2932 _argvec[7] = (unsigned long)(arg7); \
2933 _argvec[8] = (unsigned long)(arg8); \
2934 _argvec[9] = (unsigned long)(arg9); \
2935 _argvec[10] = (unsigned long)(arg10); \
2936 _argvec[11] = (unsigned long)(arg11); \
2937 _argvec[12] = (unsigned long)(arg12); \
2939 "ldr r0, [%1, #40] \n\t" \
2940 "ldr r1, [%1, #44] \n\t" \
2941 "ldr r2, [%1, #48] \n\t" \
2942 "push {r0, r1, r2} \n\t" \
2943 "ldr r0, [%1, #20] \n\t" \
2944 "ldr r1, [%1, #24] \n\t" \
2945 "ldr r2, [%1, #28] \n\t" \
2946 "ldr r3, [%1, #32] \n\t" \
2947 "ldr r4, [%1, #36] \n\t" \
2948 "push {r0, r1, r2, r3, r4} \n\t" \
2949 "ldr r0, [%1, #4] \n\t" \
2950 "ldr r1, [%1, #8] \n\t" \
2951 "ldr r2, [%1, #12] \n\t" \
2952 "ldr r3, [%1, #16] \n\t" \
2953 "ldr r4, [%1] \n\t" \
2954 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
2955 "add sp, sp, #32 \n\t" \
2958 : "0" (&_argvec[0]) \
2959 : "cc", "memory", __CALLER_SAVED_REGS \
2961 lval = (__typeof__(lval)) _res; \
2968#if defined(PLAT_ppc32_aix5)
2973#define __CALLER_SAVED_REGS \
2974 "lr", "ctr", "xer", \
2975 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \
2976 "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \
2982#define VG_EXPAND_FRAME_BY_trashes_r3(_n_fr) \
2983 "addi 1,1,-" #_n_fr "\n\t" \
2984 "lwz 3," #_n_fr "(1)\n\t" \
2987#define VG_CONTRACT_FRAME_BY(_n_fr) \
2988 "addi 1,1," #_n_fr "\n\t"
2993#define CALL_FN_W_v(lval, orig) \
2995 volatile OrigFn _orig = (orig); \
2996 volatile unsigned long _argvec[3+0]; \
2997 volatile unsigned long _res; \
2999 _argvec[1] = (unsigned long)_orig.r2; \
3000 _argvec[2] = (unsigned long)_orig.nraddr; \
3003 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3004 "stw 2,-8(11)\n\t" \
3005 "lwz 2,-4(11)\n\t" \
3006 "lwz 11, 0(11)\n\t" \
3007 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3010 "lwz 2,-8(11)\n\t" \
3011 VG_CONTRACT_FRAME_BY(512) \
3013 : "r" (&_argvec[2]) \
3014 : "cc", "memory", __CALLER_SAVED_REGS \
3016 lval = (__typeof__(lval)) _res; \
3019#define CALL_FN_W_W(lval, orig, arg1) \
3021 volatile OrigFn _orig = (orig); \
3022 volatile unsigned long _argvec[3+1]; \
3023 volatile unsigned long _res; \
3025 _argvec[1] = (unsigned long)_orig.r2; \
3026 _argvec[2] = (unsigned long)_orig.nraddr; \
3027 _argvec[2+1] = (unsigned long)arg1; \
3030 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3031 "stw 2,-8(11)\n\t" \
3032 "lwz 2,-4(11)\n\t" \
3033 "lwz 3, 4(11)\n\t" \
3034 "lwz 11, 0(11)\n\t" \
3035 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3038 "lwz 2,-8(11)\n\t" \
3039 VG_CONTRACT_FRAME_BY(512) \
3041 : "r" (&_argvec[2]) \
3042 : "cc", "memory", __CALLER_SAVED_REGS \
3044 lval = (__typeof__(lval)) _res; \
3047#define CALL_FN_W_WW(lval, orig, arg1,arg2) \
3049 volatile OrigFn _orig = (orig); \
3050 volatile unsigned long _argvec[3+2]; \
3051 volatile unsigned long _res; \
3053 _argvec[1] = (unsigned long)_orig.r2; \
3054 _argvec[2] = (unsigned long)_orig.nraddr; \
3055 _argvec[2+1] = (unsigned long)arg1; \
3056 _argvec[2+2] = (unsigned long)arg2; \
3059 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3060 "stw 2,-8(11)\n\t" \
3061 "lwz 2,-4(11)\n\t" \
3062 "lwz 3, 4(11)\n\t" \
3063 "lwz 4, 8(11)\n\t" \
3064 "lwz 11, 0(11)\n\t" \
3065 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3068 "lwz 2,-8(11)\n\t" \
3069 VG_CONTRACT_FRAME_BY(512) \
3071 : "r" (&_argvec[2]) \
3072 : "cc", "memory", __CALLER_SAVED_REGS \
3074 lval = (__typeof__(lval)) _res; \
3077#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
3079 volatile OrigFn _orig = (orig); \
3080 volatile unsigned long _argvec[3+3]; \
3081 volatile unsigned long _res; \
3083 _argvec[1] = (unsigned long)_orig.r2; \
3084 _argvec[2] = (unsigned long)_orig.nraddr; \
3085 _argvec[2+1] = (unsigned long)arg1; \
3086 _argvec[2+2] = (unsigned long)arg2; \
3087 _argvec[2+3] = (unsigned long)arg3; \
3090 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3091 "stw 2,-8(11)\n\t" \
3092 "lwz 2,-4(11)\n\t" \
3093 "lwz 3, 4(11)\n\t" \
3094 "lwz 4, 8(11)\n\t" \
3095 "lwz 5, 12(11)\n\t" \
3096 "lwz 11, 0(11)\n\t" \
3097 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3100 "lwz 2,-8(11)\n\t" \
3101 VG_CONTRACT_FRAME_BY(512) \
3103 : "r" (&_argvec[2]) \
3104 : "cc", "memory", __CALLER_SAVED_REGS \
3106 lval = (__typeof__(lval)) _res; \
3109#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
3111 volatile OrigFn _orig = (orig); \
3112 volatile unsigned long _argvec[3+4]; \
3113 volatile unsigned long _res; \
3115 _argvec[1] = (unsigned long)_orig.r2; \
3116 _argvec[2] = (unsigned long)_orig.nraddr; \
3117 _argvec[2+1] = (unsigned long)arg1; \
3118 _argvec[2+2] = (unsigned long)arg2; \
3119 _argvec[2+3] = (unsigned long)arg3; \
3120 _argvec[2+4] = (unsigned long)arg4; \
3123 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3124 "stw 2,-8(11)\n\t" \
3125 "lwz 2,-4(11)\n\t" \
3126 "lwz 3, 4(11)\n\t" \
3127 "lwz 4, 8(11)\n\t" \
3128 "lwz 5, 12(11)\n\t" \
3129 "lwz 6, 16(11)\n\t" \
3130 "lwz 11, 0(11)\n\t" \
3131 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3134 "lwz 2,-8(11)\n\t" \
3135 VG_CONTRACT_FRAME_BY(512) \
3137 : "r" (&_argvec[2]) \
3138 : "cc", "memory", __CALLER_SAVED_REGS \
3140 lval = (__typeof__(lval)) _res; \
3143#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
3145 volatile OrigFn _orig = (orig); \
3146 volatile unsigned long _argvec[3+5]; \
3147 volatile unsigned long _res; \
3149 _argvec[1] = (unsigned long)_orig.r2; \
3150 _argvec[2] = (unsigned long)_orig.nraddr; \
3151 _argvec[2+1] = (unsigned long)arg1; \
3152 _argvec[2+2] = (unsigned long)arg2; \
3153 _argvec[2+3] = (unsigned long)arg3; \
3154 _argvec[2+4] = (unsigned long)arg4; \
3155 _argvec[2+5] = (unsigned long)arg5; \
3158 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3159 "stw 2,-8(11)\n\t" \
3160 "lwz 2,-4(11)\n\t" \
3161 "lwz 3, 4(11)\n\t" \
3162 "lwz 4, 8(11)\n\t" \
3163 "lwz 5, 12(11)\n\t" \
3164 "lwz 6, 16(11)\n\t" \
3165 "lwz 7, 20(11)\n\t" \
3166 "lwz 11, 0(11)\n\t" \
3167 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3170 "lwz 2,-8(11)\n\t" \
3171 VG_CONTRACT_FRAME_BY(512) \
3173 : "r" (&_argvec[2]) \
3174 : "cc", "memory", __CALLER_SAVED_REGS \
3176 lval = (__typeof__(lval)) _res; \
3179#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
3181 volatile OrigFn _orig = (orig); \
3182 volatile unsigned long _argvec[3+6]; \
3183 volatile unsigned long _res; \
3185 _argvec[1] = (unsigned long)_orig.r2; \
3186 _argvec[2] = (unsigned long)_orig.nraddr; \
3187 _argvec[2+1] = (unsigned long)arg1; \
3188 _argvec[2+2] = (unsigned long)arg2; \
3189 _argvec[2+3] = (unsigned long)arg3; \
3190 _argvec[2+4] = (unsigned long)arg4; \
3191 _argvec[2+5] = (unsigned long)arg5; \
3192 _argvec[2+6] = (unsigned long)arg6; \
3195 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3196 "stw 2,-8(11)\n\t" \
3197 "lwz 2,-4(11)\n\t" \
3198 "lwz 3, 4(11)\n\t" \
3199 "lwz 4, 8(11)\n\t" \
3200 "lwz 5, 12(11)\n\t" \
3201 "lwz 6, 16(11)\n\t" \
3202 "lwz 7, 20(11)\n\t" \
3203 "lwz 8, 24(11)\n\t" \
3204 "lwz 11, 0(11)\n\t" \
3205 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3208 "lwz 2,-8(11)\n\t" \
3209 VG_CONTRACT_FRAME_BY(512) \
3211 : "r" (&_argvec[2]) \
3212 : "cc", "memory", __CALLER_SAVED_REGS \
3214 lval = (__typeof__(lval)) _res; \
3217#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3220 volatile OrigFn _orig = (orig); \
3221 volatile unsigned long _argvec[3+7]; \
3222 volatile unsigned long _res; \
3224 _argvec[1] = (unsigned long)_orig.r2; \
3225 _argvec[2] = (unsigned long)_orig.nraddr; \
3226 _argvec[2+1] = (unsigned long)arg1; \
3227 _argvec[2+2] = (unsigned long)arg2; \
3228 _argvec[2+3] = (unsigned long)arg3; \
3229 _argvec[2+4] = (unsigned long)arg4; \
3230 _argvec[2+5] = (unsigned long)arg5; \
3231 _argvec[2+6] = (unsigned long)arg6; \
3232 _argvec[2+7] = (unsigned long)arg7; \
3235 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3236 "stw 2,-8(11)\n\t" \
3237 "lwz 2,-4(11)\n\t" \
3238 "lwz 3, 4(11)\n\t" \
3239 "lwz 4, 8(11)\n\t" \
3240 "lwz 5, 12(11)\n\t" \
3241 "lwz 6, 16(11)\n\t" \
3242 "lwz 7, 20(11)\n\t" \
3243 "lwz 8, 24(11)\n\t" \
3244 "lwz 9, 28(11)\n\t" \
3245 "lwz 11, 0(11)\n\t" \
3246 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3249 "lwz 2,-8(11)\n\t" \
3250 VG_CONTRACT_FRAME_BY(512) \
3252 : "r" (&_argvec[2]) \
3253 : "cc", "memory", __CALLER_SAVED_REGS \
3255 lval = (__typeof__(lval)) _res; \
3258#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3261 volatile OrigFn _orig = (orig); \
3262 volatile unsigned long _argvec[3+8]; \
3263 volatile unsigned long _res; \
3265 _argvec[1] = (unsigned long)_orig.r2; \
3266 _argvec[2] = (unsigned long)_orig.nraddr; \
3267 _argvec[2+1] = (unsigned long)arg1; \
3268 _argvec[2+2] = (unsigned long)arg2; \
3269 _argvec[2+3] = (unsigned long)arg3; \
3270 _argvec[2+4] = (unsigned long)arg4; \
3271 _argvec[2+5] = (unsigned long)arg5; \
3272 _argvec[2+6] = (unsigned long)arg6; \
3273 _argvec[2+7] = (unsigned long)arg7; \
3274 _argvec[2+8] = (unsigned long)arg8; \
3277 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3278 "stw 2,-8(11)\n\t" \
3279 "lwz 2,-4(11)\n\t" \
3280 "lwz 3, 4(11)\n\t" \
3281 "lwz 4, 8(11)\n\t" \
3282 "lwz 5, 12(11)\n\t" \
3283 "lwz 6, 16(11)\n\t" \
3284 "lwz 7, 20(11)\n\t" \
3285 "lwz 8, 24(11)\n\t" \
3286 "lwz 9, 28(11)\n\t" \
3287 "lwz 10, 32(11)\n\t" \
3288 "lwz 11, 0(11)\n\t" \
3289 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3292 "lwz 2,-8(11)\n\t" \
3293 VG_CONTRACT_FRAME_BY(512) \
3295 : "r" (&_argvec[2]) \
3296 : "cc", "memory", __CALLER_SAVED_REGS \
3298 lval = (__typeof__(lval)) _res; \
3301#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3304 volatile OrigFn _orig = (orig); \
3305 volatile unsigned long _argvec[3+9]; \
3306 volatile unsigned long _res; \
3308 _argvec[1] = (unsigned long)_orig.r2; \
3309 _argvec[2] = (unsigned long)_orig.nraddr; \
3310 _argvec[2+1] = (unsigned long)arg1; \
3311 _argvec[2+2] = (unsigned long)arg2; \
3312 _argvec[2+3] = (unsigned long)arg3; \
3313 _argvec[2+4] = (unsigned long)arg4; \
3314 _argvec[2+5] = (unsigned long)arg5; \
3315 _argvec[2+6] = (unsigned long)arg6; \
3316 _argvec[2+7] = (unsigned long)arg7; \
3317 _argvec[2+8] = (unsigned long)arg8; \
3318 _argvec[2+9] = (unsigned long)arg9; \
3321 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3322 "stw 2,-8(11)\n\t" \
3323 "lwz 2,-4(11)\n\t" \
3324 VG_EXPAND_FRAME_BY_trashes_r3(64) \
3326 "lwz 3,36(11)\n\t" \
3329 "lwz 3, 4(11)\n\t" \
3330 "lwz 4, 8(11)\n\t" \
3331 "lwz 5, 12(11)\n\t" \
3332 "lwz 6, 16(11)\n\t" \
3333 "lwz 7, 20(11)\n\t" \
3334 "lwz 8, 24(11)\n\t" \
3335 "lwz 9, 28(11)\n\t" \
3336 "lwz 10, 32(11)\n\t" \
3337 "lwz 11, 0(11)\n\t" \
3338 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3341 "lwz 2,-8(11)\n\t" \
3342 VG_CONTRACT_FRAME_BY(64) \
3343 VG_CONTRACT_FRAME_BY(512) \
3345 : "r" (&_argvec[2]) \
3346 : "cc", "memory", __CALLER_SAVED_REGS \
3348 lval = (__typeof__(lval)) _res; \
3351#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3352 arg7,arg8,arg9,arg10) \
3354 volatile OrigFn _orig = (orig); \
3355 volatile unsigned long _argvec[3+10]; \
3356 volatile unsigned long _res; \
3358 _argvec[1] = (unsigned long)_orig.r2; \
3359 _argvec[2] = (unsigned long)_orig.nraddr; \
3360 _argvec[2+1] = (unsigned long)arg1; \
3361 _argvec[2+2] = (unsigned long)arg2; \
3362 _argvec[2+3] = (unsigned long)arg3; \
3363 _argvec[2+4] = (unsigned long)arg4; \
3364 _argvec[2+5] = (unsigned long)arg5; \
3365 _argvec[2+6] = (unsigned long)arg6; \
3366 _argvec[2+7] = (unsigned long)arg7; \
3367 _argvec[2+8] = (unsigned long)arg8; \
3368 _argvec[2+9] = (unsigned long)arg9; \
3369 _argvec[2+10] = (unsigned long)arg10; \
3372 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3373 "stw 2,-8(11)\n\t" \
3374 "lwz 2,-4(11)\n\t" \
3375 VG_EXPAND_FRAME_BY_trashes_r3(64) \
3377 "lwz 3,40(11)\n\t" \
3380 "lwz 3,36(11)\n\t" \
3383 "lwz 3, 4(11)\n\t" \
3384 "lwz 4, 8(11)\n\t" \
3385 "lwz 5, 12(11)\n\t" \
3386 "lwz 6, 16(11)\n\t" \
3387 "lwz 7, 20(11)\n\t" \
3388 "lwz 8, 24(11)\n\t" \
3389 "lwz 9, 28(11)\n\t" \
3390 "lwz 10, 32(11)\n\t" \
3391 "lwz 11, 0(11)\n\t" \
3392 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3395 "lwz 2,-8(11)\n\t" \
3396 VG_CONTRACT_FRAME_BY(64) \
3397 VG_CONTRACT_FRAME_BY(512) \
3399 : "r" (&_argvec[2]) \
3400 : "cc", "memory", __CALLER_SAVED_REGS \
3402 lval = (__typeof__(lval)) _res; \
3405#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3406 arg7,arg8,arg9,arg10,arg11) \
3408 volatile OrigFn _orig = (orig); \
3409 volatile unsigned long _argvec[3+11]; \
3410 volatile unsigned long _res; \
3412 _argvec[1] = (unsigned long)_orig.r2; \
3413 _argvec[2] = (unsigned long)_orig.nraddr; \
3414 _argvec[2+1] = (unsigned long)arg1; \
3415 _argvec[2+2] = (unsigned long)arg2; \
3416 _argvec[2+3] = (unsigned long)arg3; \
3417 _argvec[2+4] = (unsigned long)arg4; \
3418 _argvec[2+5] = (unsigned long)arg5; \
3419 _argvec[2+6] = (unsigned long)arg6; \
3420 _argvec[2+7] = (unsigned long)arg7; \
3421 _argvec[2+8] = (unsigned long)arg8; \
3422 _argvec[2+9] = (unsigned long)arg9; \
3423 _argvec[2+10] = (unsigned long)arg10; \
3424 _argvec[2+11] = (unsigned long)arg11; \
3427 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3428 "stw 2,-8(11)\n\t" \
3429 "lwz 2,-4(11)\n\t" \
3430 VG_EXPAND_FRAME_BY_trashes_r3(72) \
3432 "lwz 3,44(11)\n\t" \
3435 "lwz 3,40(11)\n\t" \
3438 "lwz 3,36(11)\n\t" \
3441 "lwz 3, 4(11)\n\t" \
3442 "lwz 4, 8(11)\n\t" \
3443 "lwz 5, 12(11)\n\t" \
3444 "lwz 6, 16(11)\n\t" \
3445 "lwz 7, 20(11)\n\t" \
3446 "lwz 8, 24(11)\n\t" \
3447 "lwz 9, 28(11)\n\t" \
3448 "lwz 10, 32(11)\n\t" \
3449 "lwz 11, 0(11)\n\t" \
3450 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3453 "lwz 2,-8(11)\n\t" \
3454 VG_CONTRACT_FRAME_BY(72) \
3455 VG_CONTRACT_FRAME_BY(512) \
3457 : "r" (&_argvec[2]) \
3458 : "cc", "memory", __CALLER_SAVED_REGS \
3460 lval = (__typeof__(lval)) _res; \
3463#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3464 arg7,arg8,arg9,arg10,arg11,arg12) \
3466 volatile OrigFn _orig = (orig); \
3467 volatile unsigned long _argvec[3+12]; \
3468 volatile unsigned long _res; \
3470 _argvec[1] = (unsigned long)_orig.r2; \
3471 _argvec[2] = (unsigned long)_orig.nraddr; \
3472 _argvec[2+1] = (unsigned long)arg1; \
3473 _argvec[2+2] = (unsigned long)arg2; \
3474 _argvec[2+3] = (unsigned long)arg3; \
3475 _argvec[2+4] = (unsigned long)arg4; \
3476 _argvec[2+5] = (unsigned long)arg5; \
3477 _argvec[2+6] = (unsigned long)arg6; \
3478 _argvec[2+7] = (unsigned long)arg7; \
3479 _argvec[2+8] = (unsigned long)arg8; \
3480 _argvec[2+9] = (unsigned long)arg9; \
3481 _argvec[2+10] = (unsigned long)arg10; \
3482 _argvec[2+11] = (unsigned long)arg11; \
3483 _argvec[2+12] = (unsigned long)arg12; \
3486 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3487 "stw 2,-8(11)\n\t" \
3488 "lwz 2,-4(11)\n\t" \
3489 VG_EXPAND_FRAME_BY_trashes_r3(72) \
3491 "lwz 3,48(11)\n\t" \
3494 "lwz 3,44(11)\n\t" \
3497 "lwz 3,40(11)\n\t" \
3500 "lwz 3,36(11)\n\t" \
3503 "lwz 3, 4(11)\n\t" \
3504 "lwz 4, 8(11)\n\t" \
3505 "lwz 5, 12(11)\n\t" \
3506 "lwz 6, 16(11)\n\t" \
3507 "lwz 7, 20(11)\n\t" \
3508 "lwz 8, 24(11)\n\t" \
3509 "lwz 9, 28(11)\n\t" \
3510 "lwz 10, 32(11)\n\t" \
3511 "lwz 11, 0(11)\n\t" \
3512 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3515 "lwz 2,-8(11)\n\t" \
3516 VG_CONTRACT_FRAME_BY(72) \
3517 VG_CONTRACT_FRAME_BY(512) \
3519 : "r" (&_argvec[2]) \
3520 : "cc", "memory", __CALLER_SAVED_REGS \
3522 lval = (__typeof__(lval)) _res; \
3529#if defined(PLAT_ppc64_aix5)
3534#define __CALLER_SAVED_REGS \
3535 "lr", "ctr", "xer", \
3536 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \
3537 "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \
3543#define VG_EXPAND_FRAME_BY_trashes_r3(_n_fr) \
3544 "addi 1,1,-" #_n_fr "\n\t" \
3545 "ld 3," #_n_fr "(1)\n\t" \
3548#define VG_CONTRACT_FRAME_BY(_n_fr) \
3549 "addi 1,1," #_n_fr "\n\t"
3554#define CALL_FN_W_v(lval, orig) \
3556 volatile OrigFn _orig = (orig); \
3557 volatile unsigned long _argvec[3+0]; \
3558 volatile unsigned long _res; \
3560 _argvec[1] = (unsigned long)_orig.r2; \
3561 _argvec[2] = (unsigned long)_orig.nraddr; \
3564 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3565 "std 2,-16(11)\n\t" \
3567 "ld 11, 0(11)\n\t" \
3568 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3571 "ld 2,-16(11)\n\t" \
3572 VG_CONTRACT_FRAME_BY(512) \
3574 : "r" (&_argvec[2]) \
3575 : "cc", "memory", __CALLER_SAVED_REGS \
3577 lval = (__typeof__(lval)) _res; \
3580#define CALL_FN_W_W(lval, orig, arg1) \
3582 volatile OrigFn _orig = (orig); \
3583 volatile unsigned long _argvec[3+1]; \
3584 volatile unsigned long _res; \
3586 _argvec[1] = (unsigned long)_orig.r2; \
3587 _argvec[2] = (unsigned long)_orig.nraddr; \
3588 _argvec[2+1] = (unsigned long)arg1; \
3591 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3592 "std 2,-16(11)\n\t" \
3595 "ld 11, 0(11)\n\t" \
3596 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3599 "ld 2,-16(11)\n\t" \
3600 VG_CONTRACT_FRAME_BY(512) \
3602 : "r" (&_argvec[2]) \
3603 : "cc", "memory", __CALLER_SAVED_REGS \
3605 lval = (__typeof__(lval)) _res; \
3608#define CALL_FN_W_WW(lval, orig, arg1,arg2) \
3610 volatile OrigFn _orig = (orig); \
3611 volatile unsigned long _argvec[3+2]; \
3612 volatile unsigned long _res; \
3614 _argvec[1] = (unsigned long)_orig.r2; \
3615 _argvec[2] = (unsigned long)_orig.nraddr; \
3616 _argvec[2+1] = (unsigned long)arg1; \
3617 _argvec[2+2] = (unsigned long)arg2; \
3620 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3621 "std 2,-16(11)\n\t" \
3624 "ld 4, 16(11)\n\t" \
3625 "ld 11, 0(11)\n\t" \
3626 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3629 "ld 2,-16(11)\n\t" \
3630 VG_CONTRACT_FRAME_BY(512) \
3632 : "r" (&_argvec[2]) \
3633 : "cc", "memory", __CALLER_SAVED_REGS \
3635 lval = (__typeof__(lval)) _res; \
3638#define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
3640 volatile OrigFn _orig = (orig); \
3641 volatile unsigned long _argvec[3+3]; \
3642 volatile unsigned long _res; \
3644 _argvec[1] = (unsigned long)_orig.r2; \
3645 _argvec[2] = (unsigned long)_orig.nraddr; \
3646 _argvec[2+1] = (unsigned long)arg1; \
3647 _argvec[2+2] = (unsigned long)arg2; \
3648 _argvec[2+3] = (unsigned long)arg3; \
3651 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3652 "std 2,-16(11)\n\t" \
3655 "ld 4, 16(11)\n\t" \
3656 "ld 5, 24(11)\n\t" \
3657 "ld 11, 0(11)\n\t" \
3658 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3661 "ld 2,-16(11)\n\t" \
3662 VG_CONTRACT_FRAME_BY(512) \
3664 : "r" (&_argvec[2]) \
3665 : "cc", "memory", __CALLER_SAVED_REGS \
3667 lval = (__typeof__(lval)) _res; \
3670#define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
3672 volatile OrigFn _orig = (orig); \
3673 volatile unsigned long _argvec[3+4]; \
3674 volatile unsigned long _res; \
3676 _argvec[1] = (unsigned long)_orig.r2; \
3677 _argvec[2] = (unsigned long)_orig.nraddr; \
3678 _argvec[2+1] = (unsigned long)arg1; \
3679 _argvec[2+2] = (unsigned long)arg2; \
3680 _argvec[2+3] = (unsigned long)arg3; \
3681 _argvec[2+4] = (unsigned long)arg4; \
3684 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3685 "std 2,-16(11)\n\t" \
3688 "ld 4, 16(11)\n\t" \
3689 "ld 5, 24(11)\n\t" \
3690 "ld 6, 32(11)\n\t" \
3691 "ld 11, 0(11)\n\t" \
3692 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3695 "ld 2,-16(11)\n\t" \
3696 VG_CONTRACT_FRAME_BY(512) \
3698 : "r" (&_argvec[2]) \
3699 : "cc", "memory", __CALLER_SAVED_REGS \
3701 lval = (__typeof__(lval)) _res; \
3704#define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
3706 volatile OrigFn _orig = (orig); \
3707 volatile unsigned long _argvec[3+5]; \
3708 volatile unsigned long _res; \
3710 _argvec[1] = (unsigned long)_orig.r2; \
3711 _argvec[2] = (unsigned long)_orig.nraddr; \
3712 _argvec[2+1] = (unsigned long)arg1; \
3713 _argvec[2+2] = (unsigned long)arg2; \
3714 _argvec[2+3] = (unsigned long)arg3; \
3715 _argvec[2+4] = (unsigned long)arg4; \
3716 _argvec[2+5] = (unsigned long)arg5; \
3719 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3720 "std 2,-16(11)\n\t" \
3723 "ld 4, 16(11)\n\t" \
3724 "ld 5, 24(11)\n\t" \
3725 "ld 6, 32(11)\n\t" \
3726 "ld 7, 40(11)\n\t" \
3727 "ld 11, 0(11)\n\t" \
3728 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3731 "ld 2,-16(11)\n\t" \
3732 VG_CONTRACT_FRAME_BY(512) \
3734 : "r" (&_argvec[2]) \
3735 : "cc", "memory", __CALLER_SAVED_REGS \
3737 lval = (__typeof__(lval)) _res; \
3740#define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
3742 volatile OrigFn _orig = (orig); \
3743 volatile unsigned long _argvec[3+6]; \
3744 volatile unsigned long _res; \
3746 _argvec[1] = (unsigned long)_orig.r2; \
3747 _argvec[2] = (unsigned long)_orig.nraddr; \
3748 _argvec[2+1] = (unsigned long)arg1; \
3749 _argvec[2+2] = (unsigned long)arg2; \
3750 _argvec[2+3] = (unsigned long)arg3; \
3751 _argvec[2+4] = (unsigned long)arg4; \
3752 _argvec[2+5] = (unsigned long)arg5; \
3753 _argvec[2+6] = (unsigned long)arg6; \
3756 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3757 "std 2,-16(11)\n\t" \
3760 "ld 4, 16(11)\n\t" \
3761 "ld 5, 24(11)\n\t" \
3762 "ld 6, 32(11)\n\t" \
3763 "ld 7, 40(11)\n\t" \
3764 "ld 8, 48(11)\n\t" \
3765 "ld 11, 0(11)\n\t" \
3766 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3769 "ld 2,-16(11)\n\t" \
3770 VG_CONTRACT_FRAME_BY(512) \
3772 : "r" (&_argvec[2]) \
3773 : "cc", "memory", __CALLER_SAVED_REGS \
3775 lval = (__typeof__(lval)) _res; \
3778#define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3781 volatile OrigFn _orig = (orig); \
3782 volatile unsigned long _argvec[3+7]; \
3783 volatile unsigned long _res; \
3785 _argvec[1] = (unsigned long)_orig.r2; \
3786 _argvec[2] = (unsigned long)_orig.nraddr; \
3787 _argvec[2+1] = (unsigned long)arg1; \
3788 _argvec[2+2] = (unsigned long)arg2; \
3789 _argvec[2+3] = (unsigned long)arg3; \
3790 _argvec[2+4] = (unsigned long)arg4; \
3791 _argvec[2+5] = (unsigned long)arg5; \
3792 _argvec[2+6] = (unsigned long)arg6; \
3793 _argvec[2+7] = (unsigned long)arg7; \
3796 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3797 "std 2,-16(11)\n\t" \
3800 "ld 4, 16(11)\n\t" \
3801 "ld 5, 24(11)\n\t" \
3802 "ld 6, 32(11)\n\t" \
3803 "ld 7, 40(11)\n\t" \
3804 "ld 8, 48(11)\n\t" \
3805 "ld 9, 56(11)\n\t" \
3806 "ld 11, 0(11)\n\t" \
3807 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3810 "ld 2,-16(11)\n\t" \
3811 VG_CONTRACT_FRAME_BY(512) \
3813 : "r" (&_argvec[2]) \
3814 : "cc", "memory", __CALLER_SAVED_REGS \
3816 lval = (__typeof__(lval)) _res; \
3819#define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3822 volatile OrigFn _orig = (orig); \
3823 volatile unsigned long _argvec[3+8]; \
3824 volatile unsigned long _res; \
3826 _argvec[1] = (unsigned long)_orig.r2; \
3827 _argvec[2] = (unsigned long)_orig.nraddr; \
3828 _argvec[2+1] = (unsigned long)arg1; \
3829 _argvec[2+2] = (unsigned long)arg2; \
3830 _argvec[2+3] = (unsigned long)arg3; \
3831 _argvec[2+4] = (unsigned long)arg4; \
3832 _argvec[2+5] = (unsigned long)arg5; \
3833 _argvec[2+6] = (unsigned long)arg6; \
3834 _argvec[2+7] = (unsigned long)arg7; \
3835 _argvec[2+8] = (unsigned long)arg8; \
3838 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3839 "std 2,-16(11)\n\t" \
3842 "ld 4, 16(11)\n\t" \
3843 "ld 5, 24(11)\n\t" \
3844 "ld 6, 32(11)\n\t" \
3845 "ld 7, 40(11)\n\t" \
3846 "ld 8, 48(11)\n\t" \
3847 "ld 9, 56(11)\n\t" \
3848 "ld 10, 64(11)\n\t" \
3849 "ld 11, 0(11)\n\t" \
3850 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3853 "ld 2,-16(11)\n\t" \
3854 VG_CONTRACT_FRAME_BY(512) \
3856 : "r" (&_argvec[2]) \
3857 : "cc", "memory", __CALLER_SAVED_REGS \
3859 lval = (__typeof__(lval)) _res; \
3862#define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3865 volatile OrigFn _orig = (orig); \
3866 volatile unsigned long _argvec[3+9]; \
3867 volatile unsigned long _res; \
3869 _argvec[1] = (unsigned long)_orig.r2; \
3870 _argvec[2] = (unsigned long)_orig.nraddr; \
3871 _argvec[2+1] = (unsigned long)arg1; \
3872 _argvec[2+2] = (unsigned long)arg2; \
3873 _argvec[2+3] = (unsigned long)arg3; \
3874 _argvec[2+4] = (unsigned long)arg4; \
3875 _argvec[2+5] = (unsigned long)arg5; \
3876 _argvec[2+6] = (unsigned long)arg6; \
3877 _argvec[2+7] = (unsigned long)arg7; \
3878 _argvec[2+8] = (unsigned long)arg8; \
3879 _argvec[2+9] = (unsigned long)arg9; \
3882 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3883 "std 2,-16(11)\n\t" \
3885 VG_EXPAND_FRAME_BY_trashes_r3(128) \
3888 "std 3,112(1)\n\t" \
3891 "ld 4, 16(11)\n\t" \
3892 "ld 5, 24(11)\n\t" \
3893 "ld 6, 32(11)\n\t" \
3894 "ld 7, 40(11)\n\t" \
3895 "ld 8, 48(11)\n\t" \
3896 "ld 9, 56(11)\n\t" \
3897 "ld 10, 64(11)\n\t" \
3898 "ld 11, 0(11)\n\t" \
3899 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3902 "ld 2,-16(11)\n\t" \
3903 VG_CONTRACT_FRAME_BY(128) \
3904 VG_CONTRACT_FRAME_BY(512) \
3906 : "r" (&_argvec[2]) \
3907 : "cc", "memory", __CALLER_SAVED_REGS \
3909 lval = (__typeof__(lval)) _res; \
3912#define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3913 arg7,arg8,arg9,arg10) \
3915 volatile OrigFn _orig = (orig); \
3916 volatile unsigned long _argvec[3+10]; \
3917 volatile unsigned long _res; \
3919 _argvec[1] = (unsigned long)_orig.r2; \
3920 _argvec[2] = (unsigned long)_orig.nraddr; \
3921 _argvec[2+1] = (unsigned long)arg1; \
3922 _argvec[2+2] = (unsigned long)arg2; \
3923 _argvec[2+3] = (unsigned long)arg3; \
3924 _argvec[2+4] = (unsigned long)arg4; \
3925 _argvec[2+5] = (unsigned long)arg5; \
3926 _argvec[2+6] = (unsigned long)arg6; \
3927 _argvec[2+7] = (unsigned long)arg7; \
3928 _argvec[2+8] = (unsigned long)arg8; \
3929 _argvec[2+9] = (unsigned long)arg9; \
3930 _argvec[2+10] = (unsigned long)arg10; \
3933 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3934 "std 2,-16(11)\n\t" \
3936 VG_EXPAND_FRAME_BY_trashes_r3(128) \
3939 "std 3,120(1)\n\t" \
3942 "std 3,112(1)\n\t" \
3945 "ld 4, 16(11)\n\t" \
3946 "ld 5, 24(11)\n\t" \
3947 "ld 6, 32(11)\n\t" \
3948 "ld 7, 40(11)\n\t" \
3949 "ld 8, 48(11)\n\t" \
3950 "ld 9, 56(11)\n\t" \
3951 "ld 10, 64(11)\n\t" \
3952 "ld 11, 0(11)\n\t" \
3953 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3956 "ld 2,-16(11)\n\t" \
3957 VG_CONTRACT_FRAME_BY(128) \
3958 VG_CONTRACT_FRAME_BY(512) \
3960 : "r" (&_argvec[2]) \
3961 : "cc", "memory", __CALLER_SAVED_REGS \
3963 lval = (__typeof__(lval)) _res; \
3966#define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3967 arg7,arg8,arg9,arg10,arg11) \
3969 volatile OrigFn _orig = (orig); \
3970 volatile unsigned long _argvec[3+11]; \
3971 volatile unsigned long _res; \
3973 _argvec[1] = (unsigned long)_orig.r2; \
3974 _argvec[2] = (unsigned long)_orig.nraddr; \
3975 _argvec[2+1] = (unsigned long)arg1; \
3976 _argvec[2+2] = (unsigned long)arg2; \
3977 _argvec[2+3] = (unsigned long)arg3; \
3978 _argvec[2+4] = (unsigned long)arg4; \
3979 _argvec[2+5] = (unsigned long)arg5; \
3980 _argvec[2+6] = (unsigned long)arg6; \
3981 _argvec[2+7] = (unsigned long)arg7; \
3982 _argvec[2+8] = (unsigned long)arg8; \
3983 _argvec[2+9] = (unsigned long)arg9; \
3984 _argvec[2+10] = (unsigned long)arg10; \
3985 _argvec[2+11] = (unsigned long)arg11; \
3988 VG_EXPAND_FRAME_BY_trashes_r3(512) \
3989 "std 2,-16(11)\n\t" \
3991 VG_EXPAND_FRAME_BY_trashes_r3(144) \
3994 "std 3,128(1)\n\t" \
3997 "std 3,120(1)\n\t" \
4000 "std 3,112(1)\n\t" \
4003 "ld 4, 16(11)\n\t" \
4004 "ld 5, 24(11)\n\t" \
4005 "ld 6, 32(11)\n\t" \
4006 "ld 7, 40(11)\n\t" \
4007 "ld 8, 48(11)\n\t" \
4008 "ld 9, 56(11)\n\t" \
4009 "ld 10, 64(11)\n\t" \
4010 "ld 11, 0(11)\n\t" \
4011 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
4014 "ld 2,-16(11)\n\t" \
4015 VG_CONTRACT_FRAME_BY(144) \
4016 VG_CONTRACT_FRAME_BY(512) \
4018 : "r" (&_argvec[2]) \
4019 : "cc", "memory", __CALLER_SAVED_REGS \
4021 lval = (__typeof__(lval)) _res; \
4024#define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
4025 arg7,arg8,arg9,arg10,arg11,arg12) \
4027 volatile OrigFn _orig = (orig); \
4028 volatile unsigned long _argvec[3+12]; \
4029 volatile unsigned long _res; \
4031 _argvec[1] = (unsigned long)_orig.r2; \
4032 _argvec[2] = (unsigned long)_orig.nraddr; \
4033 _argvec[2+1] = (unsigned long)arg1; \
4034 _argvec[2+2] = (unsigned long)arg2; \
4035 _argvec[2+3] = (unsigned long)arg3; \
4036 _argvec[2+4] = (unsigned long)arg4; \
4037 _argvec[2+5] = (unsigned long)arg5; \
4038 _argvec[2+6] = (unsigned long)arg6; \
4039 _argvec[2+7] = (unsigned long)arg7; \
4040 _argvec[2+8] = (unsigned long)arg8; \
4041 _argvec[2+9] = (unsigned long)arg9; \
4042 _argvec[2+10] = (unsigned long)arg10; \
4043 _argvec[2+11] = (unsigned long)arg11; \
4044 _argvec[2+12] = (unsigned long)arg12; \
4047 VG_EXPAND_FRAME_BY_trashes_r3(512) \
4048 "std 2,-16(11)\n\t" \
4050 VG_EXPAND_FRAME_BY_trashes_r3(144) \
4053 "std 3,136(1)\n\t" \
4056 "std 3,128(1)\n\t" \
4059 "std 3,120(1)\n\t" \
4062 "std 3,112(1)\n\t" \
4065 "ld 4, 16(11)\n\t" \
4066 "ld 5, 24(11)\n\t" \
4067 "ld 6, 32(11)\n\t" \
4068 "ld 7, 40(11)\n\t" \
4069 "ld 8, 48(11)\n\t" \
4070 "ld 9, 56(11)\n\t" \
4071 "ld 10, 64(11)\n\t" \
4072 "ld 11, 0(11)\n\t" \
4073 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
4076 "ld 2,-16(11)\n\t" \
4077 VG_CONTRACT_FRAME_BY(144) \
4078 VG_CONTRACT_FRAME_BY(512) \
4080 : "r" (&_argvec[2]) \
4081 : "cc", "memory", __CALLER_SAVED_REGS \
4083 lval = (__typeof__(lval)) _res; \
4104#define VG_USERREQ_TOOL_BASE(a,b) \
4105 ((unsigned int)(((a)&0xff) << 24 | ((b)&0xff) << 16))
4106#define VG_IS_TOOL_USERREQ(a, b, v) \
4107 (VG_USERREQ_TOOL_BASE(a,b) == ((v) & 0xffff0000))
4168#if !defined(__GNUC__)
4169# define __extension__
4176#define RUNNING_ON_VALGRIND __extension__ \
4177 ({unsigned int _qzz_res; \
4178 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0 , \
4179 VG_USERREQ__RUNNING_ON_VALGRIND, \
4189#define VALGRIND_DISCARD_TRANSLATIONS(_qzz_addr,_qzz_len) \
4190 {unsigned int _qzz_res; \
4191 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
4192 VG_USERREQ__DISCARD_TRANSLATIONS, \
4193 _qzz_addr, _qzz_len, 0, 0, 0); \
4202#if defined(NVALGRIND)
4204# define VALGRIND_PRINTF(...)
4205# define VALGRIND_PRINTF_BACKTRACE(...)
4216 unsigned long _qzz_res;
4222 (
unsigned long)&vargs,
4225 return (
int)_qzz_res;
4233 unsigned long _qzz_res;
4239 (
unsigned long)&vargs,
4242 return (
int)_qzz_res;
4271#define VALGRIND_NON_SIMD_CALL0(_qyy_fn) \
4273 ({unsigned long _qyy_res; \
4274 VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 , \
4275 VG_USERREQ__CLIENT_CALL0, \
4281#define VALGRIND_NON_SIMD_CALL1(_qyy_fn, _qyy_arg1) \
4283 ({unsigned long _qyy_res; \
4284 VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 , \
4285 VG_USERREQ__CLIENT_CALL1, \
4287 _qyy_arg1, 0, 0, 0); \
4291#define VALGRIND_NON_SIMD_CALL2(_qyy_fn, _qyy_arg1, _qyy_arg2) \
4293 ({unsigned long _qyy_res; \
4294 VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 , \
4295 VG_USERREQ__CLIENT_CALL2, \
4297 _qyy_arg1, _qyy_arg2, 0, 0); \
4301#define VALGRIND_NON_SIMD_CALL3(_qyy_fn, _qyy_arg1, _qyy_arg2, _qyy_arg3) \
4303 ({unsigned long _qyy_res; \
4304 VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 , \
4305 VG_USERREQ__CLIENT_CALL3, \
4307 _qyy_arg1, _qyy_arg2, \
4316#define VALGRIND_COUNT_ERRORS \
4318 ({unsigned int _qyy_res; \
4319 VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 , \
4320 VG_USERREQ__COUNT_ERRORS, \
4412#define VALGRIND_MALLOCLIKE_BLOCK(addr, sizeB, rzB, is_zeroed) \
4413 {unsigned int __unused _qzz_res; \
4414 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
4415 VG_USERREQ__MALLOCLIKE_BLOCK, \
4416 addr, sizeB, rzB, is_zeroed, 0); \
4422#define VALGRIND_FREELIKE_BLOCK(addr, rzB) \
4423 {unsigned int __unused _qzz_res; \
4424 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
4425 VG_USERREQ__FREELIKE_BLOCK, \
4426 addr, rzB, 0, 0, 0); \
4430#define VALGRIND_CREATE_MEMPOOL(pool, rzB, is_zeroed) \
4431 {unsigned int _qzz_res; \
4432 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
4433 VG_USERREQ__CREATE_MEMPOOL, \
4434 pool, rzB, is_zeroed, 0, 0); \
4438#define VALGRIND_DESTROY_MEMPOOL(pool) \
4439 {unsigned int _qzz_res; \
4440 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
4441 VG_USERREQ__DESTROY_MEMPOOL, \
4442 pool, 0, 0, 0, 0); \
4446#define VALGRIND_MEMPOOL_ALLOC(pool, addr, size) \
4447 {unsigned int _qzz_res; \
4448 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
4449 VG_USERREQ__MEMPOOL_ALLOC, \
4450 pool, addr, size, 0, 0); \
4454#define VALGRIND_MEMPOOL_FREE(pool, addr) \
4455 {unsigned int _qzz_res; \
4456 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
4457 VG_USERREQ__MEMPOOL_FREE, \
4458 pool, addr, 0, 0, 0); \
4462#define VALGRIND_MEMPOOL_TRIM(pool, addr, size) \
4463 {unsigned int _qzz_res; \
4464 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
4465 VG_USERREQ__MEMPOOL_TRIM, \
4466 pool, addr, size, 0, 0); \
4470#define VALGRIND_MOVE_MEMPOOL(poolA, poolB) \
4471 {unsigned int _qzz_res; \
4472 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
4473 VG_USERREQ__MOVE_MEMPOOL, \
4474 poolA, poolB, 0, 0, 0); \
4478#define VALGRIND_MEMPOOL_CHANGE(pool, addrA, addrB, size) \
4479 {unsigned int _qzz_res; \
4480 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
4481 VG_USERREQ__MEMPOOL_CHANGE, \
4482 pool, addrA, addrB, size, 0); \
4486#define VALGRIND_MEMPOOL_EXISTS(pool) \
4488 ({unsigned int _qzz_res; \
4489 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
4490 VG_USERREQ__MEMPOOL_EXISTS, \
4491 pool, 0, 0, 0, 0); \
4496#define VALGRIND_STACK_REGISTER(start, end) \
4498 ({unsigned int _qzz_res; \
4499 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
4500 VG_USERREQ__STACK_REGISTER, \
4501 start, end, 0, 0, 0); \
4507#define VALGRIND_STACK_DEREGISTER(id) \
4508 {unsigned int _qzz_res; \
4509 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
4510 VG_USERREQ__STACK_DEREGISTER, \
4515#define VALGRIND_STACK_CHANGE(id, start, end) \
4516 {unsigned int _qzz_res; \
4517 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
4518 VG_USERREQ__STACK_CHANGE, \
4519 id, start, end, 0, 0); \
4523#define VALGRIND_LOAD_PDB_DEBUGINFO(fd, ptr, total_size, delta) \
4524 {unsigned int _qzz_res; \
4525 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
4526 VG_USERREQ__LOAD_PDB_DEBUGINFO, \
4527 fd, ptr, total_size, delta, 0); \
4531#undef PLAT_x86_linux
4532#undef PLAT_amd64_linux
4533#undef PLAT_ppc32_linux
4534#undef PLAT_ppc64_linux
4535#undef PLAT_arm_linux
4536#undef PLAT_ppc32_aix5
4537#undef PLAT_ppc64_aix5
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
#define FILE_SECBOOT(_status)
Declare a file's UEFI Secure Boot permission status.
#define va_start(ap, last)
__builtin_va_list va_list
#define VALGRIND_PRINTF_BACKTRACE(...)
#define VALGRIND_PRINTF(...)
@ VG_USERREQ__DESTROY_MEMPOOL
@ VG_USERREQ__LOAD_PDB_DEBUGINFO
@ VG_USERREQ__PRINTF_BACKTRACE
@ VG_USERREQ__MEMPOOL_ALLOC
@ 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
#define VALGRIND_DO_CLIENT_REQUEST( _zzq_rlval, _zzq_default, _zzq_request, _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)