95 #elif defined(__x86_64__)
97 #elif defined(__powerpc__) && !defined(__powerpc64__)
99 #elif defined(__powerpc__) && defined(__powerpc64__)
100 # define ARCH_ppc64 1
105 #if !defined(ARCH_x86) && !defined(ARCH_amd64) \
106 && !defined(ARCH_ppc32) && !defined(ARCH_ppc64)
107 # if !defined(NVALGRIND)
118 #if defined(NVALGRIND)
123 #define VALGRIND_DO_CLIENT_REQUEST( \
124 _zzq_rlval, _zzq_default, _zzq_request, \
125 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
127 (_zzq_rlval) = (_zzq_default); \
169 #if defined(ARCH_x86)
177 #define __SPECIAL_INSTRUCTION_PREAMBLE \
178 "roll $3, %%edi ; roll $13, %%edi\n\t" \
179 "roll $29, %%edi ; roll $19, %%edi\n\t"
181 #define VALGRIND_DO_CLIENT_REQUEST( \
182 _zzq_rlval, _zzq_default, _zzq_request, \
183 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
184 { volatile unsigned int _zzq_args[6]; \
185 volatile unsigned int _zzq_result; \
186 _zzq_args[0] = (unsigned int)(_zzq_request); \
187 _zzq_args[1] = (unsigned int)(_zzq_arg1); \
188 _zzq_args[2] = (unsigned int)(_zzq_arg2); \
189 _zzq_args[3] = (unsigned int)(_zzq_arg3); \
190 _zzq_args[4] = (unsigned int)(_zzq_arg4); \
191 _zzq_args[5] = (unsigned int)(_zzq_arg5); \
192 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
194 "xchgl %%ebx,%%ebx" \
195 : "=d" (_zzq_result) \
196 : "a" (&_zzq_args[0]), "0" (_zzq_default) \
199 _zzq_rlval = _zzq_result; \
202 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
203 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
204 volatile unsigned int __addr; \
205 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
207 "xchgl %%ecx,%%ecx" \
212 _zzq_orig->nraddr = __addr; \
215 #define VALGRIND_CALL_NOREDIR_EAX \
216 __SPECIAL_INSTRUCTION_PREAMBLE \
218 "xchgl %%edx,%%edx\n\t"
223 #if defined(ARCH_amd64)
227 unsigned long long int nraddr;
231 #define __SPECIAL_INSTRUCTION_PREAMBLE \
232 "rolq $3, %%rdi ; rolq $13, %%rdi\n\t" \
233 "rolq $61, %%rdi ; rolq $51, %%rdi\n\t"
235 #define VALGRIND_DO_CLIENT_REQUEST( \
236 _zzq_rlval, _zzq_default, _zzq_request, \
237 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
238 { volatile unsigned long long int _zzq_args[6]; \
239 volatile unsigned long long int _zzq_result; \
240 _zzq_args[0] = (unsigned long long int)(_zzq_request); \
241 _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \
242 _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \
243 _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \
244 _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \
245 _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \
246 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
248 "xchgq %%rbx,%%rbx" \
249 : "=d" (_zzq_result) \
250 : "a" (&_zzq_args[0]), "0" (_zzq_default) \
253 _zzq_rlval = _zzq_result; \
256 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
257 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
258 volatile unsigned long long int __addr; \
259 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
261 "xchgq %%rcx,%%rcx" \
266 _zzq_orig->nraddr = __addr; \
269 #define VALGRIND_CALL_NOREDIR_RAX \
270 __SPECIAL_INSTRUCTION_PREAMBLE \
272 "xchgq %%rdx,%%rdx\n\t"
277 #if defined(ARCH_ppc32)
285 #define __SPECIAL_INSTRUCTION_PREAMBLE \
286 "rlwinm 0,0,3,0,0 ; rlwinm 0,0,13,0,0\n\t" \
287 "rlwinm 0,0,29,0,0 ; rlwinm 0,0,19,0,0\n\t"
289 #define VALGRIND_DO_CLIENT_REQUEST( \
290 _zzq_rlval, _zzq_default, _zzq_request, \
291 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
293 { unsigned int _zzq_args[6]; \
294 register unsigned int _zzq_result __asm__("r3"); \
295 register unsigned int* _zzq_ptr __asm__("r4"); \
296 _zzq_args[0] = (unsigned int)(_zzq_request); \
297 _zzq_args[1] = (unsigned int)(_zzq_arg1); \
298 _zzq_args[2] = (unsigned int)(_zzq_arg2); \
299 _zzq_args[3] = (unsigned int)(_zzq_arg3); \
300 _zzq_args[4] = (unsigned int)(_zzq_arg4); \
301 _zzq_args[5] = (unsigned int)(_zzq_arg5); \
302 _zzq_ptr = _zzq_args; \
303 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
306 : "=r" (_zzq_result) \
307 : "0" (_zzq_default), "r" (_zzq_ptr) \
309 _zzq_rlval = _zzq_result; \
312 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
313 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
314 register unsigned int __addr __asm__("r3"); \
315 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
322 _zzq_orig->nraddr = __addr; \
325 #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
326 __SPECIAL_INSTRUCTION_PREAMBLE \
333 #if defined(ARCH_ppc64)
337 unsigned long long int nraddr;
338 unsigned long long int r2;
342 #define __SPECIAL_INSTRUCTION_PREAMBLE \
343 "rotldi 0,0,3 ; rotldi 0,0,13\n\t" \
344 "rotldi 0,0,61 ; rotldi 0,0,51\n\t"
346 #define VALGRIND_DO_CLIENT_REQUEST( \
347 _zzq_rlval, _zzq_default, _zzq_request, \
348 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
350 { unsigned long long int _zzq_args[6]; \
351 register unsigned long long int _zzq_result __asm__("r3"); \
352 register unsigned long long int* _zzq_ptr __asm__("r4"); \
353 _zzq_args[0] = (unsigned long long int)(_zzq_request); \
354 _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \
355 _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \
356 _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \
357 _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \
358 _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \
359 _zzq_ptr = _zzq_args; \
360 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
363 : "=r" (_zzq_result) \
364 : "0" (_zzq_default), "r" (_zzq_ptr) \
366 _zzq_rlval = _zzq_result; \
369 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
370 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
371 register unsigned long long int __addr __asm__("r3"); \
372 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
379 _zzq_orig->nraddr = __addr; \
380 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
387 _zzq_orig->r2 = __addr; \
390 #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
391 __SPECIAL_INSTRUCTION_PREAMBLE \
428 #define I_WRAP_SONAME_FNNAME_ZU(soname,fnname) \
429 _vgwZU_##soname##_##fnname
431 #define I_WRAP_SONAME_FNNAME_ZZ(soname,fnname) \
432 _vgwZZ_##soname##_##fnname
438 #define VALGRIND_GET_ORIG_FN(_lval) VALGRIND_GET_NR_CONTEXT(_lval)
443 #define CALL_FN_v_v(fnptr) \
444 do { volatile unsigned long _junk; \
445 CALL_FN_W_v(_junk,fnptr); } while (0)
447 #define CALL_FN_v_W(fnptr, arg1) \
448 do { volatile unsigned long _junk; \
449 CALL_FN_W_W(_junk,fnptr,arg1); } while (0)
451 #define CALL_FN_v_WW(fnptr, arg1,arg2) \
452 do { volatile unsigned long _junk; \
453 CALL_FN_W_WW(_junk,fnptr,arg1,arg2); } while (0)
455 #define CALL_FN_v_WWW(fnptr, arg1,arg2,arg3) \
456 do { volatile unsigned long _junk; \
457 CALL_FN_W_WWW(_junk,fnptr,arg1,arg2,arg3); } while (0)
461 #if defined(ARCH_x86)
465 #define __CALLER_SAVED_REGS "ecx", "edx"
470 #define CALL_FN_W_v(lval, orig) \
472 volatile OrigFn _orig = (orig); \
473 volatile unsigned long _argvec[1]; \
474 volatile unsigned long _res; \
475 _argvec[0] = (unsigned long)_orig.nraddr; \
477 "movl (%%eax), %%eax\n\t" \
478 VALGRIND_CALL_NOREDIR_EAX \
480 : "a" (&_argvec[0]) \
481 : "cc", "memory", __CALLER_SAVED_REGS \
483 lval = (__typeof__(lval)) _res; \
486 #define CALL_FN_W_W(lval, orig, arg1) \
488 volatile OrigFn _orig = (orig); \
489 volatile unsigned long _argvec[2]; \
490 volatile unsigned long _res; \
491 _argvec[0] = (unsigned long)_orig.nraddr; \
492 _argvec[1] = (unsigned long)(arg1); \
494 "pushl 4(%%eax)\n\t" \
495 "movl (%%eax), %%eax\n\t" \
496 VALGRIND_CALL_NOREDIR_EAX \
499 : "a" (&_argvec[0]) \
500 : "cc", "memory", __CALLER_SAVED_REGS \
502 lval = (__typeof__(lval)) _res; \
505 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
507 volatile OrigFn _orig = (orig); \
508 volatile unsigned long _argvec[3]; \
509 volatile unsigned long _res; \
510 _argvec[0] = (unsigned long)_orig.nraddr; \
511 _argvec[1] = (unsigned long)(arg1); \
512 _argvec[2] = (unsigned long)(arg2); \
514 "pushl 8(%%eax)\n\t" \
515 "pushl 4(%%eax)\n\t" \
516 "movl (%%eax), %%eax\n\t" \
517 VALGRIND_CALL_NOREDIR_EAX \
520 : "a" (&_argvec[0]) \
521 : "cc", "memory", __CALLER_SAVED_REGS \
523 lval = (__typeof__(lval)) _res; \
526 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
528 volatile OrigFn _orig = (orig); \
529 volatile unsigned long _argvec[4]; \
530 volatile unsigned long _res; \
531 _argvec[0] = (unsigned long)_orig.nraddr; \
532 _argvec[1] = (unsigned long)(arg1); \
533 _argvec[2] = (unsigned long)(arg2); \
534 _argvec[3] = (unsigned long)(arg3); \
536 "pushl 12(%%eax)\n\t" \
537 "pushl 8(%%eax)\n\t" \
538 "pushl 4(%%eax)\n\t" \
539 "movl (%%eax), %%eax\n\t" \
540 VALGRIND_CALL_NOREDIR_EAX \
541 "addl $12, %%esp\n" \
543 : "a" (&_argvec[0]) \
544 : "cc", "memory", __CALLER_SAVED_REGS \
546 lval = (__typeof__(lval)) _res; \
549 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
551 volatile OrigFn _orig = (orig); \
552 volatile unsigned long _argvec[5]; \
553 volatile unsigned long _res; \
554 _argvec[0] = (unsigned long)_orig.nraddr; \
555 _argvec[1] = (unsigned long)(arg1); \
556 _argvec[2] = (unsigned long)(arg2); \
557 _argvec[3] = (unsigned long)(arg3); \
558 _argvec[4] = (unsigned long)(arg4); \
560 "pushl 16(%%eax)\n\t" \
561 "pushl 12(%%eax)\n\t" \
562 "pushl 8(%%eax)\n\t" \
563 "pushl 4(%%eax)\n\t" \
564 "movl (%%eax), %%eax\n\t" \
565 VALGRIND_CALL_NOREDIR_EAX \
566 "addl $16, %%esp\n" \
568 : "a" (&_argvec[0]) \
569 : "cc", "memory", __CALLER_SAVED_REGS \
571 lval = (__typeof__(lval)) _res; \
574 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
576 volatile OrigFn _orig = (orig); \
577 volatile unsigned long _argvec[6]; \
578 volatile unsigned long _res; \
579 _argvec[0] = (unsigned long)_orig.nraddr; \
580 _argvec[1] = (unsigned long)(arg1); \
581 _argvec[2] = (unsigned long)(arg2); \
582 _argvec[3] = (unsigned long)(arg3); \
583 _argvec[4] = (unsigned long)(arg4); \
584 _argvec[5] = (unsigned long)(arg5); \
586 "pushl 20(%%eax)\n\t" \
587 "pushl 16(%%eax)\n\t" \
588 "pushl 12(%%eax)\n\t" \
589 "pushl 8(%%eax)\n\t" \
590 "pushl 4(%%eax)\n\t" \
591 "movl (%%eax), %%eax\n\t" \
592 VALGRIND_CALL_NOREDIR_EAX \
593 "addl $20, %%esp\n" \
595 : "a" (&_argvec[0]) \
596 : "cc", "memory", __CALLER_SAVED_REGS \
598 lval = (__typeof__(lval)) _res; \
601 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
603 volatile OrigFn _orig = (orig); \
604 volatile unsigned long _argvec[7]; \
605 volatile unsigned long _res; \
606 _argvec[0] = (unsigned long)_orig.nraddr; \
607 _argvec[1] = (unsigned long)(arg1); \
608 _argvec[2] = (unsigned long)(arg2); \
609 _argvec[3] = (unsigned long)(arg3); \
610 _argvec[4] = (unsigned long)(arg4); \
611 _argvec[5] = (unsigned long)(arg5); \
612 _argvec[6] = (unsigned long)(arg6); \
614 "pushl 24(%%eax)\n\t" \
615 "pushl 20(%%eax)\n\t" \
616 "pushl 16(%%eax)\n\t" \
617 "pushl 12(%%eax)\n\t" \
618 "pushl 8(%%eax)\n\t" \
619 "pushl 4(%%eax)\n\t" \
620 "movl (%%eax), %%eax\n\t" \
621 VALGRIND_CALL_NOREDIR_EAX \
622 "addl $24, %%esp\n" \
624 : "a" (&_argvec[0]) \
625 : "cc", "memory", __CALLER_SAVED_REGS \
627 lval = (__typeof__(lval)) _res; \
630 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
633 volatile OrigFn _orig = (orig); \
634 volatile unsigned long _argvec[8]; \
635 volatile unsigned long _res; \
636 _argvec[0] = (unsigned long)_orig.nraddr; \
637 _argvec[1] = (unsigned long)(arg1); \
638 _argvec[2] = (unsigned long)(arg2); \
639 _argvec[3] = (unsigned long)(arg3); \
640 _argvec[4] = (unsigned long)(arg4); \
641 _argvec[5] = (unsigned long)(arg5); \
642 _argvec[6] = (unsigned long)(arg6); \
643 _argvec[7] = (unsigned long)(arg7); \
645 "pushl 28(%%eax)\n\t" \
646 "pushl 24(%%eax)\n\t" \
647 "pushl 20(%%eax)\n\t" \
648 "pushl 16(%%eax)\n\t" \
649 "pushl 12(%%eax)\n\t" \
650 "pushl 8(%%eax)\n\t" \
651 "pushl 4(%%eax)\n\t" \
652 "movl (%%eax), %%eax\n\t" \
653 VALGRIND_CALL_NOREDIR_EAX \
654 "addl $28, %%esp\n" \
656 : "a" (&_argvec[0]) \
657 : "cc", "memory", __CALLER_SAVED_REGS \
659 lval = (__typeof__(lval)) _res; \
662 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
665 volatile OrigFn _orig = (orig); \
666 volatile unsigned long _argvec[9]; \
667 volatile unsigned long _res; \
668 _argvec[0] = (unsigned long)_orig.nraddr; \
669 _argvec[1] = (unsigned long)(arg1); \
670 _argvec[2] = (unsigned long)(arg2); \
671 _argvec[3] = (unsigned long)(arg3); \
672 _argvec[4] = (unsigned long)(arg4); \
673 _argvec[5] = (unsigned long)(arg5); \
674 _argvec[6] = (unsigned long)(arg6); \
675 _argvec[7] = (unsigned long)(arg7); \
676 _argvec[8] = (unsigned long)(arg8); \
678 "pushl 32(%%eax)\n\t" \
679 "pushl 28(%%eax)\n\t" \
680 "pushl 24(%%eax)\n\t" \
681 "pushl 20(%%eax)\n\t" \
682 "pushl 16(%%eax)\n\t" \
683 "pushl 12(%%eax)\n\t" \
684 "pushl 8(%%eax)\n\t" \
685 "pushl 4(%%eax)\n\t" \
686 "movl (%%eax), %%eax\n\t" \
687 VALGRIND_CALL_NOREDIR_EAX \
688 "addl $32, %%esp\n" \
690 : "a" (&_argvec[0]) \
691 : "cc", "memory", __CALLER_SAVED_REGS \
693 lval = (__typeof__(lval)) _res; \
696 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
699 volatile OrigFn _orig = (orig); \
700 volatile unsigned long _argvec[10]; \
701 volatile unsigned long _res; \
702 _argvec[0] = (unsigned long)_orig.nraddr; \
703 _argvec[1] = (unsigned long)(arg1); \
704 _argvec[2] = (unsigned long)(arg2); \
705 _argvec[3] = (unsigned long)(arg3); \
706 _argvec[4] = (unsigned long)(arg4); \
707 _argvec[5] = (unsigned long)(arg5); \
708 _argvec[6] = (unsigned long)(arg6); \
709 _argvec[7] = (unsigned long)(arg7); \
710 _argvec[8] = (unsigned long)(arg8); \
711 _argvec[9] = (unsigned long)(arg9); \
713 "pushl 36(%%eax)\n\t" \
714 "pushl 32(%%eax)\n\t" \
715 "pushl 28(%%eax)\n\t" \
716 "pushl 24(%%eax)\n\t" \
717 "pushl 20(%%eax)\n\t" \
718 "pushl 16(%%eax)\n\t" \
719 "pushl 12(%%eax)\n\t" \
720 "pushl 8(%%eax)\n\t" \
721 "pushl 4(%%eax)\n\t" \
722 "movl (%%eax), %%eax\n\t" \
723 VALGRIND_CALL_NOREDIR_EAX \
724 "addl $36, %%esp\n" \
726 : "a" (&_argvec[0]) \
727 : "cc", "memory", __CALLER_SAVED_REGS \
729 lval = (__typeof__(lval)) _res; \
732 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
733 arg7,arg8,arg9,arg10) \
735 volatile OrigFn _orig = (orig); \
736 volatile unsigned long _argvec[11]; \
737 volatile unsigned long _res; \
738 _argvec[0] = (unsigned long)_orig.nraddr; \
739 _argvec[1] = (unsigned long)(arg1); \
740 _argvec[2] = (unsigned long)(arg2); \
741 _argvec[3] = (unsigned long)(arg3); \
742 _argvec[4] = (unsigned long)(arg4); \
743 _argvec[5] = (unsigned long)(arg5); \
744 _argvec[6] = (unsigned long)(arg6); \
745 _argvec[7] = (unsigned long)(arg7); \
746 _argvec[8] = (unsigned long)(arg8); \
747 _argvec[9] = (unsigned long)(arg9); \
748 _argvec[10] = (unsigned long)(arg10); \
750 "pushl 40(%%eax)\n\t" \
751 "pushl 36(%%eax)\n\t" \
752 "pushl 32(%%eax)\n\t" \
753 "pushl 28(%%eax)\n\t" \
754 "pushl 24(%%eax)\n\t" \
755 "pushl 20(%%eax)\n\t" \
756 "pushl 16(%%eax)\n\t" \
757 "pushl 12(%%eax)\n\t" \
758 "pushl 8(%%eax)\n\t" \
759 "pushl 4(%%eax)\n\t" \
760 "movl (%%eax), %%eax\n\t" \
761 VALGRIND_CALL_NOREDIR_EAX \
762 "addl $40, %%esp\n" \
764 : "a" (&_argvec[0]) \
765 : "cc", "memory", __CALLER_SAVED_REGS \
767 lval = (__typeof__(lval)) _res; \
770 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
771 arg6,arg7,arg8,arg9,arg10, \
774 volatile OrigFn _orig = (orig); \
775 volatile unsigned long _argvec[12]; \
776 volatile unsigned long _res; \
777 _argvec[0] = (unsigned long)_orig.nraddr; \
778 _argvec[1] = (unsigned long)(arg1); \
779 _argvec[2] = (unsigned long)(arg2); \
780 _argvec[3] = (unsigned long)(arg3); \
781 _argvec[4] = (unsigned long)(arg4); \
782 _argvec[5] = (unsigned long)(arg5); \
783 _argvec[6] = (unsigned long)(arg6); \
784 _argvec[7] = (unsigned long)(arg7); \
785 _argvec[8] = (unsigned long)(arg8); \
786 _argvec[9] = (unsigned long)(arg9); \
787 _argvec[10] = (unsigned long)(arg10); \
788 _argvec[11] = (unsigned long)(arg11); \
790 "pushl 44(%%eax)\n\t" \
791 "pushl 40(%%eax)\n\t" \
792 "pushl 36(%%eax)\n\t" \
793 "pushl 32(%%eax)\n\t" \
794 "pushl 28(%%eax)\n\t" \
795 "pushl 24(%%eax)\n\t" \
796 "pushl 20(%%eax)\n\t" \
797 "pushl 16(%%eax)\n\t" \
798 "pushl 12(%%eax)\n\t" \
799 "pushl 8(%%eax)\n\t" \
800 "pushl 4(%%eax)\n\t" \
801 "movl (%%eax), %%eax\n\t" \
802 VALGRIND_CALL_NOREDIR_EAX \
803 "addl $44, %%esp\n" \
805 : "a" (&_argvec[0]) \
806 : "cc", "memory", __CALLER_SAVED_REGS \
808 lval = (__typeof__(lval)) _res; \
811 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
812 arg6,arg7,arg8,arg9,arg10, \
815 volatile OrigFn _orig = (orig); \
816 volatile unsigned long _argvec[13]; \
817 volatile unsigned long _res; \
818 _argvec[0] = (unsigned long)_orig.nraddr; \
819 _argvec[1] = (unsigned long)(arg1); \
820 _argvec[2] = (unsigned long)(arg2); \
821 _argvec[3] = (unsigned long)(arg3); \
822 _argvec[4] = (unsigned long)(arg4); \
823 _argvec[5] = (unsigned long)(arg5); \
824 _argvec[6] = (unsigned long)(arg6); \
825 _argvec[7] = (unsigned long)(arg7); \
826 _argvec[8] = (unsigned long)(arg8); \
827 _argvec[9] = (unsigned long)(arg9); \
828 _argvec[10] = (unsigned long)(arg10); \
829 _argvec[11] = (unsigned long)(arg11); \
830 _argvec[12] = (unsigned long)(arg12); \
832 "pushl 48(%%eax)\n\t" \
833 "pushl 44(%%eax)\n\t" \
834 "pushl 40(%%eax)\n\t" \
835 "pushl 36(%%eax)\n\t" \
836 "pushl 32(%%eax)\n\t" \
837 "pushl 28(%%eax)\n\t" \
838 "pushl 24(%%eax)\n\t" \
839 "pushl 20(%%eax)\n\t" \
840 "pushl 16(%%eax)\n\t" \
841 "pushl 12(%%eax)\n\t" \
842 "pushl 8(%%eax)\n\t" \
843 "pushl 4(%%eax)\n\t" \
844 "movl (%%eax), %%eax\n\t" \
845 VALGRIND_CALL_NOREDIR_EAX \
846 "addl $48, %%esp\n" \
848 : "a" (&_argvec[0]) \
849 : "cc", "memory", __CALLER_SAVED_REGS \
851 lval = (__typeof__(lval)) _res; \
858 #if defined(ARCH_amd64)
863 #define __CALLER_SAVED_REGS "rcx", "rdx", "rsi", \
864 "rdi", "r8", "r9", "r10", "r11"
869 #define CALL_FN_W_v(lval, orig) \
871 volatile OrigFn _orig = (orig); \
872 volatile unsigned long _argvec[1]; \
873 volatile unsigned long _res; \
874 _argvec[0] = (unsigned long)_orig.nraddr; \
876 "movq (%%rax), %%rax\n\t" \
877 VALGRIND_CALL_NOREDIR_RAX \
879 : "a" (&_argvec[0]) \
880 : "cc", "memory", __CALLER_SAVED_REGS \
882 lval = (__typeof__(lval)) _res; \
885 #define CALL_FN_W_W(lval, orig, arg1) \
887 volatile OrigFn _orig = (orig); \
888 volatile unsigned long _argvec[2]; \
889 volatile unsigned long _res; \
890 _argvec[0] = (unsigned long)_orig.nraddr; \
891 _argvec[1] = (unsigned long)(arg1); \
893 "movq 8(%%rax), %%rdi\n\t" \
894 "movq (%%rax), %%rax\n\t" \
895 VALGRIND_CALL_NOREDIR_RAX \
897 : "a" (&_argvec[0]) \
898 : "cc", "memory", __CALLER_SAVED_REGS \
900 lval = (__typeof__(lval)) _res; \
903 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
905 volatile OrigFn _orig = (orig); \
906 volatile unsigned long _argvec[3]; \
907 volatile unsigned long _res; \
908 _argvec[0] = (unsigned long)_orig.nraddr; \
909 _argvec[1] = (unsigned long)(arg1); \
910 _argvec[2] = (unsigned long)(arg2); \
912 "movq 16(%%rax), %%rsi\n\t" \
913 "movq 8(%%rax), %%rdi\n\t" \
914 "movq (%%rax), %%rax\n\t" \
915 VALGRIND_CALL_NOREDIR_RAX \
917 : "a" (&_argvec[0]) \
918 : "cc", "memory", __CALLER_SAVED_REGS \
920 lval = (__typeof__(lval)) _res; \
923 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
925 volatile OrigFn _orig = (orig); \
926 volatile unsigned long _argvec[4]; \
927 volatile unsigned long _res; \
928 _argvec[0] = (unsigned long)_orig.nraddr; \
929 _argvec[1] = (unsigned long)(arg1); \
930 _argvec[2] = (unsigned long)(arg2); \
931 _argvec[3] = (unsigned long)(arg3); \
933 "movq 24(%%rax), %%rdx\n\t" \
934 "movq 16(%%rax), %%rsi\n\t" \
935 "movq 8(%%rax), %%rdi\n\t" \
936 "movq (%%rax), %%rax\n\t" \
937 VALGRIND_CALL_NOREDIR_RAX \
939 : "a" (&_argvec[0]) \
940 : "cc", "memory", __CALLER_SAVED_REGS \
942 lval = (__typeof__(lval)) _res; \
945 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
947 volatile OrigFn _orig = (orig); \
948 volatile unsigned long _argvec[5]; \
949 volatile unsigned long _res; \
950 _argvec[0] = (unsigned long)_orig.nraddr; \
951 _argvec[1] = (unsigned long)(arg1); \
952 _argvec[2] = (unsigned long)(arg2); \
953 _argvec[3] = (unsigned long)(arg3); \
954 _argvec[4] = (unsigned long)(arg4); \
956 "movq 32(%%rax), %%rcx\n\t" \
957 "movq 24(%%rax), %%rdx\n\t" \
958 "movq 16(%%rax), %%rsi\n\t" \
959 "movq 8(%%rax), %%rdi\n\t" \
960 "movq (%%rax), %%rax\n\t" \
961 VALGRIND_CALL_NOREDIR_RAX \
963 : "a" (&_argvec[0]) \
964 : "cc", "memory", __CALLER_SAVED_REGS \
966 lval = (__typeof__(lval)) _res; \
969 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
971 volatile OrigFn _orig = (orig); \
972 volatile unsigned long _argvec[6]; \
973 volatile unsigned long _res; \
974 _argvec[0] = (unsigned long)_orig.nraddr; \
975 _argvec[1] = (unsigned long)(arg1); \
976 _argvec[2] = (unsigned long)(arg2); \
977 _argvec[3] = (unsigned long)(arg3); \
978 _argvec[4] = (unsigned long)(arg4); \
979 _argvec[5] = (unsigned long)(arg5); \
981 "movq 40(%%rax), %%r8\n\t" \
982 "movq 32(%%rax), %%rcx\n\t" \
983 "movq 24(%%rax), %%rdx\n\t" \
984 "movq 16(%%rax), %%rsi\n\t" \
985 "movq 8(%%rax), %%rdi\n\t" \
986 "movq (%%rax), %%rax\n\t" \
987 VALGRIND_CALL_NOREDIR_RAX \
989 : "a" (&_argvec[0]) \
990 : "cc", "memory", __CALLER_SAVED_REGS \
992 lval = (__typeof__(lval)) _res; \
995 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
997 volatile OrigFn _orig = (orig); \
998 volatile unsigned long _argvec[7]; \
999 volatile unsigned long _res; \
1000 _argvec[0] = (unsigned long)_orig.nraddr; \
1001 _argvec[1] = (unsigned long)(arg1); \
1002 _argvec[2] = (unsigned long)(arg2); \
1003 _argvec[3] = (unsigned long)(arg3); \
1004 _argvec[4] = (unsigned long)(arg4); \
1005 _argvec[5] = (unsigned long)(arg5); \
1006 _argvec[6] = (unsigned long)(arg6); \
1008 "movq 48(%%rax), %%r9\n\t" \
1009 "movq 40(%%rax), %%r8\n\t" \
1010 "movq 32(%%rax), %%rcx\n\t" \
1011 "movq 24(%%rax), %%rdx\n\t" \
1012 "movq 16(%%rax), %%rsi\n\t" \
1013 "movq 8(%%rax), %%rdi\n\t" \
1014 "movq (%%rax), %%rax\n\t" \
1015 VALGRIND_CALL_NOREDIR_RAX \
1017 : "a" (&_argvec[0]) \
1018 : "cc", "memory", __CALLER_SAVED_REGS \
1020 lval = (__typeof__(lval)) _res; \
1023 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1026 volatile OrigFn _orig = (orig); \
1027 volatile unsigned long _argvec[8]; \
1028 volatile unsigned long _res; \
1029 _argvec[0] = (unsigned long)_orig.nraddr; \
1030 _argvec[1] = (unsigned long)(arg1); \
1031 _argvec[2] = (unsigned long)(arg2); \
1032 _argvec[3] = (unsigned long)(arg3); \
1033 _argvec[4] = (unsigned long)(arg4); \
1034 _argvec[5] = (unsigned long)(arg5); \
1035 _argvec[6] = (unsigned long)(arg6); \
1036 _argvec[7] = (unsigned long)(arg7); \
1038 "pushq 56(%%rax)\n\t" \
1039 "movq 48(%%rax), %%r9\n\t" \
1040 "movq 40(%%rax), %%r8\n\t" \
1041 "movq 32(%%rax), %%rcx\n\t" \
1042 "movq 24(%%rax), %%rdx\n\t" \
1043 "movq 16(%%rax), %%rsi\n\t" \
1044 "movq 8(%%rax), %%rdi\n\t" \
1045 "movq (%%rax), %%rax\n\t" \
1046 VALGRIND_CALL_NOREDIR_RAX \
1047 "addq $8, %%rsp\n" \
1049 : "a" (&_argvec[0]) \
1050 : "cc", "memory", __CALLER_SAVED_REGS \
1052 lval = (__typeof__(lval)) _res; \
1055 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1058 volatile OrigFn _orig = (orig); \
1059 volatile unsigned long _argvec[9]; \
1060 volatile unsigned long _res; \
1061 _argvec[0] = (unsigned long)_orig.nraddr; \
1062 _argvec[1] = (unsigned long)(arg1); \
1063 _argvec[2] = (unsigned long)(arg2); \
1064 _argvec[3] = (unsigned long)(arg3); \
1065 _argvec[4] = (unsigned long)(arg4); \
1066 _argvec[5] = (unsigned long)(arg5); \
1067 _argvec[6] = (unsigned long)(arg6); \
1068 _argvec[7] = (unsigned long)(arg7); \
1069 _argvec[8] = (unsigned long)(arg8); \
1071 "pushq 64(%%rax)\n\t" \
1072 "pushq 56(%%rax)\n\t" \
1073 "movq 48(%%rax), %%r9\n\t" \
1074 "movq 40(%%rax), %%r8\n\t" \
1075 "movq 32(%%rax), %%rcx\n\t" \
1076 "movq 24(%%rax), %%rdx\n\t" \
1077 "movq 16(%%rax), %%rsi\n\t" \
1078 "movq 8(%%rax), %%rdi\n\t" \
1079 "movq (%%rax), %%rax\n\t" \
1080 VALGRIND_CALL_NOREDIR_RAX \
1081 "addq $16, %%rsp\n" \
1083 : "a" (&_argvec[0]) \
1084 : "cc", "memory", __CALLER_SAVED_REGS \
1086 lval = (__typeof__(lval)) _res; \
1089 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1092 volatile OrigFn _orig = (orig); \
1093 volatile unsigned long _argvec[10]; \
1094 volatile unsigned long _res; \
1095 _argvec[0] = (unsigned long)_orig.nraddr; \
1096 _argvec[1] = (unsigned long)(arg1); \
1097 _argvec[2] = (unsigned long)(arg2); \
1098 _argvec[3] = (unsigned long)(arg3); \
1099 _argvec[4] = (unsigned long)(arg4); \
1100 _argvec[5] = (unsigned long)(arg5); \
1101 _argvec[6] = (unsigned long)(arg6); \
1102 _argvec[7] = (unsigned long)(arg7); \
1103 _argvec[8] = (unsigned long)(arg8); \
1104 _argvec[9] = (unsigned long)(arg9); \
1106 "pushq 72(%%rax)\n\t" \
1107 "pushq 64(%%rax)\n\t" \
1108 "pushq 56(%%rax)\n\t" \
1109 "movq 48(%%rax), %%r9\n\t" \
1110 "movq 40(%%rax), %%r8\n\t" \
1111 "movq 32(%%rax), %%rcx\n\t" \
1112 "movq 24(%%rax), %%rdx\n\t" \
1113 "movq 16(%%rax), %%rsi\n\t" \
1114 "movq 8(%%rax), %%rdi\n\t" \
1115 "movq (%%rax), %%rax\n\t" \
1116 VALGRIND_CALL_NOREDIR_RAX \
1117 "addq $24, %%rsp\n" \
1119 : "a" (&_argvec[0]) \
1120 : "cc", "memory", __CALLER_SAVED_REGS \
1122 lval = (__typeof__(lval)) _res; \
1125 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1126 arg7,arg8,arg9,arg10) \
1128 volatile OrigFn _orig = (orig); \
1129 volatile unsigned long _argvec[11]; \
1130 volatile unsigned long _res; \
1131 _argvec[0] = (unsigned long)_orig.nraddr; \
1132 _argvec[1] = (unsigned long)(arg1); \
1133 _argvec[2] = (unsigned long)(arg2); \
1134 _argvec[3] = (unsigned long)(arg3); \
1135 _argvec[4] = (unsigned long)(arg4); \
1136 _argvec[5] = (unsigned long)(arg5); \
1137 _argvec[6] = (unsigned long)(arg6); \
1138 _argvec[7] = (unsigned long)(arg7); \
1139 _argvec[8] = (unsigned long)(arg8); \
1140 _argvec[9] = (unsigned long)(arg9); \
1141 _argvec[10] = (unsigned long)(arg10); \
1143 "pushq 80(%%rax)\n\t" \
1144 "pushq 72(%%rax)\n\t" \
1145 "pushq 64(%%rax)\n\t" \
1146 "pushq 56(%%rax)\n\t" \
1147 "movq 48(%%rax), %%r9\n\t" \
1148 "movq 40(%%rax), %%r8\n\t" \
1149 "movq 32(%%rax), %%rcx\n\t" \
1150 "movq 24(%%rax), %%rdx\n\t" \
1151 "movq 16(%%rax), %%rsi\n\t" \
1152 "movq 8(%%rax), %%rdi\n\t" \
1153 "movq (%%rax), %%rax\n\t" \
1154 VALGRIND_CALL_NOREDIR_RAX \
1155 "addq $32, %%rsp\n" \
1157 : "a" (&_argvec[0]) \
1158 : "cc", "memory", __CALLER_SAVED_REGS \
1160 lval = (__typeof__(lval)) _res; \
1163 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1164 arg7,arg8,arg9,arg10,arg11) \
1166 volatile OrigFn _orig = (orig); \
1167 volatile unsigned long _argvec[12]; \
1168 volatile unsigned long _res; \
1169 _argvec[0] = (unsigned long)_orig.nraddr; \
1170 _argvec[1] = (unsigned long)(arg1); \
1171 _argvec[2] = (unsigned long)(arg2); \
1172 _argvec[3] = (unsigned long)(arg3); \
1173 _argvec[4] = (unsigned long)(arg4); \
1174 _argvec[5] = (unsigned long)(arg5); \
1175 _argvec[6] = (unsigned long)(arg6); \
1176 _argvec[7] = (unsigned long)(arg7); \
1177 _argvec[8] = (unsigned long)(arg8); \
1178 _argvec[9] = (unsigned long)(arg9); \
1179 _argvec[10] = (unsigned long)(arg10); \
1180 _argvec[11] = (unsigned long)(arg11); \
1182 "pushq 88(%%rax)\n\t" \
1183 "pushq 80(%%rax)\n\t" \
1184 "pushq 72(%%rax)\n\t" \
1185 "pushq 64(%%rax)\n\t" \
1186 "pushq 56(%%rax)\n\t" \
1187 "movq 48(%%rax), %%r9\n\t" \
1188 "movq 40(%%rax), %%r8\n\t" \
1189 "movq 32(%%rax), %%rcx\n\t" \
1190 "movq 24(%%rax), %%rdx\n\t" \
1191 "movq 16(%%rax), %%rsi\n\t" \
1192 "movq 8(%%rax), %%rdi\n\t" \
1193 "movq (%%rax), %%rax\n\t" \
1194 VALGRIND_CALL_NOREDIR_RAX \
1195 "addq $40, %%rsp\n" \
1197 : "a" (&_argvec[0]) \
1198 : "cc", "memory", __CALLER_SAVED_REGS \
1200 lval = (__typeof__(lval)) _res; \
1203 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1204 arg7,arg8,arg9,arg10,arg11,arg12) \
1206 volatile OrigFn _orig = (orig); \
1207 volatile unsigned long _argvec[13]; \
1208 volatile unsigned long _res; \
1209 _argvec[0] = (unsigned long)_orig.nraddr; \
1210 _argvec[1] = (unsigned long)(arg1); \
1211 _argvec[2] = (unsigned long)(arg2); \
1212 _argvec[3] = (unsigned long)(arg3); \
1213 _argvec[4] = (unsigned long)(arg4); \
1214 _argvec[5] = (unsigned long)(arg5); \
1215 _argvec[6] = (unsigned long)(arg6); \
1216 _argvec[7] = (unsigned long)(arg7); \
1217 _argvec[8] = (unsigned long)(arg8); \
1218 _argvec[9] = (unsigned long)(arg9); \
1219 _argvec[10] = (unsigned long)(arg10); \
1220 _argvec[11] = (unsigned long)(arg11); \
1221 _argvec[12] = (unsigned long)(arg12); \
1223 "pushq 96(%%rax)\n\t" \
1224 "pushq 88(%%rax)\n\t" \
1225 "pushq 80(%%rax)\n\t" \
1226 "pushq 72(%%rax)\n\t" \
1227 "pushq 64(%%rax)\n\t" \
1228 "pushq 56(%%rax)\n\t" \
1229 "movq 48(%%rax), %%r9\n\t" \
1230 "movq 40(%%rax), %%r8\n\t" \
1231 "movq 32(%%rax), %%rcx\n\t" \
1232 "movq 24(%%rax), %%rdx\n\t" \
1233 "movq 16(%%rax), %%rsi\n\t" \
1234 "movq 8(%%rax), %%rdi\n\t" \
1235 "movq (%%rax), %%rax\n\t" \
1236 VALGRIND_CALL_NOREDIR_RAX \
1237 "addq $48, %%rsp\n" \
1239 : "a" (&_argvec[0]) \
1240 : "cc", "memory", __CALLER_SAVED_REGS \
1242 lval = (__typeof__(lval)) _res; \
1249 #if defined(ARCH_ppc32)
1275 #define __CALLER_SAVED_REGS \
1276 "lr", "ctr", "xer", \
1277 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \
1278 "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \
1284 #define CALL_FN_W_v(lval, orig) \
1286 volatile OrigFn _orig = (orig); \
1287 volatile unsigned long _argvec[1]; \
1288 volatile unsigned long _res; \
1289 _argvec[0] = (unsigned long)_orig.nraddr; \
1292 "lwz 11,0(11)\n\t" \
1293 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1296 : "r" (&_argvec[0]) \
1297 : "cc", "memory", __CALLER_SAVED_REGS \
1299 lval = (__typeof__(lval)) _res; \
1302 #define CALL_FN_W_W(lval, orig, arg1) \
1304 volatile OrigFn _orig = (orig); \
1305 volatile unsigned long _argvec[2]; \
1306 volatile unsigned long _res; \
1307 _argvec[0] = (unsigned long)_orig.nraddr; \
1308 _argvec[1] = (unsigned long)arg1; \
1312 "lwz 11,0(11)\n\t" \
1313 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1316 : "r" (&_argvec[0]) \
1317 : "cc", "memory", __CALLER_SAVED_REGS \
1319 lval = (__typeof__(lval)) _res; \
1322 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
1324 volatile OrigFn _orig = (orig); \
1325 volatile unsigned long _argvec[3]; \
1326 volatile unsigned long _res; \
1327 _argvec[0] = (unsigned long)_orig.nraddr; \
1328 _argvec[1] = (unsigned long)arg1; \
1329 _argvec[2] = (unsigned long)arg2; \
1334 "lwz 11,0(11)\n\t" \
1335 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1338 : "r" (&_argvec[0]) \
1339 : "cc", "memory", __CALLER_SAVED_REGS \
1341 lval = (__typeof__(lval)) _res; \
1344 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
1346 volatile OrigFn _orig = (orig); \
1347 volatile unsigned long _argvec[4]; \
1348 volatile unsigned long _res; \
1349 _argvec[0] = (unsigned long)_orig.nraddr; \
1350 _argvec[1] = (unsigned long)arg1; \
1351 _argvec[2] = (unsigned long)arg2; \
1352 _argvec[3] = (unsigned long)arg3; \
1357 "lwz 5,12(11)\n\t" \
1358 "lwz 11,0(11)\n\t" \
1359 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1362 : "r" (&_argvec[0]) \
1363 : "cc", "memory", __CALLER_SAVED_REGS \
1365 lval = (__typeof__(lval)) _res; \
1368 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
1370 volatile OrigFn _orig = (orig); \
1371 volatile unsigned long _argvec[5]; \
1372 volatile unsigned long _res; \
1373 _argvec[0] = (unsigned long)_orig.nraddr; \
1374 _argvec[1] = (unsigned long)arg1; \
1375 _argvec[2] = (unsigned long)arg2; \
1376 _argvec[3] = (unsigned long)arg3; \
1377 _argvec[4] = (unsigned long)arg4; \
1382 "lwz 5,12(11)\n\t" \
1383 "lwz 6,16(11)\n\t" \
1384 "lwz 11,0(11)\n\t" \
1385 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1388 : "r" (&_argvec[0]) \
1389 : "cc", "memory", __CALLER_SAVED_REGS \
1391 lval = (__typeof__(lval)) _res; \
1394 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
1396 volatile OrigFn _orig = (orig); \
1397 volatile unsigned long _argvec[6]; \
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; \
1409 "lwz 5,12(11)\n\t" \
1410 "lwz 6,16(11)\n\t" \
1411 "lwz 7,20(11)\n\t" \
1412 "lwz 11,0(11)\n\t" \
1413 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1416 : "r" (&_argvec[0]) \
1417 : "cc", "memory", __CALLER_SAVED_REGS \
1419 lval = (__typeof__(lval)) _res; \
1422 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
1424 volatile OrigFn _orig = (orig); \
1425 volatile unsigned long _argvec[7]; \
1426 volatile unsigned long _res; \
1427 _argvec[0] = (unsigned long)_orig.nraddr; \
1428 _argvec[1] = (unsigned long)arg1; \
1429 _argvec[2] = (unsigned long)arg2; \
1430 _argvec[3] = (unsigned long)arg3; \
1431 _argvec[4] = (unsigned long)arg4; \
1432 _argvec[5] = (unsigned long)arg5; \
1433 _argvec[6] = (unsigned long)arg6; \
1438 "lwz 5,12(11)\n\t" \
1439 "lwz 6,16(11)\n\t" \
1440 "lwz 7,20(11)\n\t" \
1441 "lwz 8,24(11)\n\t" \
1442 "lwz 11,0(11)\n\t" \
1443 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1446 : "r" (&_argvec[0]) \
1447 : "cc", "memory", __CALLER_SAVED_REGS \
1449 lval = (__typeof__(lval)) _res; \
1452 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1455 volatile OrigFn _orig = (orig); \
1456 volatile unsigned long _argvec[8]; \
1457 volatile unsigned long _res; \
1458 _argvec[0] = (unsigned long)_orig.nraddr; \
1459 _argvec[1] = (unsigned long)arg1; \
1460 _argvec[2] = (unsigned long)arg2; \
1461 _argvec[3] = (unsigned long)arg3; \
1462 _argvec[4] = (unsigned long)arg4; \
1463 _argvec[5] = (unsigned long)arg5; \
1464 _argvec[6] = (unsigned long)arg6; \
1465 _argvec[7] = (unsigned long)arg7; \
1470 "lwz 5,12(11)\n\t" \
1471 "lwz 6,16(11)\n\t" \
1472 "lwz 7,20(11)\n\t" \
1473 "lwz 8,24(11)\n\t" \
1474 "lwz 9,28(11)\n\t" \
1475 "lwz 11,0(11)\n\t" \
1476 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1479 : "r" (&_argvec[0]) \
1480 : "cc", "memory", __CALLER_SAVED_REGS \
1482 lval = (__typeof__(lval)) _res; \
1485 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1488 volatile OrigFn _orig = (orig); \
1489 volatile unsigned long _argvec[9]; \
1490 volatile unsigned long _res; \
1491 _argvec[0] = (unsigned long)_orig.nraddr; \
1492 _argvec[1] = (unsigned long)arg1; \
1493 _argvec[2] = (unsigned long)arg2; \
1494 _argvec[3] = (unsigned long)arg3; \
1495 _argvec[4] = (unsigned long)arg4; \
1496 _argvec[5] = (unsigned long)arg5; \
1497 _argvec[6] = (unsigned long)arg6; \
1498 _argvec[7] = (unsigned long)arg7; \
1499 _argvec[8] = (unsigned long)arg8; \
1504 "lwz 5,12(11)\n\t" \
1505 "lwz 6,16(11)\n\t" \
1506 "lwz 7,20(11)\n\t" \
1507 "lwz 8,24(11)\n\t" \
1508 "lwz 9,28(11)\n\t" \
1509 "lwz 10,32(11)\n\t" \
1510 "lwz 11,0(11)\n\t" \
1511 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1514 : "r" (&_argvec[0]) \
1515 : "cc", "memory", __CALLER_SAVED_REGS \
1517 lval = (__typeof__(lval)) _res; \
1520 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1523 volatile OrigFn _orig = (orig); \
1524 volatile unsigned long _argvec[10]; \
1525 volatile unsigned long _res; \
1526 _argvec[0] = (unsigned long)_orig.nraddr; \
1527 _argvec[1] = (unsigned long)arg1; \
1528 _argvec[2] = (unsigned long)arg2; \
1529 _argvec[3] = (unsigned long)arg3; \
1530 _argvec[4] = (unsigned long)arg4; \
1531 _argvec[5] = (unsigned long)arg5; \
1532 _argvec[6] = (unsigned long)arg6; \
1533 _argvec[7] = (unsigned long)arg7; \
1534 _argvec[8] = (unsigned long)arg8; \
1535 _argvec[9] = (unsigned long)arg9; \
1538 "addi 1,1,-16\n\t" \
1540 "lwz 3,36(11)\n\t" \
1545 "lwz 5,12(11)\n\t" \
1546 "lwz 6,16(11)\n\t" \
1547 "lwz 7,20(11)\n\t" \
1548 "lwz 8,24(11)\n\t" \
1549 "lwz 9,28(11)\n\t" \
1550 "lwz 10,32(11)\n\t" \
1551 "lwz 11,0(11)\n\t" \
1552 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1556 : "r" (&_argvec[0]) \
1557 : "cc", "memory", __CALLER_SAVED_REGS \
1559 lval = (__typeof__(lval)) _res; \
1562 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1563 arg7,arg8,arg9,arg10) \
1565 volatile OrigFn _orig = (orig); \
1566 volatile unsigned long _argvec[11]; \
1567 volatile unsigned long _res; \
1568 _argvec[0] = (unsigned long)_orig.nraddr; \
1569 _argvec[1] = (unsigned long)arg1; \
1570 _argvec[2] = (unsigned long)arg2; \
1571 _argvec[3] = (unsigned long)arg3; \
1572 _argvec[4] = (unsigned long)arg4; \
1573 _argvec[5] = (unsigned long)arg5; \
1574 _argvec[6] = (unsigned long)arg6; \
1575 _argvec[7] = (unsigned long)arg7; \
1576 _argvec[8] = (unsigned long)arg8; \
1577 _argvec[9] = (unsigned long)arg9; \
1578 _argvec[10] = (unsigned long)arg10; \
1581 "addi 1,1,-16\n\t" \
1583 "lwz 3,40(11)\n\t" \
1586 "lwz 3,36(11)\n\t" \
1591 "lwz 5,12(11)\n\t" \
1592 "lwz 6,16(11)\n\t" \
1593 "lwz 7,20(11)\n\t" \
1594 "lwz 8,24(11)\n\t" \
1595 "lwz 9,28(11)\n\t" \
1596 "lwz 10,32(11)\n\t" \
1597 "lwz 11,0(11)\n\t" \
1598 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1602 : "r" (&_argvec[0]) \
1603 : "cc", "memory", __CALLER_SAVED_REGS \
1605 lval = (__typeof__(lval)) _res; \
1608 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1609 arg7,arg8,arg9,arg10,arg11) \
1611 volatile OrigFn _orig = (orig); \
1612 volatile unsigned long _argvec[12]; \
1613 volatile unsigned long _res; \
1614 _argvec[0] = (unsigned long)_orig.nraddr; \
1615 _argvec[1] = (unsigned long)arg1; \
1616 _argvec[2] = (unsigned long)arg2; \
1617 _argvec[3] = (unsigned long)arg3; \
1618 _argvec[4] = (unsigned long)arg4; \
1619 _argvec[5] = (unsigned long)arg5; \
1620 _argvec[6] = (unsigned long)arg6; \
1621 _argvec[7] = (unsigned long)arg7; \
1622 _argvec[8] = (unsigned long)arg8; \
1623 _argvec[9] = (unsigned long)arg9; \
1624 _argvec[10] = (unsigned long)arg10; \
1625 _argvec[11] = (unsigned long)arg11; \
1628 "addi 1,1,-32\n\t" \
1630 "lwz 3,44(11)\n\t" \
1633 "lwz 3,40(11)\n\t" \
1636 "lwz 3,36(11)\n\t" \
1641 "lwz 5,12(11)\n\t" \
1642 "lwz 6,16(11)\n\t" \
1643 "lwz 7,20(11)\n\t" \
1644 "lwz 8,24(11)\n\t" \
1645 "lwz 9,28(11)\n\t" \
1646 "lwz 10,32(11)\n\t" \
1647 "lwz 11,0(11)\n\t" \
1648 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1652 : "r" (&_argvec[0]) \
1653 : "cc", "memory", __CALLER_SAVED_REGS \
1655 lval = (__typeof__(lval)) _res; \
1658 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1659 arg7,arg8,arg9,arg10,arg11,arg12) \
1661 volatile OrigFn _orig = (orig); \
1662 volatile unsigned long _argvec[13]; \
1663 volatile unsigned long _res; \
1664 _argvec[0] = (unsigned long)_orig.nraddr; \
1665 _argvec[1] = (unsigned long)arg1; \
1666 _argvec[2] = (unsigned long)arg2; \
1667 _argvec[3] = (unsigned long)arg3; \
1668 _argvec[4] = (unsigned long)arg4; \
1669 _argvec[5] = (unsigned long)arg5; \
1670 _argvec[6] = (unsigned long)arg6; \
1671 _argvec[7] = (unsigned long)arg7; \
1672 _argvec[8] = (unsigned long)arg8; \
1673 _argvec[9] = (unsigned long)arg9; \
1674 _argvec[10] = (unsigned long)arg10; \
1675 _argvec[11] = (unsigned long)arg11; \
1676 _argvec[12] = (unsigned long)arg12; \
1679 "addi 1,1,-32\n\t" \
1681 "lwz 3,48(11)\n\t" \
1684 "lwz 3,44(11)\n\t" \
1687 "lwz 3,40(11)\n\t" \
1690 "lwz 3,36(11)\n\t" \
1695 "lwz 5,12(11)\n\t" \
1696 "lwz 6,16(11)\n\t" \
1697 "lwz 7,20(11)\n\t" \
1698 "lwz 8,24(11)\n\t" \
1699 "lwz 9,28(11)\n\t" \
1700 "lwz 10,32(11)\n\t" \
1701 "lwz 11,0(11)\n\t" \
1702 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1706 : "r" (&_argvec[0]) \
1707 : "cc", "memory", __CALLER_SAVED_REGS \
1709 lval = (__typeof__(lval)) _res; \
1716 #if defined(ARCH_ppc64)
1721 #define __CALLER_SAVED_REGS \
1722 "lr", "ctr", "xer", \
1723 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \
1724 "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \
1730 #define CALL_FN_W_v(lval, orig) \
1732 volatile OrigFn _orig = (orig); \
1733 volatile unsigned long _argvec[3+0]; \
1734 volatile unsigned long _res; \
1736 _argvec[1] = (unsigned long)_orig.r2; \
1737 _argvec[2] = (unsigned long)_orig.nraddr; \
1740 "std 2,-16(11)\n\t" \
1742 "ld 11, 0(11)\n\t" \
1743 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1748 : "r" (&_argvec[2]) \
1749 : "cc", "memory", __CALLER_SAVED_REGS \
1751 lval = (__typeof__(lval)) _res; \
1754 #define CALL_FN_W_W(lval, orig, arg1) \
1756 volatile OrigFn _orig = (orig); \
1757 volatile unsigned long _argvec[3+1]; \
1758 volatile unsigned long _res; \
1760 _argvec[1] = (unsigned long)_orig.r2; \
1761 _argvec[2] = (unsigned long)_orig.nraddr; \
1762 _argvec[2+1] = (unsigned long)arg1; \
1765 "std 2,-16(11)\n\t" \
1768 "ld 11, 0(11)\n\t" \
1769 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1774 : "r" (&_argvec[2]) \
1775 : "cc", "memory", __CALLER_SAVED_REGS \
1777 lval = (__typeof__(lval)) _res; \
1780 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
1782 volatile OrigFn _orig = (orig); \
1783 volatile unsigned long _argvec[3+2]; \
1784 volatile unsigned long _res; \
1786 _argvec[1] = (unsigned long)_orig.r2; \
1787 _argvec[2] = (unsigned long)_orig.nraddr; \
1788 _argvec[2+1] = (unsigned long)arg1; \
1789 _argvec[2+2] = (unsigned long)arg2; \
1792 "std 2,-16(11)\n\t" \
1795 "ld 4, 16(11)\n\t" \
1796 "ld 11, 0(11)\n\t" \
1797 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1802 : "r" (&_argvec[2]) \
1803 : "cc", "memory", __CALLER_SAVED_REGS \
1805 lval = (__typeof__(lval)) _res; \
1808 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
1810 volatile OrigFn _orig = (orig); \
1811 volatile unsigned long _argvec[3+3]; \
1812 volatile unsigned long _res; \
1814 _argvec[1] = (unsigned long)_orig.r2; \
1815 _argvec[2] = (unsigned long)_orig.nraddr; \
1816 _argvec[2+1] = (unsigned long)arg1; \
1817 _argvec[2+2] = (unsigned long)arg2; \
1818 _argvec[2+3] = (unsigned long)arg3; \
1821 "std 2,-16(11)\n\t" \
1824 "ld 4, 16(11)\n\t" \
1825 "ld 5, 24(11)\n\t" \
1826 "ld 11, 0(11)\n\t" \
1827 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1832 : "r" (&_argvec[2]) \
1833 : "cc", "memory", __CALLER_SAVED_REGS \
1835 lval = (__typeof__(lval)) _res; \
1838 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
1840 volatile OrigFn _orig = (orig); \
1841 volatile unsigned long _argvec[3+4]; \
1842 volatile unsigned long _res; \
1844 _argvec[1] = (unsigned long)_orig.r2; \
1845 _argvec[2] = (unsigned long)_orig.nraddr; \
1846 _argvec[2+1] = (unsigned long)arg1; \
1847 _argvec[2+2] = (unsigned long)arg2; \
1848 _argvec[2+3] = (unsigned long)arg3; \
1849 _argvec[2+4] = (unsigned long)arg4; \
1852 "std 2,-16(11)\n\t" \
1855 "ld 4, 16(11)\n\t" \
1856 "ld 5, 24(11)\n\t" \
1857 "ld 6, 32(11)\n\t" \
1858 "ld 11, 0(11)\n\t" \
1859 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1864 : "r" (&_argvec[2]) \
1865 : "cc", "memory", __CALLER_SAVED_REGS \
1867 lval = (__typeof__(lval)) _res; \
1870 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
1872 volatile OrigFn _orig = (orig); \
1873 volatile unsigned long _argvec[3+5]; \
1874 volatile unsigned long _res; \
1876 _argvec[1] = (unsigned long)_orig.r2; \
1877 _argvec[2] = (unsigned long)_orig.nraddr; \
1878 _argvec[2+1] = (unsigned long)arg1; \
1879 _argvec[2+2] = (unsigned long)arg2; \
1880 _argvec[2+3] = (unsigned long)arg3; \
1881 _argvec[2+4] = (unsigned long)arg4; \
1882 _argvec[2+5] = (unsigned long)arg5; \
1885 "std 2,-16(11)\n\t" \
1888 "ld 4, 16(11)\n\t" \
1889 "ld 5, 24(11)\n\t" \
1890 "ld 6, 32(11)\n\t" \
1891 "ld 7, 40(11)\n\t" \
1892 "ld 11, 0(11)\n\t" \
1893 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1898 : "r" (&_argvec[2]) \
1899 : "cc", "memory", __CALLER_SAVED_REGS \
1901 lval = (__typeof__(lval)) _res; \
1904 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
1906 volatile OrigFn _orig = (orig); \
1907 volatile unsigned long _argvec[3+6]; \
1908 volatile unsigned long _res; \
1910 _argvec[1] = (unsigned long)_orig.r2; \
1911 _argvec[2] = (unsigned long)_orig.nraddr; \
1912 _argvec[2+1] = (unsigned long)arg1; \
1913 _argvec[2+2] = (unsigned long)arg2; \
1914 _argvec[2+3] = (unsigned long)arg3; \
1915 _argvec[2+4] = (unsigned long)arg4; \
1916 _argvec[2+5] = (unsigned long)arg5; \
1917 _argvec[2+6] = (unsigned long)arg6; \
1920 "std 2,-16(11)\n\t" \
1923 "ld 4, 16(11)\n\t" \
1924 "ld 5, 24(11)\n\t" \
1925 "ld 6, 32(11)\n\t" \
1926 "ld 7, 40(11)\n\t" \
1927 "ld 8, 48(11)\n\t" \
1928 "ld 11, 0(11)\n\t" \
1929 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1934 : "r" (&_argvec[2]) \
1935 : "cc", "memory", __CALLER_SAVED_REGS \
1937 lval = (__typeof__(lval)) _res; \
1940 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1943 volatile OrigFn _orig = (orig); \
1944 volatile unsigned long _argvec[3+7]; \
1945 volatile unsigned long _res; \
1947 _argvec[1] = (unsigned long)_orig.r2; \
1948 _argvec[2] = (unsigned long)_orig.nraddr; \
1949 _argvec[2+1] = (unsigned long)arg1; \
1950 _argvec[2+2] = (unsigned long)arg2; \
1951 _argvec[2+3] = (unsigned long)arg3; \
1952 _argvec[2+4] = (unsigned long)arg4; \
1953 _argvec[2+5] = (unsigned long)arg5; \
1954 _argvec[2+6] = (unsigned long)arg6; \
1955 _argvec[2+7] = (unsigned long)arg7; \
1958 "std 2,-16(11)\n\t" \
1961 "ld 4, 16(11)\n\t" \
1962 "ld 5, 24(11)\n\t" \
1963 "ld 6, 32(11)\n\t" \
1964 "ld 7, 40(11)\n\t" \
1965 "ld 8, 48(11)\n\t" \
1966 "ld 9, 56(11)\n\t" \
1967 "ld 11, 0(11)\n\t" \
1968 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
1973 : "r" (&_argvec[2]) \
1974 : "cc", "memory", __CALLER_SAVED_REGS \
1976 lval = (__typeof__(lval)) _res; \
1979 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1982 volatile OrigFn _orig = (orig); \
1983 volatile unsigned long _argvec[3+8]; \
1984 volatile unsigned long _res; \
1986 _argvec[1] = (unsigned long)_orig.r2; \
1987 _argvec[2] = (unsigned long)_orig.nraddr; \
1988 _argvec[2+1] = (unsigned long)arg1; \
1989 _argvec[2+2] = (unsigned long)arg2; \
1990 _argvec[2+3] = (unsigned long)arg3; \
1991 _argvec[2+4] = (unsigned long)arg4; \
1992 _argvec[2+5] = (unsigned long)arg5; \
1993 _argvec[2+6] = (unsigned long)arg6; \
1994 _argvec[2+7] = (unsigned long)arg7; \
1995 _argvec[2+8] = (unsigned long)arg8; \
1998 "std 2,-16(11)\n\t" \
2001 "ld 4, 16(11)\n\t" \
2002 "ld 5, 24(11)\n\t" \
2003 "ld 6, 32(11)\n\t" \
2004 "ld 7, 40(11)\n\t" \
2005 "ld 8, 48(11)\n\t" \
2006 "ld 9, 56(11)\n\t" \
2007 "ld 10, 64(11)\n\t" \
2008 "ld 11, 0(11)\n\t" \
2009 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2014 : "r" (&_argvec[2]) \
2015 : "cc", "memory", __CALLER_SAVED_REGS \
2017 lval = (__typeof__(lval)) _res; \
2020 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2023 volatile OrigFn _orig = (orig); \
2024 volatile unsigned long _argvec[3+9]; \
2025 volatile unsigned long _res; \
2027 _argvec[1] = (unsigned long)_orig.r2; \
2028 _argvec[2] = (unsigned long)_orig.nraddr; \
2029 _argvec[2+1] = (unsigned long)arg1; \
2030 _argvec[2+2] = (unsigned long)arg2; \
2031 _argvec[2+3] = (unsigned long)arg3; \
2032 _argvec[2+4] = (unsigned long)arg4; \
2033 _argvec[2+5] = (unsigned long)arg5; \
2034 _argvec[2+6] = (unsigned long)arg6; \
2035 _argvec[2+7] = (unsigned long)arg7; \
2036 _argvec[2+8] = (unsigned long)arg8; \
2037 _argvec[2+9] = (unsigned long)arg9; \
2040 "std 2,-16(11)\n\t" \
2042 "addi 1,1,-128\n\t" \
2045 "std 3,112(1)\n\t" \
2048 "ld 4, 16(11)\n\t" \
2049 "ld 5, 24(11)\n\t" \
2050 "ld 6, 32(11)\n\t" \
2051 "ld 7, 40(11)\n\t" \
2052 "ld 8, 48(11)\n\t" \
2053 "ld 9, 56(11)\n\t" \
2054 "ld 10, 64(11)\n\t" \
2055 "ld 11, 0(11)\n\t" \
2056 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2059 "ld 2,-16(11)\n\t" \
2062 : "r" (&_argvec[2]) \
2063 : "cc", "memory", __CALLER_SAVED_REGS \
2065 lval = (__typeof__(lval)) _res; \
2068 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2069 arg7,arg8,arg9,arg10) \
2071 volatile OrigFn _orig = (orig); \
2072 volatile unsigned long _argvec[3+10]; \
2073 volatile unsigned long _res; \
2075 _argvec[1] = (unsigned long)_orig.r2; \
2076 _argvec[2] = (unsigned long)_orig.nraddr; \
2077 _argvec[2+1] = (unsigned long)arg1; \
2078 _argvec[2+2] = (unsigned long)arg2; \
2079 _argvec[2+3] = (unsigned long)arg3; \
2080 _argvec[2+4] = (unsigned long)arg4; \
2081 _argvec[2+5] = (unsigned long)arg5; \
2082 _argvec[2+6] = (unsigned long)arg6; \
2083 _argvec[2+7] = (unsigned long)arg7; \
2084 _argvec[2+8] = (unsigned long)arg8; \
2085 _argvec[2+9] = (unsigned long)arg9; \
2086 _argvec[2+10] = (unsigned long)arg10; \
2089 "std 2,-16(11)\n\t" \
2091 "addi 1,1,-128\n\t" \
2094 "std 3,120(1)\n\t" \
2097 "std 3,112(1)\n\t" \
2100 "ld 4, 16(11)\n\t" \
2101 "ld 5, 24(11)\n\t" \
2102 "ld 6, 32(11)\n\t" \
2103 "ld 7, 40(11)\n\t" \
2104 "ld 8, 48(11)\n\t" \
2105 "ld 9, 56(11)\n\t" \
2106 "ld 10, 64(11)\n\t" \
2107 "ld 11, 0(11)\n\t" \
2108 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2111 "ld 2,-16(11)\n\t" \
2114 : "r" (&_argvec[2]) \
2115 : "cc", "memory", __CALLER_SAVED_REGS \
2117 lval = (__typeof__(lval)) _res; \
2120 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2121 arg7,arg8,arg9,arg10,arg11) \
2123 volatile OrigFn _orig = (orig); \
2124 volatile unsigned long _argvec[3+11]; \
2125 volatile unsigned long _res; \
2127 _argvec[1] = (unsigned long)_orig.r2; \
2128 _argvec[2] = (unsigned long)_orig.nraddr; \
2129 _argvec[2+1] = (unsigned long)arg1; \
2130 _argvec[2+2] = (unsigned long)arg2; \
2131 _argvec[2+3] = (unsigned long)arg3; \
2132 _argvec[2+4] = (unsigned long)arg4; \
2133 _argvec[2+5] = (unsigned long)arg5; \
2134 _argvec[2+6] = (unsigned long)arg6; \
2135 _argvec[2+7] = (unsigned long)arg7; \
2136 _argvec[2+8] = (unsigned long)arg8; \
2137 _argvec[2+9] = (unsigned long)arg9; \
2138 _argvec[2+10] = (unsigned long)arg10; \
2139 _argvec[2+11] = (unsigned long)arg11; \
2142 "std 2,-16(11)\n\t" \
2144 "addi 1,1,-144\n\t" \
2147 "std 3,128(1)\n\t" \
2150 "std 3,120(1)\n\t" \
2153 "std 3,112(1)\n\t" \
2156 "ld 4, 16(11)\n\t" \
2157 "ld 5, 24(11)\n\t" \
2158 "ld 6, 32(11)\n\t" \
2159 "ld 7, 40(11)\n\t" \
2160 "ld 8, 48(11)\n\t" \
2161 "ld 9, 56(11)\n\t" \
2162 "ld 10, 64(11)\n\t" \
2163 "ld 11, 0(11)\n\t" \
2164 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2167 "ld 2,-16(11)\n\t" \
2170 : "r" (&_argvec[2]) \
2171 : "cc", "memory", __CALLER_SAVED_REGS \
2173 lval = (__typeof__(lval)) _res; \
2176 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2177 arg7,arg8,arg9,arg10,arg11,arg12) \
2179 volatile OrigFn _orig = (orig); \
2180 volatile unsigned long _argvec[3+12]; \
2181 volatile unsigned long _res; \
2183 _argvec[1] = (unsigned long)_orig.r2; \
2184 _argvec[2] = (unsigned long)_orig.nraddr; \
2185 _argvec[2+1] = (unsigned long)arg1; \
2186 _argvec[2+2] = (unsigned long)arg2; \
2187 _argvec[2+3] = (unsigned long)arg3; \
2188 _argvec[2+4] = (unsigned long)arg4; \
2189 _argvec[2+5] = (unsigned long)arg5; \
2190 _argvec[2+6] = (unsigned long)arg6; \
2191 _argvec[2+7] = (unsigned long)arg7; \
2192 _argvec[2+8] = (unsigned long)arg8; \
2193 _argvec[2+9] = (unsigned long)arg9; \
2194 _argvec[2+10] = (unsigned long)arg10; \
2195 _argvec[2+11] = (unsigned long)arg11; \
2196 _argvec[2+12] = (unsigned long)arg12; \
2199 "std 2,-16(11)\n\t" \
2201 "addi 1,1,-144\n\t" \
2204 "std 3,136(1)\n\t" \
2207 "std 3,128(1)\n\t" \
2210 "std 3,120(1)\n\t" \
2213 "std 3,112(1)\n\t" \
2216 "ld 4, 16(11)\n\t" \
2217 "ld 5, 24(11)\n\t" \
2218 "ld 6, 32(11)\n\t" \
2219 "ld 7, 40(11)\n\t" \
2220 "ld 8, 48(11)\n\t" \
2221 "ld 9, 56(11)\n\t" \
2222 "ld 10, 64(11)\n\t" \
2223 "ld 11, 0(11)\n\t" \
2224 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2227 "ld 2,-16(11)\n\t" \
2230 : "r" (&_argvec[2]) \
2231 : "cc", "memory", __CALLER_SAVED_REGS \
2233 lval = (__typeof__(lval)) _res; \
2254 #define VG_USERREQ_TOOL_BASE(a,b) \
2255 ((unsigned int)(((a)&0xff) << 24 | ((b)&0xff) << 16))
2256 #define VG_IS_TOOL_USERREQ(a, b, v) \
2257 (VG_USERREQ_TOOL_BASE(a,b) == ((v) & 0xffff0000))
2264 enum { VG_USERREQ__RUNNING_ON_VALGRIND = 0x1001,
2265 VG_USERREQ__DISCARD_TRANSLATIONS = 0x1002,
2272 VG_USERREQ__CLIENT_CALL0 = 0x1101,
2273 VG_USERREQ__CLIENT_CALL1 = 0x1102,
2274 VG_USERREQ__CLIENT_CALL2 = 0x1103,
2275 VG_USERREQ__CLIENT_CALL3 = 0x1104,
2280 VG_USERREQ__COUNT_ERRORS = 0x1201,
2284 VG_USERREQ__MALLOCLIKE_BLOCK = 0x1301,
2285 VG_USERREQ__FREELIKE_BLOCK = 0x1302,
2287 VG_USERREQ__CREATE_MEMPOOL = 0x1303,
2288 VG_USERREQ__DESTROY_MEMPOOL = 0x1304,
2289 VG_USERREQ__MEMPOOL_ALLOC = 0x1305,
2290 VG_USERREQ__MEMPOOL_FREE = 0x1306,
2293 VG_USERREQ__PRINTF = 0x1401,
2294 VG_USERREQ__PRINTF_BACKTRACE = 0x1402,
2297 VG_USERREQ__STACK_REGISTER = 0x1501,
2298 VG_USERREQ__STACK_DEREGISTER = 0x1502,
2299 VG_USERREQ__STACK_CHANGE = 0x1503
2302 #if !defined(__GNUC__)
2303 # define __extension__
2310 #define RUNNING_ON_VALGRIND __extension__ \
2311 ({unsigned int _qzz_res; \
2312 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0 , \
2313 VG_USERREQ__RUNNING_ON_VALGRIND, \
2323 #define VALGRIND_DISCARD_TRANSLATIONS(_qzz_addr,_qzz_len) \
2324 {unsigned int _qzz_res; \
2325 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
2326 VG_USERREQ__DISCARD_TRANSLATIONS, \
2327 _qzz_addr, _qzz_len, 0, 0, 0); \
2334 #if defined(NVALGRIND)
2336 # define VALGRIND_PRINTF(...)
2337 # define VALGRIND_PRINTF_BACKTRACE(...)
2343 static int VALGRIND_PRINTF(
const char *format, ...)
2344 __attribute__((format(__printf__, 1, 2), __unused__));
2346 VALGRIND_PRINTF(const
char *format, ...)
2348 unsigned long _qzz_res;
2350 va_start(vargs, format);
2351 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, VG_USERREQ__PRINTF,
2352 (
unsigned long)format, (
unsigned long)vargs,
2355 return (
int)_qzz_res;
2358 static int VALGRIND_PRINTF_BACKTRACE(
const char *format, ...)
2359 __attribute__((format(__printf__, 1, 2), __unused__));
2361 VALGRIND_PRINTF_BACKTRACE(const
char *format, ...)
2363 unsigned long _qzz_res;
2365 va_start(vargs, format);
2366 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, VG_USERREQ__PRINTF_BACKTRACE,
2367 (
unsigned long)format, (
unsigned long)vargs,
2370 return (
int)_qzz_res;
2378 #define VALGRIND_NON_SIMD_CALL0(_qyy_fn) \
2380 ({unsigned long _qyy_res; \
2381 VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 , \
2382 VG_USERREQ__CLIENT_CALL0, \
2388 #define VALGRIND_NON_SIMD_CALL1(_qyy_fn, _qyy_arg1) \
2390 ({unsigned long _qyy_res; \
2391 VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 , \
2392 VG_USERREQ__CLIENT_CALL1, \
2394 _qyy_arg1, 0, 0, 0); \
2398 #define VALGRIND_NON_SIMD_CALL2(_qyy_fn, _qyy_arg1, _qyy_arg2) \
2400 ({unsigned long _qyy_res; \
2401 VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 , \
2402 VG_USERREQ__CLIENT_CALL2, \
2404 _qyy_arg1, _qyy_arg2, 0, 0); \
2408 #define VALGRIND_NON_SIMD_CALL3(_qyy_fn, _qyy_arg1, _qyy_arg2, _qyy_arg3) \
2410 ({unsigned long _qyy_res; \
2411 VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 , \
2412 VG_USERREQ__CLIENT_CALL3, \
2414 _qyy_arg1, _qyy_arg2, \
2423 #define VALGRIND_COUNT_ERRORS \
2425 ({unsigned int _qyy_res; \
2426 VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 , \
2427 VG_USERREQ__COUNT_ERRORS, \
2457 #define VALGRIND_MALLOCLIKE_BLOCK(addr, sizeB, rzB, is_zeroed) \
2458 {unsigned int _qzz_res; \
2459 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
2460 VG_USERREQ__MALLOCLIKE_BLOCK, \
2461 addr, sizeB, rzB, is_zeroed, 0); \
2468 #define VALGRIND_FREELIKE_BLOCK(addr, rzB) \
2469 {unsigned int _qzz_res; \
2470 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
2471 VG_USERREQ__FREELIKE_BLOCK, \
2472 addr, rzB, 0, 0, 0); \
2476 #define VALGRIND_CREATE_MEMPOOL(pool, rzB, is_zeroed) \
2477 {unsigned int _qzz_res; \
2478 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
2479 VG_USERREQ__CREATE_MEMPOOL, \
2480 pool, rzB, is_zeroed, 0, 0); \
2484 #define VALGRIND_DESTROY_MEMPOOL(pool) \
2485 {unsigned int _qzz_res; \
2486 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
2487 VG_USERREQ__DESTROY_MEMPOOL, \
2488 pool, 0, 0, 0, 0); \
2492 #define VALGRIND_MEMPOOL_ALLOC(pool, addr, size) \
2493 {unsigned int _qzz_res; \
2494 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
2495 VG_USERREQ__MEMPOOL_ALLOC, \
2496 pool, addr, size, 0, 0); \
2500 #define VALGRIND_MEMPOOL_FREE(pool, addr) \
2501 {unsigned int _qzz_res; \
2502 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
2503 VG_USERREQ__MEMPOOL_FREE, \
2504 pool, addr, 0, 0, 0); \
2508 #define VALGRIND_STACK_REGISTER(start, end) \
2509 ({unsigned int _qzz_res; \
2510 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
2511 VG_USERREQ__STACK_REGISTER, \
2512 start, end, 0, 0, 0); \
2518 #define VALGRIND_STACK_DEREGISTER(id) \
2519 {unsigned int _qzz_res; \
2520 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
2521 VG_USERREQ__STACK_DEREGISTER, \
2526 #define VALGRIND_STACK_CHANGE(id, start, end) \
2527 {unsigned int _qzz_res; \
2528 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \
2529 VG_USERREQ__STACK_CHANGE, \
2530 id, start, end, 0, 0); \