93 #define __VALGRIND_MAJOR__ 3 94 #define __VALGRIND_MINOR__ 6 113 #undef PLAT_ppc64_aix5 114 #undef PLAT_ppc32_aix5 115 #undef PLAT_x86_darwin 116 #undef PLAT_amd64_darwin 117 #undef PLAT_x86_linux 118 #undef PLAT_amd64_linux 119 #undef PLAT_ppc32_linux 120 #undef PLAT_ppc64_linux 121 #undef PLAT_arm_linux 123 #if defined(_AIX) && defined(__64BIT__) 124 # define PLAT_ppc64_aix5 1 125 #elif defined(_AIX) && !defined(__64BIT__) 126 # define PLAT_ppc32_aix5 1 127 #elif defined(__APPLE__) && defined(__i386__) 128 # define PLAT_x86_darwin 1 129 #elif defined(__APPLE__) && defined(__x86_64__) 130 # define PLAT_amd64_darwin 1 131 #elif defined(__linux__) && defined(__i386__) 132 # define PLAT_x86_linux 1 133 #elif defined(__linux__) && defined(__x86_64__) 134 # define PLAT_amd64_linux 1 135 #elif defined(__linux__) && defined(__powerpc__) && !defined(__powerpc64__) 136 # define PLAT_ppc32_linux 1 137 #elif defined(__linux__) && defined(__powerpc__) && defined(__powerpc64__) 138 # define PLAT_ppc64_linux 1 139 #elif defined(__linux__) && defined(__arm__) 140 # define PLAT_arm_linux 1 144 # if !defined(NVALGRIND) 155 #if defined(NVALGRIND) 160 #define VALGRIND_DO_CLIENT_REQUEST( \ 161 _zzq_rlval, _zzq_default, _zzq_request, \ 162 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ 164 (_zzq_rlval) = (_zzq_default); \ 206 #if defined(PLAT_x86_linux) || defined(PLAT_x86_darwin) 214 #define __SPECIAL_INSTRUCTION_PREAMBLE \ 215 "roll $3, %%edi ; roll $13, %%edi\n\t" \ 216 "roll $29, %%edi ; roll $19, %%edi\n\t" 218 #define VALGRIND_DO_CLIENT_REQUEST( \ 219 _zzq_rlval, _zzq_default, _zzq_request, \ 220 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ 221 { volatile unsigned int _zzq_args[6]; \ 222 volatile unsigned int _zzq_result; \ 223 _zzq_args[0] = (unsigned int)(_zzq_request); \ 224 _zzq_args[1] = (unsigned int)(_zzq_arg1); \ 225 _zzq_args[2] = (unsigned int)(_zzq_arg2); \ 226 _zzq_args[3] = (unsigned int)(_zzq_arg3); \ 227 _zzq_args[4] = (unsigned int)(_zzq_arg4); \ 228 _zzq_args[5] = (unsigned int)(_zzq_arg5); \ 229 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 231 "xchgl %%ebx,%%ebx" \ 232 : "=d" (_zzq_result) \ 233 : "a" (&_zzq_args[0]), "0" (_zzq_default) \ 236 _zzq_rlval = _zzq_result; \ 239 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ 240 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ 241 volatile unsigned int __addr; \ 242 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 244 "xchgl %%ecx,%%ecx" \ 249 _zzq_orig->nraddr = __addr; \ 252 #define VALGRIND_CALL_NOREDIR_EAX \ 253 __SPECIAL_INSTRUCTION_PREAMBLE \ 255 "xchgl %%edx,%%edx\n\t" 260 #if defined(PLAT_amd64_linux) || defined(PLAT_amd64_darwin) 264 unsigned long long int nraddr;
268 #define __SPECIAL_INSTRUCTION_PREAMBLE \ 269 "rolq $3, %%rdi ; rolq $13, %%rdi\n\t" \ 270 "rolq $61, %%rdi ; rolq $51, %%rdi\n\t" 272 #define VALGRIND_DO_CLIENT_REQUEST( \ 273 _zzq_rlval, _zzq_default, _zzq_request, \ 274 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ 275 { volatile unsigned long long int _zzq_args[6]; \ 276 volatile unsigned long long int _zzq_result; \ 277 _zzq_args[0] = (unsigned long long int)(_zzq_request); \ 278 _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \ 279 _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \ 280 _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \ 281 _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \ 282 _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \ 283 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 285 "xchgq %%rbx,%%rbx" \ 286 : "=d" (_zzq_result) \ 287 : "a" (&_zzq_args[0]), "0" (_zzq_default) \ 290 _zzq_rlval = _zzq_result; \ 293 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ 294 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ 295 volatile unsigned long long int __addr; \ 296 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 298 "xchgq %%rcx,%%rcx" \ 303 _zzq_orig->nraddr = __addr; \ 306 #define VALGRIND_CALL_NOREDIR_RAX \ 307 __SPECIAL_INSTRUCTION_PREAMBLE \ 309 "xchgq %%rdx,%%rdx\n\t" 314 #if defined(PLAT_ppc32_linux) 322 #define __SPECIAL_INSTRUCTION_PREAMBLE \ 323 "rlwinm 0,0,3,0,0 ; rlwinm 0,0,13,0,0\n\t" \ 324 "rlwinm 0,0,29,0,0 ; rlwinm 0,0,19,0,0\n\t" 326 #define VALGRIND_DO_CLIENT_REQUEST( \ 327 _zzq_rlval, _zzq_default, _zzq_request, \ 328 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ 330 { unsigned int _zzq_args[6]; \ 331 unsigned int _zzq_result; \ 332 unsigned int* _zzq_ptr; \ 333 _zzq_args[0] = (unsigned int)(_zzq_request); \ 334 _zzq_args[1] = (unsigned int)(_zzq_arg1); \ 335 _zzq_args[2] = (unsigned int)(_zzq_arg2); \ 336 _zzq_args[3] = (unsigned int)(_zzq_arg3); \ 337 _zzq_args[4] = (unsigned int)(_zzq_arg4); \ 338 _zzq_args[5] = (unsigned int)(_zzq_arg5); \ 339 _zzq_ptr = _zzq_args; \ 340 __asm__ volatile("mr 3,%1\n\t" \ 342 __SPECIAL_INSTRUCTION_PREAMBLE \ 346 : "=b" (_zzq_result) \ 347 : "b" (_zzq_default), "b" (_zzq_ptr) \ 348 : "cc", "memory", "r3", "r4"); \ 349 _zzq_rlval = _zzq_result; \ 352 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ 353 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ 354 unsigned int __addr; \ 355 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 361 : "cc", "memory", "r3" \ 363 _zzq_orig->nraddr = __addr; \ 366 #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 367 __SPECIAL_INSTRUCTION_PREAMBLE \ 374 #if defined(PLAT_ppc64_linux) 378 unsigned long long int nraddr;
379 unsigned long long int r2;
383 #define __SPECIAL_INSTRUCTION_PREAMBLE \ 384 "rotldi 0,0,3 ; rotldi 0,0,13\n\t" \ 385 "rotldi 0,0,61 ; rotldi 0,0,51\n\t" 387 #define VALGRIND_DO_CLIENT_REQUEST( \ 388 _zzq_rlval, _zzq_default, _zzq_request, \ 389 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ 391 { unsigned long long int _zzq_args[6]; \ 392 register unsigned long long int _zzq_result __asm__("r3"); \ 393 register unsigned long long int* _zzq_ptr __asm__("r4"); \ 394 _zzq_args[0] = (unsigned long long int)(_zzq_request); \ 395 _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \ 396 _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \ 397 _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \ 398 _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \ 399 _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \ 400 _zzq_ptr = _zzq_args; \ 401 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 404 : "=r" (_zzq_result) \ 405 : "0" (_zzq_default), "r" (_zzq_ptr) \ 407 _zzq_rlval = _zzq_result; \ 410 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ 411 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ 412 register unsigned long long int __addr __asm__("r3"); \ 413 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 420 _zzq_orig->nraddr = __addr; \ 421 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 428 _zzq_orig->r2 = __addr; \ 431 #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 432 __SPECIAL_INSTRUCTION_PREAMBLE \ 440 #if defined(PLAT_arm_linux) 448 #define __SPECIAL_INSTRUCTION_PREAMBLE \ 449 "mov r12, r12, ror #3 ; mov r12, r12, ror #13 \n\t" \ 450 "mov r12, r12, ror #29 ; mov r12, r12, ror #19 \n\t" 452 #define VALGRIND_DO_CLIENT_REQUEST( \ 453 _zzq_rlval, _zzq_default, _zzq_request, \ 454 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ 456 { volatile unsigned int _zzq_args[6]; \ 457 volatile unsigned int _zzq_result; \ 458 _zzq_args[0] = (unsigned int)(_zzq_request); \ 459 _zzq_args[1] = (unsigned int)(_zzq_arg1); \ 460 _zzq_args[2] = (unsigned int)(_zzq_arg2); \ 461 _zzq_args[3] = (unsigned int)(_zzq_arg3); \ 462 _zzq_args[4] = (unsigned int)(_zzq_arg4); \ 463 _zzq_args[5] = (unsigned int)(_zzq_arg5); \ 464 __asm__ volatile("mov r3, %1\n\t" \ 466 __SPECIAL_INSTRUCTION_PREAMBLE \ 468 "orr r10, r10, r10\n\t" \ 470 : "=r" (_zzq_result) \ 471 : "r" (_zzq_default), "r" (&_zzq_args[0]) \ 472 : "cc","memory", "r3", "r4"); \ 473 _zzq_rlval = _zzq_result; \ 476 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ 477 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ 478 unsigned int __addr; \ 479 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 481 "orr r11, r11, r11\n\t" \ 485 : "cc", "memory", "r3" \ 487 _zzq_orig->nraddr = __addr; \ 490 #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ 491 __SPECIAL_INSTRUCTION_PREAMBLE \ 493 "orr r12, r12, r12\n\t" 499 #if defined(PLAT_ppc32_aix5) 508 #define __SPECIAL_INSTRUCTION_PREAMBLE \ 509 "rlwinm 0,0,3,0,0 ; rlwinm 0,0,13,0,0\n\t" \ 510 "rlwinm 0,0,29,0,0 ; rlwinm 0,0,19,0,0\n\t" 512 #define VALGRIND_DO_CLIENT_REQUEST( \ 513 _zzq_rlval, _zzq_default, _zzq_request, \ 514 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ 516 { unsigned int _zzq_args[7]; \ 517 register unsigned int _zzq_result; \ 518 register unsigned int* _zzq_ptr; \ 519 _zzq_args[0] = (unsigned int)(_zzq_request); \ 520 _zzq_args[1] = (unsigned int)(_zzq_arg1); \ 521 _zzq_args[2] = (unsigned int)(_zzq_arg2); \ 522 _zzq_args[3] = (unsigned int)(_zzq_arg3); \ 523 _zzq_args[4] = (unsigned int)(_zzq_arg4); \ 524 _zzq_args[5] = (unsigned int)(_zzq_arg5); \ 525 _zzq_args[6] = (unsigned int)(_zzq_default); \ 526 _zzq_ptr = _zzq_args; \ 527 __asm__ volatile("mr 4,%1\n\t" \ 529 __SPECIAL_INSTRUCTION_PREAMBLE \ 533 : "=b" (_zzq_result) \ 535 : "r3", "r4", "cc", "memory"); \ 536 _zzq_rlval = _zzq_result; \ 539 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ 540 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ 541 register unsigned int __addr; \ 542 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 548 : "r3", "cc", "memory" \ 550 _zzq_orig->nraddr = __addr; \ 551 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 557 : "r3", "cc", "memory" \ 559 _zzq_orig->r2 = __addr; \ 562 #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 563 __SPECIAL_INSTRUCTION_PREAMBLE \ 571 #if defined(PLAT_ppc64_aix5) 575 unsigned long long int nraddr;
576 unsigned long long int r2;
580 #define __SPECIAL_INSTRUCTION_PREAMBLE \ 581 "rotldi 0,0,3 ; rotldi 0,0,13\n\t" \ 582 "rotldi 0,0,61 ; rotldi 0,0,51\n\t" 584 #define VALGRIND_DO_CLIENT_REQUEST( \ 585 _zzq_rlval, _zzq_default, _zzq_request, \ 586 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ 588 { unsigned long long int _zzq_args[7]; \ 589 register unsigned long long int _zzq_result; \ 590 register unsigned long long int* _zzq_ptr; \ 591 _zzq_args[0] = (unsigned int long long)(_zzq_request); \ 592 _zzq_args[1] = (unsigned int long long)(_zzq_arg1); \ 593 _zzq_args[2] = (unsigned int long long)(_zzq_arg2); \ 594 _zzq_args[3] = (unsigned int long long)(_zzq_arg3); \ 595 _zzq_args[4] = (unsigned int long long)(_zzq_arg4); \ 596 _zzq_args[5] = (unsigned int long long)(_zzq_arg5); \ 597 _zzq_args[6] = (unsigned int long long)(_zzq_default); \ 598 _zzq_ptr = _zzq_args; \ 599 __asm__ volatile("mr 4,%1\n\t" \ 601 __SPECIAL_INSTRUCTION_PREAMBLE \ 605 : "=b" (_zzq_result) \ 607 : "r3", "r4", "cc", "memory"); \ 608 _zzq_rlval = _zzq_result; \ 611 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \ 612 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \ 613 register unsigned long long int __addr; \ 614 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 620 : "r3", "cc", "memory" \ 622 _zzq_orig->nraddr = __addr; \ 623 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ 629 : "r3", "cc", "memory" \ 631 _zzq_orig->r2 = __addr; \ 634 #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 635 __SPECIAL_INSTRUCTION_PREAMBLE \ 674 #define VG_CONCAT4(_aa,_bb,_cc,_dd) _aa##_bb##_cc##_dd 676 #define I_WRAP_SONAME_FNNAME_ZU(soname,fnname) \ 677 VG_CONCAT4(_vgwZU_,soname,_,fnname) 679 #define I_WRAP_SONAME_FNNAME_ZZ(soname,fnname) \ 680 VG_CONCAT4(_vgwZZ_,soname,_,fnname) 686 #define VALGRIND_GET_ORIG_FN(_lval) VALGRIND_GET_NR_CONTEXT(_lval) 691 #define CALL_FN_v_v(fnptr) \ 692 do { volatile unsigned long _junk; \ 693 CALL_FN_W_v(_junk,fnptr); } while (0) 695 #define CALL_FN_v_W(fnptr, arg1) \ 696 do { volatile unsigned long _junk; \ 697 CALL_FN_W_W(_junk,fnptr,arg1); } while (0) 699 #define CALL_FN_v_WW(fnptr, arg1,arg2) \ 700 do { volatile unsigned long _junk; \ 701 CALL_FN_W_WW(_junk,fnptr,arg1,arg2); } while (0) 703 #define CALL_FN_v_WWW(fnptr, arg1,arg2,arg3) \ 704 do { volatile unsigned long _junk; \ 705 CALL_FN_W_WWW(_junk,fnptr,arg1,arg2,arg3); } while (0) 707 #define CALL_FN_v_WWWW(fnptr, arg1,arg2,arg3,arg4) \ 708 do { volatile unsigned long _junk; \ 709 CALL_FN_W_WWWW(_junk,fnptr,arg1,arg2,arg3,arg4); } while (0) 711 #define CALL_FN_v_5W(fnptr, arg1,arg2,arg3,arg4,arg5) \ 712 do { volatile unsigned long _junk; \ 713 CALL_FN_W_5W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5); } while (0) 715 #define CALL_FN_v_6W(fnptr, arg1,arg2,arg3,arg4,arg5,arg6) \ 716 do { volatile unsigned long _junk; \ 717 CALL_FN_W_6W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5,arg6); } while (0) 719 #define CALL_FN_v_7W(fnptr, arg1,arg2,arg3,arg4,arg5,arg6,arg7) \ 720 do { volatile unsigned long _junk; \ 721 CALL_FN_W_7W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5,arg6,arg7); } while (0) 725 #if defined(PLAT_x86_linux) || defined(PLAT_x86_darwin) 729 #define __CALLER_SAVED_REGS "ecx", "edx" 734 #define CALL_FN_W_v(lval, orig) \ 736 volatile OrigFn _orig = (orig); \ 737 volatile unsigned long _argvec[1]; \ 738 volatile unsigned long _res; \ 739 _argvec[0] = (unsigned long)_orig.nraddr; \ 741 "movl (%%eax), %%eax\n\t" \ 742 VALGRIND_CALL_NOREDIR_EAX \ 744 : "a" (&_argvec[0]) \ 745 : "cc", "memory", __CALLER_SAVED_REGS \ 747 lval = (__typeof__(lval)) _res; \ 750 #define CALL_FN_W_W(lval, orig, arg1) \ 752 volatile OrigFn _orig = (orig); \ 753 volatile unsigned long _argvec[2]; \ 754 volatile unsigned long _res; \ 755 _argvec[0] = (unsigned long)_orig.nraddr; \ 756 _argvec[1] = (unsigned long)(arg1); \ 758 "pushl 4(%%eax)\n\t" \ 759 "movl (%%eax), %%eax\n\t" \ 760 VALGRIND_CALL_NOREDIR_EAX \ 763 : "a" (&_argvec[0]) \ 764 : "cc", "memory", __CALLER_SAVED_REGS \ 766 lval = (__typeof__(lval)) _res; \ 769 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \ 771 volatile OrigFn _orig = (orig); \ 772 volatile unsigned long _argvec[3]; \ 773 volatile unsigned long _res; \ 774 _argvec[0] = (unsigned long)_orig.nraddr; \ 775 _argvec[1] = (unsigned long)(arg1); \ 776 _argvec[2] = (unsigned long)(arg2); \ 778 "pushl 8(%%eax)\n\t" \ 779 "pushl 4(%%eax)\n\t" \ 780 "movl (%%eax), %%eax\n\t" \ 781 VALGRIND_CALL_NOREDIR_EAX \ 784 : "a" (&_argvec[0]) \ 785 : "cc", "memory", __CALLER_SAVED_REGS \ 787 lval = (__typeof__(lval)) _res; \ 790 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ 792 volatile OrigFn _orig = (orig); \ 793 volatile unsigned long _argvec[4]; \ 794 volatile unsigned long _res; \ 795 _argvec[0] = (unsigned long)_orig.nraddr; \ 796 _argvec[1] = (unsigned long)(arg1); \ 797 _argvec[2] = (unsigned long)(arg2); \ 798 _argvec[3] = (unsigned long)(arg3); \ 800 "pushl 12(%%eax)\n\t" \ 801 "pushl 8(%%eax)\n\t" \ 802 "pushl 4(%%eax)\n\t" \ 803 "movl (%%eax), %%eax\n\t" \ 804 VALGRIND_CALL_NOREDIR_EAX \ 805 "addl $12, %%esp\n" \ 807 : "a" (&_argvec[0]) \ 808 : "cc", "memory", __CALLER_SAVED_REGS \ 810 lval = (__typeof__(lval)) _res; \ 813 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ 815 volatile OrigFn _orig = (orig); \ 816 volatile unsigned long _argvec[5]; \ 817 volatile unsigned long _res; \ 818 _argvec[0] = (unsigned long)_orig.nraddr; \ 819 _argvec[1] = (unsigned long)(arg1); \ 820 _argvec[2] = (unsigned long)(arg2); \ 821 _argvec[3] = (unsigned long)(arg3); \ 822 _argvec[4] = (unsigned long)(arg4); \ 824 "pushl 16(%%eax)\n\t" \ 825 "pushl 12(%%eax)\n\t" \ 826 "pushl 8(%%eax)\n\t" \ 827 "pushl 4(%%eax)\n\t" \ 828 "movl (%%eax), %%eax\n\t" \ 829 VALGRIND_CALL_NOREDIR_EAX \ 830 "addl $16, %%esp\n" \ 832 : "a" (&_argvec[0]) \ 833 : "cc", "memory", __CALLER_SAVED_REGS \ 835 lval = (__typeof__(lval)) _res; \ 838 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ 840 volatile OrigFn _orig = (orig); \ 841 volatile unsigned long _argvec[6]; \ 842 volatile unsigned long _res; \ 843 _argvec[0] = (unsigned long)_orig.nraddr; \ 844 _argvec[1] = (unsigned long)(arg1); \ 845 _argvec[2] = (unsigned long)(arg2); \ 846 _argvec[3] = (unsigned long)(arg3); \ 847 _argvec[4] = (unsigned long)(arg4); \ 848 _argvec[5] = (unsigned long)(arg5); \ 850 "pushl 20(%%eax)\n\t" \ 851 "pushl 16(%%eax)\n\t" \ 852 "pushl 12(%%eax)\n\t" \ 853 "pushl 8(%%eax)\n\t" \ 854 "pushl 4(%%eax)\n\t" \ 855 "movl (%%eax), %%eax\n\t" \ 856 VALGRIND_CALL_NOREDIR_EAX \ 857 "addl $20, %%esp\n" \ 859 : "a" (&_argvec[0]) \ 860 : "cc", "memory", __CALLER_SAVED_REGS \ 862 lval = (__typeof__(lval)) _res; \ 865 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ 867 volatile OrigFn _orig = (orig); \ 868 volatile unsigned long _argvec[7]; \ 869 volatile unsigned long _res; \ 870 _argvec[0] = (unsigned long)_orig.nraddr; \ 871 _argvec[1] = (unsigned long)(arg1); \ 872 _argvec[2] = (unsigned long)(arg2); \ 873 _argvec[3] = (unsigned long)(arg3); \ 874 _argvec[4] = (unsigned long)(arg4); \ 875 _argvec[5] = (unsigned long)(arg5); \ 876 _argvec[6] = (unsigned long)(arg6); \ 878 "pushl 24(%%eax)\n\t" \ 879 "pushl 20(%%eax)\n\t" \ 880 "pushl 16(%%eax)\n\t" \ 881 "pushl 12(%%eax)\n\t" \ 882 "pushl 8(%%eax)\n\t" \ 883 "pushl 4(%%eax)\n\t" \ 884 "movl (%%eax), %%eax\n\t" \ 885 VALGRIND_CALL_NOREDIR_EAX \ 886 "addl $24, %%esp\n" \ 888 : "a" (&_argvec[0]) \ 889 : "cc", "memory", __CALLER_SAVED_REGS \ 891 lval = (__typeof__(lval)) _res; \ 894 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 897 volatile OrigFn _orig = (orig); \ 898 volatile unsigned long _argvec[8]; \ 899 volatile unsigned long _res; \ 900 _argvec[0] = (unsigned long)_orig.nraddr; \ 901 _argvec[1] = (unsigned long)(arg1); \ 902 _argvec[2] = (unsigned long)(arg2); \ 903 _argvec[3] = (unsigned long)(arg3); \ 904 _argvec[4] = (unsigned long)(arg4); \ 905 _argvec[5] = (unsigned long)(arg5); \ 906 _argvec[6] = (unsigned long)(arg6); \ 907 _argvec[7] = (unsigned long)(arg7); \ 909 "pushl 28(%%eax)\n\t" \ 910 "pushl 24(%%eax)\n\t" \ 911 "pushl 20(%%eax)\n\t" \ 912 "pushl 16(%%eax)\n\t" \ 913 "pushl 12(%%eax)\n\t" \ 914 "pushl 8(%%eax)\n\t" \ 915 "pushl 4(%%eax)\n\t" \ 916 "movl (%%eax), %%eax\n\t" \ 917 VALGRIND_CALL_NOREDIR_EAX \ 918 "addl $28, %%esp\n" \ 920 : "a" (&_argvec[0]) \ 921 : "cc", "memory", __CALLER_SAVED_REGS \ 923 lval = (__typeof__(lval)) _res; \ 926 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 929 volatile OrigFn _orig = (orig); \ 930 volatile unsigned long _argvec[9]; \ 931 volatile unsigned long _res; \ 932 _argvec[0] = (unsigned long)_orig.nraddr; \ 933 _argvec[1] = (unsigned long)(arg1); \ 934 _argvec[2] = (unsigned long)(arg2); \ 935 _argvec[3] = (unsigned long)(arg3); \ 936 _argvec[4] = (unsigned long)(arg4); \ 937 _argvec[5] = (unsigned long)(arg5); \ 938 _argvec[6] = (unsigned long)(arg6); \ 939 _argvec[7] = (unsigned long)(arg7); \ 940 _argvec[8] = (unsigned long)(arg8); \ 942 "pushl 32(%%eax)\n\t" \ 943 "pushl 28(%%eax)\n\t" \ 944 "pushl 24(%%eax)\n\t" \ 945 "pushl 20(%%eax)\n\t" \ 946 "pushl 16(%%eax)\n\t" \ 947 "pushl 12(%%eax)\n\t" \ 948 "pushl 8(%%eax)\n\t" \ 949 "pushl 4(%%eax)\n\t" \ 950 "movl (%%eax), %%eax\n\t" \ 951 VALGRIND_CALL_NOREDIR_EAX \ 952 "addl $32, %%esp\n" \ 954 : "a" (&_argvec[0]) \ 955 : "cc", "memory", __CALLER_SAVED_REGS \ 957 lval = (__typeof__(lval)) _res; \ 960 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 963 volatile OrigFn _orig = (orig); \ 964 volatile unsigned long _argvec[10]; \ 965 volatile unsigned long _res; \ 966 _argvec[0] = (unsigned long)_orig.nraddr; \ 967 _argvec[1] = (unsigned long)(arg1); \ 968 _argvec[2] = (unsigned long)(arg2); \ 969 _argvec[3] = (unsigned long)(arg3); \ 970 _argvec[4] = (unsigned long)(arg4); \ 971 _argvec[5] = (unsigned long)(arg5); \ 972 _argvec[6] = (unsigned long)(arg6); \ 973 _argvec[7] = (unsigned long)(arg7); \ 974 _argvec[8] = (unsigned long)(arg8); \ 975 _argvec[9] = (unsigned long)(arg9); \ 977 "pushl 36(%%eax)\n\t" \ 978 "pushl 32(%%eax)\n\t" \ 979 "pushl 28(%%eax)\n\t" \ 980 "pushl 24(%%eax)\n\t" \ 981 "pushl 20(%%eax)\n\t" \ 982 "pushl 16(%%eax)\n\t" \ 983 "pushl 12(%%eax)\n\t" \ 984 "pushl 8(%%eax)\n\t" \ 985 "pushl 4(%%eax)\n\t" \ 986 "movl (%%eax), %%eax\n\t" \ 987 VALGRIND_CALL_NOREDIR_EAX \ 988 "addl $36, %%esp\n" \ 990 : "a" (&_argvec[0]) \ 991 : "cc", "memory", __CALLER_SAVED_REGS \ 993 lval = (__typeof__(lval)) _res; \ 996 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 997 arg7,arg8,arg9,arg10) \ 999 volatile OrigFn _orig = (orig); \ 1000 volatile unsigned long _argvec[11]; \ 1001 volatile unsigned long _res; \ 1002 _argvec[0] = (unsigned long)_orig.nraddr; \ 1003 _argvec[1] = (unsigned long)(arg1); \ 1004 _argvec[2] = (unsigned long)(arg2); \ 1005 _argvec[3] = (unsigned long)(arg3); \ 1006 _argvec[4] = (unsigned long)(arg4); \ 1007 _argvec[5] = (unsigned long)(arg5); \ 1008 _argvec[6] = (unsigned long)(arg6); \ 1009 _argvec[7] = (unsigned long)(arg7); \ 1010 _argvec[8] = (unsigned long)(arg8); \ 1011 _argvec[9] = (unsigned long)(arg9); \ 1012 _argvec[10] = (unsigned long)(arg10); \ 1014 "pushl 40(%%eax)\n\t" \ 1015 "pushl 36(%%eax)\n\t" \ 1016 "pushl 32(%%eax)\n\t" \ 1017 "pushl 28(%%eax)\n\t" \ 1018 "pushl 24(%%eax)\n\t" \ 1019 "pushl 20(%%eax)\n\t" \ 1020 "pushl 16(%%eax)\n\t" \ 1021 "pushl 12(%%eax)\n\t" \ 1022 "pushl 8(%%eax)\n\t" \ 1023 "pushl 4(%%eax)\n\t" \ 1024 "movl (%%eax), %%eax\n\t" \ 1025 VALGRIND_CALL_NOREDIR_EAX \ 1026 "addl $40, %%esp\n" \ 1028 : "a" (&_argvec[0]) \ 1029 : "cc", "memory", __CALLER_SAVED_REGS \ 1031 lval = (__typeof__(lval)) _res; \ 1034 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ 1035 arg6,arg7,arg8,arg9,arg10, \ 1038 volatile OrigFn _orig = (orig); \ 1039 volatile unsigned long _argvec[12]; \ 1040 volatile unsigned long _res; \ 1041 _argvec[0] = (unsigned long)_orig.nraddr; \ 1042 _argvec[1] = (unsigned long)(arg1); \ 1043 _argvec[2] = (unsigned long)(arg2); \ 1044 _argvec[3] = (unsigned long)(arg3); \ 1045 _argvec[4] = (unsigned long)(arg4); \ 1046 _argvec[5] = (unsigned long)(arg5); \ 1047 _argvec[6] = (unsigned long)(arg6); \ 1048 _argvec[7] = (unsigned long)(arg7); \ 1049 _argvec[8] = (unsigned long)(arg8); \ 1050 _argvec[9] = (unsigned long)(arg9); \ 1051 _argvec[10] = (unsigned long)(arg10); \ 1052 _argvec[11] = (unsigned long)(arg11); \ 1054 "pushl 44(%%eax)\n\t" \ 1055 "pushl 40(%%eax)\n\t" \ 1056 "pushl 36(%%eax)\n\t" \ 1057 "pushl 32(%%eax)\n\t" \ 1058 "pushl 28(%%eax)\n\t" \ 1059 "pushl 24(%%eax)\n\t" \ 1060 "pushl 20(%%eax)\n\t" \ 1061 "pushl 16(%%eax)\n\t" \ 1062 "pushl 12(%%eax)\n\t" \ 1063 "pushl 8(%%eax)\n\t" \ 1064 "pushl 4(%%eax)\n\t" \ 1065 "movl (%%eax), %%eax\n\t" \ 1066 VALGRIND_CALL_NOREDIR_EAX \ 1067 "addl $44, %%esp\n" \ 1069 : "a" (&_argvec[0]) \ 1070 : "cc", "memory", __CALLER_SAVED_REGS \ 1072 lval = (__typeof__(lval)) _res; \ 1075 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ 1076 arg6,arg7,arg8,arg9,arg10, \ 1079 volatile OrigFn _orig = (orig); \ 1080 volatile unsigned long _argvec[13]; \ 1081 volatile unsigned long _res; \ 1082 _argvec[0] = (unsigned long)_orig.nraddr; \ 1083 _argvec[1] = (unsigned long)(arg1); \ 1084 _argvec[2] = (unsigned long)(arg2); \ 1085 _argvec[3] = (unsigned long)(arg3); \ 1086 _argvec[4] = (unsigned long)(arg4); \ 1087 _argvec[5] = (unsigned long)(arg5); \ 1088 _argvec[6] = (unsigned long)(arg6); \ 1089 _argvec[7] = (unsigned long)(arg7); \ 1090 _argvec[8] = (unsigned long)(arg8); \ 1091 _argvec[9] = (unsigned long)(arg9); \ 1092 _argvec[10] = (unsigned long)(arg10); \ 1093 _argvec[11] = (unsigned long)(arg11); \ 1094 _argvec[12] = (unsigned long)(arg12); \ 1096 "pushl 48(%%eax)\n\t" \ 1097 "pushl 44(%%eax)\n\t" \ 1098 "pushl 40(%%eax)\n\t" \ 1099 "pushl 36(%%eax)\n\t" \ 1100 "pushl 32(%%eax)\n\t" \ 1101 "pushl 28(%%eax)\n\t" \ 1102 "pushl 24(%%eax)\n\t" \ 1103 "pushl 20(%%eax)\n\t" \ 1104 "pushl 16(%%eax)\n\t" \ 1105 "pushl 12(%%eax)\n\t" \ 1106 "pushl 8(%%eax)\n\t" \ 1107 "pushl 4(%%eax)\n\t" \ 1108 "movl (%%eax), %%eax\n\t" \ 1109 VALGRIND_CALL_NOREDIR_EAX \ 1110 "addl $48, %%esp\n" \ 1112 : "a" (&_argvec[0]) \ 1113 : "cc", "memory", __CALLER_SAVED_REGS \ 1115 lval = (__typeof__(lval)) _res; \ 1122 #if defined(PLAT_amd64_linux) || defined(PLAT_amd64_darwin) 1127 #define __CALLER_SAVED_REGS "rcx", "rdx", "rsi", \ 1128 "rdi", "r8", "r9", "r10", "r11" 1154 #define CALL_FN_W_v(lval, orig) \ 1156 volatile OrigFn _orig = (orig); \ 1157 volatile unsigned long _argvec[1]; \ 1158 volatile unsigned long _res; \ 1159 _argvec[0] = (unsigned long)_orig.nraddr; \ 1161 "subq $128,%%rsp\n\t" \ 1162 "movq (%%rax), %%rax\n\t" \ 1163 VALGRIND_CALL_NOREDIR_RAX \ 1164 "addq $128,%%rsp\n\t" \ 1166 : "a" (&_argvec[0]) \ 1167 : "cc", "memory", __CALLER_SAVED_REGS \ 1169 lval = (__typeof__(lval)) _res; \ 1172 #define CALL_FN_W_W(lval, orig, arg1) \ 1174 volatile OrigFn _orig = (orig); \ 1175 volatile unsigned long _argvec[2]; \ 1176 volatile unsigned long _res; \ 1177 _argvec[0] = (unsigned long)_orig.nraddr; \ 1178 _argvec[1] = (unsigned long)(arg1); \ 1180 "subq $128,%%rsp\n\t" \ 1181 "movq 8(%%rax), %%rdi\n\t" \ 1182 "movq (%%rax), %%rax\n\t" \ 1183 VALGRIND_CALL_NOREDIR_RAX \ 1184 "addq $128,%%rsp\n\t" \ 1186 : "a" (&_argvec[0]) \ 1187 : "cc", "memory", __CALLER_SAVED_REGS \ 1189 lval = (__typeof__(lval)) _res; \ 1192 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \ 1194 volatile OrigFn _orig = (orig); \ 1195 volatile unsigned long _argvec[3]; \ 1196 volatile unsigned long _res; \ 1197 _argvec[0] = (unsigned long)_orig.nraddr; \ 1198 _argvec[1] = (unsigned long)(arg1); \ 1199 _argvec[2] = (unsigned long)(arg2); \ 1201 "subq $128,%%rsp\n\t" \ 1202 "movq 16(%%rax), %%rsi\n\t" \ 1203 "movq 8(%%rax), %%rdi\n\t" \ 1204 "movq (%%rax), %%rax\n\t" \ 1205 VALGRIND_CALL_NOREDIR_RAX \ 1206 "addq $128,%%rsp\n\t" \ 1208 : "a" (&_argvec[0]) \ 1209 : "cc", "memory", __CALLER_SAVED_REGS \ 1211 lval = (__typeof__(lval)) _res; \ 1214 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ 1216 volatile OrigFn _orig = (orig); \ 1217 volatile unsigned long _argvec[4]; \ 1218 volatile unsigned long _res; \ 1219 _argvec[0] = (unsigned long)_orig.nraddr; \ 1220 _argvec[1] = (unsigned long)(arg1); \ 1221 _argvec[2] = (unsigned long)(arg2); \ 1222 _argvec[3] = (unsigned long)(arg3); \ 1224 "subq $128,%%rsp\n\t" \ 1225 "movq 24(%%rax), %%rdx\n\t" \ 1226 "movq 16(%%rax), %%rsi\n\t" \ 1227 "movq 8(%%rax), %%rdi\n\t" \ 1228 "movq (%%rax), %%rax\n\t" \ 1229 VALGRIND_CALL_NOREDIR_RAX \ 1230 "addq $128,%%rsp\n\t" \ 1232 : "a" (&_argvec[0]) \ 1233 : "cc", "memory", __CALLER_SAVED_REGS \ 1235 lval = (__typeof__(lval)) _res; \ 1238 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ 1240 volatile OrigFn _orig = (orig); \ 1241 volatile unsigned long _argvec[5]; \ 1242 volatile unsigned long _res; \ 1243 _argvec[0] = (unsigned long)_orig.nraddr; \ 1244 _argvec[1] = (unsigned long)(arg1); \ 1245 _argvec[2] = (unsigned long)(arg2); \ 1246 _argvec[3] = (unsigned long)(arg3); \ 1247 _argvec[4] = (unsigned long)(arg4); \ 1249 "subq $128,%%rsp\n\t" \ 1250 "movq 32(%%rax), %%rcx\n\t" \ 1251 "movq 24(%%rax), %%rdx\n\t" \ 1252 "movq 16(%%rax), %%rsi\n\t" \ 1253 "movq 8(%%rax), %%rdi\n\t" \ 1254 "movq (%%rax), %%rax\n\t" \ 1255 VALGRIND_CALL_NOREDIR_RAX \ 1256 "addq $128,%%rsp\n\t" \ 1258 : "a" (&_argvec[0]) \ 1259 : "cc", "memory", __CALLER_SAVED_REGS \ 1261 lval = (__typeof__(lval)) _res; \ 1264 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ 1266 volatile OrigFn _orig = (orig); \ 1267 volatile unsigned long _argvec[6]; \ 1268 volatile unsigned long _res; \ 1269 _argvec[0] = (unsigned long)_orig.nraddr; \ 1270 _argvec[1] = (unsigned long)(arg1); \ 1271 _argvec[2] = (unsigned long)(arg2); \ 1272 _argvec[3] = (unsigned long)(arg3); \ 1273 _argvec[4] = (unsigned long)(arg4); \ 1274 _argvec[5] = (unsigned long)(arg5); \ 1276 "subq $128,%%rsp\n\t" \ 1277 "movq 40(%%rax), %%r8\n\t" \ 1278 "movq 32(%%rax), %%rcx\n\t" \ 1279 "movq 24(%%rax), %%rdx\n\t" \ 1280 "movq 16(%%rax), %%rsi\n\t" \ 1281 "movq 8(%%rax), %%rdi\n\t" \ 1282 "movq (%%rax), %%rax\n\t" \ 1283 VALGRIND_CALL_NOREDIR_RAX \ 1284 "addq $128,%%rsp\n\t" \ 1286 : "a" (&_argvec[0]) \ 1287 : "cc", "memory", __CALLER_SAVED_REGS \ 1289 lval = (__typeof__(lval)) _res; \ 1292 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ 1294 volatile OrigFn _orig = (orig); \ 1295 volatile unsigned long _argvec[7]; \ 1296 volatile unsigned long _res; \ 1297 _argvec[0] = (unsigned long)_orig.nraddr; \ 1298 _argvec[1] = (unsigned long)(arg1); \ 1299 _argvec[2] = (unsigned long)(arg2); \ 1300 _argvec[3] = (unsigned long)(arg3); \ 1301 _argvec[4] = (unsigned long)(arg4); \ 1302 _argvec[5] = (unsigned long)(arg5); \ 1303 _argvec[6] = (unsigned long)(arg6); \ 1305 "subq $128,%%rsp\n\t" \ 1306 "movq 48(%%rax), %%r9\n\t" \ 1307 "movq 40(%%rax), %%r8\n\t" \ 1308 "movq 32(%%rax), %%rcx\n\t" \ 1309 "movq 24(%%rax), %%rdx\n\t" \ 1310 "movq 16(%%rax), %%rsi\n\t" \ 1311 "movq 8(%%rax), %%rdi\n\t" \ 1312 "movq (%%rax), %%rax\n\t" \ 1313 "addq $128,%%rsp\n\t" \ 1314 VALGRIND_CALL_NOREDIR_RAX \ 1316 : "a" (&_argvec[0]) \ 1317 : "cc", "memory", __CALLER_SAVED_REGS \ 1319 lval = (__typeof__(lval)) _res; \ 1322 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 1325 volatile OrigFn _orig = (orig); \ 1326 volatile unsigned long _argvec[8]; \ 1327 volatile unsigned long _res; \ 1328 _argvec[0] = (unsigned long)_orig.nraddr; \ 1329 _argvec[1] = (unsigned long)(arg1); \ 1330 _argvec[2] = (unsigned long)(arg2); \ 1331 _argvec[3] = (unsigned long)(arg3); \ 1332 _argvec[4] = (unsigned long)(arg4); \ 1333 _argvec[5] = (unsigned long)(arg5); \ 1334 _argvec[6] = (unsigned long)(arg6); \ 1335 _argvec[7] = (unsigned long)(arg7); \ 1337 "subq $128,%%rsp\n\t" \ 1338 "pushq 56(%%rax)\n\t" \ 1339 "movq 48(%%rax), %%r9\n\t" \ 1340 "movq 40(%%rax), %%r8\n\t" \ 1341 "movq 32(%%rax), %%rcx\n\t" \ 1342 "movq 24(%%rax), %%rdx\n\t" \ 1343 "movq 16(%%rax), %%rsi\n\t" \ 1344 "movq 8(%%rax), %%rdi\n\t" \ 1345 "movq (%%rax), %%rax\n\t" \ 1346 VALGRIND_CALL_NOREDIR_RAX \ 1347 "addq $8, %%rsp\n" \ 1348 "addq $128,%%rsp\n\t" \ 1350 : "a" (&_argvec[0]) \ 1351 : "cc", "memory", __CALLER_SAVED_REGS \ 1353 lval = (__typeof__(lval)) _res; \ 1356 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 1359 volatile OrigFn _orig = (orig); \ 1360 volatile unsigned long _argvec[9]; \ 1361 volatile unsigned long _res; \ 1362 _argvec[0] = (unsigned long)_orig.nraddr; \ 1363 _argvec[1] = (unsigned long)(arg1); \ 1364 _argvec[2] = (unsigned long)(arg2); \ 1365 _argvec[3] = (unsigned long)(arg3); \ 1366 _argvec[4] = (unsigned long)(arg4); \ 1367 _argvec[5] = (unsigned long)(arg5); \ 1368 _argvec[6] = (unsigned long)(arg6); \ 1369 _argvec[7] = (unsigned long)(arg7); \ 1370 _argvec[8] = (unsigned long)(arg8); \ 1372 "subq $128,%%rsp\n\t" \ 1373 "pushq 64(%%rax)\n\t" \ 1374 "pushq 56(%%rax)\n\t" \ 1375 "movq 48(%%rax), %%r9\n\t" \ 1376 "movq 40(%%rax), %%r8\n\t" \ 1377 "movq 32(%%rax), %%rcx\n\t" \ 1378 "movq 24(%%rax), %%rdx\n\t" \ 1379 "movq 16(%%rax), %%rsi\n\t" \ 1380 "movq 8(%%rax), %%rdi\n\t" \ 1381 "movq (%%rax), %%rax\n\t" \ 1382 VALGRIND_CALL_NOREDIR_RAX \ 1383 "addq $16, %%rsp\n" \ 1384 "addq $128,%%rsp\n\t" \ 1386 : "a" (&_argvec[0]) \ 1387 : "cc", "memory", __CALLER_SAVED_REGS \ 1389 lval = (__typeof__(lval)) _res; \ 1392 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 1395 volatile OrigFn _orig = (orig); \ 1396 volatile unsigned long _argvec[10]; \ 1397 volatile unsigned long _res; \ 1398 _argvec[0] = (unsigned long)_orig.nraddr; \ 1399 _argvec[1] = (unsigned long)(arg1); \ 1400 _argvec[2] = (unsigned long)(arg2); \ 1401 _argvec[3] = (unsigned long)(arg3); \ 1402 _argvec[4] = (unsigned long)(arg4); \ 1403 _argvec[5] = (unsigned long)(arg5); \ 1404 _argvec[6] = (unsigned long)(arg6); \ 1405 _argvec[7] = (unsigned long)(arg7); \ 1406 _argvec[8] = (unsigned long)(arg8); \ 1407 _argvec[9] = (unsigned long)(arg9); \ 1409 "subq $128,%%rsp\n\t" \ 1410 "pushq 72(%%rax)\n\t" \ 1411 "pushq 64(%%rax)\n\t" \ 1412 "pushq 56(%%rax)\n\t" \ 1413 "movq 48(%%rax), %%r9\n\t" \ 1414 "movq 40(%%rax), %%r8\n\t" \ 1415 "movq 32(%%rax), %%rcx\n\t" \ 1416 "movq 24(%%rax), %%rdx\n\t" \ 1417 "movq 16(%%rax), %%rsi\n\t" \ 1418 "movq 8(%%rax), %%rdi\n\t" \ 1419 "movq (%%rax), %%rax\n\t" \ 1420 VALGRIND_CALL_NOREDIR_RAX \ 1421 "addq $24, %%rsp\n" \ 1422 "addq $128,%%rsp\n\t" \ 1424 : "a" (&_argvec[0]) \ 1425 : "cc", "memory", __CALLER_SAVED_REGS \ 1427 lval = (__typeof__(lval)) _res; \ 1430 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 1431 arg7,arg8,arg9,arg10) \ 1433 volatile OrigFn _orig = (orig); \ 1434 volatile unsigned long _argvec[11]; \ 1435 volatile unsigned long _res; \ 1436 _argvec[0] = (unsigned long)_orig.nraddr; \ 1437 _argvec[1] = (unsigned long)(arg1); \ 1438 _argvec[2] = (unsigned long)(arg2); \ 1439 _argvec[3] = (unsigned long)(arg3); \ 1440 _argvec[4] = (unsigned long)(arg4); \ 1441 _argvec[5] = (unsigned long)(arg5); \ 1442 _argvec[6] = (unsigned long)(arg6); \ 1443 _argvec[7] = (unsigned long)(arg7); \ 1444 _argvec[8] = (unsigned long)(arg8); \ 1445 _argvec[9] = (unsigned long)(arg9); \ 1446 _argvec[10] = (unsigned long)(arg10); \ 1448 "subq $128,%%rsp\n\t" \ 1449 "pushq 80(%%rax)\n\t" \ 1450 "pushq 72(%%rax)\n\t" \ 1451 "pushq 64(%%rax)\n\t" \ 1452 "pushq 56(%%rax)\n\t" \ 1453 "movq 48(%%rax), %%r9\n\t" \ 1454 "movq 40(%%rax), %%r8\n\t" \ 1455 "movq 32(%%rax), %%rcx\n\t" \ 1456 "movq 24(%%rax), %%rdx\n\t" \ 1457 "movq 16(%%rax), %%rsi\n\t" \ 1458 "movq 8(%%rax), %%rdi\n\t" \ 1459 "movq (%%rax), %%rax\n\t" \ 1460 VALGRIND_CALL_NOREDIR_RAX \ 1461 "addq $32, %%rsp\n" \ 1462 "addq $128,%%rsp\n\t" \ 1464 : "a" (&_argvec[0]) \ 1465 : "cc", "memory", __CALLER_SAVED_REGS \ 1467 lval = (__typeof__(lval)) _res; \ 1470 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 1471 arg7,arg8,arg9,arg10,arg11) \ 1473 volatile OrigFn _orig = (orig); \ 1474 volatile unsigned long _argvec[12]; \ 1475 volatile unsigned long _res; \ 1476 _argvec[0] = (unsigned long)_orig.nraddr; \ 1477 _argvec[1] = (unsigned long)(arg1); \ 1478 _argvec[2] = (unsigned long)(arg2); \ 1479 _argvec[3] = (unsigned long)(arg3); \ 1480 _argvec[4] = (unsigned long)(arg4); \ 1481 _argvec[5] = (unsigned long)(arg5); \ 1482 _argvec[6] = (unsigned long)(arg6); \ 1483 _argvec[7] = (unsigned long)(arg7); \ 1484 _argvec[8] = (unsigned long)(arg8); \ 1485 _argvec[9] = (unsigned long)(arg9); \ 1486 _argvec[10] = (unsigned long)(arg10); \ 1487 _argvec[11] = (unsigned long)(arg11); \ 1489 "subq $128,%%rsp\n\t" \ 1490 "pushq 88(%%rax)\n\t" \ 1491 "pushq 80(%%rax)\n\t" \ 1492 "pushq 72(%%rax)\n\t" \ 1493 "pushq 64(%%rax)\n\t" \ 1494 "pushq 56(%%rax)\n\t" \ 1495 "movq 48(%%rax), %%r9\n\t" \ 1496 "movq 40(%%rax), %%r8\n\t" \ 1497 "movq 32(%%rax), %%rcx\n\t" \ 1498 "movq 24(%%rax), %%rdx\n\t" \ 1499 "movq 16(%%rax), %%rsi\n\t" \ 1500 "movq 8(%%rax), %%rdi\n\t" \ 1501 "movq (%%rax), %%rax\n\t" \ 1502 VALGRIND_CALL_NOREDIR_RAX \ 1503 "addq $40, %%rsp\n" \ 1504 "addq $128,%%rsp\n\t" \ 1506 : "a" (&_argvec[0]) \ 1507 : "cc", "memory", __CALLER_SAVED_REGS \ 1509 lval = (__typeof__(lval)) _res; \ 1512 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 1513 arg7,arg8,arg9,arg10,arg11,arg12) \ 1515 volatile OrigFn _orig = (orig); \ 1516 volatile unsigned long _argvec[13]; \ 1517 volatile unsigned long _res; \ 1518 _argvec[0] = (unsigned long)_orig.nraddr; \ 1519 _argvec[1] = (unsigned long)(arg1); \ 1520 _argvec[2] = (unsigned long)(arg2); \ 1521 _argvec[3] = (unsigned long)(arg3); \ 1522 _argvec[4] = (unsigned long)(arg4); \ 1523 _argvec[5] = (unsigned long)(arg5); \ 1524 _argvec[6] = (unsigned long)(arg6); \ 1525 _argvec[7] = (unsigned long)(arg7); \ 1526 _argvec[8] = (unsigned long)(arg8); \ 1527 _argvec[9] = (unsigned long)(arg9); \ 1528 _argvec[10] = (unsigned long)(arg10); \ 1529 _argvec[11] = (unsigned long)(arg11); \ 1530 _argvec[12] = (unsigned long)(arg12); \ 1532 "subq $128,%%rsp\n\t" \ 1533 "pushq 96(%%rax)\n\t" \ 1534 "pushq 88(%%rax)\n\t" \ 1535 "pushq 80(%%rax)\n\t" \ 1536 "pushq 72(%%rax)\n\t" \ 1537 "pushq 64(%%rax)\n\t" \ 1538 "pushq 56(%%rax)\n\t" \ 1539 "movq 48(%%rax), %%r9\n\t" \ 1540 "movq 40(%%rax), %%r8\n\t" \ 1541 "movq 32(%%rax), %%rcx\n\t" \ 1542 "movq 24(%%rax), %%rdx\n\t" \ 1543 "movq 16(%%rax), %%rsi\n\t" \ 1544 "movq 8(%%rax), %%rdi\n\t" \ 1545 "movq (%%rax), %%rax\n\t" \ 1546 VALGRIND_CALL_NOREDIR_RAX \ 1547 "addq $48, %%rsp\n" \ 1548 "addq $128,%%rsp\n\t" \ 1550 : "a" (&_argvec[0]) \ 1551 : "cc", "memory", __CALLER_SAVED_REGS \ 1553 lval = (__typeof__(lval)) _res; \ 1560 #if defined(PLAT_ppc32_linux) 1586 #define __CALLER_SAVED_REGS \ 1587 "lr", "ctr", "xer", \ 1588 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \ 1589 "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \ 1595 #define CALL_FN_W_v(lval, orig) \ 1597 volatile OrigFn _orig = (orig); \ 1598 volatile unsigned long _argvec[1]; \ 1599 volatile unsigned long _res; \ 1600 _argvec[0] = (unsigned long)_orig.nraddr; \ 1603 "lwz 11,0(11)\n\t" \ 1604 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 1607 : "r" (&_argvec[0]) \ 1608 : "cc", "memory", __CALLER_SAVED_REGS \ 1610 lval = (__typeof__(lval)) _res; \ 1613 #define CALL_FN_W_W(lval, orig, arg1) \ 1615 volatile OrigFn _orig = (orig); \ 1616 volatile unsigned long _argvec[2]; \ 1617 volatile unsigned long _res; \ 1618 _argvec[0] = (unsigned long)_orig.nraddr; \ 1619 _argvec[1] = (unsigned long)arg1; \ 1623 "lwz 11,0(11)\n\t" \ 1624 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 1627 : "r" (&_argvec[0]) \ 1628 : "cc", "memory", __CALLER_SAVED_REGS \ 1630 lval = (__typeof__(lval)) _res; \ 1633 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \ 1635 volatile OrigFn _orig = (orig); \ 1636 volatile unsigned long _argvec[3]; \ 1637 volatile unsigned long _res; \ 1638 _argvec[0] = (unsigned long)_orig.nraddr; \ 1639 _argvec[1] = (unsigned long)arg1; \ 1640 _argvec[2] = (unsigned long)arg2; \ 1645 "lwz 11,0(11)\n\t" \ 1646 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 1649 : "r" (&_argvec[0]) \ 1650 : "cc", "memory", __CALLER_SAVED_REGS \ 1652 lval = (__typeof__(lval)) _res; \ 1655 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ 1657 volatile OrigFn _orig = (orig); \ 1658 volatile unsigned long _argvec[4]; \ 1659 volatile unsigned long _res; \ 1660 _argvec[0] = (unsigned long)_orig.nraddr; \ 1661 _argvec[1] = (unsigned long)arg1; \ 1662 _argvec[2] = (unsigned long)arg2; \ 1663 _argvec[3] = (unsigned long)arg3; \ 1668 "lwz 5,12(11)\n\t" \ 1669 "lwz 11,0(11)\n\t" \ 1670 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 1673 : "r" (&_argvec[0]) \ 1674 : "cc", "memory", __CALLER_SAVED_REGS \ 1676 lval = (__typeof__(lval)) _res; \ 1679 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ 1681 volatile OrigFn _orig = (orig); \ 1682 volatile unsigned long _argvec[5]; \ 1683 volatile unsigned long _res; \ 1684 _argvec[0] = (unsigned long)_orig.nraddr; \ 1685 _argvec[1] = (unsigned long)arg1; \ 1686 _argvec[2] = (unsigned long)arg2; \ 1687 _argvec[3] = (unsigned long)arg3; \ 1688 _argvec[4] = (unsigned long)arg4; \ 1693 "lwz 5,12(11)\n\t" \ 1694 "lwz 6,16(11)\n\t" \ 1695 "lwz 11,0(11)\n\t" \ 1696 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 1699 : "r" (&_argvec[0]) \ 1700 : "cc", "memory", __CALLER_SAVED_REGS \ 1702 lval = (__typeof__(lval)) _res; \ 1705 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ 1707 volatile OrigFn _orig = (orig); \ 1708 volatile unsigned long _argvec[6]; \ 1709 volatile unsigned long _res; \ 1710 _argvec[0] = (unsigned long)_orig.nraddr; \ 1711 _argvec[1] = (unsigned long)arg1; \ 1712 _argvec[2] = (unsigned long)arg2; \ 1713 _argvec[3] = (unsigned long)arg3; \ 1714 _argvec[4] = (unsigned long)arg4; \ 1715 _argvec[5] = (unsigned long)arg5; \ 1720 "lwz 5,12(11)\n\t" \ 1721 "lwz 6,16(11)\n\t" \ 1722 "lwz 7,20(11)\n\t" \ 1723 "lwz 11,0(11)\n\t" \ 1724 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 1727 : "r" (&_argvec[0]) \ 1728 : "cc", "memory", __CALLER_SAVED_REGS \ 1730 lval = (__typeof__(lval)) _res; \ 1733 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ 1735 volatile OrigFn _orig = (orig); \ 1736 volatile unsigned long _argvec[7]; \ 1737 volatile unsigned long _res; \ 1738 _argvec[0] = (unsigned long)_orig.nraddr; \ 1739 _argvec[1] = (unsigned long)arg1; \ 1740 _argvec[2] = (unsigned long)arg2; \ 1741 _argvec[3] = (unsigned long)arg3; \ 1742 _argvec[4] = (unsigned long)arg4; \ 1743 _argvec[5] = (unsigned long)arg5; \ 1744 _argvec[6] = (unsigned long)arg6; \ 1749 "lwz 5,12(11)\n\t" \ 1750 "lwz 6,16(11)\n\t" \ 1751 "lwz 7,20(11)\n\t" \ 1752 "lwz 8,24(11)\n\t" \ 1753 "lwz 11,0(11)\n\t" \ 1754 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 1757 : "r" (&_argvec[0]) \ 1758 : "cc", "memory", __CALLER_SAVED_REGS \ 1760 lval = (__typeof__(lval)) _res; \ 1763 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 1766 volatile OrigFn _orig = (orig); \ 1767 volatile unsigned long _argvec[8]; \ 1768 volatile unsigned long _res; \ 1769 _argvec[0] = (unsigned long)_orig.nraddr; \ 1770 _argvec[1] = (unsigned long)arg1; \ 1771 _argvec[2] = (unsigned long)arg2; \ 1772 _argvec[3] = (unsigned long)arg3; \ 1773 _argvec[4] = (unsigned long)arg4; \ 1774 _argvec[5] = (unsigned long)arg5; \ 1775 _argvec[6] = (unsigned long)arg6; \ 1776 _argvec[7] = (unsigned long)arg7; \ 1781 "lwz 5,12(11)\n\t" \ 1782 "lwz 6,16(11)\n\t" \ 1783 "lwz 7,20(11)\n\t" \ 1784 "lwz 8,24(11)\n\t" \ 1785 "lwz 9,28(11)\n\t" \ 1786 "lwz 11,0(11)\n\t" \ 1787 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 1790 : "r" (&_argvec[0]) \ 1791 : "cc", "memory", __CALLER_SAVED_REGS \ 1793 lval = (__typeof__(lval)) _res; \ 1796 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 1799 volatile OrigFn _orig = (orig); \ 1800 volatile unsigned long _argvec[9]; \ 1801 volatile unsigned long _res; \ 1802 _argvec[0] = (unsigned long)_orig.nraddr; \ 1803 _argvec[1] = (unsigned long)arg1; \ 1804 _argvec[2] = (unsigned long)arg2; \ 1805 _argvec[3] = (unsigned long)arg3; \ 1806 _argvec[4] = (unsigned long)arg4; \ 1807 _argvec[5] = (unsigned long)arg5; \ 1808 _argvec[6] = (unsigned long)arg6; \ 1809 _argvec[7] = (unsigned long)arg7; \ 1810 _argvec[8] = (unsigned long)arg8; \ 1815 "lwz 5,12(11)\n\t" \ 1816 "lwz 6,16(11)\n\t" \ 1817 "lwz 7,20(11)\n\t" \ 1818 "lwz 8,24(11)\n\t" \ 1819 "lwz 9,28(11)\n\t" \ 1820 "lwz 10,32(11)\n\t" \ 1821 "lwz 11,0(11)\n\t" \ 1822 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 1825 : "r" (&_argvec[0]) \ 1826 : "cc", "memory", __CALLER_SAVED_REGS \ 1828 lval = (__typeof__(lval)) _res; \ 1831 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 1834 volatile OrigFn _orig = (orig); \ 1835 volatile unsigned long _argvec[10]; \ 1836 volatile unsigned long _res; \ 1837 _argvec[0] = (unsigned long)_orig.nraddr; \ 1838 _argvec[1] = (unsigned long)arg1; \ 1839 _argvec[2] = (unsigned long)arg2; \ 1840 _argvec[3] = (unsigned long)arg3; \ 1841 _argvec[4] = (unsigned long)arg4; \ 1842 _argvec[5] = (unsigned long)arg5; \ 1843 _argvec[6] = (unsigned long)arg6; \ 1844 _argvec[7] = (unsigned long)arg7; \ 1845 _argvec[8] = (unsigned long)arg8; \ 1846 _argvec[9] = (unsigned long)arg9; \ 1849 "addi 1,1,-16\n\t" \ 1851 "lwz 3,36(11)\n\t" \ 1856 "lwz 5,12(11)\n\t" \ 1857 "lwz 6,16(11)\n\t" \ 1858 "lwz 7,20(11)\n\t" \ 1859 "lwz 8,24(11)\n\t" \ 1860 "lwz 9,28(11)\n\t" \ 1861 "lwz 10,32(11)\n\t" \ 1862 "lwz 11,0(11)\n\t" \ 1863 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 1867 : "r" (&_argvec[0]) \ 1868 : "cc", "memory", __CALLER_SAVED_REGS \ 1870 lval = (__typeof__(lval)) _res; \ 1873 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 1874 arg7,arg8,arg9,arg10) \ 1876 volatile OrigFn _orig = (orig); \ 1877 volatile unsigned long _argvec[11]; \ 1878 volatile unsigned long _res; \ 1879 _argvec[0] = (unsigned long)_orig.nraddr; \ 1880 _argvec[1] = (unsigned long)arg1; \ 1881 _argvec[2] = (unsigned long)arg2; \ 1882 _argvec[3] = (unsigned long)arg3; \ 1883 _argvec[4] = (unsigned long)arg4; \ 1884 _argvec[5] = (unsigned long)arg5; \ 1885 _argvec[6] = (unsigned long)arg6; \ 1886 _argvec[7] = (unsigned long)arg7; \ 1887 _argvec[8] = (unsigned long)arg8; \ 1888 _argvec[9] = (unsigned long)arg9; \ 1889 _argvec[10] = (unsigned long)arg10; \ 1892 "addi 1,1,-16\n\t" \ 1894 "lwz 3,40(11)\n\t" \ 1897 "lwz 3,36(11)\n\t" \ 1902 "lwz 5,12(11)\n\t" \ 1903 "lwz 6,16(11)\n\t" \ 1904 "lwz 7,20(11)\n\t" \ 1905 "lwz 8,24(11)\n\t" \ 1906 "lwz 9,28(11)\n\t" \ 1907 "lwz 10,32(11)\n\t" \ 1908 "lwz 11,0(11)\n\t" \ 1909 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 1913 : "r" (&_argvec[0]) \ 1914 : "cc", "memory", __CALLER_SAVED_REGS \ 1916 lval = (__typeof__(lval)) _res; \ 1919 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 1920 arg7,arg8,arg9,arg10,arg11) \ 1922 volatile OrigFn _orig = (orig); \ 1923 volatile unsigned long _argvec[12]; \ 1924 volatile unsigned long _res; \ 1925 _argvec[0] = (unsigned long)_orig.nraddr; \ 1926 _argvec[1] = (unsigned long)arg1; \ 1927 _argvec[2] = (unsigned long)arg2; \ 1928 _argvec[3] = (unsigned long)arg3; \ 1929 _argvec[4] = (unsigned long)arg4; \ 1930 _argvec[5] = (unsigned long)arg5; \ 1931 _argvec[6] = (unsigned long)arg6; \ 1932 _argvec[7] = (unsigned long)arg7; \ 1933 _argvec[8] = (unsigned long)arg8; \ 1934 _argvec[9] = (unsigned long)arg9; \ 1935 _argvec[10] = (unsigned long)arg10; \ 1936 _argvec[11] = (unsigned long)arg11; \ 1939 "addi 1,1,-32\n\t" \ 1941 "lwz 3,44(11)\n\t" \ 1944 "lwz 3,40(11)\n\t" \ 1947 "lwz 3,36(11)\n\t" \ 1952 "lwz 5,12(11)\n\t" \ 1953 "lwz 6,16(11)\n\t" \ 1954 "lwz 7,20(11)\n\t" \ 1955 "lwz 8,24(11)\n\t" \ 1956 "lwz 9,28(11)\n\t" \ 1957 "lwz 10,32(11)\n\t" \ 1958 "lwz 11,0(11)\n\t" \ 1959 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 1963 : "r" (&_argvec[0]) \ 1964 : "cc", "memory", __CALLER_SAVED_REGS \ 1966 lval = (__typeof__(lval)) _res; \ 1969 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 1970 arg7,arg8,arg9,arg10,arg11,arg12) \ 1972 volatile OrigFn _orig = (orig); \ 1973 volatile unsigned long _argvec[13]; \ 1974 volatile unsigned long _res; \ 1975 _argvec[0] = (unsigned long)_orig.nraddr; \ 1976 _argvec[1] = (unsigned long)arg1; \ 1977 _argvec[2] = (unsigned long)arg2; \ 1978 _argvec[3] = (unsigned long)arg3; \ 1979 _argvec[4] = (unsigned long)arg4; \ 1980 _argvec[5] = (unsigned long)arg5; \ 1981 _argvec[6] = (unsigned long)arg6; \ 1982 _argvec[7] = (unsigned long)arg7; \ 1983 _argvec[8] = (unsigned long)arg8; \ 1984 _argvec[9] = (unsigned long)arg9; \ 1985 _argvec[10] = (unsigned long)arg10; \ 1986 _argvec[11] = (unsigned long)arg11; \ 1987 _argvec[12] = (unsigned long)arg12; \ 1990 "addi 1,1,-32\n\t" \ 1992 "lwz 3,48(11)\n\t" \ 1995 "lwz 3,44(11)\n\t" \ 1998 "lwz 3,40(11)\n\t" \ 2001 "lwz 3,36(11)\n\t" \ 2006 "lwz 5,12(11)\n\t" \ 2007 "lwz 6,16(11)\n\t" \ 2008 "lwz 7,20(11)\n\t" \ 2009 "lwz 8,24(11)\n\t" \ 2010 "lwz 9,28(11)\n\t" \ 2011 "lwz 10,32(11)\n\t" \ 2012 "lwz 11,0(11)\n\t" \ 2013 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 2017 : "r" (&_argvec[0]) \ 2018 : "cc", "memory", __CALLER_SAVED_REGS \ 2020 lval = (__typeof__(lval)) _res; \ 2027 #if defined(PLAT_ppc64_linux) 2032 #define __CALLER_SAVED_REGS \ 2033 "lr", "ctr", "xer", \ 2034 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \ 2035 "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \ 2041 #define CALL_FN_W_v(lval, orig) \ 2043 volatile OrigFn _orig = (orig); \ 2044 volatile unsigned long _argvec[3+0]; \ 2045 volatile unsigned long _res; \ 2047 _argvec[1] = (unsigned long)_orig.r2; \ 2048 _argvec[2] = (unsigned long)_orig.nraddr; \ 2051 "std 2,-16(11)\n\t" \ 2053 "ld 11, 0(11)\n\t" \ 2054 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 2059 : "r" (&_argvec[2]) \ 2060 : "cc", "memory", __CALLER_SAVED_REGS \ 2062 lval = (__typeof__(lval)) _res; \ 2065 #define CALL_FN_W_W(lval, orig, arg1) \ 2067 volatile OrigFn _orig = (orig); \ 2068 volatile unsigned long _argvec[3+1]; \ 2069 volatile unsigned long _res; \ 2071 _argvec[1] = (unsigned long)_orig.r2; \ 2072 _argvec[2] = (unsigned long)_orig.nraddr; \ 2073 _argvec[2+1] = (unsigned long)arg1; \ 2076 "std 2,-16(11)\n\t" \ 2079 "ld 11, 0(11)\n\t" \ 2080 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 2085 : "r" (&_argvec[2]) \ 2086 : "cc", "memory", __CALLER_SAVED_REGS \ 2088 lval = (__typeof__(lval)) _res; \ 2091 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \ 2093 volatile OrigFn _orig = (orig); \ 2094 volatile unsigned long _argvec[3+2]; \ 2095 volatile unsigned long _res; \ 2097 _argvec[1] = (unsigned long)_orig.r2; \ 2098 _argvec[2] = (unsigned long)_orig.nraddr; \ 2099 _argvec[2+1] = (unsigned long)arg1; \ 2100 _argvec[2+2] = (unsigned long)arg2; \ 2103 "std 2,-16(11)\n\t" \ 2106 "ld 4, 16(11)\n\t" \ 2107 "ld 11, 0(11)\n\t" \ 2108 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 2113 : "r" (&_argvec[2]) \ 2114 : "cc", "memory", __CALLER_SAVED_REGS \ 2116 lval = (__typeof__(lval)) _res; \ 2119 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ 2121 volatile OrigFn _orig = (orig); \ 2122 volatile unsigned long _argvec[3+3]; \ 2123 volatile unsigned long _res; \ 2125 _argvec[1] = (unsigned long)_orig.r2; \ 2126 _argvec[2] = (unsigned long)_orig.nraddr; \ 2127 _argvec[2+1] = (unsigned long)arg1; \ 2128 _argvec[2+2] = (unsigned long)arg2; \ 2129 _argvec[2+3] = (unsigned long)arg3; \ 2132 "std 2,-16(11)\n\t" \ 2135 "ld 4, 16(11)\n\t" \ 2136 "ld 5, 24(11)\n\t" \ 2137 "ld 11, 0(11)\n\t" \ 2138 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 2143 : "r" (&_argvec[2]) \ 2144 : "cc", "memory", __CALLER_SAVED_REGS \ 2146 lval = (__typeof__(lval)) _res; \ 2149 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ 2151 volatile OrigFn _orig = (orig); \ 2152 volatile unsigned long _argvec[3+4]; \ 2153 volatile unsigned long _res; \ 2155 _argvec[1] = (unsigned long)_orig.r2; \ 2156 _argvec[2] = (unsigned long)_orig.nraddr; \ 2157 _argvec[2+1] = (unsigned long)arg1; \ 2158 _argvec[2+2] = (unsigned long)arg2; \ 2159 _argvec[2+3] = (unsigned long)arg3; \ 2160 _argvec[2+4] = (unsigned long)arg4; \ 2163 "std 2,-16(11)\n\t" \ 2166 "ld 4, 16(11)\n\t" \ 2167 "ld 5, 24(11)\n\t" \ 2168 "ld 6, 32(11)\n\t" \ 2169 "ld 11, 0(11)\n\t" \ 2170 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 2175 : "r" (&_argvec[2]) \ 2176 : "cc", "memory", __CALLER_SAVED_REGS \ 2178 lval = (__typeof__(lval)) _res; \ 2181 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ 2183 volatile OrigFn _orig = (orig); \ 2184 volatile unsigned long _argvec[3+5]; \ 2185 volatile unsigned long _res; \ 2187 _argvec[1] = (unsigned long)_orig.r2; \ 2188 _argvec[2] = (unsigned long)_orig.nraddr; \ 2189 _argvec[2+1] = (unsigned long)arg1; \ 2190 _argvec[2+2] = (unsigned long)arg2; \ 2191 _argvec[2+3] = (unsigned long)arg3; \ 2192 _argvec[2+4] = (unsigned long)arg4; \ 2193 _argvec[2+5] = (unsigned long)arg5; \ 2196 "std 2,-16(11)\n\t" \ 2199 "ld 4, 16(11)\n\t" \ 2200 "ld 5, 24(11)\n\t" \ 2201 "ld 6, 32(11)\n\t" \ 2202 "ld 7, 40(11)\n\t" \ 2203 "ld 11, 0(11)\n\t" \ 2204 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 2209 : "r" (&_argvec[2]) \ 2210 : "cc", "memory", __CALLER_SAVED_REGS \ 2212 lval = (__typeof__(lval)) _res; \ 2215 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ 2217 volatile OrigFn _orig = (orig); \ 2218 volatile unsigned long _argvec[3+6]; \ 2219 volatile unsigned long _res; \ 2221 _argvec[1] = (unsigned long)_orig.r2; \ 2222 _argvec[2] = (unsigned long)_orig.nraddr; \ 2223 _argvec[2+1] = (unsigned long)arg1; \ 2224 _argvec[2+2] = (unsigned long)arg2; \ 2225 _argvec[2+3] = (unsigned long)arg3; \ 2226 _argvec[2+4] = (unsigned long)arg4; \ 2227 _argvec[2+5] = (unsigned long)arg5; \ 2228 _argvec[2+6] = (unsigned long)arg6; \ 2231 "std 2,-16(11)\n\t" \ 2234 "ld 4, 16(11)\n\t" \ 2235 "ld 5, 24(11)\n\t" \ 2236 "ld 6, 32(11)\n\t" \ 2237 "ld 7, 40(11)\n\t" \ 2238 "ld 8, 48(11)\n\t" \ 2239 "ld 11, 0(11)\n\t" \ 2240 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 2245 : "r" (&_argvec[2]) \ 2246 : "cc", "memory", __CALLER_SAVED_REGS \ 2248 lval = (__typeof__(lval)) _res; \ 2251 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 2254 volatile OrigFn _orig = (orig); \ 2255 volatile unsigned long _argvec[3+7]; \ 2256 volatile unsigned long _res; \ 2258 _argvec[1] = (unsigned long)_orig.r2; \ 2259 _argvec[2] = (unsigned long)_orig.nraddr; \ 2260 _argvec[2+1] = (unsigned long)arg1; \ 2261 _argvec[2+2] = (unsigned long)arg2; \ 2262 _argvec[2+3] = (unsigned long)arg3; \ 2263 _argvec[2+4] = (unsigned long)arg4; \ 2264 _argvec[2+5] = (unsigned long)arg5; \ 2265 _argvec[2+6] = (unsigned long)arg6; \ 2266 _argvec[2+7] = (unsigned long)arg7; \ 2269 "std 2,-16(11)\n\t" \ 2272 "ld 4, 16(11)\n\t" \ 2273 "ld 5, 24(11)\n\t" \ 2274 "ld 6, 32(11)\n\t" \ 2275 "ld 7, 40(11)\n\t" \ 2276 "ld 8, 48(11)\n\t" \ 2277 "ld 9, 56(11)\n\t" \ 2278 "ld 11, 0(11)\n\t" \ 2279 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 2284 : "r" (&_argvec[2]) \ 2285 : "cc", "memory", __CALLER_SAVED_REGS \ 2287 lval = (__typeof__(lval)) _res; \ 2290 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 2293 volatile OrigFn _orig = (orig); \ 2294 volatile unsigned long _argvec[3+8]; \ 2295 volatile unsigned long _res; \ 2297 _argvec[1] = (unsigned long)_orig.r2; \ 2298 _argvec[2] = (unsigned long)_orig.nraddr; \ 2299 _argvec[2+1] = (unsigned long)arg1; \ 2300 _argvec[2+2] = (unsigned long)arg2; \ 2301 _argvec[2+3] = (unsigned long)arg3; \ 2302 _argvec[2+4] = (unsigned long)arg4; \ 2303 _argvec[2+5] = (unsigned long)arg5; \ 2304 _argvec[2+6] = (unsigned long)arg6; \ 2305 _argvec[2+7] = (unsigned long)arg7; \ 2306 _argvec[2+8] = (unsigned long)arg8; \ 2309 "std 2,-16(11)\n\t" \ 2312 "ld 4, 16(11)\n\t" \ 2313 "ld 5, 24(11)\n\t" \ 2314 "ld 6, 32(11)\n\t" \ 2315 "ld 7, 40(11)\n\t" \ 2316 "ld 8, 48(11)\n\t" \ 2317 "ld 9, 56(11)\n\t" \ 2318 "ld 10, 64(11)\n\t" \ 2319 "ld 11, 0(11)\n\t" \ 2320 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 2325 : "r" (&_argvec[2]) \ 2326 : "cc", "memory", __CALLER_SAVED_REGS \ 2328 lval = (__typeof__(lval)) _res; \ 2331 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 2334 volatile OrigFn _orig = (orig); \ 2335 volatile unsigned long _argvec[3+9]; \ 2336 volatile unsigned long _res; \ 2338 _argvec[1] = (unsigned long)_orig.r2; \ 2339 _argvec[2] = (unsigned long)_orig.nraddr; \ 2340 _argvec[2+1] = (unsigned long)arg1; \ 2341 _argvec[2+2] = (unsigned long)arg2; \ 2342 _argvec[2+3] = (unsigned long)arg3; \ 2343 _argvec[2+4] = (unsigned long)arg4; \ 2344 _argvec[2+5] = (unsigned long)arg5; \ 2345 _argvec[2+6] = (unsigned long)arg6; \ 2346 _argvec[2+7] = (unsigned long)arg7; \ 2347 _argvec[2+8] = (unsigned long)arg8; \ 2348 _argvec[2+9] = (unsigned long)arg9; \ 2351 "std 2,-16(11)\n\t" \ 2353 "addi 1,1,-128\n\t" \ 2356 "std 3,112(1)\n\t" \ 2359 "ld 4, 16(11)\n\t" \ 2360 "ld 5, 24(11)\n\t" \ 2361 "ld 6, 32(11)\n\t" \ 2362 "ld 7, 40(11)\n\t" \ 2363 "ld 8, 48(11)\n\t" \ 2364 "ld 9, 56(11)\n\t" \ 2365 "ld 10, 64(11)\n\t" \ 2366 "ld 11, 0(11)\n\t" \ 2367 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 2370 "ld 2,-16(11)\n\t" \ 2373 : "r" (&_argvec[2]) \ 2374 : "cc", "memory", __CALLER_SAVED_REGS \ 2376 lval = (__typeof__(lval)) _res; \ 2379 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 2380 arg7,arg8,arg9,arg10) \ 2382 volatile OrigFn _orig = (orig); \ 2383 volatile unsigned long _argvec[3+10]; \ 2384 volatile unsigned long _res; \ 2386 _argvec[1] = (unsigned long)_orig.r2; \ 2387 _argvec[2] = (unsigned long)_orig.nraddr; \ 2388 _argvec[2+1] = (unsigned long)arg1; \ 2389 _argvec[2+2] = (unsigned long)arg2; \ 2390 _argvec[2+3] = (unsigned long)arg3; \ 2391 _argvec[2+4] = (unsigned long)arg4; \ 2392 _argvec[2+5] = (unsigned long)arg5; \ 2393 _argvec[2+6] = (unsigned long)arg6; \ 2394 _argvec[2+7] = (unsigned long)arg7; \ 2395 _argvec[2+8] = (unsigned long)arg8; \ 2396 _argvec[2+9] = (unsigned long)arg9; \ 2397 _argvec[2+10] = (unsigned long)arg10; \ 2400 "std 2,-16(11)\n\t" \ 2402 "addi 1,1,-128\n\t" \ 2405 "std 3,120(1)\n\t" \ 2408 "std 3,112(1)\n\t" \ 2411 "ld 4, 16(11)\n\t" \ 2412 "ld 5, 24(11)\n\t" \ 2413 "ld 6, 32(11)\n\t" \ 2414 "ld 7, 40(11)\n\t" \ 2415 "ld 8, 48(11)\n\t" \ 2416 "ld 9, 56(11)\n\t" \ 2417 "ld 10, 64(11)\n\t" \ 2418 "ld 11, 0(11)\n\t" \ 2419 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 2422 "ld 2,-16(11)\n\t" \ 2425 : "r" (&_argvec[2]) \ 2426 : "cc", "memory", __CALLER_SAVED_REGS \ 2428 lval = (__typeof__(lval)) _res; \ 2431 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 2432 arg7,arg8,arg9,arg10,arg11) \ 2434 volatile OrigFn _orig = (orig); \ 2435 volatile unsigned long _argvec[3+11]; \ 2436 volatile unsigned long _res; \ 2438 _argvec[1] = (unsigned long)_orig.r2; \ 2439 _argvec[2] = (unsigned long)_orig.nraddr; \ 2440 _argvec[2+1] = (unsigned long)arg1; \ 2441 _argvec[2+2] = (unsigned long)arg2; \ 2442 _argvec[2+3] = (unsigned long)arg3; \ 2443 _argvec[2+4] = (unsigned long)arg4; \ 2444 _argvec[2+5] = (unsigned long)arg5; \ 2445 _argvec[2+6] = (unsigned long)arg6; \ 2446 _argvec[2+7] = (unsigned long)arg7; \ 2447 _argvec[2+8] = (unsigned long)arg8; \ 2448 _argvec[2+9] = (unsigned long)arg9; \ 2449 _argvec[2+10] = (unsigned long)arg10; \ 2450 _argvec[2+11] = (unsigned long)arg11; \ 2453 "std 2,-16(11)\n\t" \ 2455 "addi 1,1,-144\n\t" \ 2458 "std 3,128(1)\n\t" \ 2461 "std 3,120(1)\n\t" \ 2464 "std 3,112(1)\n\t" \ 2467 "ld 4, 16(11)\n\t" \ 2468 "ld 5, 24(11)\n\t" \ 2469 "ld 6, 32(11)\n\t" \ 2470 "ld 7, 40(11)\n\t" \ 2471 "ld 8, 48(11)\n\t" \ 2472 "ld 9, 56(11)\n\t" \ 2473 "ld 10, 64(11)\n\t" \ 2474 "ld 11, 0(11)\n\t" \ 2475 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 2478 "ld 2,-16(11)\n\t" \ 2481 : "r" (&_argvec[2]) \ 2482 : "cc", "memory", __CALLER_SAVED_REGS \ 2484 lval = (__typeof__(lval)) _res; \ 2487 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 2488 arg7,arg8,arg9,arg10,arg11,arg12) \ 2490 volatile OrigFn _orig = (orig); \ 2491 volatile unsigned long _argvec[3+12]; \ 2492 volatile unsigned long _res; \ 2494 _argvec[1] = (unsigned long)_orig.r2; \ 2495 _argvec[2] = (unsigned long)_orig.nraddr; \ 2496 _argvec[2+1] = (unsigned long)arg1; \ 2497 _argvec[2+2] = (unsigned long)arg2; \ 2498 _argvec[2+3] = (unsigned long)arg3; \ 2499 _argvec[2+4] = (unsigned long)arg4; \ 2500 _argvec[2+5] = (unsigned long)arg5; \ 2501 _argvec[2+6] = (unsigned long)arg6; \ 2502 _argvec[2+7] = (unsigned long)arg7; \ 2503 _argvec[2+8] = (unsigned long)arg8; \ 2504 _argvec[2+9] = (unsigned long)arg9; \ 2505 _argvec[2+10] = (unsigned long)arg10; \ 2506 _argvec[2+11] = (unsigned long)arg11; \ 2507 _argvec[2+12] = (unsigned long)arg12; \ 2510 "std 2,-16(11)\n\t" \ 2512 "addi 1,1,-144\n\t" \ 2515 "std 3,136(1)\n\t" \ 2518 "std 3,128(1)\n\t" \ 2521 "std 3,120(1)\n\t" \ 2524 "std 3,112(1)\n\t" \ 2527 "ld 4, 16(11)\n\t" \ 2528 "ld 5, 24(11)\n\t" \ 2529 "ld 6, 32(11)\n\t" \ 2530 "ld 7, 40(11)\n\t" \ 2531 "ld 8, 48(11)\n\t" \ 2532 "ld 9, 56(11)\n\t" \ 2533 "ld 10, 64(11)\n\t" \ 2534 "ld 11, 0(11)\n\t" \ 2535 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 2538 "ld 2,-16(11)\n\t" \ 2541 : "r" (&_argvec[2]) \ 2542 : "cc", "memory", __CALLER_SAVED_REGS \ 2544 lval = (__typeof__(lval)) _res; \ 2551 #if defined(PLAT_arm_linux) 2554 #define __CALLER_SAVED_REGS "r0", "r1", "r2", "r3","r4","r14" 2559 #define CALL_FN_W_v(lval, orig) \ 2561 volatile OrigFn _orig = (orig); \ 2562 volatile unsigned long _argvec[1]; \ 2563 volatile unsigned long _res; \ 2564 _argvec[0] = (unsigned long)_orig.nraddr; \ 2566 "ldr r4, [%1] \n\t" \ 2567 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ 2570 : "0" (&_argvec[0]) \ 2571 : "cc", "memory", __CALLER_SAVED_REGS \ 2573 lval = (__typeof__(lval)) _res; \ 2576 #define CALL_FN_W_W(lval, orig, arg1) \ 2578 volatile OrigFn _orig = (orig); \ 2579 volatile unsigned long _argvec[2]; \ 2580 volatile unsigned long _res; \ 2581 _argvec[0] = (unsigned long)_orig.nraddr; \ 2582 _argvec[1] = (unsigned long)(arg1); \ 2584 "ldr r0, [%1, #4] \n\t" \ 2585 "ldr r4, [%1] \n\t" \ 2586 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ 2589 : "0" (&_argvec[0]) \ 2590 : "cc", "memory", __CALLER_SAVED_REGS \ 2592 lval = (__typeof__(lval)) _res; \ 2595 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \ 2597 volatile OrigFn _orig = (orig); \ 2598 volatile unsigned long _argvec[3]; \ 2599 volatile unsigned long _res; \ 2600 _argvec[0] = (unsigned long)_orig.nraddr; \ 2601 _argvec[1] = (unsigned long)(arg1); \ 2602 _argvec[2] = (unsigned long)(arg2); \ 2604 "ldr r0, [%1, #4] \n\t" \ 2605 "ldr r1, [%1, #8] \n\t" \ 2606 "ldr r4, [%1] \n\t" \ 2607 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ 2610 : "0" (&_argvec[0]) \ 2611 : "cc", "memory", __CALLER_SAVED_REGS \ 2613 lval = (__typeof__(lval)) _res; \ 2616 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ 2618 volatile OrigFn _orig = (orig); \ 2619 volatile unsigned long _argvec[4]; \ 2620 volatile unsigned long _res; \ 2621 _argvec[0] = (unsigned long)_orig.nraddr; \ 2622 _argvec[1] = (unsigned long)(arg1); \ 2623 _argvec[2] = (unsigned long)(arg2); \ 2624 _argvec[3] = (unsigned long)(arg3); \ 2626 "ldr r0, [%1, #4] \n\t" \ 2627 "ldr r1, [%1, #8] \n\t" \ 2628 "ldr r2, [%1, #12] \n\t" \ 2629 "ldr r4, [%1] \n\t" \ 2630 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ 2633 : "0" (&_argvec[0]) \ 2634 : "cc", "memory", __CALLER_SAVED_REGS \ 2636 lval = (__typeof__(lval)) _res; \ 2639 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ 2641 volatile OrigFn _orig = (orig); \ 2642 volatile unsigned long _argvec[5]; \ 2643 volatile unsigned long _res; \ 2644 _argvec[0] = (unsigned long)_orig.nraddr; \ 2645 _argvec[1] = (unsigned long)(arg1); \ 2646 _argvec[2] = (unsigned long)(arg2); \ 2647 _argvec[3] = (unsigned long)(arg3); \ 2648 _argvec[4] = (unsigned long)(arg4); \ 2650 "ldr r0, [%1, #4] \n\t" \ 2651 "ldr r1, [%1, #8] \n\t" \ 2652 "ldr r2, [%1, #12] \n\t" \ 2653 "ldr r3, [%1, #16] \n\t" \ 2654 "ldr r4, [%1] \n\t" \ 2655 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ 2658 : "0" (&_argvec[0]) \ 2659 : "cc", "memory", __CALLER_SAVED_REGS \ 2661 lval = (__typeof__(lval)) _res; \ 2664 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ 2666 volatile OrigFn _orig = (orig); \ 2667 volatile unsigned long _argvec[6]; \ 2668 volatile unsigned long _res; \ 2669 _argvec[0] = (unsigned long)_orig.nraddr; \ 2670 _argvec[1] = (unsigned long)(arg1); \ 2671 _argvec[2] = (unsigned long)(arg2); \ 2672 _argvec[3] = (unsigned long)(arg3); \ 2673 _argvec[4] = (unsigned long)(arg4); \ 2674 _argvec[5] = (unsigned long)(arg5); \ 2676 "ldr r0, [%1, #20] \n\t" \ 2678 "ldr r0, [%1, #4] \n\t" \ 2679 "ldr r1, [%1, #8] \n\t" \ 2680 "ldr r2, [%1, #12] \n\t" \ 2681 "ldr r3, [%1, #16] \n\t" \ 2682 "ldr r4, [%1] \n\t" \ 2683 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ 2684 "add sp, sp, #4 \n\t" \ 2687 : "0" (&_argvec[0]) \ 2688 : "cc", "memory", __CALLER_SAVED_REGS \ 2690 lval = (__typeof__(lval)) _res; \ 2693 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ 2695 volatile OrigFn _orig = (orig); \ 2696 volatile unsigned long _argvec[7]; \ 2697 volatile unsigned long _res; \ 2698 _argvec[0] = (unsigned long)_orig.nraddr; \ 2699 _argvec[1] = (unsigned long)(arg1); \ 2700 _argvec[2] = (unsigned long)(arg2); \ 2701 _argvec[3] = (unsigned long)(arg3); \ 2702 _argvec[4] = (unsigned long)(arg4); \ 2703 _argvec[5] = (unsigned long)(arg5); \ 2704 _argvec[6] = (unsigned long)(arg6); \ 2706 "ldr r0, [%1, #20] \n\t" \ 2707 "ldr r1, [%1, #24] \n\t" \ 2708 "push {r0, r1} \n\t" \ 2709 "ldr r0, [%1, #4] \n\t" \ 2710 "ldr r1, [%1, #8] \n\t" \ 2711 "ldr r2, [%1, #12] \n\t" \ 2712 "ldr r3, [%1, #16] \n\t" \ 2713 "ldr r4, [%1] \n\t" \ 2714 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ 2715 "add sp, sp, #8 \n\t" \ 2718 : "0" (&_argvec[0]) \ 2719 : "cc", "memory", __CALLER_SAVED_REGS \ 2721 lval = (__typeof__(lval)) _res; \ 2724 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 2727 volatile OrigFn _orig = (orig); \ 2728 volatile unsigned long _argvec[8]; \ 2729 volatile unsigned long _res; \ 2730 _argvec[0] = (unsigned long)_orig.nraddr; \ 2731 _argvec[1] = (unsigned long)(arg1); \ 2732 _argvec[2] = (unsigned long)(arg2); \ 2733 _argvec[3] = (unsigned long)(arg3); \ 2734 _argvec[4] = (unsigned long)(arg4); \ 2735 _argvec[5] = (unsigned long)(arg5); \ 2736 _argvec[6] = (unsigned long)(arg6); \ 2737 _argvec[7] = (unsigned long)(arg7); \ 2739 "ldr r0, [%1, #20] \n\t" \ 2740 "ldr r1, [%1, #24] \n\t" \ 2741 "ldr r2, [%1, #28] \n\t" \ 2742 "push {r0, r1, r2} \n\t" \ 2743 "ldr r0, [%1, #4] \n\t" \ 2744 "ldr r1, [%1, #8] \n\t" \ 2745 "ldr r2, [%1, #12] \n\t" \ 2746 "ldr r3, [%1, #16] \n\t" \ 2747 "ldr r4, [%1] \n\t" \ 2748 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ 2749 "add sp, sp, #12 \n\t" \ 2752 : "0" (&_argvec[0]) \ 2753 : "cc", "memory", __CALLER_SAVED_REGS \ 2755 lval = (__typeof__(lval)) _res; \ 2758 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 2761 volatile OrigFn _orig = (orig); \ 2762 volatile unsigned long _argvec[9]; \ 2763 volatile unsigned long _res; \ 2764 _argvec[0] = (unsigned long)_orig.nraddr; \ 2765 _argvec[1] = (unsigned long)(arg1); \ 2766 _argvec[2] = (unsigned long)(arg2); \ 2767 _argvec[3] = (unsigned long)(arg3); \ 2768 _argvec[4] = (unsigned long)(arg4); \ 2769 _argvec[5] = (unsigned long)(arg5); \ 2770 _argvec[6] = (unsigned long)(arg6); \ 2771 _argvec[7] = (unsigned long)(arg7); \ 2772 _argvec[8] = (unsigned long)(arg8); \ 2774 "ldr r0, [%1, #20] \n\t" \ 2775 "ldr r1, [%1, #24] \n\t" \ 2776 "ldr r2, [%1, #28] \n\t" \ 2777 "ldr r3, [%1, #32] \n\t" \ 2778 "push {r0, r1, r2, r3} \n\t" \ 2779 "ldr r0, [%1, #4] \n\t" \ 2780 "ldr r1, [%1, #8] \n\t" \ 2781 "ldr r2, [%1, #12] \n\t" \ 2782 "ldr r3, [%1, #16] \n\t" \ 2783 "ldr r4, [%1] \n\t" \ 2784 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ 2785 "add sp, sp, #16 \n\t" \ 2788 : "0" (&_argvec[0]) \ 2789 : "cc", "memory", __CALLER_SAVED_REGS \ 2791 lval = (__typeof__(lval)) _res; \ 2794 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 2797 volatile OrigFn _orig = (orig); \ 2798 volatile unsigned long _argvec[10]; \ 2799 volatile unsigned long _res; \ 2800 _argvec[0] = (unsigned long)_orig.nraddr; \ 2801 _argvec[1] = (unsigned long)(arg1); \ 2802 _argvec[2] = (unsigned long)(arg2); \ 2803 _argvec[3] = (unsigned long)(arg3); \ 2804 _argvec[4] = (unsigned long)(arg4); \ 2805 _argvec[5] = (unsigned long)(arg5); \ 2806 _argvec[6] = (unsigned long)(arg6); \ 2807 _argvec[7] = (unsigned long)(arg7); \ 2808 _argvec[8] = (unsigned long)(arg8); \ 2809 _argvec[9] = (unsigned long)(arg9); \ 2811 "ldr r0, [%1, #20] \n\t" \ 2812 "ldr r1, [%1, #24] \n\t" \ 2813 "ldr r2, [%1, #28] \n\t" \ 2814 "ldr r3, [%1, #32] \n\t" \ 2815 "ldr r4, [%1, #36] \n\t" \ 2816 "push {r0, r1, r2, r3, r4} \n\t" \ 2817 "ldr r0, [%1, #4] \n\t" \ 2818 "ldr r1, [%1, #8] \n\t" \ 2819 "ldr r2, [%1, #12] \n\t" \ 2820 "ldr r3, [%1, #16] \n\t" \ 2821 "ldr r4, [%1] \n\t" \ 2822 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ 2823 "add sp, sp, #20 \n\t" \ 2826 : "0" (&_argvec[0]) \ 2827 : "cc", "memory", __CALLER_SAVED_REGS \ 2829 lval = (__typeof__(lval)) _res; \ 2832 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 2833 arg7,arg8,arg9,arg10) \ 2835 volatile OrigFn _orig = (orig); \ 2836 volatile unsigned long _argvec[11]; \ 2837 volatile unsigned long _res; \ 2838 _argvec[0] = (unsigned long)_orig.nraddr; \ 2839 _argvec[1] = (unsigned long)(arg1); \ 2840 _argvec[2] = (unsigned long)(arg2); \ 2841 _argvec[3] = (unsigned long)(arg3); \ 2842 _argvec[4] = (unsigned long)(arg4); \ 2843 _argvec[5] = (unsigned long)(arg5); \ 2844 _argvec[6] = (unsigned long)(arg6); \ 2845 _argvec[7] = (unsigned long)(arg7); \ 2846 _argvec[8] = (unsigned long)(arg8); \ 2847 _argvec[9] = (unsigned long)(arg9); \ 2848 _argvec[10] = (unsigned long)(arg10); \ 2850 "ldr r0, [%1, #40] \n\t" \ 2852 "ldr r0, [%1, #20] \n\t" \ 2853 "ldr r1, [%1, #24] \n\t" \ 2854 "ldr r2, [%1, #28] \n\t" \ 2855 "ldr r3, [%1, #32] \n\t" \ 2856 "ldr r4, [%1, #36] \n\t" \ 2857 "push {r0, r1, r2, r3, r4} \n\t" \ 2858 "ldr r0, [%1, #4] \n\t" \ 2859 "ldr r1, [%1, #8] \n\t" \ 2860 "ldr r2, [%1, #12] \n\t" \ 2861 "ldr r3, [%1, #16] \n\t" \ 2862 "ldr r4, [%1] \n\t" \ 2863 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ 2864 "add sp, sp, #24 \n\t" \ 2867 : "0" (&_argvec[0]) \ 2868 : "cc", "memory", __CALLER_SAVED_REGS \ 2870 lval = (__typeof__(lval)) _res; \ 2873 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ 2874 arg6,arg7,arg8,arg9,arg10, \ 2877 volatile OrigFn _orig = (orig); \ 2878 volatile unsigned long _argvec[12]; \ 2879 volatile unsigned long _res; \ 2880 _argvec[0] = (unsigned long)_orig.nraddr; \ 2881 _argvec[1] = (unsigned long)(arg1); \ 2882 _argvec[2] = (unsigned long)(arg2); \ 2883 _argvec[3] = (unsigned long)(arg3); \ 2884 _argvec[4] = (unsigned long)(arg4); \ 2885 _argvec[5] = (unsigned long)(arg5); \ 2886 _argvec[6] = (unsigned long)(arg6); \ 2887 _argvec[7] = (unsigned long)(arg7); \ 2888 _argvec[8] = (unsigned long)(arg8); \ 2889 _argvec[9] = (unsigned long)(arg9); \ 2890 _argvec[10] = (unsigned long)(arg10); \ 2891 _argvec[11] = (unsigned long)(arg11); \ 2893 "ldr r0, [%1, #40] \n\t" \ 2894 "ldr r1, [%1, #44] \n\t" \ 2895 "push {r0, r1} \n\t" \ 2896 "ldr r0, [%1, #20] \n\t" \ 2897 "ldr r1, [%1, #24] \n\t" \ 2898 "ldr r2, [%1, #28] \n\t" \ 2899 "ldr r3, [%1, #32] \n\t" \ 2900 "ldr r4, [%1, #36] \n\t" \ 2901 "push {r0, r1, r2, r3, r4} \n\t" \ 2902 "ldr r0, [%1, #4] \n\t" \ 2903 "ldr r1, [%1, #8] \n\t" \ 2904 "ldr r2, [%1, #12] \n\t" \ 2905 "ldr r3, [%1, #16] \n\t" \ 2906 "ldr r4, [%1] \n\t" \ 2907 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ 2908 "add sp, sp, #28 \n\t" \ 2911 : "0" (&_argvec[0]) \ 2912 : "cc", "memory",__CALLER_SAVED_REGS \ 2914 lval = (__typeof__(lval)) _res; \ 2917 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \ 2918 arg6,arg7,arg8,arg9,arg10, \ 2921 volatile OrigFn _orig = (orig); \ 2922 volatile unsigned long _argvec[13]; \ 2923 volatile unsigned long _res; \ 2924 _argvec[0] = (unsigned long)_orig.nraddr; \ 2925 _argvec[1] = (unsigned long)(arg1); \ 2926 _argvec[2] = (unsigned long)(arg2); \ 2927 _argvec[3] = (unsigned long)(arg3); \ 2928 _argvec[4] = (unsigned long)(arg4); \ 2929 _argvec[5] = (unsigned long)(arg5); \ 2930 _argvec[6] = (unsigned long)(arg6); \ 2931 _argvec[7] = (unsigned long)(arg7); \ 2932 _argvec[8] = (unsigned long)(arg8); \ 2933 _argvec[9] = (unsigned long)(arg9); \ 2934 _argvec[10] = (unsigned long)(arg10); \ 2935 _argvec[11] = (unsigned long)(arg11); \ 2936 _argvec[12] = (unsigned long)(arg12); \ 2938 "ldr r0, [%1, #40] \n\t" \ 2939 "ldr r1, [%1, #44] \n\t" \ 2940 "ldr r2, [%1, #48] \n\t" \ 2941 "push {r0, r1, r2} \n\t" \ 2942 "ldr r0, [%1, #20] \n\t" \ 2943 "ldr r1, [%1, #24] \n\t" \ 2944 "ldr r2, [%1, #28] \n\t" \ 2945 "ldr r3, [%1, #32] \n\t" \ 2946 "ldr r4, [%1, #36] \n\t" \ 2947 "push {r0, r1, r2, r3, r4} \n\t" \ 2948 "ldr r0, [%1, #4] \n\t" \ 2949 "ldr r1, [%1, #8] \n\t" \ 2950 "ldr r2, [%1, #12] \n\t" \ 2951 "ldr r3, [%1, #16] \n\t" \ 2952 "ldr r4, [%1] \n\t" \ 2953 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \ 2954 "add sp, sp, #32 \n\t" \ 2957 : "0" (&_argvec[0]) \ 2958 : "cc", "memory", __CALLER_SAVED_REGS \ 2960 lval = (__typeof__(lval)) _res; \ 2967 #if defined(PLAT_ppc32_aix5) 2972 #define __CALLER_SAVED_REGS \ 2973 "lr", "ctr", "xer", \ 2974 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \ 2975 "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \ 2981 #define VG_EXPAND_FRAME_BY_trashes_r3(_n_fr) \ 2982 "addi 1,1,-" #_n_fr "\n\t" \ 2983 "lwz 3," #_n_fr "(1)\n\t" \ 2986 #define VG_CONTRACT_FRAME_BY(_n_fr) \ 2987 "addi 1,1," #_n_fr "\n\t" 2992 #define CALL_FN_W_v(lval, orig) \ 2994 volatile OrigFn _orig = (orig); \ 2995 volatile unsigned long _argvec[3+0]; \ 2996 volatile unsigned long _res; \ 2998 _argvec[1] = (unsigned long)_orig.r2; \ 2999 _argvec[2] = (unsigned long)_orig.nraddr; \ 3002 VG_EXPAND_FRAME_BY_trashes_r3(512) \ 3003 "stw 2,-8(11)\n\t" \ 3004 "lwz 2,-4(11)\n\t" \ 3005 "lwz 11, 0(11)\n\t" \ 3006 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 3009 "lwz 2,-8(11)\n\t" \ 3010 VG_CONTRACT_FRAME_BY(512) \ 3012 : "r" (&_argvec[2]) \ 3013 : "cc", "memory", __CALLER_SAVED_REGS \ 3015 lval = (__typeof__(lval)) _res; \ 3018 #define CALL_FN_W_W(lval, orig, arg1) \ 3020 volatile OrigFn _orig = (orig); \ 3021 volatile unsigned long _argvec[3+1]; \ 3022 volatile unsigned long _res; \ 3024 _argvec[1] = (unsigned long)_orig.r2; \ 3025 _argvec[2] = (unsigned long)_orig.nraddr; \ 3026 _argvec[2+1] = (unsigned long)arg1; \ 3029 VG_EXPAND_FRAME_BY_trashes_r3(512) \ 3030 "stw 2,-8(11)\n\t" \ 3031 "lwz 2,-4(11)\n\t" \ 3032 "lwz 3, 4(11)\n\t" \ 3033 "lwz 11, 0(11)\n\t" \ 3034 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 3037 "lwz 2,-8(11)\n\t" \ 3038 VG_CONTRACT_FRAME_BY(512) \ 3040 : "r" (&_argvec[2]) \ 3041 : "cc", "memory", __CALLER_SAVED_REGS \ 3043 lval = (__typeof__(lval)) _res; \ 3046 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \ 3048 volatile OrigFn _orig = (orig); \ 3049 volatile unsigned long _argvec[3+2]; \ 3050 volatile unsigned long _res; \ 3052 _argvec[1] = (unsigned long)_orig.r2; \ 3053 _argvec[2] = (unsigned long)_orig.nraddr; \ 3054 _argvec[2+1] = (unsigned long)arg1; \ 3055 _argvec[2+2] = (unsigned long)arg2; \ 3058 VG_EXPAND_FRAME_BY_trashes_r3(512) \ 3059 "stw 2,-8(11)\n\t" \ 3060 "lwz 2,-4(11)\n\t" \ 3061 "lwz 3, 4(11)\n\t" \ 3062 "lwz 4, 8(11)\n\t" \ 3063 "lwz 11, 0(11)\n\t" \ 3064 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 3067 "lwz 2,-8(11)\n\t" \ 3068 VG_CONTRACT_FRAME_BY(512) \ 3070 : "r" (&_argvec[2]) \ 3071 : "cc", "memory", __CALLER_SAVED_REGS \ 3073 lval = (__typeof__(lval)) _res; \ 3076 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ 3078 volatile OrigFn _orig = (orig); \ 3079 volatile unsigned long _argvec[3+3]; \ 3080 volatile unsigned long _res; \ 3082 _argvec[1] = (unsigned long)_orig.r2; \ 3083 _argvec[2] = (unsigned long)_orig.nraddr; \ 3084 _argvec[2+1] = (unsigned long)arg1; \ 3085 _argvec[2+2] = (unsigned long)arg2; \ 3086 _argvec[2+3] = (unsigned long)arg3; \ 3089 VG_EXPAND_FRAME_BY_trashes_r3(512) \ 3090 "stw 2,-8(11)\n\t" \ 3091 "lwz 2,-4(11)\n\t" \ 3092 "lwz 3, 4(11)\n\t" \ 3093 "lwz 4, 8(11)\n\t" \ 3094 "lwz 5, 12(11)\n\t" \ 3095 "lwz 11, 0(11)\n\t" \ 3096 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 3099 "lwz 2,-8(11)\n\t" \ 3100 VG_CONTRACT_FRAME_BY(512) \ 3102 : "r" (&_argvec[2]) \ 3103 : "cc", "memory", __CALLER_SAVED_REGS \ 3105 lval = (__typeof__(lval)) _res; \ 3108 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ 3110 volatile OrigFn _orig = (orig); \ 3111 volatile unsigned long _argvec[3+4]; \ 3112 volatile unsigned long _res; \ 3114 _argvec[1] = (unsigned long)_orig.r2; \ 3115 _argvec[2] = (unsigned long)_orig.nraddr; \ 3116 _argvec[2+1] = (unsigned long)arg1; \ 3117 _argvec[2+2] = (unsigned long)arg2; \ 3118 _argvec[2+3] = (unsigned long)arg3; \ 3119 _argvec[2+4] = (unsigned long)arg4; \ 3122 VG_EXPAND_FRAME_BY_trashes_r3(512) \ 3123 "stw 2,-8(11)\n\t" \ 3124 "lwz 2,-4(11)\n\t" \ 3125 "lwz 3, 4(11)\n\t" \ 3126 "lwz 4, 8(11)\n\t" \ 3127 "lwz 5, 12(11)\n\t" \ 3128 "lwz 6, 16(11)\n\t" \ 3129 "lwz 11, 0(11)\n\t" \ 3130 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 3133 "lwz 2,-8(11)\n\t" \ 3134 VG_CONTRACT_FRAME_BY(512) \ 3136 : "r" (&_argvec[2]) \ 3137 : "cc", "memory", __CALLER_SAVED_REGS \ 3139 lval = (__typeof__(lval)) _res; \ 3142 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ 3144 volatile OrigFn _orig = (orig); \ 3145 volatile unsigned long _argvec[3+5]; \ 3146 volatile unsigned long _res; \ 3148 _argvec[1] = (unsigned long)_orig.r2; \ 3149 _argvec[2] = (unsigned long)_orig.nraddr; \ 3150 _argvec[2+1] = (unsigned long)arg1; \ 3151 _argvec[2+2] = (unsigned long)arg2; \ 3152 _argvec[2+3] = (unsigned long)arg3; \ 3153 _argvec[2+4] = (unsigned long)arg4; \ 3154 _argvec[2+5] = (unsigned long)arg5; \ 3157 VG_EXPAND_FRAME_BY_trashes_r3(512) \ 3158 "stw 2,-8(11)\n\t" \ 3159 "lwz 2,-4(11)\n\t" \ 3160 "lwz 3, 4(11)\n\t" \ 3161 "lwz 4, 8(11)\n\t" \ 3162 "lwz 5, 12(11)\n\t" \ 3163 "lwz 6, 16(11)\n\t" \ 3164 "lwz 7, 20(11)\n\t" \ 3165 "lwz 11, 0(11)\n\t" \ 3166 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 3169 "lwz 2,-8(11)\n\t" \ 3170 VG_CONTRACT_FRAME_BY(512) \ 3172 : "r" (&_argvec[2]) \ 3173 : "cc", "memory", __CALLER_SAVED_REGS \ 3175 lval = (__typeof__(lval)) _res; \ 3178 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ 3180 volatile OrigFn _orig = (orig); \ 3181 volatile unsigned long _argvec[3+6]; \ 3182 volatile unsigned long _res; \ 3184 _argvec[1] = (unsigned long)_orig.r2; \ 3185 _argvec[2] = (unsigned long)_orig.nraddr; \ 3186 _argvec[2+1] = (unsigned long)arg1; \ 3187 _argvec[2+2] = (unsigned long)arg2; \ 3188 _argvec[2+3] = (unsigned long)arg3; \ 3189 _argvec[2+4] = (unsigned long)arg4; \ 3190 _argvec[2+5] = (unsigned long)arg5; \ 3191 _argvec[2+6] = (unsigned long)arg6; \ 3194 VG_EXPAND_FRAME_BY_trashes_r3(512) \ 3195 "stw 2,-8(11)\n\t" \ 3196 "lwz 2,-4(11)\n\t" \ 3197 "lwz 3, 4(11)\n\t" \ 3198 "lwz 4, 8(11)\n\t" \ 3199 "lwz 5, 12(11)\n\t" \ 3200 "lwz 6, 16(11)\n\t" \ 3201 "lwz 7, 20(11)\n\t" \ 3202 "lwz 8, 24(11)\n\t" \ 3203 "lwz 11, 0(11)\n\t" \ 3204 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 3207 "lwz 2,-8(11)\n\t" \ 3208 VG_CONTRACT_FRAME_BY(512) \ 3210 : "r" (&_argvec[2]) \ 3211 : "cc", "memory", __CALLER_SAVED_REGS \ 3213 lval = (__typeof__(lval)) _res; \ 3216 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 3219 volatile OrigFn _orig = (orig); \ 3220 volatile unsigned long _argvec[3+7]; \ 3221 volatile unsigned long _res; \ 3223 _argvec[1] = (unsigned long)_orig.r2; \ 3224 _argvec[2] = (unsigned long)_orig.nraddr; \ 3225 _argvec[2+1] = (unsigned long)arg1; \ 3226 _argvec[2+2] = (unsigned long)arg2; \ 3227 _argvec[2+3] = (unsigned long)arg3; \ 3228 _argvec[2+4] = (unsigned long)arg4; \ 3229 _argvec[2+5] = (unsigned long)arg5; \ 3230 _argvec[2+6] = (unsigned long)arg6; \ 3231 _argvec[2+7] = (unsigned long)arg7; \ 3234 VG_EXPAND_FRAME_BY_trashes_r3(512) \ 3235 "stw 2,-8(11)\n\t" \ 3236 "lwz 2,-4(11)\n\t" \ 3237 "lwz 3, 4(11)\n\t" \ 3238 "lwz 4, 8(11)\n\t" \ 3239 "lwz 5, 12(11)\n\t" \ 3240 "lwz 6, 16(11)\n\t" \ 3241 "lwz 7, 20(11)\n\t" \ 3242 "lwz 8, 24(11)\n\t" \ 3243 "lwz 9, 28(11)\n\t" \ 3244 "lwz 11, 0(11)\n\t" \ 3245 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 3248 "lwz 2,-8(11)\n\t" \ 3249 VG_CONTRACT_FRAME_BY(512) \ 3251 : "r" (&_argvec[2]) \ 3252 : "cc", "memory", __CALLER_SAVED_REGS \ 3254 lval = (__typeof__(lval)) _res; \ 3257 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 3260 volatile OrigFn _orig = (orig); \ 3261 volatile unsigned long _argvec[3+8]; \ 3262 volatile unsigned long _res; \ 3264 _argvec[1] = (unsigned long)_orig.r2; \ 3265 _argvec[2] = (unsigned long)_orig.nraddr; \ 3266 _argvec[2+1] = (unsigned long)arg1; \ 3267 _argvec[2+2] = (unsigned long)arg2; \ 3268 _argvec[2+3] = (unsigned long)arg3; \ 3269 _argvec[2+4] = (unsigned long)arg4; \ 3270 _argvec[2+5] = (unsigned long)arg5; \ 3271 _argvec[2+6] = (unsigned long)arg6; \ 3272 _argvec[2+7] = (unsigned long)arg7; \ 3273 _argvec[2+8] = (unsigned long)arg8; \ 3276 VG_EXPAND_FRAME_BY_trashes_r3(512) \ 3277 "stw 2,-8(11)\n\t" \ 3278 "lwz 2,-4(11)\n\t" \ 3279 "lwz 3, 4(11)\n\t" \ 3280 "lwz 4, 8(11)\n\t" \ 3281 "lwz 5, 12(11)\n\t" \ 3282 "lwz 6, 16(11)\n\t" \ 3283 "lwz 7, 20(11)\n\t" \ 3284 "lwz 8, 24(11)\n\t" \ 3285 "lwz 9, 28(11)\n\t" \ 3286 "lwz 10, 32(11)\n\t" \ 3287 "lwz 11, 0(11)\n\t" \ 3288 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 3291 "lwz 2,-8(11)\n\t" \ 3292 VG_CONTRACT_FRAME_BY(512) \ 3294 : "r" (&_argvec[2]) \ 3295 : "cc", "memory", __CALLER_SAVED_REGS \ 3297 lval = (__typeof__(lval)) _res; \ 3300 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 3303 volatile OrigFn _orig = (orig); \ 3304 volatile unsigned long _argvec[3+9]; \ 3305 volatile unsigned long _res; \ 3307 _argvec[1] = (unsigned long)_orig.r2; \ 3308 _argvec[2] = (unsigned long)_orig.nraddr; \ 3309 _argvec[2+1] = (unsigned long)arg1; \ 3310 _argvec[2+2] = (unsigned long)arg2; \ 3311 _argvec[2+3] = (unsigned long)arg3; \ 3312 _argvec[2+4] = (unsigned long)arg4; \ 3313 _argvec[2+5] = (unsigned long)arg5; \ 3314 _argvec[2+6] = (unsigned long)arg6; \ 3315 _argvec[2+7] = (unsigned long)arg7; \ 3316 _argvec[2+8] = (unsigned long)arg8; \ 3317 _argvec[2+9] = (unsigned long)arg9; \ 3320 VG_EXPAND_FRAME_BY_trashes_r3(512) \ 3321 "stw 2,-8(11)\n\t" \ 3322 "lwz 2,-4(11)\n\t" \ 3323 VG_EXPAND_FRAME_BY_trashes_r3(64) \ 3325 "lwz 3,36(11)\n\t" \ 3328 "lwz 3, 4(11)\n\t" \ 3329 "lwz 4, 8(11)\n\t" \ 3330 "lwz 5, 12(11)\n\t" \ 3331 "lwz 6, 16(11)\n\t" \ 3332 "lwz 7, 20(11)\n\t" \ 3333 "lwz 8, 24(11)\n\t" \ 3334 "lwz 9, 28(11)\n\t" \ 3335 "lwz 10, 32(11)\n\t" \ 3336 "lwz 11, 0(11)\n\t" \ 3337 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 3340 "lwz 2,-8(11)\n\t" \ 3341 VG_CONTRACT_FRAME_BY(64) \ 3342 VG_CONTRACT_FRAME_BY(512) \ 3344 : "r" (&_argvec[2]) \ 3345 : "cc", "memory", __CALLER_SAVED_REGS \ 3347 lval = (__typeof__(lval)) _res; \ 3350 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 3351 arg7,arg8,arg9,arg10) \ 3353 volatile OrigFn _orig = (orig); \ 3354 volatile unsigned long _argvec[3+10]; \ 3355 volatile unsigned long _res; \ 3357 _argvec[1] = (unsigned long)_orig.r2; \ 3358 _argvec[2] = (unsigned long)_orig.nraddr; \ 3359 _argvec[2+1] = (unsigned long)arg1; \ 3360 _argvec[2+2] = (unsigned long)arg2; \ 3361 _argvec[2+3] = (unsigned long)arg3; \ 3362 _argvec[2+4] = (unsigned long)arg4; \ 3363 _argvec[2+5] = (unsigned long)arg5; \ 3364 _argvec[2+6] = (unsigned long)arg6; \ 3365 _argvec[2+7] = (unsigned long)arg7; \ 3366 _argvec[2+8] = (unsigned long)arg8; \ 3367 _argvec[2+9] = (unsigned long)arg9; \ 3368 _argvec[2+10] = (unsigned long)arg10; \ 3371 VG_EXPAND_FRAME_BY_trashes_r3(512) \ 3372 "stw 2,-8(11)\n\t" \ 3373 "lwz 2,-4(11)\n\t" \ 3374 VG_EXPAND_FRAME_BY_trashes_r3(64) \ 3376 "lwz 3,40(11)\n\t" \ 3379 "lwz 3,36(11)\n\t" \ 3382 "lwz 3, 4(11)\n\t" \ 3383 "lwz 4, 8(11)\n\t" \ 3384 "lwz 5, 12(11)\n\t" \ 3385 "lwz 6, 16(11)\n\t" \ 3386 "lwz 7, 20(11)\n\t" \ 3387 "lwz 8, 24(11)\n\t" \ 3388 "lwz 9, 28(11)\n\t" \ 3389 "lwz 10, 32(11)\n\t" \ 3390 "lwz 11, 0(11)\n\t" \ 3391 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 3394 "lwz 2,-8(11)\n\t" \ 3395 VG_CONTRACT_FRAME_BY(64) \ 3396 VG_CONTRACT_FRAME_BY(512) \ 3398 : "r" (&_argvec[2]) \ 3399 : "cc", "memory", __CALLER_SAVED_REGS \ 3401 lval = (__typeof__(lval)) _res; \ 3404 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 3405 arg7,arg8,arg9,arg10,arg11) \ 3407 volatile OrigFn _orig = (orig); \ 3408 volatile unsigned long _argvec[3+11]; \ 3409 volatile unsigned long _res; \ 3411 _argvec[1] = (unsigned long)_orig.r2; \ 3412 _argvec[2] = (unsigned long)_orig.nraddr; \ 3413 _argvec[2+1] = (unsigned long)arg1; \ 3414 _argvec[2+2] = (unsigned long)arg2; \ 3415 _argvec[2+3] = (unsigned long)arg3; \ 3416 _argvec[2+4] = (unsigned long)arg4; \ 3417 _argvec[2+5] = (unsigned long)arg5; \ 3418 _argvec[2+6] = (unsigned long)arg6; \ 3419 _argvec[2+7] = (unsigned long)arg7; \ 3420 _argvec[2+8] = (unsigned long)arg8; \ 3421 _argvec[2+9] = (unsigned long)arg9; \ 3422 _argvec[2+10] = (unsigned long)arg10; \ 3423 _argvec[2+11] = (unsigned long)arg11; \ 3426 VG_EXPAND_FRAME_BY_trashes_r3(512) \ 3427 "stw 2,-8(11)\n\t" \ 3428 "lwz 2,-4(11)\n\t" \ 3429 VG_EXPAND_FRAME_BY_trashes_r3(72) \ 3431 "lwz 3,44(11)\n\t" \ 3434 "lwz 3,40(11)\n\t" \ 3437 "lwz 3,36(11)\n\t" \ 3440 "lwz 3, 4(11)\n\t" \ 3441 "lwz 4, 8(11)\n\t" \ 3442 "lwz 5, 12(11)\n\t" \ 3443 "lwz 6, 16(11)\n\t" \ 3444 "lwz 7, 20(11)\n\t" \ 3445 "lwz 8, 24(11)\n\t" \ 3446 "lwz 9, 28(11)\n\t" \ 3447 "lwz 10, 32(11)\n\t" \ 3448 "lwz 11, 0(11)\n\t" \ 3449 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 3452 "lwz 2,-8(11)\n\t" \ 3453 VG_CONTRACT_FRAME_BY(72) \ 3454 VG_CONTRACT_FRAME_BY(512) \ 3456 : "r" (&_argvec[2]) \ 3457 : "cc", "memory", __CALLER_SAVED_REGS \ 3459 lval = (__typeof__(lval)) _res; \ 3462 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 3463 arg7,arg8,arg9,arg10,arg11,arg12) \ 3465 volatile OrigFn _orig = (orig); \ 3466 volatile unsigned long _argvec[3+12]; \ 3467 volatile unsigned long _res; \ 3469 _argvec[1] = (unsigned long)_orig.r2; \ 3470 _argvec[2] = (unsigned long)_orig.nraddr; \ 3471 _argvec[2+1] = (unsigned long)arg1; \ 3472 _argvec[2+2] = (unsigned long)arg2; \ 3473 _argvec[2+3] = (unsigned long)arg3; \ 3474 _argvec[2+4] = (unsigned long)arg4; \ 3475 _argvec[2+5] = (unsigned long)arg5; \ 3476 _argvec[2+6] = (unsigned long)arg6; \ 3477 _argvec[2+7] = (unsigned long)arg7; \ 3478 _argvec[2+8] = (unsigned long)arg8; \ 3479 _argvec[2+9] = (unsigned long)arg9; \ 3480 _argvec[2+10] = (unsigned long)arg10; \ 3481 _argvec[2+11] = (unsigned long)arg11; \ 3482 _argvec[2+12] = (unsigned long)arg12; \ 3485 VG_EXPAND_FRAME_BY_trashes_r3(512) \ 3486 "stw 2,-8(11)\n\t" \ 3487 "lwz 2,-4(11)\n\t" \ 3488 VG_EXPAND_FRAME_BY_trashes_r3(72) \ 3490 "lwz 3,48(11)\n\t" \ 3493 "lwz 3,44(11)\n\t" \ 3496 "lwz 3,40(11)\n\t" \ 3499 "lwz 3,36(11)\n\t" \ 3502 "lwz 3, 4(11)\n\t" \ 3503 "lwz 4, 8(11)\n\t" \ 3504 "lwz 5, 12(11)\n\t" \ 3505 "lwz 6, 16(11)\n\t" \ 3506 "lwz 7, 20(11)\n\t" \ 3507 "lwz 8, 24(11)\n\t" \ 3508 "lwz 9, 28(11)\n\t" \ 3509 "lwz 10, 32(11)\n\t" \ 3510 "lwz 11, 0(11)\n\t" \ 3511 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 3514 "lwz 2,-8(11)\n\t" \ 3515 VG_CONTRACT_FRAME_BY(72) \ 3516 VG_CONTRACT_FRAME_BY(512) \ 3518 : "r" (&_argvec[2]) \ 3519 : "cc", "memory", __CALLER_SAVED_REGS \ 3521 lval = (__typeof__(lval)) _res; \ 3528 #if defined(PLAT_ppc64_aix5) 3533 #define __CALLER_SAVED_REGS \ 3534 "lr", "ctr", "xer", \ 3535 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \ 3536 "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \ 3542 #define VG_EXPAND_FRAME_BY_trashes_r3(_n_fr) \ 3543 "addi 1,1,-" #_n_fr "\n\t" \ 3544 "ld 3," #_n_fr "(1)\n\t" \ 3547 #define VG_CONTRACT_FRAME_BY(_n_fr) \ 3548 "addi 1,1," #_n_fr "\n\t" 3553 #define CALL_FN_W_v(lval, orig) \ 3555 volatile OrigFn _orig = (orig); \ 3556 volatile unsigned long _argvec[3+0]; \ 3557 volatile unsigned long _res; \ 3559 _argvec[1] = (unsigned long)_orig.r2; \ 3560 _argvec[2] = (unsigned long)_orig.nraddr; \ 3563 VG_EXPAND_FRAME_BY_trashes_r3(512) \ 3564 "std 2,-16(11)\n\t" \ 3566 "ld 11, 0(11)\n\t" \ 3567 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 3570 "ld 2,-16(11)\n\t" \ 3571 VG_CONTRACT_FRAME_BY(512) \ 3573 : "r" (&_argvec[2]) \ 3574 : "cc", "memory", __CALLER_SAVED_REGS \ 3576 lval = (__typeof__(lval)) _res; \ 3579 #define CALL_FN_W_W(lval, orig, arg1) \ 3581 volatile OrigFn _orig = (orig); \ 3582 volatile unsigned long _argvec[3+1]; \ 3583 volatile unsigned long _res; \ 3585 _argvec[1] = (unsigned long)_orig.r2; \ 3586 _argvec[2] = (unsigned long)_orig.nraddr; \ 3587 _argvec[2+1] = (unsigned long)arg1; \ 3590 VG_EXPAND_FRAME_BY_trashes_r3(512) \ 3591 "std 2,-16(11)\n\t" \ 3594 "ld 11, 0(11)\n\t" \ 3595 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 3598 "ld 2,-16(11)\n\t" \ 3599 VG_CONTRACT_FRAME_BY(512) \ 3601 : "r" (&_argvec[2]) \ 3602 : "cc", "memory", __CALLER_SAVED_REGS \ 3604 lval = (__typeof__(lval)) _res; \ 3607 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \ 3609 volatile OrigFn _orig = (orig); \ 3610 volatile unsigned long _argvec[3+2]; \ 3611 volatile unsigned long _res; \ 3613 _argvec[1] = (unsigned long)_orig.r2; \ 3614 _argvec[2] = (unsigned long)_orig.nraddr; \ 3615 _argvec[2+1] = (unsigned long)arg1; \ 3616 _argvec[2+2] = (unsigned long)arg2; \ 3619 VG_EXPAND_FRAME_BY_trashes_r3(512) \ 3620 "std 2,-16(11)\n\t" \ 3623 "ld 4, 16(11)\n\t" \ 3624 "ld 11, 0(11)\n\t" \ 3625 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 3628 "ld 2,-16(11)\n\t" \ 3629 VG_CONTRACT_FRAME_BY(512) \ 3631 : "r" (&_argvec[2]) \ 3632 : "cc", "memory", __CALLER_SAVED_REGS \ 3634 lval = (__typeof__(lval)) _res; \ 3637 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \ 3639 volatile OrigFn _orig = (orig); \ 3640 volatile unsigned long _argvec[3+3]; \ 3641 volatile unsigned long _res; \ 3643 _argvec[1] = (unsigned long)_orig.r2; \ 3644 _argvec[2] = (unsigned long)_orig.nraddr; \ 3645 _argvec[2+1] = (unsigned long)arg1; \ 3646 _argvec[2+2] = (unsigned long)arg2; \ 3647 _argvec[2+3] = (unsigned long)arg3; \ 3650 VG_EXPAND_FRAME_BY_trashes_r3(512) \ 3651 "std 2,-16(11)\n\t" \ 3654 "ld 4, 16(11)\n\t" \ 3655 "ld 5, 24(11)\n\t" \ 3656 "ld 11, 0(11)\n\t" \ 3657 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 3660 "ld 2,-16(11)\n\t" \ 3661 VG_CONTRACT_FRAME_BY(512) \ 3663 : "r" (&_argvec[2]) \ 3664 : "cc", "memory", __CALLER_SAVED_REGS \ 3666 lval = (__typeof__(lval)) _res; \ 3669 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \ 3671 volatile OrigFn _orig = (orig); \ 3672 volatile unsigned long _argvec[3+4]; \ 3673 volatile unsigned long _res; \ 3675 _argvec[1] = (unsigned long)_orig.r2; \ 3676 _argvec[2] = (unsigned long)_orig.nraddr; \ 3677 _argvec[2+1] = (unsigned long)arg1; \ 3678 _argvec[2+2] = (unsigned long)arg2; \ 3679 _argvec[2+3] = (unsigned long)arg3; \ 3680 _argvec[2+4] = (unsigned long)arg4; \ 3683 VG_EXPAND_FRAME_BY_trashes_r3(512) \ 3684 "std 2,-16(11)\n\t" \ 3687 "ld 4, 16(11)\n\t" \ 3688 "ld 5, 24(11)\n\t" \ 3689 "ld 6, 32(11)\n\t" \ 3690 "ld 11, 0(11)\n\t" \ 3691 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 3694 "ld 2,-16(11)\n\t" \ 3695 VG_CONTRACT_FRAME_BY(512) \ 3697 : "r" (&_argvec[2]) \ 3698 : "cc", "memory", __CALLER_SAVED_REGS \ 3700 lval = (__typeof__(lval)) _res; \ 3703 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \ 3705 volatile OrigFn _orig = (orig); \ 3706 volatile unsigned long _argvec[3+5]; \ 3707 volatile unsigned long _res; \ 3709 _argvec[1] = (unsigned long)_orig.r2; \ 3710 _argvec[2] = (unsigned long)_orig.nraddr; \ 3711 _argvec[2+1] = (unsigned long)arg1; \ 3712 _argvec[2+2] = (unsigned long)arg2; \ 3713 _argvec[2+3] = (unsigned long)arg3; \ 3714 _argvec[2+4] = (unsigned long)arg4; \ 3715 _argvec[2+5] = (unsigned long)arg5; \ 3718 VG_EXPAND_FRAME_BY_trashes_r3(512) \ 3719 "std 2,-16(11)\n\t" \ 3722 "ld 4, 16(11)\n\t" \ 3723 "ld 5, 24(11)\n\t" \ 3724 "ld 6, 32(11)\n\t" \ 3725 "ld 7, 40(11)\n\t" \ 3726 "ld 11, 0(11)\n\t" \ 3727 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 3730 "ld 2,-16(11)\n\t" \ 3731 VG_CONTRACT_FRAME_BY(512) \ 3733 : "r" (&_argvec[2]) \ 3734 : "cc", "memory", __CALLER_SAVED_REGS \ 3736 lval = (__typeof__(lval)) _res; \ 3739 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \ 3741 volatile OrigFn _orig = (orig); \ 3742 volatile unsigned long _argvec[3+6]; \ 3743 volatile unsigned long _res; \ 3745 _argvec[1] = (unsigned long)_orig.r2; \ 3746 _argvec[2] = (unsigned long)_orig.nraddr; \ 3747 _argvec[2+1] = (unsigned long)arg1; \ 3748 _argvec[2+2] = (unsigned long)arg2; \ 3749 _argvec[2+3] = (unsigned long)arg3; \ 3750 _argvec[2+4] = (unsigned long)arg4; \ 3751 _argvec[2+5] = (unsigned long)arg5; \ 3752 _argvec[2+6] = (unsigned long)arg6; \ 3755 VG_EXPAND_FRAME_BY_trashes_r3(512) \ 3756 "std 2,-16(11)\n\t" \ 3759 "ld 4, 16(11)\n\t" \ 3760 "ld 5, 24(11)\n\t" \ 3761 "ld 6, 32(11)\n\t" \ 3762 "ld 7, 40(11)\n\t" \ 3763 "ld 8, 48(11)\n\t" \ 3764 "ld 11, 0(11)\n\t" \ 3765 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 3768 "ld 2,-16(11)\n\t" \ 3769 VG_CONTRACT_FRAME_BY(512) \ 3771 : "r" (&_argvec[2]) \ 3772 : "cc", "memory", __CALLER_SAVED_REGS \ 3774 lval = (__typeof__(lval)) _res; \ 3777 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 3780 volatile OrigFn _orig = (orig); \ 3781 volatile unsigned long _argvec[3+7]; \ 3782 volatile unsigned long _res; \ 3784 _argvec[1] = (unsigned long)_orig.r2; \ 3785 _argvec[2] = (unsigned long)_orig.nraddr; \ 3786 _argvec[2+1] = (unsigned long)arg1; \ 3787 _argvec[2+2] = (unsigned long)arg2; \ 3788 _argvec[2+3] = (unsigned long)arg3; \ 3789 _argvec[2+4] = (unsigned long)arg4; \ 3790 _argvec[2+5] = (unsigned long)arg5; \ 3791 _argvec[2+6] = (unsigned long)arg6; \ 3792 _argvec[2+7] = (unsigned long)arg7; \ 3795 VG_EXPAND_FRAME_BY_trashes_r3(512) \ 3796 "std 2,-16(11)\n\t" \ 3799 "ld 4, 16(11)\n\t" \ 3800 "ld 5, 24(11)\n\t" \ 3801 "ld 6, 32(11)\n\t" \ 3802 "ld 7, 40(11)\n\t" \ 3803 "ld 8, 48(11)\n\t" \ 3804 "ld 9, 56(11)\n\t" \ 3805 "ld 11, 0(11)\n\t" \ 3806 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 3809 "ld 2,-16(11)\n\t" \ 3810 VG_CONTRACT_FRAME_BY(512) \ 3812 : "r" (&_argvec[2]) \ 3813 : "cc", "memory", __CALLER_SAVED_REGS \ 3815 lval = (__typeof__(lval)) _res; \ 3818 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 3821 volatile OrigFn _orig = (orig); \ 3822 volatile unsigned long _argvec[3+8]; \ 3823 volatile unsigned long _res; \ 3825 _argvec[1] = (unsigned long)_orig.r2; \ 3826 _argvec[2] = (unsigned long)_orig.nraddr; \ 3827 _argvec[2+1] = (unsigned long)arg1; \ 3828 _argvec[2+2] = (unsigned long)arg2; \ 3829 _argvec[2+3] = (unsigned long)arg3; \ 3830 _argvec[2+4] = (unsigned long)arg4; \ 3831 _argvec[2+5] = (unsigned long)arg5; \ 3832 _argvec[2+6] = (unsigned long)arg6; \ 3833 _argvec[2+7] = (unsigned long)arg7; \ 3834 _argvec[2+8] = (unsigned long)arg8; \ 3837 VG_EXPAND_FRAME_BY_trashes_r3(512) \ 3838 "std 2,-16(11)\n\t" \ 3841 "ld 4, 16(11)\n\t" \ 3842 "ld 5, 24(11)\n\t" \ 3843 "ld 6, 32(11)\n\t" \ 3844 "ld 7, 40(11)\n\t" \ 3845 "ld 8, 48(11)\n\t" \ 3846 "ld 9, 56(11)\n\t" \ 3847 "ld 10, 64(11)\n\t" \ 3848 "ld 11, 0(11)\n\t" \ 3849 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 3852 "ld 2,-16(11)\n\t" \ 3853 VG_CONTRACT_FRAME_BY(512) \ 3855 : "r" (&_argvec[2]) \ 3856 : "cc", "memory", __CALLER_SAVED_REGS \ 3858 lval = (__typeof__(lval)) _res; \ 3861 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 3864 volatile OrigFn _orig = (orig); \ 3865 volatile unsigned long _argvec[3+9]; \ 3866 volatile unsigned long _res; \ 3868 _argvec[1] = (unsigned long)_orig.r2; \ 3869 _argvec[2] = (unsigned long)_orig.nraddr; \ 3870 _argvec[2+1] = (unsigned long)arg1; \ 3871 _argvec[2+2] = (unsigned long)arg2; \ 3872 _argvec[2+3] = (unsigned long)arg3; \ 3873 _argvec[2+4] = (unsigned long)arg4; \ 3874 _argvec[2+5] = (unsigned long)arg5; \ 3875 _argvec[2+6] = (unsigned long)arg6; \ 3876 _argvec[2+7] = (unsigned long)arg7; \ 3877 _argvec[2+8] = (unsigned long)arg8; \ 3878 _argvec[2+9] = (unsigned long)arg9; \ 3881 VG_EXPAND_FRAME_BY_trashes_r3(512) \ 3882 "std 2,-16(11)\n\t" \ 3884 VG_EXPAND_FRAME_BY_trashes_r3(128) \ 3887 "std 3,112(1)\n\t" \ 3890 "ld 4, 16(11)\n\t" \ 3891 "ld 5, 24(11)\n\t" \ 3892 "ld 6, 32(11)\n\t" \ 3893 "ld 7, 40(11)\n\t" \ 3894 "ld 8, 48(11)\n\t" \ 3895 "ld 9, 56(11)\n\t" \ 3896 "ld 10, 64(11)\n\t" \ 3897 "ld 11, 0(11)\n\t" \ 3898 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 3901 "ld 2,-16(11)\n\t" \ 3902 VG_CONTRACT_FRAME_BY(128) \ 3903 VG_CONTRACT_FRAME_BY(512) \ 3905 : "r" (&_argvec[2]) \ 3906 : "cc", "memory", __CALLER_SAVED_REGS \ 3908 lval = (__typeof__(lval)) _res; \ 3911 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 3912 arg7,arg8,arg9,arg10) \ 3914 volatile OrigFn _orig = (orig); \ 3915 volatile unsigned long _argvec[3+10]; \ 3916 volatile unsigned long _res; \ 3918 _argvec[1] = (unsigned long)_orig.r2; \ 3919 _argvec[2] = (unsigned long)_orig.nraddr; \ 3920 _argvec[2+1] = (unsigned long)arg1; \ 3921 _argvec[2+2] = (unsigned long)arg2; \ 3922 _argvec[2+3] = (unsigned long)arg3; \ 3923 _argvec[2+4] = (unsigned long)arg4; \ 3924 _argvec[2+5] = (unsigned long)arg5; \ 3925 _argvec[2+6] = (unsigned long)arg6; \ 3926 _argvec[2+7] = (unsigned long)arg7; \ 3927 _argvec[2+8] = (unsigned long)arg8; \ 3928 _argvec[2+9] = (unsigned long)arg9; \ 3929 _argvec[2+10] = (unsigned long)arg10; \ 3932 VG_EXPAND_FRAME_BY_trashes_r3(512) \ 3933 "std 2,-16(11)\n\t" \ 3935 VG_EXPAND_FRAME_BY_trashes_r3(128) \ 3938 "std 3,120(1)\n\t" \ 3941 "std 3,112(1)\n\t" \ 3944 "ld 4, 16(11)\n\t" \ 3945 "ld 5, 24(11)\n\t" \ 3946 "ld 6, 32(11)\n\t" \ 3947 "ld 7, 40(11)\n\t" \ 3948 "ld 8, 48(11)\n\t" \ 3949 "ld 9, 56(11)\n\t" \ 3950 "ld 10, 64(11)\n\t" \ 3951 "ld 11, 0(11)\n\t" \ 3952 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 3955 "ld 2,-16(11)\n\t" \ 3956 VG_CONTRACT_FRAME_BY(128) \ 3957 VG_CONTRACT_FRAME_BY(512) \ 3959 : "r" (&_argvec[2]) \ 3960 : "cc", "memory", __CALLER_SAVED_REGS \ 3962 lval = (__typeof__(lval)) _res; \ 3965 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 3966 arg7,arg8,arg9,arg10,arg11) \ 3968 volatile OrigFn _orig = (orig); \ 3969 volatile unsigned long _argvec[3+11]; \ 3970 volatile unsigned long _res; \ 3972 _argvec[1] = (unsigned long)_orig.r2; \ 3973 _argvec[2] = (unsigned long)_orig.nraddr; \ 3974 _argvec[2+1] = (unsigned long)arg1; \ 3975 _argvec[2+2] = (unsigned long)arg2; \ 3976 _argvec[2+3] = (unsigned long)arg3; \ 3977 _argvec[2+4] = (unsigned long)arg4; \ 3978 _argvec[2+5] = (unsigned long)arg5; \ 3979 _argvec[2+6] = (unsigned long)arg6; \ 3980 _argvec[2+7] = (unsigned long)arg7; \ 3981 _argvec[2+8] = (unsigned long)arg8; \ 3982 _argvec[2+9] = (unsigned long)arg9; \ 3983 _argvec[2+10] = (unsigned long)arg10; \ 3984 _argvec[2+11] = (unsigned long)arg11; \ 3987 VG_EXPAND_FRAME_BY_trashes_r3(512) \ 3988 "std 2,-16(11)\n\t" \ 3990 VG_EXPAND_FRAME_BY_trashes_r3(144) \ 3993 "std 3,128(1)\n\t" \ 3996 "std 3,120(1)\n\t" \ 3999 "std 3,112(1)\n\t" \ 4002 "ld 4, 16(11)\n\t" \ 4003 "ld 5, 24(11)\n\t" \ 4004 "ld 6, 32(11)\n\t" \ 4005 "ld 7, 40(11)\n\t" \ 4006 "ld 8, 48(11)\n\t" \ 4007 "ld 9, 56(11)\n\t" \ 4008 "ld 10, 64(11)\n\t" \ 4009 "ld 11, 0(11)\n\t" \ 4010 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 4013 "ld 2,-16(11)\n\t" \ 4014 VG_CONTRACT_FRAME_BY(144) \ 4015 VG_CONTRACT_FRAME_BY(512) \ 4017 : "r" (&_argvec[2]) \ 4018 : "cc", "memory", __CALLER_SAVED_REGS \ 4020 lval = (__typeof__(lval)) _res; \ 4023 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \ 4024 arg7,arg8,arg9,arg10,arg11,arg12) \ 4026 volatile OrigFn _orig = (orig); \ 4027 volatile unsigned long _argvec[3+12]; \ 4028 volatile unsigned long _res; \ 4030 _argvec[1] = (unsigned long)_orig.r2; \ 4031 _argvec[2] = (unsigned long)_orig.nraddr; \ 4032 _argvec[2+1] = (unsigned long)arg1; \ 4033 _argvec[2+2] = (unsigned long)arg2; \ 4034 _argvec[2+3] = (unsigned long)arg3; \ 4035 _argvec[2+4] = (unsigned long)arg4; \ 4036 _argvec[2+5] = (unsigned long)arg5; \ 4037 _argvec[2+6] = (unsigned long)arg6; \ 4038 _argvec[2+7] = (unsigned long)arg7; \ 4039 _argvec[2+8] = (unsigned long)arg8; \ 4040 _argvec[2+9] = (unsigned long)arg9; \ 4041 _argvec[2+10] = (unsigned long)arg10; \ 4042 _argvec[2+11] = (unsigned long)arg11; \ 4043 _argvec[2+12] = (unsigned long)arg12; \ 4046 VG_EXPAND_FRAME_BY_trashes_r3(512) \ 4047 "std 2,-16(11)\n\t" \ 4049 VG_EXPAND_FRAME_BY_trashes_r3(144) \ 4052 "std 3,136(1)\n\t" \ 4055 "std 3,128(1)\n\t" \ 4058 "std 3,120(1)\n\t" \ 4061 "std 3,112(1)\n\t" \ 4064 "ld 4, 16(11)\n\t" \ 4065 "ld 5, 24(11)\n\t" \ 4066 "ld 6, 32(11)\n\t" \ 4067 "ld 7, 40(11)\n\t" \ 4068 "ld 8, 48(11)\n\t" \ 4069 "ld 9, 56(11)\n\t" \ 4070 "ld 10, 64(11)\n\t" \ 4071 "ld 11, 0(11)\n\t" \ 4072 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \ 4075 "ld 2,-16(11)\n\t" \ 4076 VG_CONTRACT_FRAME_BY(144) \ 4077 VG_CONTRACT_FRAME_BY(512) \ 4079 : "r" (&_argvec[2]) \ 4080 : "cc", "memory", __CALLER_SAVED_REGS \ 4082 lval = (__typeof__(lval)) _res; \ 4103 #define VG_USERREQ_TOOL_BASE(a,b) \ 4104 ((unsigned int)(((a)&0xff) << 24 | ((b)&0xff) << 16)) 4105 #define VG_IS_TOOL_USERREQ(a, b, v) \ 4106 (VG_USERREQ_TOOL_BASE(a,b) == ((v) & 0xffff0000)) 4167 #if !defined(__GNUC__) 4168 # define __extension__ 4175 #define RUNNING_ON_VALGRIND __extension__ \ 4176 ({unsigned int _qzz_res; \ 4177 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0 , \ 4178 VG_USERREQ__RUNNING_ON_VALGRIND, \ 4188 #define VALGRIND_DISCARD_TRANSLATIONS(_qzz_addr,_qzz_len) \ 4189 {unsigned int _qzz_res; \ 4190 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 4191 VG_USERREQ__DISCARD_TRANSLATIONS, \ 4192 _qzz_addr, _qzz_len, 0, 0, 0); \ 4201 #if defined(NVALGRIND) 4203 # define VALGRIND_PRINTF(...) 4204 # define VALGRIND_PRINTF_BACKTRACE(...) 4215 unsigned long _qzz_res;
4221 (
unsigned long)&vargs,
4224 return (
int)_qzz_res;
4232 unsigned long _qzz_res;
4238 (
unsigned long)&vargs,
4241 return (
int)_qzz_res;
4270 #define VALGRIND_NON_SIMD_CALL0(_qyy_fn) \ 4272 ({unsigned long _qyy_res; \ 4273 VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 , \ 4274 VG_USERREQ__CLIENT_CALL0, \ 4280 #define VALGRIND_NON_SIMD_CALL1(_qyy_fn, _qyy_arg1) \ 4282 ({unsigned long _qyy_res; \ 4283 VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 , \ 4284 VG_USERREQ__CLIENT_CALL1, \ 4286 _qyy_arg1, 0, 0, 0); \ 4290 #define VALGRIND_NON_SIMD_CALL2(_qyy_fn, _qyy_arg1, _qyy_arg2) \ 4292 ({unsigned long _qyy_res; \ 4293 VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 , \ 4294 VG_USERREQ__CLIENT_CALL2, \ 4296 _qyy_arg1, _qyy_arg2, 0, 0); \ 4300 #define VALGRIND_NON_SIMD_CALL3(_qyy_fn, _qyy_arg1, _qyy_arg2, _qyy_arg3) \ 4302 ({unsigned long _qyy_res; \ 4303 VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 , \ 4304 VG_USERREQ__CLIENT_CALL3, \ 4306 _qyy_arg1, _qyy_arg2, \ 4315 #define VALGRIND_COUNT_ERRORS \ 4317 ({unsigned int _qyy_res; \ 4318 VALGRIND_DO_CLIENT_REQUEST(_qyy_res, 0 , \ 4319 VG_USERREQ__COUNT_ERRORS, \ 4411 #define VALGRIND_MALLOCLIKE_BLOCK(addr, sizeB, rzB, is_zeroed) \ 4412 {unsigned int __unused _qzz_res; \ 4413 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 4414 VG_USERREQ__MALLOCLIKE_BLOCK, \ 4415 addr, sizeB, rzB, is_zeroed, 0); \ 4421 #define VALGRIND_FREELIKE_BLOCK(addr, rzB) \ 4422 {unsigned int __unused _qzz_res; \ 4423 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 4424 VG_USERREQ__FREELIKE_BLOCK, \ 4425 addr, rzB, 0, 0, 0); \ 4429 #define VALGRIND_CREATE_MEMPOOL(pool, rzB, is_zeroed) \ 4430 {unsigned int _qzz_res; \ 4431 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 4432 VG_USERREQ__CREATE_MEMPOOL, \ 4433 pool, rzB, is_zeroed, 0, 0); \ 4437 #define VALGRIND_DESTROY_MEMPOOL(pool) \ 4438 {unsigned int _qzz_res; \ 4439 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 4440 VG_USERREQ__DESTROY_MEMPOOL, \ 4441 pool, 0, 0, 0, 0); \ 4445 #define VALGRIND_MEMPOOL_ALLOC(pool, addr, size) \ 4446 {unsigned int _qzz_res; \ 4447 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 4448 VG_USERREQ__MEMPOOL_ALLOC, \ 4449 pool, addr, size, 0, 0); \ 4453 #define VALGRIND_MEMPOOL_FREE(pool, addr) \ 4454 {unsigned int _qzz_res; \ 4455 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 4456 VG_USERREQ__MEMPOOL_FREE, \ 4457 pool, addr, 0, 0, 0); \ 4461 #define VALGRIND_MEMPOOL_TRIM(pool, addr, size) \ 4462 {unsigned int _qzz_res; \ 4463 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 4464 VG_USERREQ__MEMPOOL_TRIM, \ 4465 pool, addr, size, 0, 0); \ 4469 #define VALGRIND_MOVE_MEMPOOL(poolA, poolB) \ 4470 {unsigned int _qzz_res; \ 4471 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 4472 VG_USERREQ__MOVE_MEMPOOL, \ 4473 poolA, poolB, 0, 0, 0); \ 4477 #define VALGRIND_MEMPOOL_CHANGE(pool, addrA, addrB, size) \ 4478 {unsigned int _qzz_res; \ 4479 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 4480 VG_USERREQ__MEMPOOL_CHANGE, \ 4481 pool, addrA, addrB, size, 0); \ 4485 #define VALGRIND_MEMPOOL_EXISTS(pool) \ 4487 ({unsigned int _qzz_res; \ 4488 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 4489 VG_USERREQ__MEMPOOL_EXISTS, \ 4490 pool, 0, 0, 0, 0); \ 4495 #define VALGRIND_STACK_REGISTER(start, end) \ 4497 ({unsigned int _qzz_res; \ 4498 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 4499 VG_USERREQ__STACK_REGISTER, \ 4500 start, end, 0, 0, 0); \ 4506 #define VALGRIND_STACK_DEREGISTER(id) \ 4507 {unsigned int _qzz_res; \ 4508 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 4509 VG_USERREQ__STACK_DEREGISTER, \ 4514 #define VALGRIND_STACK_CHANGE(id, start, end) \ 4515 {unsigned int _qzz_res; \ 4516 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 4517 VG_USERREQ__STACK_CHANGE, \ 4518 id, start, end, 0, 0); \ 4522 #define VALGRIND_LOAD_PDB_DEBUGINFO(fd, ptr, total_size, delta) \ 4523 {unsigned int _qzz_res; \ 4524 VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, \ 4525 VG_USERREQ__LOAD_PDB_DEBUGINFO, \ 4526 fd, ptr, total_size, delta, 0); \ 4530 #undef PLAT_x86_linux 4531 #undef PLAT_amd64_linux 4532 #undef PLAT_ppc32_linux 4533 #undef PLAT_ppc64_linux 4534 #undef PLAT_arm_linux 4535 #undef PLAT_ppc32_aix5 4536 #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)