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 118 #undef PLAT_x86_linux 119 #undef PLAT_amd64_linux 120 #undef PLAT_ppc32_linux 121 #undef PLAT_ppc64_linux 122 #undef PLAT_arm_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
A 16-bit general register.
#define VALGRIND_PRINTF(...)
__builtin_va_list va_list
#define va_start(ap, last)
#define VALGRIND_PRINTF_BACKTRACE(...)
#define VALGRIND_DO_CLIENT_REQUEST( _zzq_rlval, _zzq_default, _zzq_request, _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)