91 #define __VALGRIND_MAJOR__ 3
92 #define __VALGRIND_MINOR__ 8
111 #undef PLAT_x86_darwin
112 #undef PLAT_amd64_darwin
113 #undef PLAT_x86_win32
114 #undef PLAT_amd64_win64
115 #undef PLAT_x86_linux
116 #undef PLAT_amd64_linux
117 #undef PLAT_ppc32_linux
118 #undef PLAT_ppc64_linux
119 #undef PLAT_arm_linux
120 #undef PLAT_s390x_linux
121 #undef PLAT_mips32_linux
122 #undef PLAT_mips64_linux
125 #if defined(__APPLE__) && defined(__i386__)
126 # define PLAT_x86_darwin 1
127 #elif defined(__APPLE__) && defined(__x86_64__)
128 # define PLAT_amd64_darwin 1
129 #elif defined(__MINGW32__) || defined(__CYGWIN32__) \
130 || (defined(_WIN32) && defined(_M_IX86))
131 # define PLAT_x86_win32 1
132 #elif defined(__MINGW64__) || (defined(_WIN64) && defined(_M_X64))
133 # define PLAT_amd64_win64 1
134 #elif defined(__linux__) && defined(__i386__)
135 # define PLAT_x86_linux 1
136 #elif defined(__linux__) && defined(__x86_64__)
137 # define PLAT_amd64_linux 1
138 #elif defined(__linux__) && defined(__powerpc__) && !defined(__powerpc64__)
139 # define PLAT_ppc32_linux 1
140 #elif defined(__linux__) && defined(__powerpc__) && defined(__powerpc64__)
141 # define PLAT_ppc64_linux 1
142 #elif defined(__linux__) && defined(__arm__)
143 # define PLAT_arm_linux 1
144 #elif defined(__linux__) && defined(__s390__) && defined(__s390x__)
145 # define PLAT_s390x_linux 1
146 #elif defined(__linux__) && defined(__mips__)
148 # define PLAT_mips64_linux 1
150 # define PLAT_mips32_linux 1
155 # if !defined(NVALGRIND)
179 #define VALGRIND_DO_CLIENT_REQUEST(_zzq_rlval, _zzq_default, \
180 _zzq_request, _zzq_arg1, _zzq_arg2, \
181 _zzq_arg3, _zzq_arg4, _zzq_arg5) \
182 do { (_zzq_rlval) = VALGRIND_DO_CLIENT_REQUEST_EXPR((_zzq_default), \
183 (_zzq_request), (_zzq_arg1), (_zzq_arg2), \
184 (_zzq_arg3), (_zzq_arg4), (_zzq_arg5)); } while (0)
186 #define VALGRIND_DO_CLIENT_REQUEST_STMT(_zzq_request, _zzq_arg1, \
187 _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
188 do { (void) VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
189 (_zzq_request), (_zzq_arg1), (_zzq_arg2), \
190 (_zzq_arg3), (_zzq_arg4), (_zzq_arg5)); } while (0)
192 #if defined(NVALGRIND)
197 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
198 _zzq_default, _zzq_request, \
199 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
241 #if defined(PLAT_x86_linux) || defined(PLAT_x86_darwin) \
242 || (defined(PLAT_x86_win32) && defined(__GNUC__))
250 #define __SPECIAL_INSTRUCTION_PREAMBLE \
251 "roll $3, %%edi ; roll $13, %%edi\n\t" \
252 "roll $29, %%edi ; roll $19, %%edi\n\t"
254 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
255 _zzq_default, _zzq_request, \
256 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
258 ({volatile unsigned int _zzq_args[6]; \
259 volatile unsigned int _zzq_result; \
260 _zzq_args[0] = (unsigned int)(_zzq_request); \
261 _zzq_args[1] = (unsigned int)(_zzq_arg1); \
262 _zzq_args[2] = (unsigned int)(_zzq_arg2); \
263 _zzq_args[3] = (unsigned int)(_zzq_arg3); \
264 _zzq_args[4] = (unsigned int)(_zzq_arg4); \
265 _zzq_args[5] = (unsigned int)(_zzq_arg5); \
266 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
268 "xchgl %%ebx,%%ebx" \
269 : "=d" (_zzq_result) \
270 : "a" (&_zzq_args[0]), "0" (_zzq_default) \
276 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
277 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
278 volatile unsigned int __addr; \
279 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
281 "xchgl %%ecx,%%ecx" \
286 _zzq_orig->nraddr = __addr; \
289 #define VALGRIND_CALL_NOREDIR_EAX \
290 __SPECIAL_INSTRUCTION_PREAMBLE \
292 "xchgl %%edx,%%edx\n\t"
294 #define VALGRIND_VEX_INJECT_IR() \
296 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
297 "xchgl %%edi,%%edi\n\t" \
298 : : : "cc", "memory" \
306 #if defined(PLAT_x86_win32) && !defined(__GNUC__)
314 #if defined(_MSC_VER)
316 #define __SPECIAL_INSTRUCTION_PREAMBLE \
317 __asm rol edi, 3 __asm rol edi, 13 \
318 __asm rol edi, 29 __asm rol edi, 19
320 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
321 _zzq_default, _zzq_request, \
322 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
323 valgrind_do_client_request_expr((uintptr_t)(_zzq_default), \
324 (uintptr_t)(_zzq_request), (uintptr_t)(_zzq_arg1), \
325 (uintptr_t)(_zzq_arg2), (uintptr_t)(_zzq_arg3), \
326 (uintptr_t)(_zzq_arg4), (uintptr_t)(_zzq_arg5))
328 static __inline uintptr_t
329 valgrind_do_client_request_expr(uintptr_t _zzq_default, uintptr_t _zzq_request,
330 uintptr_t _zzq_arg1, uintptr_t _zzq_arg2,
331 uintptr_t _zzq_arg3, uintptr_t _zzq_arg4,
334 volatile uintptr_t _zzq_args[6];
335 volatile unsigned int _zzq_result;
336 _zzq_args[0] = (uintptr_t)(_zzq_request);
337 _zzq_args[1] = (uintptr_t)(_zzq_arg1);
338 _zzq_args[2] = (uintptr_t)(_zzq_arg2);
339 _zzq_args[3] = (uintptr_t)(_zzq_arg3);
340 _zzq_args[4] = (uintptr_t)(_zzq_arg4);
341 _zzq_args[5] = (uintptr_t)(_zzq_arg5);
342 __asm { __asm lea eax, _zzq_args __asm mov edx, _zzq_default
343 __SPECIAL_INSTRUCTION_PREAMBLE
346 __asm mov _zzq_result, edx
351 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
352 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
353 volatile unsigned int __addr; \
354 __asm { __SPECIAL_INSTRUCTION_PREAMBLE \
357 __asm mov __addr, eax \
359 _zzq_orig->nraddr = __addr; \
362 #define VALGRIND_CALL_NOREDIR_EAX ERROR
364 #define VALGRIND_VEX_INJECT_IR() \
366 __asm { __SPECIAL_INSTRUCTION_PREAMBLE \
372 #error Unsupported compiler.
379 #if defined(PLAT_amd64_linux) || defined(PLAT_amd64_darwin)
383 unsigned long long int nraddr;
387 #define __SPECIAL_INSTRUCTION_PREAMBLE \
388 "rolq $3, %%rdi ; rolq $13, %%rdi\n\t" \
389 "rolq $61, %%rdi ; rolq $51, %%rdi\n\t"
391 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
392 _zzq_default, _zzq_request, \
393 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
395 ({ volatile unsigned long long int _zzq_args[6]; \
396 volatile unsigned long long int _zzq_result; \
397 _zzq_args[0] = (unsigned long long int)(_zzq_request); \
398 _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \
399 _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \
400 _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \
401 _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \
402 _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \
403 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
405 "xchgq %%rbx,%%rbx" \
406 : "=d" (_zzq_result) \
407 : "a" (&_zzq_args[0]), "0" (_zzq_default) \
413 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
414 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
415 volatile unsigned long long int __addr; \
416 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
418 "xchgq %%rcx,%%rcx" \
423 _zzq_orig->nraddr = __addr; \
426 #define VALGRIND_CALL_NOREDIR_RAX \
427 __SPECIAL_INSTRUCTION_PREAMBLE \
429 "xchgq %%rdx,%%rdx\n\t"
431 #define VALGRIND_VEX_INJECT_IR() \
433 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
434 "xchgq %%rdi,%%rdi\n\t" \
435 : : : "cc", "memory" \
443 #if defined(PLAT_ppc32_linux)
451 #define __SPECIAL_INSTRUCTION_PREAMBLE \
452 "rlwinm 0,0,3,0,0 ; rlwinm 0,0,13,0,0\n\t" \
453 "rlwinm 0,0,29,0,0 ; rlwinm 0,0,19,0,0\n\t"
455 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
456 _zzq_default, _zzq_request, \
457 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
460 ({ unsigned int _zzq_args[6]; \
461 unsigned int _zzq_result; \
462 unsigned int* _zzq_ptr; \
463 _zzq_args[0] = (unsigned int)(_zzq_request); \
464 _zzq_args[1] = (unsigned int)(_zzq_arg1); \
465 _zzq_args[2] = (unsigned int)(_zzq_arg2); \
466 _zzq_args[3] = (unsigned int)(_zzq_arg3); \
467 _zzq_args[4] = (unsigned int)(_zzq_arg4); \
468 _zzq_args[5] = (unsigned int)(_zzq_arg5); \
469 _zzq_ptr = _zzq_args; \
470 __asm__ volatile("mr 3,%1\n\t" \
472 __SPECIAL_INSTRUCTION_PREAMBLE \
476 : "=b" (_zzq_result) \
477 : "b" (_zzq_default), "b" (_zzq_ptr) \
478 : "cc", "memory", "r3", "r4"); \
482 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
483 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
484 unsigned int __addr; \
485 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
491 : "cc", "memory", "r3" \
493 _zzq_orig->nraddr = __addr; \
496 #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
497 __SPECIAL_INSTRUCTION_PREAMBLE \
501 #define VALGRIND_VEX_INJECT_IR() \
503 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
512 #if defined(PLAT_ppc64_linux)
516 unsigned long long int nraddr;
517 unsigned long long int r2;
521 #define __SPECIAL_INSTRUCTION_PREAMBLE \
522 "rotldi 0,0,3 ; rotldi 0,0,13\n\t" \
523 "rotldi 0,0,61 ; rotldi 0,0,51\n\t"
525 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
526 _zzq_default, _zzq_request, \
527 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
530 ({ unsigned long long int _zzq_args[6]; \
531 unsigned long long int _zzq_result; \
532 unsigned long long int* _zzq_ptr; \
533 _zzq_args[0] = (unsigned long long int)(_zzq_request); \
534 _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \
535 _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \
536 _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \
537 _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \
538 _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \
539 _zzq_ptr = _zzq_args; \
540 __asm__ volatile("mr 3,%1\n\t" \
542 __SPECIAL_INSTRUCTION_PREAMBLE \
546 : "=b" (_zzq_result) \
547 : "b" (_zzq_default), "b" (_zzq_ptr) \
548 : "cc", "memory", "r3", "r4"); \
552 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
553 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
554 unsigned long long int __addr; \
555 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
561 : "cc", "memory", "r3" \
563 _zzq_orig->nraddr = __addr; \
564 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
570 : "cc", "memory", "r3" \
572 _zzq_orig->r2 = __addr; \
575 #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
576 __SPECIAL_INSTRUCTION_PREAMBLE \
580 #define VALGRIND_VEX_INJECT_IR() \
582 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
591 #if defined(PLAT_arm_linux)
599 #define __SPECIAL_INSTRUCTION_PREAMBLE \
600 "mov r12, r12, ror #3 ; mov r12, r12, ror #13 \n\t" \
601 "mov r12, r12, ror #29 ; mov r12, r12, ror #19 \n\t"
603 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
604 _zzq_default, _zzq_request, \
605 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
608 ({volatile unsigned int _zzq_args[6]; \
609 volatile unsigned int _zzq_result; \
610 _zzq_args[0] = (unsigned int)(_zzq_request); \
611 _zzq_args[1] = (unsigned int)(_zzq_arg1); \
612 _zzq_args[2] = (unsigned int)(_zzq_arg2); \
613 _zzq_args[3] = (unsigned int)(_zzq_arg3); \
614 _zzq_args[4] = (unsigned int)(_zzq_arg4); \
615 _zzq_args[5] = (unsigned int)(_zzq_arg5); \
616 __asm__ volatile("mov r3, %1\n\t" \
618 __SPECIAL_INSTRUCTION_PREAMBLE \
620 "orr r10, r10, r10\n\t" \
622 : "=r" (_zzq_result) \
623 : "r" (_zzq_default), "r" (&_zzq_args[0]) \
624 : "cc","memory", "r3", "r4"); \
628 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
629 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
630 unsigned int __addr; \
631 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
633 "orr r11, r11, r11\n\t" \
637 : "cc", "memory", "r3" \
639 _zzq_orig->nraddr = __addr; \
642 #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
643 __SPECIAL_INSTRUCTION_PREAMBLE \
645 "orr r12, r12, r12\n\t"
647 #define VALGRIND_VEX_INJECT_IR() \
649 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
650 "orr r9, r9, r9\n\t" \
651 : : : "cc", "memory" \
659 #if defined(PLAT_s390x_linux)
663 unsigned long long int nraddr;
671 #define __SPECIAL_INSTRUCTION_PREAMBLE \
677 #define __CLIENT_REQUEST_CODE "lr 2,2\n\t"
678 #define __GET_NR_CONTEXT_CODE "lr 3,3\n\t"
679 #define __CALL_NO_REDIR_CODE "lr 4,4\n\t"
680 #define __VEX_INJECT_IR_CODE "lr 5,5\n\t"
682 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
683 _zzq_default, _zzq_request, \
684 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
686 ({volatile unsigned long long int _zzq_args[6]; \
687 volatile unsigned long long int _zzq_result; \
688 _zzq_args[0] = (unsigned long long int)(_zzq_request); \
689 _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \
690 _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \
691 _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \
692 _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \
693 _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \
698 __SPECIAL_INSTRUCTION_PREAMBLE \
699 __CLIENT_REQUEST_CODE \
702 : "=d" (_zzq_result) \
703 : "a" (&_zzq_args[0]), "0" (_zzq_default) \
704 : "cc", "2", "3", "memory" \
709 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
710 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
711 volatile unsigned long long int __addr; \
712 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
713 __GET_NR_CONTEXT_CODE \
717 : "cc", "3", "memory" \
719 _zzq_orig->nraddr = __addr; \
722 #define VALGRIND_CALL_NOREDIR_R1 \
723 __SPECIAL_INSTRUCTION_PREAMBLE \
726 #define VALGRIND_VEX_INJECT_IR() \
728 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
729 __VEX_INJECT_IR_CODE); \
736 #if defined(PLAT_mips32_linux)
748 #define __SPECIAL_INSTRUCTION_PREAMBLE \
749 "srl $0, $0, 13\n\t" \
750 "srl $0, $0, 29\n\t" \
751 "srl $0, $0, 3\n\t" \
754 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
755 _zzq_default, _zzq_request, \
756 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
758 ({ volatile unsigned int _zzq_args[6]; \
759 volatile unsigned int _zzq_result; \
760 _zzq_args[0] = (unsigned int)(_zzq_request); \
761 _zzq_args[1] = (unsigned int)(_zzq_arg1); \
762 _zzq_args[2] = (unsigned int)(_zzq_arg2); \
763 _zzq_args[3] = (unsigned int)(_zzq_arg3); \
764 _zzq_args[4] = (unsigned int)(_zzq_arg4); \
765 _zzq_args[5] = (unsigned int)(_zzq_arg5); \
766 __asm__ volatile("move $11, %1\n\t" \
768 __SPECIAL_INSTRUCTION_PREAMBLE \
770 "or $13, $13, $13\n\t" \
772 : "=r" (_zzq_result) \
773 : "r" (_zzq_default), "r" (&_zzq_args[0]) \
778 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
779 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
780 volatile unsigned int __addr; \
781 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
783 "or $14, $14, $14\n\t" \
789 _zzq_orig->nraddr = __addr; \
792 #define VALGRIND_CALL_NOREDIR_T9 \
793 __SPECIAL_INSTRUCTION_PREAMBLE \
795 "or $15, $15, $15\n\t"
797 #define VALGRIND_VEX_INJECT_IR() \
799 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
800 "or $11, $11, $11\n\t" \
809 #if defined(PLAT_mips64_linux)
813 unsigned long long nraddr;
821 #define __SPECIAL_INSTRUCTION_PREAMBLE \
822 "dsll $0,$0, 3 ; dsll $0,$0,13\n\t" \
823 "dsll $0,$0,29 ; dsll $0,$0,19\n\t"
825 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
826 _zzq_default, _zzq_request, \
827 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
829 ({ volatile unsigned long long int _zzq_args[6]; \
830 volatile unsigned long long int _zzq_result; \
831 _zzq_args[0] = (unsigned long long int)(_zzq_request); \
832 _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \
833 _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \
834 _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \
835 _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \
836 _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \
837 __asm__ volatile("move $11, %1\n\t" \
839 __SPECIAL_INSTRUCTION_PREAMBLE \
841 "or $13, $13, $13\n\t" \
843 : "=r" (_zzq_result) \
844 : "r" (_zzq_default), "r" (&_zzq_args[0]) \
849 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
850 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
851 volatile unsigned long long int __addr; \
852 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
854 "or $14, $14, $14\n\t" \
859 _zzq_orig->nraddr = __addr; \
862 #define VALGRIND_CALL_NOREDIR_T9 \
863 __SPECIAL_INSTRUCTION_PREAMBLE \
865 "or $15, $15, $15\n\t"
867 #define VALGRIND_VEX_INJECT_IR() \
869 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
870 "or $11, $11, $11\n\t" \
912 #define VG_CONCAT4(_aa,_bb,_cc,_dd) _aa##_bb##_cc##_dd
914 #define I_WRAP_SONAME_FNNAME_ZU(soname,fnname) \
915 VG_CONCAT4(_vgw00000ZU_,soname,_,fnname)
917 #define I_WRAP_SONAME_FNNAME_ZZ(soname,fnname) \
918 VG_CONCAT4(_vgw00000ZZ_,soname,_,fnname)
924 #define VALGRIND_GET_ORIG_FN(_lval) VALGRIND_GET_NR_CONTEXT(_lval)
932 #define I_REPLACE_SONAME_FNNAME_ZU(soname,fnname) \
933 VG_CONCAT4(_vgr00000ZU_,soname,_,fnname)
935 #define I_REPLACE_SONAME_FNNAME_ZZ(soname,fnname) \
936 VG_CONCAT4(_vgr00000ZZ_,soname,_,fnname)
941 #define CALL_FN_v_v(fnptr) \
942 do { volatile unsigned long _junk; \
943 CALL_FN_W_v(_junk,fnptr); } while (0)
945 #define CALL_FN_v_W(fnptr, arg1) \
946 do { volatile unsigned long _junk; \
947 CALL_FN_W_W(_junk,fnptr,arg1); } while (0)
949 #define CALL_FN_v_WW(fnptr, arg1,arg2) \
950 do { volatile unsigned long _junk; \
951 CALL_FN_W_WW(_junk,fnptr,arg1,arg2); } while (0)
953 #define CALL_FN_v_WWW(fnptr, arg1,arg2,arg3) \
954 do { volatile unsigned long _junk; \
955 CALL_FN_W_WWW(_junk,fnptr,arg1,arg2,arg3); } while (0)
957 #define CALL_FN_v_WWWW(fnptr, arg1,arg2,arg3,arg4) \
958 do { volatile unsigned long _junk; \
959 CALL_FN_W_WWWW(_junk,fnptr,arg1,arg2,arg3,arg4); } while (0)
961 #define CALL_FN_v_5W(fnptr, arg1,arg2,arg3,arg4,arg5) \
962 do { volatile unsigned long _junk; \
963 CALL_FN_W_5W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5); } while (0)
965 #define CALL_FN_v_6W(fnptr, arg1,arg2,arg3,arg4,arg5,arg6) \
966 do { volatile unsigned long _junk; \
967 CALL_FN_W_6W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5,arg6); } while (0)
969 #define CALL_FN_v_7W(fnptr, arg1,arg2,arg3,arg4,arg5,arg6,arg7) \
970 do { volatile unsigned long _junk; \
971 CALL_FN_W_7W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5,arg6,arg7); } while (0)
975 #if defined(PLAT_x86_linux) || defined(PLAT_x86_darwin)
979 #define __CALLER_SAVED_REGS "ecx", "edx"
986 #define VALGRIND_ALIGN_STACK \
987 "movl %%esp,%%edi\n\t" \
988 "andl $0xfffffff0,%%esp\n\t"
989 #define VALGRIND_RESTORE_STACK \
990 "movl %%edi,%%esp\n\t"
995 #define CALL_FN_W_v(lval, orig) \
997 volatile OrigFn _orig = (orig); \
998 volatile unsigned long _argvec[1]; \
999 volatile unsigned long _res; \
1000 _argvec[0] = (unsigned long)_orig.nraddr; \
1002 VALGRIND_ALIGN_STACK \
1003 "movl (%%eax), %%eax\n\t" \
1004 VALGRIND_CALL_NOREDIR_EAX \
1005 VALGRIND_RESTORE_STACK \
1007 : "a" (&_argvec[0]) \
1008 : "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1010 lval = (__typeof__(lval)) _res; \
1013 #define CALL_FN_W_W(lval, orig, arg1) \
1015 volatile OrigFn _orig = (orig); \
1016 volatile unsigned long _argvec[2]; \
1017 volatile unsigned long _res; \
1018 _argvec[0] = (unsigned long)_orig.nraddr; \
1019 _argvec[1] = (unsigned long)(arg1); \
1021 VALGRIND_ALIGN_STACK \
1022 "subl $12, %%esp\n\t" \
1023 "pushl 4(%%eax)\n\t" \
1024 "movl (%%eax), %%eax\n\t" \
1025 VALGRIND_CALL_NOREDIR_EAX \
1026 VALGRIND_RESTORE_STACK \
1028 : "a" (&_argvec[0]) \
1029 : "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1031 lval = (__typeof__(lval)) _res; \
1034 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
1036 volatile OrigFn _orig = (orig); \
1037 volatile unsigned long _argvec[3]; \
1038 volatile unsigned long _res; \
1039 _argvec[0] = (unsigned long)_orig.nraddr; \
1040 _argvec[1] = (unsigned long)(arg1); \
1041 _argvec[2] = (unsigned long)(arg2); \
1043 VALGRIND_ALIGN_STACK \
1044 "subl $8, %%esp\n\t" \
1045 "pushl 8(%%eax)\n\t" \
1046 "pushl 4(%%eax)\n\t" \
1047 "movl (%%eax), %%eax\n\t" \
1048 VALGRIND_CALL_NOREDIR_EAX \
1049 VALGRIND_RESTORE_STACK \
1051 : "a" (&_argvec[0]) \
1052 : "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1054 lval = (__typeof__(lval)) _res; \
1057 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
1059 volatile OrigFn _orig = (orig); \
1060 volatile unsigned long _argvec[4]; \
1061 volatile unsigned long _res; \
1062 _argvec[0] = (unsigned long)_orig.nraddr; \
1063 _argvec[1] = (unsigned long)(arg1); \
1064 _argvec[2] = (unsigned long)(arg2); \
1065 _argvec[3] = (unsigned long)(arg3); \
1067 VALGRIND_ALIGN_STACK \
1068 "subl $4, %%esp\n\t" \
1069 "pushl 12(%%eax)\n\t" \
1070 "pushl 8(%%eax)\n\t" \
1071 "pushl 4(%%eax)\n\t" \
1072 "movl (%%eax), %%eax\n\t" \
1073 VALGRIND_CALL_NOREDIR_EAX \
1074 VALGRIND_RESTORE_STACK \
1076 : "a" (&_argvec[0]) \
1077 : "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1079 lval = (__typeof__(lval)) _res; \
1082 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
1084 volatile OrigFn _orig = (orig); \
1085 volatile unsigned long _argvec[5]; \
1086 volatile unsigned long _res; \
1087 _argvec[0] = (unsigned long)_orig.nraddr; \
1088 _argvec[1] = (unsigned long)(arg1); \
1089 _argvec[2] = (unsigned long)(arg2); \
1090 _argvec[3] = (unsigned long)(arg3); \
1091 _argvec[4] = (unsigned long)(arg4); \
1093 VALGRIND_ALIGN_STACK \
1094 "pushl 16(%%eax)\n\t" \
1095 "pushl 12(%%eax)\n\t" \
1096 "pushl 8(%%eax)\n\t" \
1097 "pushl 4(%%eax)\n\t" \
1098 "movl (%%eax), %%eax\n\t" \
1099 VALGRIND_CALL_NOREDIR_EAX \
1100 VALGRIND_RESTORE_STACK \
1102 : "a" (&_argvec[0]) \
1103 : "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1105 lval = (__typeof__(lval)) _res; \
1108 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
1110 volatile OrigFn _orig = (orig); \
1111 volatile unsigned long _argvec[6]; \
1112 volatile unsigned long _res; \
1113 _argvec[0] = (unsigned long)_orig.nraddr; \
1114 _argvec[1] = (unsigned long)(arg1); \
1115 _argvec[2] = (unsigned long)(arg2); \
1116 _argvec[3] = (unsigned long)(arg3); \
1117 _argvec[4] = (unsigned long)(arg4); \
1118 _argvec[5] = (unsigned long)(arg5); \
1120 VALGRIND_ALIGN_STACK \
1121 "subl $12, %%esp\n\t" \
1122 "pushl 20(%%eax)\n\t" \
1123 "pushl 16(%%eax)\n\t" \
1124 "pushl 12(%%eax)\n\t" \
1125 "pushl 8(%%eax)\n\t" \
1126 "pushl 4(%%eax)\n\t" \
1127 "movl (%%eax), %%eax\n\t" \
1128 VALGRIND_CALL_NOREDIR_EAX \
1129 VALGRIND_RESTORE_STACK \
1131 : "a" (&_argvec[0]) \
1132 : "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1134 lval = (__typeof__(lval)) _res; \
1137 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
1139 volatile OrigFn _orig = (orig); \
1140 volatile unsigned long _argvec[7]; \
1141 volatile unsigned long _res; \
1142 _argvec[0] = (unsigned long)_orig.nraddr; \
1143 _argvec[1] = (unsigned long)(arg1); \
1144 _argvec[2] = (unsigned long)(arg2); \
1145 _argvec[3] = (unsigned long)(arg3); \
1146 _argvec[4] = (unsigned long)(arg4); \
1147 _argvec[5] = (unsigned long)(arg5); \
1148 _argvec[6] = (unsigned long)(arg6); \
1150 VALGRIND_ALIGN_STACK \
1151 "subl $8, %%esp\n\t" \
1152 "pushl 24(%%eax)\n\t" \
1153 "pushl 20(%%eax)\n\t" \
1154 "pushl 16(%%eax)\n\t" \
1155 "pushl 12(%%eax)\n\t" \
1156 "pushl 8(%%eax)\n\t" \
1157 "pushl 4(%%eax)\n\t" \
1158 "movl (%%eax), %%eax\n\t" \
1159 VALGRIND_CALL_NOREDIR_EAX \
1160 VALGRIND_RESTORE_STACK \
1162 : "a" (&_argvec[0]) \
1163 : "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1165 lval = (__typeof__(lval)) _res; \
1168 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1171 volatile OrigFn _orig = (orig); \
1172 volatile unsigned long _argvec[8]; \
1173 volatile unsigned long _res; \
1174 _argvec[0] = (unsigned long)_orig.nraddr; \
1175 _argvec[1] = (unsigned long)(arg1); \
1176 _argvec[2] = (unsigned long)(arg2); \
1177 _argvec[3] = (unsigned long)(arg3); \
1178 _argvec[4] = (unsigned long)(arg4); \
1179 _argvec[5] = (unsigned long)(arg5); \
1180 _argvec[6] = (unsigned long)(arg6); \
1181 _argvec[7] = (unsigned long)(arg7); \
1183 VALGRIND_ALIGN_STACK \
1184 "subl $4, %%esp\n\t" \
1185 "pushl 28(%%eax)\n\t" \
1186 "pushl 24(%%eax)\n\t" \
1187 "pushl 20(%%eax)\n\t" \
1188 "pushl 16(%%eax)\n\t" \
1189 "pushl 12(%%eax)\n\t" \
1190 "pushl 8(%%eax)\n\t" \
1191 "pushl 4(%%eax)\n\t" \
1192 "movl (%%eax), %%eax\n\t" \
1193 VALGRIND_CALL_NOREDIR_EAX \
1194 VALGRIND_RESTORE_STACK \
1196 : "a" (&_argvec[0]) \
1197 : "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1199 lval = (__typeof__(lval)) _res; \
1202 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1205 volatile OrigFn _orig = (orig); \
1206 volatile unsigned long _argvec[9]; \
1207 volatile unsigned long _res; \
1208 _argvec[0] = (unsigned long)_orig.nraddr; \
1209 _argvec[1] = (unsigned long)(arg1); \
1210 _argvec[2] = (unsigned long)(arg2); \
1211 _argvec[3] = (unsigned long)(arg3); \
1212 _argvec[4] = (unsigned long)(arg4); \
1213 _argvec[5] = (unsigned long)(arg5); \
1214 _argvec[6] = (unsigned long)(arg6); \
1215 _argvec[7] = (unsigned long)(arg7); \
1216 _argvec[8] = (unsigned long)(arg8); \
1218 VALGRIND_ALIGN_STACK \
1219 "pushl 32(%%eax)\n\t" \
1220 "pushl 28(%%eax)\n\t" \
1221 "pushl 24(%%eax)\n\t" \
1222 "pushl 20(%%eax)\n\t" \
1223 "pushl 16(%%eax)\n\t" \
1224 "pushl 12(%%eax)\n\t" \
1225 "pushl 8(%%eax)\n\t" \
1226 "pushl 4(%%eax)\n\t" \
1227 "movl (%%eax), %%eax\n\t" \
1228 VALGRIND_CALL_NOREDIR_EAX \
1229 VALGRIND_RESTORE_STACK \
1231 : "a" (&_argvec[0]) \
1232 : "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1234 lval = (__typeof__(lval)) _res; \
1237 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1240 volatile OrigFn _orig = (orig); \
1241 volatile unsigned long _argvec[10]; \
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); \
1248 _argvec[5] = (unsigned long)(arg5); \
1249 _argvec[6] = (unsigned long)(arg6); \
1250 _argvec[7] = (unsigned long)(arg7); \
1251 _argvec[8] = (unsigned long)(arg8); \
1252 _argvec[9] = (unsigned long)(arg9); \
1254 VALGRIND_ALIGN_STACK \
1255 "subl $12, %%esp\n\t" \
1256 "pushl 36(%%eax)\n\t" \
1257 "pushl 32(%%eax)\n\t" \
1258 "pushl 28(%%eax)\n\t" \
1259 "pushl 24(%%eax)\n\t" \
1260 "pushl 20(%%eax)\n\t" \
1261 "pushl 16(%%eax)\n\t" \
1262 "pushl 12(%%eax)\n\t" \
1263 "pushl 8(%%eax)\n\t" \
1264 "pushl 4(%%eax)\n\t" \
1265 "movl (%%eax), %%eax\n\t" \
1266 VALGRIND_CALL_NOREDIR_EAX \
1267 VALGRIND_RESTORE_STACK \
1269 : "a" (&_argvec[0]) \
1270 : "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1272 lval = (__typeof__(lval)) _res; \
1275 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1276 arg7,arg8,arg9,arg10) \
1278 volatile OrigFn _orig = (orig); \
1279 volatile unsigned long _argvec[11]; \
1280 volatile unsigned long _res; \
1281 _argvec[0] = (unsigned long)_orig.nraddr; \
1282 _argvec[1] = (unsigned long)(arg1); \
1283 _argvec[2] = (unsigned long)(arg2); \
1284 _argvec[3] = (unsigned long)(arg3); \
1285 _argvec[4] = (unsigned long)(arg4); \
1286 _argvec[5] = (unsigned long)(arg5); \
1287 _argvec[6] = (unsigned long)(arg6); \
1288 _argvec[7] = (unsigned long)(arg7); \
1289 _argvec[8] = (unsigned long)(arg8); \
1290 _argvec[9] = (unsigned long)(arg9); \
1291 _argvec[10] = (unsigned long)(arg10); \
1293 VALGRIND_ALIGN_STACK \
1294 "subl $8, %%esp\n\t" \
1295 "pushl 40(%%eax)\n\t" \
1296 "pushl 36(%%eax)\n\t" \
1297 "pushl 32(%%eax)\n\t" \
1298 "pushl 28(%%eax)\n\t" \
1299 "pushl 24(%%eax)\n\t" \
1300 "pushl 20(%%eax)\n\t" \
1301 "pushl 16(%%eax)\n\t" \
1302 "pushl 12(%%eax)\n\t" \
1303 "pushl 8(%%eax)\n\t" \
1304 "pushl 4(%%eax)\n\t" \
1305 "movl (%%eax), %%eax\n\t" \
1306 VALGRIND_CALL_NOREDIR_EAX \
1307 VALGRIND_RESTORE_STACK \
1309 : "a" (&_argvec[0]) \
1310 : "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1312 lval = (__typeof__(lval)) _res; \
1315 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
1316 arg6,arg7,arg8,arg9,arg10, \
1319 volatile OrigFn _orig = (orig); \
1320 volatile unsigned long _argvec[12]; \
1321 volatile unsigned long _res; \
1322 _argvec[0] = (unsigned long)_orig.nraddr; \
1323 _argvec[1] = (unsigned long)(arg1); \
1324 _argvec[2] = (unsigned long)(arg2); \
1325 _argvec[3] = (unsigned long)(arg3); \
1326 _argvec[4] = (unsigned long)(arg4); \
1327 _argvec[5] = (unsigned long)(arg5); \
1328 _argvec[6] = (unsigned long)(arg6); \
1329 _argvec[7] = (unsigned long)(arg7); \
1330 _argvec[8] = (unsigned long)(arg8); \
1331 _argvec[9] = (unsigned long)(arg9); \
1332 _argvec[10] = (unsigned long)(arg10); \
1333 _argvec[11] = (unsigned long)(arg11); \
1335 VALGRIND_ALIGN_STACK \
1336 "subl $4, %%esp\n\t" \
1337 "pushl 44(%%eax)\n\t" \
1338 "pushl 40(%%eax)\n\t" \
1339 "pushl 36(%%eax)\n\t" \
1340 "pushl 32(%%eax)\n\t" \
1341 "pushl 28(%%eax)\n\t" \
1342 "pushl 24(%%eax)\n\t" \
1343 "pushl 20(%%eax)\n\t" \
1344 "pushl 16(%%eax)\n\t" \
1345 "pushl 12(%%eax)\n\t" \
1346 "pushl 8(%%eax)\n\t" \
1347 "pushl 4(%%eax)\n\t" \
1348 "movl (%%eax), %%eax\n\t" \
1349 VALGRIND_CALL_NOREDIR_EAX \
1350 VALGRIND_RESTORE_STACK \
1352 : "a" (&_argvec[0]) \
1353 : "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1355 lval = (__typeof__(lval)) _res; \
1358 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
1359 arg6,arg7,arg8,arg9,arg10, \
1362 volatile OrigFn _orig = (orig); \
1363 volatile unsigned long _argvec[13]; \
1364 volatile unsigned long _res; \
1365 _argvec[0] = (unsigned long)_orig.nraddr; \
1366 _argvec[1] = (unsigned long)(arg1); \
1367 _argvec[2] = (unsigned long)(arg2); \
1368 _argvec[3] = (unsigned long)(arg3); \
1369 _argvec[4] = (unsigned long)(arg4); \
1370 _argvec[5] = (unsigned long)(arg5); \
1371 _argvec[6] = (unsigned long)(arg6); \
1372 _argvec[7] = (unsigned long)(arg7); \
1373 _argvec[8] = (unsigned long)(arg8); \
1374 _argvec[9] = (unsigned long)(arg9); \
1375 _argvec[10] = (unsigned long)(arg10); \
1376 _argvec[11] = (unsigned long)(arg11); \
1377 _argvec[12] = (unsigned long)(arg12); \
1379 VALGRIND_ALIGN_STACK \
1380 "pushl 48(%%eax)\n\t" \
1381 "pushl 44(%%eax)\n\t" \
1382 "pushl 40(%%eax)\n\t" \
1383 "pushl 36(%%eax)\n\t" \
1384 "pushl 32(%%eax)\n\t" \
1385 "pushl 28(%%eax)\n\t" \
1386 "pushl 24(%%eax)\n\t" \
1387 "pushl 20(%%eax)\n\t" \
1388 "pushl 16(%%eax)\n\t" \
1389 "pushl 12(%%eax)\n\t" \
1390 "pushl 8(%%eax)\n\t" \
1391 "pushl 4(%%eax)\n\t" \
1392 "movl (%%eax), %%eax\n\t" \
1393 VALGRIND_CALL_NOREDIR_EAX \
1394 VALGRIND_RESTORE_STACK \
1396 : "a" (&_argvec[0]) \
1397 : "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1399 lval = (__typeof__(lval)) _res; \
1406 #if defined(PLAT_amd64_linux) || defined(PLAT_amd64_darwin)
1411 #define __CALLER_SAVED_REGS "rcx", "rdx", "rsi", \
1412 "rdi", "r8", "r9", "r10", "r11"
1468 #if defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM)
1469 # define __FRAME_POINTER \
1470 ,"r"(__builtin_dwarf_cfa())
1471 # define VALGRIND_CFI_PROLOGUE \
1472 "movq %%rbp, %%r15\n\t" \
1473 "movq %2, %%rbp\n\t" \
1474 ".cfi_remember_state\n\t" \
1475 ".cfi_def_cfa rbp, 0\n\t"
1476 # define VALGRIND_CFI_EPILOGUE \
1477 "movq %%r15, %%rbp\n\t" \
1478 ".cfi_restore_state\n\t"
1480 # define __FRAME_POINTER
1481 # define VALGRIND_CFI_PROLOGUE
1482 # define VALGRIND_CFI_EPILOGUE
1490 #define VALGRIND_ALIGN_STACK \
1491 "movq %%rsp,%%r14\n\t" \
1492 "andq $0xfffffffffffffff0,%%rsp\n\t"
1493 #define VALGRIND_RESTORE_STACK \
1494 "movq %%r14,%%rsp\n\t"
1520 #define CALL_FN_W_v(lval, orig) \
1522 volatile OrigFn _orig = (orig); \
1523 volatile unsigned long _argvec[1]; \
1524 volatile unsigned long _res; \
1525 _argvec[0] = (unsigned long)_orig.nraddr; \
1527 VALGRIND_CFI_PROLOGUE \
1528 VALGRIND_ALIGN_STACK \
1529 "subq $128,%%rsp\n\t" \
1530 "movq (%%rax), %%rax\n\t" \
1531 VALGRIND_CALL_NOREDIR_RAX \
1532 VALGRIND_RESTORE_STACK \
1533 VALGRIND_CFI_EPILOGUE \
1535 : "a" (&_argvec[0]) __FRAME_POINTER \
1536 : "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1538 lval = (__typeof__(lval)) _res; \
1541 #define CALL_FN_W_W(lval, orig, arg1) \
1543 volatile OrigFn _orig = (orig); \
1544 volatile unsigned long _argvec[2]; \
1545 volatile unsigned long _res; \
1546 _argvec[0] = (unsigned long)_orig.nraddr; \
1547 _argvec[1] = (unsigned long)(arg1); \
1549 VALGRIND_CFI_PROLOGUE \
1550 VALGRIND_ALIGN_STACK \
1551 "subq $128,%%rsp\n\t" \
1552 "movq 8(%%rax), %%rdi\n\t" \
1553 "movq (%%rax), %%rax\n\t" \
1554 VALGRIND_CALL_NOREDIR_RAX \
1555 VALGRIND_RESTORE_STACK \
1556 VALGRIND_CFI_EPILOGUE \
1558 : "a" (&_argvec[0]) __FRAME_POINTER \
1559 : "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1561 lval = (__typeof__(lval)) _res; \
1564 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
1566 volatile OrigFn _orig = (orig); \
1567 volatile unsigned long _argvec[3]; \
1568 volatile unsigned long _res; \
1569 _argvec[0] = (unsigned long)_orig.nraddr; \
1570 _argvec[1] = (unsigned long)(arg1); \
1571 _argvec[2] = (unsigned long)(arg2); \
1573 VALGRIND_CFI_PROLOGUE \
1574 VALGRIND_ALIGN_STACK \
1575 "subq $128,%%rsp\n\t" \
1576 "movq 16(%%rax), %%rsi\n\t" \
1577 "movq 8(%%rax), %%rdi\n\t" \
1578 "movq (%%rax), %%rax\n\t" \
1579 VALGRIND_CALL_NOREDIR_RAX \
1580 VALGRIND_RESTORE_STACK \
1581 VALGRIND_CFI_EPILOGUE \
1583 : "a" (&_argvec[0]) __FRAME_POINTER \
1584 : "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1586 lval = (__typeof__(lval)) _res; \
1589 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
1591 volatile OrigFn _orig = (orig); \
1592 volatile unsigned long _argvec[4]; \
1593 volatile unsigned long _res; \
1594 _argvec[0] = (unsigned long)_orig.nraddr; \
1595 _argvec[1] = (unsigned long)(arg1); \
1596 _argvec[2] = (unsigned long)(arg2); \
1597 _argvec[3] = (unsigned long)(arg3); \
1599 VALGRIND_CFI_PROLOGUE \
1600 VALGRIND_ALIGN_STACK \
1601 "subq $128,%%rsp\n\t" \
1602 "movq 24(%%rax), %%rdx\n\t" \
1603 "movq 16(%%rax), %%rsi\n\t" \
1604 "movq 8(%%rax), %%rdi\n\t" \
1605 "movq (%%rax), %%rax\n\t" \
1606 VALGRIND_CALL_NOREDIR_RAX \
1607 VALGRIND_RESTORE_STACK \
1608 VALGRIND_CFI_EPILOGUE \
1610 : "a" (&_argvec[0]) __FRAME_POINTER \
1611 : "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1613 lval = (__typeof__(lval)) _res; \
1616 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
1618 volatile OrigFn _orig = (orig); \
1619 volatile unsigned long _argvec[5]; \
1620 volatile unsigned long _res; \
1621 _argvec[0] = (unsigned long)_orig.nraddr; \
1622 _argvec[1] = (unsigned long)(arg1); \
1623 _argvec[2] = (unsigned long)(arg2); \
1624 _argvec[3] = (unsigned long)(arg3); \
1625 _argvec[4] = (unsigned long)(arg4); \
1627 VALGRIND_CFI_PROLOGUE \
1628 VALGRIND_ALIGN_STACK \
1629 "subq $128,%%rsp\n\t" \
1630 "movq 32(%%rax), %%rcx\n\t" \
1631 "movq 24(%%rax), %%rdx\n\t" \
1632 "movq 16(%%rax), %%rsi\n\t" \
1633 "movq 8(%%rax), %%rdi\n\t" \
1634 "movq (%%rax), %%rax\n\t" \
1635 VALGRIND_CALL_NOREDIR_RAX \
1636 VALGRIND_RESTORE_STACK \
1637 VALGRIND_CFI_EPILOGUE \
1639 : "a" (&_argvec[0]) __FRAME_POINTER \
1640 : "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1642 lval = (__typeof__(lval)) _res; \
1645 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
1647 volatile OrigFn _orig = (orig); \
1648 volatile unsigned long _argvec[6]; \
1649 volatile unsigned long _res; \
1650 _argvec[0] = (unsigned long)_orig.nraddr; \
1651 _argvec[1] = (unsigned long)(arg1); \
1652 _argvec[2] = (unsigned long)(arg2); \
1653 _argvec[3] = (unsigned long)(arg3); \
1654 _argvec[4] = (unsigned long)(arg4); \
1655 _argvec[5] = (unsigned long)(arg5); \
1657 VALGRIND_CFI_PROLOGUE \
1658 VALGRIND_ALIGN_STACK \
1659 "subq $128,%%rsp\n\t" \
1660 "movq 40(%%rax), %%r8\n\t" \
1661 "movq 32(%%rax), %%rcx\n\t" \
1662 "movq 24(%%rax), %%rdx\n\t" \
1663 "movq 16(%%rax), %%rsi\n\t" \
1664 "movq 8(%%rax), %%rdi\n\t" \
1665 "movq (%%rax), %%rax\n\t" \
1666 VALGRIND_CALL_NOREDIR_RAX \
1667 VALGRIND_RESTORE_STACK \
1668 VALGRIND_CFI_EPILOGUE \
1670 : "a" (&_argvec[0]) __FRAME_POINTER \
1671 : "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1673 lval = (__typeof__(lval)) _res; \
1676 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
1678 volatile OrigFn _orig = (orig); \
1679 volatile unsigned long _argvec[7]; \
1680 volatile unsigned long _res; \
1681 _argvec[0] = (unsigned long)_orig.nraddr; \
1682 _argvec[1] = (unsigned long)(arg1); \
1683 _argvec[2] = (unsigned long)(arg2); \
1684 _argvec[3] = (unsigned long)(arg3); \
1685 _argvec[4] = (unsigned long)(arg4); \
1686 _argvec[5] = (unsigned long)(arg5); \
1687 _argvec[6] = (unsigned long)(arg6); \
1689 VALGRIND_CFI_PROLOGUE \
1690 VALGRIND_ALIGN_STACK \
1691 "subq $128,%%rsp\n\t" \
1692 "movq 48(%%rax), %%r9\n\t" \
1693 "movq 40(%%rax), %%r8\n\t" \
1694 "movq 32(%%rax), %%rcx\n\t" \
1695 "movq 24(%%rax), %%rdx\n\t" \
1696 "movq 16(%%rax), %%rsi\n\t" \
1697 "movq 8(%%rax), %%rdi\n\t" \
1698 "movq (%%rax), %%rax\n\t" \
1699 VALGRIND_CALL_NOREDIR_RAX \
1700 VALGRIND_RESTORE_STACK \
1701 VALGRIND_CFI_EPILOGUE \
1703 : "a" (&_argvec[0]) __FRAME_POINTER \
1704 : "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1706 lval = (__typeof__(lval)) _res; \
1709 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1712 volatile OrigFn _orig = (orig); \
1713 volatile unsigned long _argvec[8]; \
1714 volatile unsigned long _res; \
1715 _argvec[0] = (unsigned long)_orig.nraddr; \
1716 _argvec[1] = (unsigned long)(arg1); \
1717 _argvec[2] = (unsigned long)(arg2); \
1718 _argvec[3] = (unsigned long)(arg3); \
1719 _argvec[4] = (unsigned long)(arg4); \
1720 _argvec[5] = (unsigned long)(arg5); \
1721 _argvec[6] = (unsigned long)(arg6); \
1722 _argvec[7] = (unsigned long)(arg7); \
1724 VALGRIND_CFI_PROLOGUE \
1725 VALGRIND_ALIGN_STACK \
1726 "subq $136,%%rsp\n\t" \
1727 "pushq 56(%%rax)\n\t" \
1728 "movq 48(%%rax), %%r9\n\t" \
1729 "movq 40(%%rax), %%r8\n\t" \
1730 "movq 32(%%rax), %%rcx\n\t" \
1731 "movq 24(%%rax), %%rdx\n\t" \
1732 "movq 16(%%rax), %%rsi\n\t" \
1733 "movq 8(%%rax), %%rdi\n\t" \
1734 "movq (%%rax), %%rax\n\t" \
1735 VALGRIND_CALL_NOREDIR_RAX \
1736 VALGRIND_RESTORE_STACK \
1737 VALGRIND_CFI_EPILOGUE \
1739 : "a" (&_argvec[0]) __FRAME_POINTER \
1740 : "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1742 lval = (__typeof__(lval)) _res; \
1745 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1748 volatile OrigFn _orig = (orig); \
1749 volatile unsigned long _argvec[9]; \
1750 volatile unsigned long _res; \
1751 _argvec[0] = (unsigned long)_orig.nraddr; \
1752 _argvec[1] = (unsigned long)(arg1); \
1753 _argvec[2] = (unsigned long)(arg2); \
1754 _argvec[3] = (unsigned long)(arg3); \
1755 _argvec[4] = (unsigned long)(arg4); \
1756 _argvec[5] = (unsigned long)(arg5); \
1757 _argvec[6] = (unsigned long)(arg6); \
1758 _argvec[7] = (unsigned long)(arg7); \
1759 _argvec[8] = (unsigned long)(arg8); \
1761 VALGRIND_CFI_PROLOGUE \
1762 VALGRIND_ALIGN_STACK \
1763 "subq $128,%%rsp\n\t" \
1764 "pushq 64(%%rax)\n\t" \
1765 "pushq 56(%%rax)\n\t" \
1766 "movq 48(%%rax), %%r9\n\t" \
1767 "movq 40(%%rax), %%r8\n\t" \
1768 "movq 32(%%rax), %%rcx\n\t" \
1769 "movq 24(%%rax), %%rdx\n\t" \
1770 "movq 16(%%rax), %%rsi\n\t" \
1771 "movq 8(%%rax), %%rdi\n\t" \
1772 "movq (%%rax), %%rax\n\t" \
1773 VALGRIND_CALL_NOREDIR_RAX \
1774 VALGRIND_RESTORE_STACK \
1775 VALGRIND_CFI_EPILOGUE \
1777 : "a" (&_argvec[0]) __FRAME_POINTER \
1778 : "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1780 lval = (__typeof__(lval)) _res; \
1783 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1786 volatile OrigFn _orig = (orig); \
1787 volatile unsigned long _argvec[10]; \
1788 volatile unsigned long _res; \
1789 _argvec[0] = (unsigned long)_orig.nraddr; \
1790 _argvec[1] = (unsigned long)(arg1); \
1791 _argvec[2] = (unsigned long)(arg2); \
1792 _argvec[3] = (unsigned long)(arg3); \
1793 _argvec[4] = (unsigned long)(arg4); \
1794 _argvec[5] = (unsigned long)(arg5); \
1795 _argvec[6] = (unsigned long)(arg6); \
1796 _argvec[7] = (unsigned long)(arg7); \
1797 _argvec[8] = (unsigned long)(arg8); \
1798 _argvec[9] = (unsigned long)(arg9); \
1800 VALGRIND_CFI_PROLOGUE \
1801 VALGRIND_ALIGN_STACK \
1802 "subq $136,%%rsp\n\t" \
1803 "pushq 72(%%rax)\n\t" \
1804 "pushq 64(%%rax)\n\t" \
1805 "pushq 56(%%rax)\n\t" \
1806 "movq 48(%%rax), %%r9\n\t" \
1807 "movq 40(%%rax), %%r8\n\t" \
1808 "movq 32(%%rax), %%rcx\n\t" \
1809 "movq 24(%%rax), %%rdx\n\t" \
1810 "movq 16(%%rax), %%rsi\n\t" \
1811 "movq 8(%%rax), %%rdi\n\t" \
1812 "movq (%%rax), %%rax\n\t" \
1813 VALGRIND_CALL_NOREDIR_RAX \
1814 VALGRIND_RESTORE_STACK \
1815 VALGRIND_CFI_EPILOGUE \
1817 : "a" (&_argvec[0]) __FRAME_POINTER \
1818 : "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1820 lval = (__typeof__(lval)) _res; \
1823 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1824 arg7,arg8,arg9,arg10) \
1826 volatile OrigFn _orig = (orig); \
1827 volatile unsigned long _argvec[11]; \
1828 volatile unsigned long _res; \
1829 _argvec[0] = (unsigned long)_orig.nraddr; \
1830 _argvec[1] = (unsigned long)(arg1); \
1831 _argvec[2] = (unsigned long)(arg2); \
1832 _argvec[3] = (unsigned long)(arg3); \
1833 _argvec[4] = (unsigned long)(arg4); \
1834 _argvec[5] = (unsigned long)(arg5); \
1835 _argvec[6] = (unsigned long)(arg6); \
1836 _argvec[7] = (unsigned long)(arg7); \
1837 _argvec[8] = (unsigned long)(arg8); \
1838 _argvec[9] = (unsigned long)(arg9); \
1839 _argvec[10] = (unsigned long)(arg10); \
1841 VALGRIND_CFI_PROLOGUE \
1842 VALGRIND_ALIGN_STACK \
1843 "subq $128,%%rsp\n\t" \
1844 "pushq 80(%%rax)\n\t" \
1845 "pushq 72(%%rax)\n\t" \
1846 "pushq 64(%%rax)\n\t" \
1847 "pushq 56(%%rax)\n\t" \
1848 "movq 48(%%rax), %%r9\n\t" \
1849 "movq 40(%%rax), %%r8\n\t" \
1850 "movq 32(%%rax), %%rcx\n\t" \
1851 "movq 24(%%rax), %%rdx\n\t" \
1852 "movq 16(%%rax), %%rsi\n\t" \
1853 "movq 8(%%rax), %%rdi\n\t" \
1854 "movq (%%rax), %%rax\n\t" \
1855 VALGRIND_CALL_NOREDIR_RAX \
1856 VALGRIND_RESTORE_STACK \
1857 VALGRIND_CFI_EPILOGUE \
1859 : "a" (&_argvec[0]) __FRAME_POINTER \
1860 : "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1862 lval = (__typeof__(lval)) _res; \
1865 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1866 arg7,arg8,arg9,arg10,arg11) \
1868 volatile OrigFn _orig = (orig); \
1869 volatile unsigned long _argvec[12]; \
1870 volatile unsigned long _res; \
1871 _argvec[0] = (unsigned long)_orig.nraddr; \
1872 _argvec[1] = (unsigned long)(arg1); \
1873 _argvec[2] = (unsigned long)(arg2); \
1874 _argvec[3] = (unsigned long)(arg3); \
1875 _argvec[4] = (unsigned long)(arg4); \
1876 _argvec[5] = (unsigned long)(arg5); \
1877 _argvec[6] = (unsigned long)(arg6); \
1878 _argvec[7] = (unsigned long)(arg7); \
1879 _argvec[8] = (unsigned long)(arg8); \
1880 _argvec[9] = (unsigned long)(arg9); \
1881 _argvec[10] = (unsigned long)(arg10); \
1882 _argvec[11] = (unsigned long)(arg11); \
1884 VALGRIND_CFI_PROLOGUE \
1885 VALGRIND_ALIGN_STACK \
1886 "subq $136,%%rsp\n\t" \
1887 "pushq 88(%%rax)\n\t" \
1888 "pushq 80(%%rax)\n\t" \
1889 "pushq 72(%%rax)\n\t" \
1890 "pushq 64(%%rax)\n\t" \
1891 "pushq 56(%%rax)\n\t" \
1892 "movq 48(%%rax), %%r9\n\t" \
1893 "movq 40(%%rax), %%r8\n\t" \
1894 "movq 32(%%rax), %%rcx\n\t" \
1895 "movq 24(%%rax), %%rdx\n\t" \
1896 "movq 16(%%rax), %%rsi\n\t" \
1897 "movq 8(%%rax), %%rdi\n\t" \
1898 "movq (%%rax), %%rax\n\t" \
1899 VALGRIND_CALL_NOREDIR_RAX \
1900 VALGRIND_RESTORE_STACK \
1901 VALGRIND_CFI_EPILOGUE \
1903 : "a" (&_argvec[0]) __FRAME_POINTER \
1904 : "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1906 lval = (__typeof__(lval)) _res; \
1909 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1910 arg7,arg8,arg9,arg10,arg11,arg12) \
1912 volatile OrigFn _orig = (orig); \
1913 volatile unsigned long _argvec[13]; \
1914 volatile unsigned long _res; \
1915 _argvec[0] = (unsigned long)_orig.nraddr; \
1916 _argvec[1] = (unsigned long)(arg1); \
1917 _argvec[2] = (unsigned long)(arg2); \
1918 _argvec[3] = (unsigned long)(arg3); \
1919 _argvec[4] = (unsigned long)(arg4); \
1920 _argvec[5] = (unsigned long)(arg5); \
1921 _argvec[6] = (unsigned long)(arg6); \
1922 _argvec[7] = (unsigned long)(arg7); \
1923 _argvec[8] = (unsigned long)(arg8); \
1924 _argvec[9] = (unsigned long)(arg9); \
1925 _argvec[10] = (unsigned long)(arg10); \
1926 _argvec[11] = (unsigned long)(arg11); \
1927 _argvec[12] = (unsigned long)(arg12); \
1929 VALGRIND_CFI_PROLOGUE \
1930 VALGRIND_ALIGN_STACK \
1931 "subq $128,%%rsp\n\t" \
1932 "pushq 96(%%rax)\n\t" \
1933 "pushq 88(%%rax)\n\t" \
1934 "pushq 80(%%rax)\n\t" \
1935 "pushq 72(%%rax)\n\t" \
1936 "pushq 64(%%rax)\n\t" \
1937 "pushq 56(%%rax)\n\t" \
1938 "movq 48(%%rax), %%r9\n\t" \
1939 "movq 40(%%rax), %%r8\n\t" \
1940 "movq 32(%%rax), %%rcx\n\t" \
1941 "movq 24(%%rax), %%rdx\n\t" \
1942 "movq 16(%%rax), %%rsi\n\t" \
1943 "movq 8(%%rax), %%rdi\n\t" \
1944 "movq (%%rax), %%rax\n\t" \
1945 VALGRIND_CALL_NOREDIR_RAX \
1946 VALGRIND_RESTORE_STACK \
1947 VALGRIND_CFI_EPILOGUE \
1949 : "a" (&_argvec[0]) __FRAME_POINTER \
1950 : "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1952 lval = (__typeof__(lval)) _res; \
1959 #if defined(PLAT_ppc32_linux)
1985 #define __CALLER_SAVED_REGS \
1986 "lr", "ctr", "xer", \
1987 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \
1988 "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \
1996 #define VALGRIND_ALIGN_STACK \
1998 "rlwinm 1,1,0,0,27\n\t"
1999 #define VALGRIND_RESTORE_STACK \
2005 #define CALL_FN_W_v(lval, orig) \
2007 volatile OrigFn _orig = (orig); \
2008 volatile unsigned long _argvec[1]; \
2009 volatile unsigned long _res; \
2010 _argvec[0] = (unsigned long)_orig.nraddr; \
2012 VALGRIND_ALIGN_STACK \
2014 "lwz 11,0(11)\n\t" \
2015 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2016 VALGRIND_RESTORE_STACK \
2019 : "r" (&_argvec[0]) \
2020 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2022 lval = (__typeof__(lval)) _res; \
2025 #define CALL_FN_W_W(lval, orig, arg1) \
2027 volatile OrigFn _orig = (orig); \
2028 volatile unsigned long _argvec[2]; \
2029 volatile unsigned long _res; \
2030 _argvec[0] = (unsigned long)_orig.nraddr; \
2031 _argvec[1] = (unsigned long)arg1; \
2033 VALGRIND_ALIGN_STACK \
2036 "lwz 11,0(11)\n\t" \
2037 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2038 VALGRIND_RESTORE_STACK \
2041 : "r" (&_argvec[0]) \
2042 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2044 lval = (__typeof__(lval)) _res; \
2047 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
2049 volatile OrigFn _orig = (orig); \
2050 volatile unsigned long _argvec[3]; \
2051 volatile unsigned long _res; \
2052 _argvec[0] = (unsigned long)_orig.nraddr; \
2053 _argvec[1] = (unsigned long)arg1; \
2054 _argvec[2] = (unsigned long)arg2; \
2056 VALGRIND_ALIGN_STACK \
2060 "lwz 11,0(11)\n\t" \
2061 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2062 VALGRIND_RESTORE_STACK \
2065 : "r" (&_argvec[0]) \
2066 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2068 lval = (__typeof__(lval)) _res; \
2071 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
2073 volatile OrigFn _orig = (orig); \
2074 volatile unsigned long _argvec[4]; \
2075 volatile unsigned long _res; \
2076 _argvec[0] = (unsigned long)_orig.nraddr; \
2077 _argvec[1] = (unsigned long)arg1; \
2078 _argvec[2] = (unsigned long)arg2; \
2079 _argvec[3] = (unsigned long)arg3; \
2081 VALGRIND_ALIGN_STACK \
2085 "lwz 5,12(11)\n\t" \
2086 "lwz 11,0(11)\n\t" \
2087 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2088 VALGRIND_RESTORE_STACK \
2091 : "r" (&_argvec[0]) \
2092 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2094 lval = (__typeof__(lval)) _res; \
2097 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
2099 volatile OrigFn _orig = (orig); \
2100 volatile unsigned long _argvec[5]; \
2101 volatile unsigned long _res; \
2102 _argvec[0] = (unsigned long)_orig.nraddr; \
2103 _argvec[1] = (unsigned long)arg1; \
2104 _argvec[2] = (unsigned long)arg2; \
2105 _argvec[3] = (unsigned long)arg3; \
2106 _argvec[4] = (unsigned long)arg4; \
2108 VALGRIND_ALIGN_STACK \
2112 "lwz 5,12(11)\n\t" \
2113 "lwz 6,16(11)\n\t" \
2114 "lwz 11,0(11)\n\t" \
2115 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2116 VALGRIND_RESTORE_STACK \
2119 : "r" (&_argvec[0]) \
2120 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2122 lval = (__typeof__(lval)) _res; \
2125 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
2127 volatile OrigFn _orig = (orig); \
2128 volatile unsigned long _argvec[6]; \
2129 volatile unsigned long _res; \
2130 _argvec[0] = (unsigned long)_orig.nraddr; \
2131 _argvec[1] = (unsigned long)arg1; \
2132 _argvec[2] = (unsigned long)arg2; \
2133 _argvec[3] = (unsigned long)arg3; \
2134 _argvec[4] = (unsigned long)arg4; \
2135 _argvec[5] = (unsigned long)arg5; \
2137 VALGRIND_ALIGN_STACK \
2141 "lwz 5,12(11)\n\t" \
2142 "lwz 6,16(11)\n\t" \
2143 "lwz 7,20(11)\n\t" \
2144 "lwz 11,0(11)\n\t" \
2145 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2146 VALGRIND_RESTORE_STACK \
2149 : "r" (&_argvec[0]) \
2150 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2152 lval = (__typeof__(lval)) _res; \
2155 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
2157 volatile OrigFn _orig = (orig); \
2158 volatile unsigned long _argvec[7]; \
2159 volatile unsigned long _res; \
2160 _argvec[0] = (unsigned long)_orig.nraddr; \
2161 _argvec[1] = (unsigned long)arg1; \
2162 _argvec[2] = (unsigned long)arg2; \
2163 _argvec[3] = (unsigned long)arg3; \
2164 _argvec[4] = (unsigned long)arg4; \
2165 _argvec[5] = (unsigned long)arg5; \
2166 _argvec[6] = (unsigned long)arg6; \
2168 VALGRIND_ALIGN_STACK \
2172 "lwz 5,12(11)\n\t" \
2173 "lwz 6,16(11)\n\t" \
2174 "lwz 7,20(11)\n\t" \
2175 "lwz 8,24(11)\n\t" \
2176 "lwz 11,0(11)\n\t" \
2177 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2178 VALGRIND_RESTORE_STACK \
2181 : "r" (&_argvec[0]) \
2182 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2184 lval = (__typeof__(lval)) _res; \
2187 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2190 volatile OrigFn _orig = (orig); \
2191 volatile unsigned long _argvec[8]; \
2192 volatile unsigned long _res; \
2193 _argvec[0] = (unsigned long)_orig.nraddr; \
2194 _argvec[1] = (unsigned long)arg1; \
2195 _argvec[2] = (unsigned long)arg2; \
2196 _argvec[3] = (unsigned long)arg3; \
2197 _argvec[4] = (unsigned long)arg4; \
2198 _argvec[5] = (unsigned long)arg5; \
2199 _argvec[6] = (unsigned long)arg6; \
2200 _argvec[7] = (unsigned long)arg7; \
2202 VALGRIND_ALIGN_STACK \
2206 "lwz 5,12(11)\n\t" \
2207 "lwz 6,16(11)\n\t" \
2208 "lwz 7,20(11)\n\t" \
2209 "lwz 8,24(11)\n\t" \
2210 "lwz 9,28(11)\n\t" \
2211 "lwz 11,0(11)\n\t" \
2212 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2213 VALGRIND_RESTORE_STACK \
2216 : "r" (&_argvec[0]) \
2217 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2219 lval = (__typeof__(lval)) _res; \
2222 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2225 volatile OrigFn _orig = (orig); \
2226 volatile unsigned long _argvec[9]; \
2227 volatile unsigned long _res; \
2228 _argvec[0] = (unsigned long)_orig.nraddr; \
2229 _argvec[1] = (unsigned long)arg1; \
2230 _argvec[2] = (unsigned long)arg2; \
2231 _argvec[3] = (unsigned long)arg3; \
2232 _argvec[4] = (unsigned long)arg4; \
2233 _argvec[5] = (unsigned long)arg5; \
2234 _argvec[6] = (unsigned long)arg6; \
2235 _argvec[7] = (unsigned long)arg7; \
2236 _argvec[8] = (unsigned long)arg8; \
2238 VALGRIND_ALIGN_STACK \
2242 "lwz 5,12(11)\n\t" \
2243 "lwz 6,16(11)\n\t" \
2244 "lwz 7,20(11)\n\t" \
2245 "lwz 8,24(11)\n\t" \
2246 "lwz 9,28(11)\n\t" \
2247 "lwz 10,32(11)\n\t" \
2248 "lwz 11,0(11)\n\t" \
2249 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2250 VALGRIND_RESTORE_STACK \
2253 : "r" (&_argvec[0]) \
2254 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2256 lval = (__typeof__(lval)) _res; \
2259 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2262 volatile OrigFn _orig = (orig); \
2263 volatile unsigned long _argvec[10]; \
2264 volatile unsigned long _res; \
2265 _argvec[0] = (unsigned long)_orig.nraddr; \
2266 _argvec[1] = (unsigned long)arg1; \
2267 _argvec[2] = (unsigned long)arg2; \
2268 _argvec[3] = (unsigned long)arg3; \
2269 _argvec[4] = (unsigned long)arg4; \
2270 _argvec[5] = (unsigned long)arg5; \
2271 _argvec[6] = (unsigned long)arg6; \
2272 _argvec[7] = (unsigned long)arg7; \
2273 _argvec[8] = (unsigned long)arg8; \
2274 _argvec[9] = (unsigned long)arg9; \
2276 VALGRIND_ALIGN_STACK \
2278 "addi 1,1,-16\n\t" \
2280 "lwz 3,36(11)\n\t" \
2285 "lwz 5,12(11)\n\t" \
2286 "lwz 6,16(11)\n\t" \
2287 "lwz 7,20(11)\n\t" \
2288 "lwz 8,24(11)\n\t" \
2289 "lwz 9,28(11)\n\t" \
2290 "lwz 10,32(11)\n\t" \
2291 "lwz 11,0(11)\n\t" \
2292 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2293 VALGRIND_RESTORE_STACK \
2296 : "r" (&_argvec[0]) \
2297 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2299 lval = (__typeof__(lval)) _res; \
2302 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2303 arg7,arg8,arg9,arg10) \
2305 volatile OrigFn _orig = (orig); \
2306 volatile unsigned long _argvec[11]; \
2307 volatile unsigned long _res; \
2308 _argvec[0] = (unsigned long)_orig.nraddr; \
2309 _argvec[1] = (unsigned long)arg1; \
2310 _argvec[2] = (unsigned long)arg2; \
2311 _argvec[3] = (unsigned long)arg3; \
2312 _argvec[4] = (unsigned long)arg4; \
2313 _argvec[5] = (unsigned long)arg5; \
2314 _argvec[6] = (unsigned long)arg6; \
2315 _argvec[7] = (unsigned long)arg7; \
2316 _argvec[8] = (unsigned long)arg8; \
2317 _argvec[9] = (unsigned long)arg9; \
2318 _argvec[10] = (unsigned long)arg10; \
2320 VALGRIND_ALIGN_STACK \
2322 "addi 1,1,-16\n\t" \
2324 "lwz 3,40(11)\n\t" \
2327 "lwz 3,36(11)\n\t" \
2332 "lwz 5,12(11)\n\t" \
2333 "lwz 6,16(11)\n\t" \
2334 "lwz 7,20(11)\n\t" \
2335 "lwz 8,24(11)\n\t" \
2336 "lwz 9,28(11)\n\t" \
2337 "lwz 10,32(11)\n\t" \
2338 "lwz 11,0(11)\n\t" \
2339 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2340 VALGRIND_RESTORE_STACK \
2343 : "r" (&_argvec[0]) \
2344 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2346 lval = (__typeof__(lval)) _res; \
2349 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2350 arg7,arg8,arg9,arg10,arg11) \
2352 volatile OrigFn _orig = (orig); \
2353 volatile unsigned long _argvec[12]; \
2354 volatile unsigned long _res; \
2355 _argvec[0] = (unsigned long)_orig.nraddr; \
2356 _argvec[1] = (unsigned long)arg1; \
2357 _argvec[2] = (unsigned long)arg2; \
2358 _argvec[3] = (unsigned long)arg3; \
2359 _argvec[4] = (unsigned long)arg4; \
2360 _argvec[5] = (unsigned long)arg5; \
2361 _argvec[6] = (unsigned long)arg6; \
2362 _argvec[7] = (unsigned long)arg7; \
2363 _argvec[8] = (unsigned long)arg8; \
2364 _argvec[9] = (unsigned long)arg9; \
2365 _argvec[10] = (unsigned long)arg10; \
2366 _argvec[11] = (unsigned long)arg11; \
2368 VALGRIND_ALIGN_STACK \
2370 "addi 1,1,-32\n\t" \
2372 "lwz 3,44(11)\n\t" \
2375 "lwz 3,40(11)\n\t" \
2378 "lwz 3,36(11)\n\t" \
2383 "lwz 5,12(11)\n\t" \
2384 "lwz 6,16(11)\n\t" \
2385 "lwz 7,20(11)\n\t" \
2386 "lwz 8,24(11)\n\t" \
2387 "lwz 9,28(11)\n\t" \
2388 "lwz 10,32(11)\n\t" \
2389 "lwz 11,0(11)\n\t" \
2390 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2391 VALGRIND_RESTORE_STACK \
2394 : "r" (&_argvec[0]) \
2395 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2397 lval = (__typeof__(lval)) _res; \
2400 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2401 arg7,arg8,arg9,arg10,arg11,arg12) \
2403 volatile OrigFn _orig = (orig); \
2404 volatile unsigned long _argvec[13]; \
2405 volatile unsigned long _res; \
2406 _argvec[0] = (unsigned long)_orig.nraddr; \
2407 _argvec[1] = (unsigned long)arg1; \
2408 _argvec[2] = (unsigned long)arg2; \
2409 _argvec[3] = (unsigned long)arg3; \
2410 _argvec[4] = (unsigned long)arg4; \
2411 _argvec[5] = (unsigned long)arg5; \
2412 _argvec[6] = (unsigned long)arg6; \
2413 _argvec[7] = (unsigned long)arg7; \
2414 _argvec[8] = (unsigned long)arg8; \
2415 _argvec[9] = (unsigned long)arg9; \
2416 _argvec[10] = (unsigned long)arg10; \
2417 _argvec[11] = (unsigned long)arg11; \
2418 _argvec[12] = (unsigned long)arg12; \
2420 VALGRIND_ALIGN_STACK \
2422 "addi 1,1,-32\n\t" \
2424 "lwz 3,48(11)\n\t" \
2427 "lwz 3,44(11)\n\t" \
2430 "lwz 3,40(11)\n\t" \
2433 "lwz 3,36(11)\n\t" \
2438 "lwz 5,12(11)\n\t" \
2439 "lwz 6,16(11)\n\t" \
2440 "lwz 7,20(11)\n\t" \
2441 "lwz 8,24(11)\n\t" \
2442 "lwz 9,28(11)\n\t" \
2443 "lwz 10,32(11)\n\t" \
2444 "lwz 11,0(11)\n\t" \
2445 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2446 VALGRIND_RESTORE_STACK \
2449 : "r" (&_argvec[0]) \
2450 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2452 lval = (__typeof__(lval)) _res; \
2459 #if defined(PLAT_ppc64_linux)
2464 #define __CALLER_SAVED_REGS \
2465 "lr", "ctr", "xer", \
2466 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \
2467 "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \
2475 #define VALGRIND_ALIGN_STACK \
2477 "rldicr 1,1,0,59\n\t"
2478 #define VALGRIND_RESTORE_STACK \
2484 #define CALL_FN_W_v(lval, orig) \
2486 volatile OrigFn _orig = (orig); \
2487 volatile unsigned long _argvec[3+0]; \
2488 volatile unsigned long _res; \
2490 _argvec[1] = (unsigned long)_orig.r2; \
2491 _argvec[2] = (unsigned long)_orig.nraddr; \
2493 VALGRIND_ALIGN_STACK \
2495 "std 2,-16(11)\n\t" \
2497 "ld 11, 0(11)\n\t" \
2498 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2501 "ld 2,-16(11)\n\t" \
2502 VALGRIND_RESTORE_STACK \
2504 : "r" (&_argvec[2]) \
2505 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2507 lval = (__typeof__(lval)) _res; \
2510 #define CALL_FN_W_W(lval, orig, arg1) \
2512 volatile OrigFn _orig = (orig); \
2513 volatile unsigned long _argvec[3+1]; \
2514 volatile unsigned long _res; \
2516 _argvec[1] = (unsigned long)_orig.r2; \
2517 _argvec[2] = (unsigned long)_orig.nraddr; \
2518 _argvec[2+1] = (unsigned long)arg1; \
2520 VALGRIND_ALIGN_STACK \
2522 "std 2,-16(11)\n\t" \
2525 "ld 11, 0(11)\n\t" \
2526 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2529 "ld 2,-16(11)\n\t" \
2530 VALGRIND_RESTORE_STACK \
2532 : "r" (&_argvec[2]) \
2533 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2535 lval = (__typeof__(lval)) _res; \
2538 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
2540 volatile OrigFn _orig = (orig); \
2541 volatile unsigned long _argvec[3+2]; \
2542 volatile unsigned long _res; \
2544 _argvec[1] = (unsigned long)_orig.r2; \
2545 _argvec[2] = (unsigned long)_orig.nraddr; \
2546 _argvec[2+1] = (unsigned long)arg1; \
2547 _argvec[2+2] = (unsigned long)arg2; \
2549 VALGRIND_ALIGN_STACK \
2551 "std 2,-16(11)\n\t" \
2554 "ld 4, 16(11)\n\t" \
2555 "ld 11, 0(11)\n\t" \
2556 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2559 "ld 2,-16(11)\n\t" \
2560 VALGRIND_RESTORE_STACK \
2562 : "r" (&_argvec[2]) \
2563 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2565 lval = (__typeof__(lval)) _res; \
2568 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
2570 volatile OrigFn _orig = (orig); \
2571 volatile unsigned long _argvec[3+3]; \
2572 volatile unsigned long _res; \
2574 _argvec[1] = (unsigned long)_orig.r2; \
2575 _argvec[2] = (unsigned long)_orig.nraddr; \
2576 _argvec[2+1] = (unsigned long)arg1; \
2577 _argvec[2+2] = (unsigned long)arg2; \
2578 _argvec[2+3] = (unsigned long)arg3; \
2580 VALGRIND_ALIGN_STACK \
2582 "std 2,-16(11)\n\t" \
2585 "ld 4, 16(11)\n\t" \
2586 "ld 5, 24(11)\n\t" \
2587 "ld 11, 0(11)\n\t" \
2588 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2591 "ld 2,-16(11)\n\t" \
2592 VALGRIND_RESTORE_STACK \
2594 : "r" (&_argvec[2]) \
2595 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2597 lval = (__typeof__(lval)) _res; \
2600 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
2602 volatile OrigFn _orig = (orig); \
2603 volatile unsigned long _argvec[3+4]; \
2604 volatile unsigned long _res; \
2606 _argvec[1] = (unsigned long)_orig.r2; \
2607 _argvec[2] = (unsigned long)_orig.nraddr; \
2608 _argvec[2+1] = (unsigned long)arg1; \
2609 _argvec[2+2] = (unsigned long)arg2; \
2610 _argvec[2+3] = (unsigned long)arg3; \
2611 _argvec[2+4] = (unsigned long)arg4; \
2613 VALGRIND_ALIGN_STACK \
2615 "std 2,-16(11)\n\t" \
2618 "ld 4, 16(11)\n\t" \
2619 "ld 5, 24(11)\n\t" \
2620 "ld 6, 32(11)\n\t" \
2621 "ld 11, 0(11)\n\t" \
2622 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2625 "ld 2,-16(11)\n\t" \
2626 VALGRIND_RESTORE_STACK \
2628 : "r" (&_argvec[2]) \
2629 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2631 lval = (__typeof__(lval)) _res; \
2634 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
2636 volatile OrigFn _orig = (orig); \
2637 volatile unsigned long _argvec[3+5]; \
2638 volatile unsigned long _res; \
2640 _argvec[1] = (unsigned long)_orig.r2; \
2641 _argvec[2] = (unsigned long)_orig.nraddr; \
2642 _argvec[2+1] = (unsigned long)arg1; \
2643 _argvec[2+2] = (unsigned long)arg2; \
2644 _argvec[2+3] = (unsigned long)arg3; \
2645 _argvec[2+4] = (unsigned long)arg4; \
2646 _argvec[2+5] = (unsigned long)arg5; \
2648 VALGRIND_ALIGN_STACK \
2650 "std 2,-16(11)\n\t" \
2653 "ld 4, 16(11)\n\t" \
2654 "ld 5, 24(11)\n\t" \
2655 "ld 6, 32(11)\n\t" \
2656 "ld 7, 40(11)\n\t" \
2657 "ld 11, 0(11)\n\t" \
2658 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2661 "ld 2,-16(11)\n\t" \
2662 VALGRIND_RESTORE_STACK \
2664 : "r" (&_argvec[2]) \
2665 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2667 lval = (__typeof__(lval)) _res; \
2670 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
2672 volatile OrigFn _orig = (orig); \
2673 volatile unsigned long _argvec[3+6]; \
2674 volatile unsigned long _res; \
2676 _argvec[1] = (unsigned long)_orig.r2; \
2677 _argvec[2] = (unsigned long)_orig.nraddr; \
2678 _argvec[2+1] = (unsigned long)arg1; \
2679 _argvec[2+2] = (unsigned long)arg2; \
2680 _argvec[2+3] = (unsigned long)arg3; \
2681 _argvec[2+4] = (unsigned long)arg4; \
2682 _argvec[2+5] = (unsigned long)arg5; \
2683 _argvec[2+6] = (unsigned long)arg6; \
2685 VALGRIND_ALIGN_STACK \
2687 "std 2,-16(11)\n\t" \
2690 "ld 4, 16(11)\n\t" \
2691 "ld 5, 24(11)\n\t" \
2692 "ld 6, 32(11)\n\t" \
2693 "ld 7, 40(11)\n\t" \
2694 "ld 8, 48(11)\n\t" \
2695 "ld 11, 0(11)\n\t" \
2696 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2699 "ld 2,-16(11)\n\t" \
2700 VALGRIND_RESTORE_STACK \
2702 : "r" (&_argvec[2]) \
2703 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2705 lval = (__typeof__(lval)) _res; \
2708 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2711 volatile OrigFn _orig = (orig); \
2712 volatile unsigned long _argvec[3+7]; \
2713 volatile unsigned long _res; \
2715 _argvec[1] = (unsigned long)_orig.r2; \
2716 _argvec[2] = (unsigned long)_orig.nraddr; \
2717 _argvec[2+1] = (unsigned long)arg1; \
2718 _argvec[2+2] = (unsigned long)arg2; \
2719 _argvec[2+3] = (unsigned long)arg3; \
2720 _argvec[2+4] = (unsigned long)arg4; \
2721 _argvec[2+5] = (unsigned long)arg5; \
2722 _argvec[2+6] = (unsigned long)arg6; \
2723 _argvec[2+7] = (unsigned long)arg7; \
2725 VALGRIND_ALIGN_STACK \
2727 "std 2,-16(11)\n\t" \
2730 "ld 4, 16(11)\n\t" \
2731 "ld 5, 24(11)\n\t" \
2732 "ld 6, 32(11)\n\t" \
2733 "ld 7, 40(11)\n\t" \
2734 "ld 8, 48(11)\n\t" \
2735 "ld 9, 56(11)\n\t" \
2736 "ld 11, 0(11)\n\t" \
2737 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2740 "ld 2,-16(11)\n\t" \
2741 VALGRIND_RESTORE_STACK \
2743 : "r" (&_argvec[2]) \
2744 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2746 lval = (__typeof__(lval)) _res; \
2749 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2752 volatile OrigFn _orig = (orig); \
2753 volatile unsigned long _argvec[3+8]; \
2754 volatile unsigned long _res; \
2756 _argvec[1] = (unsigned long)_orig.r2; \
2757 _argvec[2] = (unsigned long)_orig.nraddr; \
2758 _argvec[2+1] = (unsigned long)arg1; \
2759 _argvec[2+2] = (unsigned long)arg2; \
2760 _argvec[2+3] = (unsigned long)arg3; \
2761 _argvec[2+4] = (unsigned long)arg4; \
2762 _argvec[2+5] = (unsigned long)arg5; \
2763 _argvec[2+6] = (unsigned long)arg6; \
2764 _argvec[2+7] = (unsigned long)arg7; \
2765 _argvec[2+8] = (unsigned long)arg8; \
2767 VALGRIND_ALIGN_STACK \
2769 "std 2,-16(11)\n\t" \
2772 "ld 4, 16(11)\n\t" \
2773 "ld 5, 24(11)\n\t" \
2774 "ld 6, 32(11)\n\t" \
2775 "ld 7, 40(11)\n\t" \
2776 "ld 8, 48(11)\n\t" \
2777 "ld 9, 56(11)\n\t" \
2778 "ld 10, 64(11)\n\t" \
2779 "ld 11, 0(11)\n\t" \
2780 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2783 "ld 2,-16(11)\n\t" \
2784 VALGRIND_RESTORE_STACK \
2786 : "r" (&_argvec[2]) \
2787 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2789 lval = (__typeof__(lval)) _res; \
2792 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2795 volatile OrigFn _orig = (orig); \
2796 volatile unsigned long _argvec[3+9]; \
2797 volatile unsigned long _res; \
2799 _argvec[1] = (unsigned long)_orig.r2; \
2800 _argvec[2] = (unsigned long)_orig.nraddr; \
2801 _argvec[2+1] = (unsigned long)arg1; \
2802 _argvec[2+2] = (unsigned long)arg2; \
2803 _argvec[2+3] = (unsigned long)arg3; \
2804 _argvec[2+4] = (unsigned long)arg4; \
2805 _argvec[2+5] = (unsigned long)arg5; \
2806 _argvec[2+6] = (unsigned long)arg6; \
2807 _argvec[2+7] = (unsigned long)arg7; \
2808 _argvec[2+8] = (unsigned long)arg8; \
2809 _argvec[2+9] = (unsigned long)arg9; \
2811 VALGRIND_ALIGN_STACK \
2813 "std 2,-16(11)\n\t" \
2815 "addi 1,1,-128\n\t" \
2818 "std 3,112(1)\n\t" \
2821 "ld 4, 16(11)\n\t" \
2822 "ld 5, 24(11)\n\t" \
2823 "ld 6, 32(11)\n\t" \
2824 "ld 7, 40(11)\n\t" \
2825 "ld 8, 48(11)\n\t" \
2826 "ld 9, 56(11)\n\t" \
2827 "ld 10, 64(11)\n\t" \
2828 "ld 11, 0(11)\n\t" \
2829 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2832 "ld 2,-16(11)\n\t" \
2833 VALGRIND_RESTORE_STACK \
2835 : "r" (&_argvec[2]) \
2836 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2838 lval = (__typeof__(lval)) _res; \
2841 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2842 arg7,arg8,arg9,arg10) \
2844 volatile OrigFn _orig = (orig); \
2845 volatile unsigned long _argvec[3+10]; \
2846 volatile unsigned long _res; \
2848 _argvec[1] = (unsigned long)_orig.r2; \
2849 _argvec[2] = (unsigned long)_orig.nraddr; \
2850 _argvec[2+1] = (unsigned long)arg1; \
2851 _argvec[2+2] = (unsigned long)arg2; \
2852 _argvec[2+3] = (unsigned long)arg3; \
2853 _argvec[2+4] = (unsigned long)arg4; \
2854 _argvec[2+5] = (unsigned long)arg5; \
2855 _argvec[2+6] = (unsigned long)arg6; \
2856 _argvec[2+7] = (unsigned long)arg7; \
2857 _argvec[2+8] = (unsigned long)arg8; \
2858 _argvec[2+9] = (unsigned long)arg9; \
2859 _argvec[2+10] = (unsigned long)arg10; \
2861 VALGRIND_ALIGN_STACK \
2863 "std 2,-16(11)\n\t" \
2865 "addi 1,1,-128\n\t" \
2868 "std 3,120(1)\n\t" \
2871 "std 3,112(1)\n\t" \
2874 "ld 4, 16(11)\n\t" \
2875 "ld 5, 24(11)\n\t" \
2876 "ld 6, 32(11)\n\t" \
2877 "ld 7, 40(11)\n\t" \
2878 "ld 8, 48(11)\n\t" \
2879 "ld 9, 56(11)\n\t" \
2880 "ld 10, 64(11)\n\t" \
2881 "ld 11, 0(11)\n\t" \
2882 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2885 "ld 2,-16(11)\n\t" \
2886 VALGRIND_RESTORE_STACK \
2888 : "r" (&_argvec[2]) \
2889 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2891 lval = (__typeof__(lval)) _res; \
2894 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2895 arg7,arg8,arg9,arg10,arg11) \
2897 volatile OrigFn _orig = (orig); \
2898 volatile unsigned long _argvec[3+11]; \
2899 volatile unsigned long _res; \
2901 _argvec[1] = (unsigned long)_orig.r2; \
2902 _argvec[2] = (unsigned long)_orig.nraddr; \
2903 _argvec[2+1] = (unsigned long)arg1; \
2904 _argvec[2+2] = (unsigned long)arg2; \
2905 _argvec[2+3] = (unsigned long)arg3; \
2906 _argvec[2+4] = (unsigned long)arg4; \
2907 _argvec[2+5] = (unsigned long)arg5; \
2908 _argvec[2+6] = (unsigned long)arg6; \
2909 _argvec[2+7] = (unsigned long)arg7; \
2910 _argvec[2+8] = (unsigned long)arg8; \
2911 _argvec[2+9] = (unsigned long)arg9; \
2912 _argvec[2+10] = (unsigned long)arg10; \
2913 _argvec[2+11] = (unsigned long)arg11; \
2915 VALGRIND_ALIGN_STACK \
2917 "std 2,-16(11)\n\t" \
2919 "addi 1,1,-144\n\t" \
2922 "std 3,128(1)\n\t" \
2925 "std 3,120(1)\n\t" \
2928 "std 3,112(1)\n\t" \
2931 "ld 4, 16(11)\n\t" \
2932 "ld 5, 24(11)\n\t" \
2933 "ld 6, 32(11)\n\t" \
2934 "ld 7, 40(11)\n\t" \
2935 "ld 8, 48(11)\n\t" \
2936 "ld 9, 56(11)\n\t" \
2937 "ld 10, 64(11)\n\t" \
2938 "ld 11, 0(11)\n\t" \
2939 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2942 "ld 2,-16(11)\n\t" \
2943 VALGRIND_RESTORE_STACK \
2945 : "r" (&_argvec[2]) \
2946 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2948 lval = (__typeof__(lval)) _res; \
2951 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2952 arg7,arg8,arg9,arg10,arg11,arg12) \
2954 volatile OrigFn _orig = (orig); \
2955 volatile unsigned long _argvec[3+12]; \
2956 volatile unsigned long _res; \
2958 _argvec[1] = (unsigned long)_orig.r2; \
2959 _argvec[2] = (unsigned long)_orig.nraddr; \
2960 _argvec[2+1] = (unsigned long)arg1; \
2961 _argvec[2+2] = (unsigned long)arg2; \
2962 _argvec[2+3] = (unsigned long)arg3; \
2963 _argvec[2+4] = (unsigned long)arg4; \
2964 _argvec[2+5] = (unsigned long)arg5; \
2965 _argvec[2+6] = (unsigned long)arg6; \
2966 _argvec[2+7] = (unsigned long)arg7; \
2967 _argvec[2+8] = (unsigned long)arg8; \
2968 _argvec[2+9] = (unsigned long)arg9; \
2969 _argvec[2+10] = (unsigned long)arg10; \
2970 _argvec[2+11] = (unsigned long)arg11; \
2971 _argvec[2+12] = (unsigned long)arg12; \
2973 VALGRIND_ALIGN_STACK \
2975 "std 2,-16(11)\n\t" \
2977 "addi 1,1,-144\n\t" \
2980 "std 3,136(1)\n\t" \
2983 "std 3,128(1)\n\t" \
2986 "std 3,120(1)\n\t" \
2989 "std 3,112(1)\n\t" \
2992 "ld 4, 16(11)\n\t" \
2993 "ld 5, 24(11)\n\t" \
2994 "ld 6, 32(11)\n\t" \
2995 "ld 7, 40(11)\n\t" \
2996 "ld 8, 48(11)\n\t" \
2997 "ld 9, 56(11)\n\t" \
2998 "ld 10, 64(11)\n\t" \
2999 "ld 11, 0(11)\n\t" \
3000 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3003 "ld 2,-16(11)\n\t" \
3004 VALGRIND_RESTORE_STACK \
3006 : "r" (&_argvec[2]) \
3007 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3009 lval = (__typeof__(lval)) _res; \
3016 #if defined(PLAT_arm_linux)
3019 #define __CALLER_SAVED_REGS "r0", "r1", "r2", "r3","r4","r14"
3034 #define VALGRIND_ALIGN_STACK \
3037 "bic r4, r4, #7\n\t" \
3039 #define VALGRIND_RESTORE_STACK \
3045 #define CALL_FN_W_v(lval, orig) \
3047 volatile OrigFn _orig = (orig); \
3048 volatile unsigned long _argvec[1]; \
3049 volatile unsigned long _res; \
3050 _argvec[0] = (unsigned long)_orig.nraddr; \
3052 VALGRIND_ALIGN_STACK \
3053 "ldr r4, [%1] \n\t" \
3054 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
3055 VALGRIND_RESTORE_STACK \
3058 : "0" (&_argvec[0]) \
3059 : "cc", "memory", __CALLER_SAVED_REGS, "r10" \
3061 lval = (__typeof__(lval)) _res; \
3064 #define CALL_FN_W_W(lval, orig, arg1) \
3066 volatile OrigFn _orig = (orig); \
3067 volatile unsigned long _argvec[2]; \
3068 volatile unsigned long _res; \
3069 _argvec[0] = (unsigned long)_orig.nraddr; \
3070 _argvec[1] = (unsigned long)(arg1); \
3072 VALGRIND_ALIGN_STACK \
3073 "ldr r0, [%1, #4] \n\t" \
3074 "ldr r4, [%1] \n\t" \
3075 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
3076 VALGRIND_RESTORE_STACK \
3079 : "0" (&_argvec[0]) \
3080 : "cc", "memory", __CALLER_SAVED_REGS, "r10" \
3082 lval = (__typeof__(lval)) _res; \
3085 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
3087 volatile OrigFn _orig = (orig); \
3088 volatile unsigned long _argvec[3]; \
3089 volatile unsigned long _res; \
3090 _argvec[0] = (unsigned long)_orig.nraddr; \
3091 _argvec[1] = (unsigned long)(arg1); \
3092 _argvec[2] = (unsigned long)(arg2); \
3094 VALGRIND_ALIGN_STACK \
3095 "ldr r0, [%1, #4] \n\t" \
3096 "ldr r1, [%1, #8] \n\t" \
3097 "ldr r4, [%1] \n\t" \
3098 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
3099 VALGRIND_RESTORE_STACK \
3102 : "0" (&_argvec[0]) \
3103 : "cc", "memory", __CALLER_SAVED_REGS, "r10" \
3105 lval = (__typeof__(lval)) _res; \
3108 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
3110 volatile OrigFn _orig = (orig); \
3111 volatile unsigned long _argvec[4]; \
3112 volatile unsigned long _res; \
3113 _argvec[0] = (unsigned long)_orig.nraddr; \
3114 _argvec[1] = (unsigned long)(arg1); \
3115 _argvec[2] = (unsigned long)(arg2); \
3116 _argvec[3] = (unsigned long)(arg3); \
3118 VALGRIND_ALIGN_STACK \
3119 "ldr r0, [%1, #4] \n\t" \
3120 "ldr r1, [%1, #8] \n\t" \
3121 "ldr r2, [%1, #12] \n\t" \
3122 "ldr r4, [%1] \n\t" \
3123 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
3124 VALGRIND_RESTORE_STACK \
3127 : "0" (&_argvec[0]) \
3128 : "cc", "memory", __CALLER_SAVED_REGS, "r10" \
3130 lval = (__typeof__(lval)) _res; \
3133 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
3135 volatile OrigFn _orig = (orig); \
3136 volatile unsigned long _argvec[5]; \
3137 volatile unsigned long _res; \
3138 _argvec[0] = (unsigned long)_orig.nraddr; \
3139 _argvec[1] = (unsigned long)(arg1); \
3140 _argvec[2] = (unsigned long)(arg2); \
3141 _argvec[3] = (unsigned long)(arg3); \
3142 _argvec[4] = (unsigned long)(arg4); \
3144 VALGRIND_ALIGN_STACK \
3145 "ldr r0, [%1, #4] \n\t" \
3146 "ldr r1, [%1, #8] \n\t" \
3147 "ldr r2, [%1, #12] \n\t" \
3148 "ldr r3, [%1, #16] \n\t" \
3149 "ldr r4, [%1] \n\t" \
3150 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
3151 VALGRIND_RESTORE_STACK \
3154 : "0" (&_argvec[0]) \
3155 : "cc", "memory", __CALLER_SAVED_REGS, "r10" \
3157 lval = (__typeof__(lval)) _res; \
3160 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
3162 volatile OrigFn _orig = (orig); \
3163 volatile unsigned long _argvec[6]; \
3164 volatile unsigned long _res; \
3165 _argvec[0] = (unsigned long)_orig.nraddr; \
3166 _argvec[1] = (unsigned long)(arg1); \
3167 _argvec[2] = (unsigned long)(arg2); \
3168 _argvec[3] = (unsigned long)(arg3); \
3169 _argvec[4] = (unsigned long)(arg4); \
3170 _argvec[5] = (unsigned long)(arg5); \
3172 VALGRIND_ALIGN_STACK \
3173 "sub sp, sp, #4 \n\t" \
3174 "ldr r0, [%1, #20] \n\t" \
3176 "ldr r0, [%1, #4] \n\t" \
3177 "ldr r1, [%1, #8] \n\t" \
3178 "ldr r2, [%1, #12] \n\t" \
3179 "ldr r3, [%1, #16] \n\t" \
3180 "ldr r4, [%1] \n\t" \
3181 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
3182 VALGRIND_RESTORE_STACK \
3185 : "0" (&_argvec[0]) \
3186 : "cc", "memory", __CALLER_SAVED_REGS, "r10" \
3188 lval = (__typeof__(lval)) _res; \
3191 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
3193 volatile OrigFn _orig = (orig); \
3194 volatile unsigned long _argvec[7]; \
3195 volatile unsigned long _res; \
3196 _argvec[0] = (unsigned long)_orig.nraddr; \
3197 _argvec[1] = (unsigned long)(arg1); \
3198 _argvec[2] = (unsigned long)(arg2); \
3199 _argvec[3] = (unsigned long)(arg3); \
3200 _argvec[4] = (unsigned long)(arg4); \
3201 _argvec[5] = (unsigned long)(arg5); \
3202 _argvec[6] = (unsigned long)(arg6); \
3204 VALGRIND_ALIGN_STACK \
3205 "ldr r0, [%1, #20] \n\t" \
3206 "ldr r1, [%1, #24] \n\t" \
3207 "push {r0, r1} \n\t" \
3208 "ldr r0, [%1, #4] \n\t" \
3209 "ldr r1, [%1, #8] \n\t" \
3210 "ldr r2, [%1, #12] \n\t" \
3211 "ldr r3, [%1, #16] \n\t" \
3212 "ldr r4, [%1] \n\t" \
3213 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
3214 VALGRIND_RESTORE_STACK \
3217 : "0" (&_argvec[0]) \
3218 : "cc", "memory", __CALLER_SAVED_REGS, "r10" \
3220 lval = (__typeof__(lval)) _res; \
3223 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3226 volatile OrigFn _orig = (orig); \
3227 volatile unsigned long _argvec[8]; \
3228 volatile unsigned long _res; \
3229 _argvec[0] = (unsigned long)_orig.nraddr; \
3230 _argvec[1] = (unsigned long)(arg1); \
3231 _argvec[2] = (unsigned long)(arg2); \
3232 _argvec[3] = (unsigned long)(arg3); \
3233 _argvec[4] = (unsigned long)(arg4); \
3234 _argvec[5] = (unsigned long)(arg5); \
3235 _argvec[6] = (unsigned long)(arg6); \
3236 _argvec[7] = (unsigned long)(arg7); \
3238 VALGRIND_ALIGN_STACK \
3239 "sub sp, sp, #4 \n\t" \
3240 "ldr r0, [%1, #20] \n\t" \
3241 "ldr r1, [%1, #24] \n\t" \
3242 "ldr r2, [%1, #28] \n\t" \
3243 "push {r0, r1, r2} \n\t" \
3244 "ldr r0, [%1, #4] \n\t" \
3245 "ldr r1, [%1, #8] \n\t" \
3246 "ldr r2, [%1, #12] \n\t" \
3247 "ldr r3, [%1, #16] \n\t" \
3248 "ldr r4, [%1] \n\t" \
3249 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
3250 VALGRIND_RESTORE_STACK \
3253 : "0" (&_argvec[0]) \
3254 : "cc", "memory", __CALLER_SAVED_REGS, "r10" \
3256 lval = (__typeof__(lval)) _res; \
3259 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3262 volatile OrigFn _orig = (orig); \
3263 volatile unsigned long _argvec[9]; \
3264 volatile unsigned long _res; \
3265 _argvec[0] = (unsigned long)_orig.nraddr; \
3266 _argvec[1] = (unsigned long)(arg1); \
3267 _argvec[2] = (unsigned long)(arg2); \
3268 _argvec[3] = (unsigned long)(arg3); \
3269 _argvec[4] = (unsigned long)(arg4); \
3270 _argvec[5] = (unsigned long)(arg5); \
3271 _argvec[6] = (unsigned long)(arg6); \
3272 _argvec[7] = (unsigned long)(arg7); \
3273 _argvec[8] = (unsigned long)(arg8); \
3275 VALGRIND_ALIGN_STACK \
3276 "ldr r0, [%1, #20] \n\t" \
3277 "ldr r1, [%1, #24] \n\t" \
3278 "ldr r2, [%1, #28] \n\t" \
3279 "ldr r3, [%1, #32] \n\t" \
3280 "push {r0, r1, r2, r3} \n\t" \
3281 "ldr r0, [%1, #4] \n\t" \
3282 "ldr r1, [%1, #8] \n\t" \
3283 "ldr r2, [%1, #12] \n\t" \
3284 "ldr r3, [%1, #16] \n\t" \
3285 "ldr r4, [%1] \n\t" \
3286 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
3287 VALGRIND_RESTORE_STACK \
3290 : "0" (&_argvec[0]) \
3291 : "cc", "memory", __CALLER_SAVED_REGS, "r10" \
3293 lval = (__typeof__(lval)) _res; \
3296 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3299 volatile OrigFn _orig = (orig); \
3300 volatile unsigned long _argvec[10]; \
3301 volatile unsigned long _res; \
3302 _argvec[0] = (unsigned long)_orig.nraddr; \
3303 _argvec[1] = (unsigned long)(arg1); \
3304 _argvec[2] = (unsigned long)(arg2); \
3305 _argvec[3] = (unsigned long)(arg3); \
3306 _argvec[4] = (unsigned long)(arg4); \
3307 _argvec[5] = (unsigned long)(arg5); \
3308 _argvec[6] = (unsigned long)(arg6); \
3309 _argvec[7] = (unsigned long)(arg7); \
3310 _argvec[8] = (unsigned long)(arg8); \
3311 _argvec[9] = (unsigned long)(arg9); \
3313 VALGRIND_ALIGN_STACK \
3314 "sub sp, sp, #4 \n\t" \
3315 "ldr r0, [%1, #20] \n\t" \
3316 "ldr r1, [%1, #24] \n\t" \
3317 "ldr r2, [%1, #28] \n\t" \
3318 "ldr r3, [%1, #32] \n\t" \
3319 "ldr r4, [%1, #36] \n\t" \
3320 "push {r0, r1, r2, r3, r4} \n\t" \
3321 "ldr r0, [%1, #4] \n\t" \
3322 "ldr r1, [%1, #8] \n\t" \
3323 "ldr r2, [%1, #12] \n\t" \
3324 "ldr r3, [%1, #16] \n\t" \
3325 "ldr r4, [%1] \n\t" \
3326 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
3327 VALGRIND_RESTORE_STACK \
3330 : "0" (&_argvec[0]) \
3331 : "cc", "memory", __CALLER_SAVED_REGS, "r10" \
3333 lval = (__typeof__(lval)) _res; \
3336 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3337 arg7,arg8,arg9,arg10) \
3339 volatile OrigFn _orig = (orig); \
3340 volatile unsigned long _argvec[11]; \
3341 volatile unsigned long _res; \
3342 _argvec[0] = (unsigned long)_orig.nraddr; \
3343 _argvec[1] = (unsigned long)(arg1); \
3344 _argvec[2] = (unsigned long)(arg2); \
3345 _argvec[3] = (unsigned long)(arg3); \
3346 _argvec[4] = (unsigned long)(arg4); \
3347 _argvec[5] = (unsigned long)(arg5); \
3348 _argvec[6] = (unsigned long)(arg6); \
3349 _argvec[7] = (unsigned long)(arg7); \
3350 _argvec[8] = (unsigned long)(arg8); \
3351 _argvec[9] = (unsigned long)(arg9); \
3352 _argvec[10] = (unsigned long)(arg10); \
3354 VALGRIND_ALIGN_STACK \
3355 "ldr r0, [%1, #40] \n\t" \
3357 "ldr r0, [%1, #20] \n\t" \
3358 "ldr r1, [%1, #24] \n\t" \
3359 "ldr r2, [%1, #28] \n\t" \
3360 "ldr r3, [%1, #32] \n\t" \
3361 "ldr r4, [%1, #36] \n\t" \
3362 "push {r0, r1, r2, r3, r4} \n\t" \
3363 "ldr r0, [%1, #4] \n\t" \
3364 "ldr r1, [%1, #8] \n\t" \
3365 "ldr r2, [%1, #12] \n\t" \
3366 "ldr r3, [%1, #16] \n\t" \
3367 "ldr r4, [%1] \n\t" \
3368 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
3369 VALGRIND_RESTORE_STACK \
3372 : "0" (&_argvec[0]) \
3373 : "cc", "memory", __CALLER_SAVED_REGS, "r10" \
3375 lval = (__typeof__(lval)) _res; \
3378 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
3379 arg6,arg7,arg8,arg9,arg10, \
3382 volatile OrigFn _orig = (orig); \
3383 volatile unsigned long _argvec[12]; \
3384 volatile unsigned long _res; \
3385 _argvec[0] = (unsigned long)_orig.nraddr; \
3386 _argvec[1] = (unsigned long)(arg1); \
3387 _argvec[2] = (unsigned long)(arg2); \
3388 _argvec[3] = (unsigned long)(arg3); \
3389 _argvec[4] = (unsigned long)(arg4); \
3390 _argvec[5] = (unsigned long)(arg5); \
3391 _argvec[6] = (unsigned long)(arg6); \
3392 _argvec[7] = (unsigned long)(arg7); \
3393 _argvec[8] = (unsigned long)(arg8); \
3394 _argvec[9] = (unsigned long)(arg9); \
3395 _argvec[10] = (unsigned long)(arg10); \
3396 _argvec[11] = (unsigned long)(arg11); \
3398 VALGRIND_ALIGN_STACK \
3399 "sub sp, sp, #4 \n\t" \
3400 "ldr r0, [%1, #40] \n\t" \
3401 "ldr r1, [%1, #44] \n\t" \
3402 "push {r0, r1} \n\t" \
3403 "ldr r0, [%1, #20] \n\t" \
3404 "ldr r1, [%1, #24] \n\t" \
3405 "ldr r2, [%1, #28] \n\t" \
3406 "ldr r3, [%1, #32] \n\t" \
3407 "ldr r4, [%1, #36] \n\t" \
3408 "push {r0, r1, r2, r3, r4} \n\t" \
3409 "ldr r0, [%1, #4] \n\t" \
3410 "ldr r1, [%1, #8] \n\t" \
3411 "ldr r2, [%1, #12] \n\t" \
3412 "ldr r3, [%1, #16] \n\t" \
3413 "ldr r4, [%1] \n\t" \
3414 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
3415 VALGRIND_RESTORE_STACK \
3418 : "0" (&_argvec[0]) \
3419 : "cc", "memory", __CALLER_SAVED_REGS, "r10" \
3421 lval = (__typeof__(lval)) _res; \
3424 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
3425 arg6,arg7,arg8,arg9,arg10, \
3428 volatile OrigFn _orig = (orig); \
3429 volatile unsigned long _argvec[13]; \
3430 volatile unsigned long _res; \
3431 _argvec[0] = (unsigned long)_orig.nraddr; \
3432 _argvec[1] = (unsigned long)(arg1); \
3433 _argvec[2] = (unsigned long)(arg2); \
3434 _argvec[3] = (unsigned long)(arg3); \
3435 _argvec[4] = (unsigned long)(arg4); \
3436 _argvec[5] = (unsigned long)(arg5); \
3437 _argvec[6] = (unsigned long)(arg6); \
3438 _argvec[7] = (unsigned long)(arg7); \
3439 _argvec[8] = (unsigned long)(arg8); \
3440 _argvec[9] = (unsigned long)(arg9); \
3441 _argvec[10] = (unsigned long)(arg10); \
3442 _argvec[11] = (unsigned long)(arg11); \
3443 _argvec[12] = (unsigned long)(arg12); \
3445 VALGRIND_ALIGN_STACK \
3446 "ldr r0, [%1, #40] \n\t" \
3447 "ldr r1, [%1, #44] \n\t" \
3448 "ldr r2, [%1, #48] \n\t" \
3449 "push {r0, r1, r2} \n\t" \
3450 "ldr r0, [%1, #20] \n\t" \
3451 "ldr r1, [%1, #24] \n\t" \
3452 "ldr r2, [%1, #28] \n\t" \
3453 "ldr r3, [%1, #32] \n\t" \
3454 "ldr r4, [%1, #36] \n\t" \
3455 "push {r0, r1, r2, r3, r4} \n\t" \
3456 "ldr r0, [%1, #4] \n\t" \
3457 "ldr r1, [%1, #8] \n\t" \
3458 "ldr r2, [%1, #12] \n\t" \
3459 "ldr r3, [%1, #16] \n\t" \
3460 "ldr r4, [%1] \n\t" \
3461 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
3462 VALGRIND_RESTORE_STACK \
3465 : "0" (&_argvec[0]) \
3466 : "cc", "memory", __CALLER_SAVED_REGS, "r10" \
3468 lval = (__typeof__(lval)) _res; \
3475 #if defined(PLAT_s390x_linux)
3481 #if defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM)
3482 # define __FRAME_POINTER \
3483 ,"d"(__builtin_dwarf_cfa())
3484 # define VALGRIND_CFI_PROLOGUE \
3485 ".cfi_remember_state\n\t" \
3489 ".cfi_def_cfa r11, 0\n\t"
3490 # define VALGRIND_CFI_EPILOGUE \
3492 ".cfi_restore_state\n\t"
3494 # define __FRAME_POINTER
3495 # define VALGRIND_CFI_PROLOGUE \
3497 # define VALGRIND_CFI_EPILOGUE
3509 #define __CALLER_SAVED_REGS "0","1","2","3","4","5","14", \
3510 "f0","f1","f2","f3","f4","f5","f6","f7"
3521 #define CALL_FN_W_v(lval, orig) \
3523 volatile OrigFn _orig = (orig); \
3524 volatile unsigned long _argvec[1]; \
3525 volatile unsigned long _res; \
3526 _argvec[0] = (unsigned long)_orig.nraddr; \
3528 VALGRIND_CFI_PROLOGUE \
3529 "aghi 15,-160\n\t" \
3531 VALGRIND_CALL_NOREDIR_R1 \
3534 VALGRIND_CFI_EPILOGUE \
3536 : "d" (&_argvec[0]) __FRAME_POINTER \
3537 : "cc", "memory", __CALLER_SAVED_REGS,"7" \
3539 lval = (__typeof__(lval)) _res; \
3543 #define CALL_FN_W_W(lval, orig, arg1) \
3545 volatile OrigFn _orig = (orig); \
3546 volatile unsigned long _argvec[2]; \
3547 volatile unsigned long _res; \
3548 _argvec[0] = (unsigned long)_orig.nraddr; \
3549 _argvec[1] = (unsigned long)arg1; \
3551 VALGRIND_CFI_PROLOGUE \
3552 "aghi 15,-160\n\t" \
3555 VALGRIND_CALL_NOREDIR_R1 \
3558 VALGRIND_CFI_EPILOGUE \
3560 : "a" (&_argvec[0]) __FRAME_POINTER \
3561 : "cc", "memory", __CALLER_SAVED_REGS,"7" \
3563 lval = (__typeof__(lval)) _res; \
3566 #define CALL_FN_W_WW(lval, orig, arg1, arg2) \
3568 volatile OrigFn _orig = (orig); \
3569 volatile unsigned long _argvec[3]; \
3570 volatile unsigned long _res; \
3571 _argvec[0] = (unsigned long)_orig.nraddr; \
3572 _argvec[1] = (unsigned long)arg1; \
3573 _argvec[2] = (unsigned long)arg2; \
3575 VALGRIND_CFI_PROLOGUE \
3576 "aghi 15,-160\n\t" \
3580 VALGRIND_CALL_NOREDIR_R1 \
3583 VALGRIND_CFI_EPILOGUE \
3585 : "a" (&_argvec[0]) __FRAME_POINTER \
3586 : "cc", "memory", __CALLER_SAVED_REGS,"7" \
3588 lval = (__typeof__(lval)) _res; \
3591 #define CALL_FN_W_WWW(lval, orig, arg1, arg2, arg3) \
3593 volatile OrigFn _orig = (orig); \
3594 volatile unsigned long _argvec[4]; \
3595 volatile unsigned long _res; \
3596 _argvec[0] = (unsigned long)_orig.nraddr; \
3597 _argvec[1] = (unsigned long)arg1; \
3598 _argvec[2] = (unsigned long)arg2; \
3599 _argvec[3] = (unsigned long)arg3; \
3601 VALGRIND_CFI_PROLOGUE \
3602 "aghi 15,-160\n\t" \
3607 VALGRIND_CALL_NOREDIR_R1 \
3610 VALGRIND_CFI_EPILOGUE \
3612 : "a" (&_argvec[0]) __FRAME_POINTER \
3613 : "cc", "memory", __CALLER_SAVED_REGS,"7" \
3615 lval = (__typeof__(lval)) _res; \
3618 #define CALL_FN_W_WWWW(lval, orig, arg1, arg2, arg3, arg4) \
3620 volatile OrigFn _orig = (orig); \
3621 volatile unsigned long _argvec[5]; \
3622 volatile unsigned long _res; \
3623 _argvec[0] = (unsigned long)_orig.nraddr; \
3624 _argvec[1] = (unsigned long)arg1; \
3625 _argvec[2] = (unsigned long)arg2; \
3626 _argvec[3] = (unsigned long)arg3; \
3627 _argvec[4] = (unsigned long)arg4; \
3629 VALGRIND_CFI_PROLOGUE \
3630 "aghi 15,-160\n\t" \
3636 VALGRIND_CALL_NOREDIR_R1 \
3639 VALGRIND_CFI_EPILOGUE \
3641 : "a" (&_argvec[0]) __FRAME_POINTER \
3642 : "cc", "memory", __CALLER_SAVED_REGS,"7" \
3644 lval = (__typeof__(lval)) _res; \
3647 #define CALL_FN_W_5W(lval, orig, arg1, arg2, arg3, arg4, arg5) \
3649 volatile OrigFn _orig = (orig); \
3650 volatile unsigned long _argvec[6]; \
3651 volatile unsigned long _res; \
3652 _argvec[0] = (unsigned long)_orig.nraddr; \
3653 _argvec[1] = (unsigned long)arg1; \
3654 _argvec[2] = (unsigned long)arg2; \
3655 _argvec[3] = (unsigned long)arg3; \
3656 _argvec[4] = (unsigned long)arg4; \
3657 _argvec[5] = (unsigned long)arg5; \
3659 VALGRIND_CFI_PROLOGUE \
3660 "aghi 15,-160\n\t" \
3667 VALGRIND_CALL_NOREDIR_R1 \
3670 VALGRIND_CFI_EPILOGUE \
3672 : "a" (&_argvec[0]) __FRAME_POINTER \
3673 : "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
3675 lval = (__typeof__(lval)) _res; \
3678 #define CALL_FN_W_6W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
3681 volatile OrigFn _orig = (orig); \
3682 volatile unsigned long _argvec[7]; \
3683 volatile unsigned long _res; \
3684 _argvec[0] = (unsigned long)_orig.nraddr; \
3685 _argvec[1] = (unsigned long)arg1; \
3686 _argvec[2] = (unsigned long)arg2; \
3687 _argvec[3] = (unsigned long)arg3; \
3688 _argvec[4] = (unsigned long)arg4; \
3689 _argvec[5] = (unsigned long)arg5; \
3690 _argvec[6] = (unsigned long)arg6; \
3692 VALGRIND_CFI_PROLOGUE \
3693 "aghi 15,-168\n\t" \
3699 "mvc 160(8,15), 48(1)\n\t" \
3701 VALGRIND_CALL_NOREDIR_R1 \
3704 VALGRIND_CFI_EPILOGUE \
3706 : "a" (&_argvec[0]) __FRAME_POINTER \
3707 : "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
3709 lval = (__typeof__(lval)) _res; \
3712 #define CALL_FN_W_7W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
3715 volatile OrigFn _orig = (orig); \
3716 volatile unsigned long _argvec[8]; \
3717 volatile unsigned long _res; \
3718 _argvec[0] = (unsigned long)_orig.nraddr; \
3719 _argvec[1] = (unsigned long)arg1; \
3720 _argvec[2] = (unsigned long)arg2; \
3721 _argvec[3] = (unsigned long)arg3; \
3722 _argvec[4] = (unsigned long)arg4; \
3723 _argvec[5] = (unsigned long)arg5; \
3724 _argvec[6] = (unsigned long)arg6; \
3725 _argvec[7] = (unsigned long)arg7; \
3727 VALGRIND_CFI_PROLOGUE \
3728 "aghi 15,-176\n\t" \
3734 "mvc 160(8,15), 48(1)\n\t" \
3735 "mvc 168(8,15), 56(1)\n\t" \
3737 VALGRIND_CALL_NOREDIR_R1 \
3740 VALGRIND_CFI_EPILOGUE \
3742 : "a" (&_argvec[0]) __FRAME_POINTER \
3743 : "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
3745 lval = (__typeof__(lval)) _res; \
3748 #define CALL_FN_W_8W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
3751 volatile OrigFn _orig = (orig); \
3752 volatile unsigned long _argvec[9]; \
3753 volatile unsigned long _res; \
3754 _argvec[0] = (unsigned long)_orig.nraddr; \
3755 _argvec[1] = (unsigned long)arg1; \
3756 _argvec[2] = (unsigned long)arg2; \
3757 _argvec[3] = (unsigned long)arg3; \
3758 _argvec[4] = (unsigned long)arg4; \
3759 _argvec[5] = (unsigned long)arg5; \
3760 _argvec[6] = (unsigned long)arg6; \
3761 _argvec[7] = (unsigned long)arg7; \
3762 _argvec[8] = (unsigned long)arg8; \
3764 VALGRIND_CFI_PROLOGUE \
3765 "aghi 15,-184\n\t" \
3771 "mvc 160(8,15), 48(1)\n\t" \
3772 "mvc 168(8,15), 56(1)\n\t" \
3773 "mvc 176(8,15), 64(1)\n\t" \
3775 VALGRIND_CALL_NOREDIR_R1 \
3778 VALGRIND_CFI_EPILOGUE \
3780 : "a" (&_argvec[0]) __FRAME_POINTER \
3781 : "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
3783 lval = (__typeof__(lval)) _res; \
3786 #define CALL_FN_W_9W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
3787 arg6, arg7 ,arg8, arg9) \
3789 volatile OrigFn _orig = (orig); \
3790 volatile unsigned long _argvec[10]; \
3791 volatile unsigned long _res; \
3792 _argvec[0] = (unsigned long)_orig.nraddr; \
3793 _argvec[1] = (unsigned long)arg1; \
3794 _argvec[2] = (unsigned long)arg2; \
3795 _argvec[3] = (unsigned long)arg3; \
3796 _argvec[4] = (unsigned long)arg4; \
3797 _argvec[5] = (unsigned long)arg5; \
3798 _argvec[6] = (unsigned long)arg6; \
3799 _argvec[7] = (unsigned long)arg7; \
3800 _argvec[8] = (unsigned long)arg8; \
3801 _argvec[9] = (unsigned long)arg9; \
3803 VALGRIND_CFI_PROLOGUE \
3804 "aghi 15,-192\n\t" \
3810 "mvc 160(8,15), 48(1)\n\t" \
3811 "mvc 168(8,15), 56(1)\n\t" \
3812 "mvc 176(8,15), 64(1)\n\t" \
3813 "mvc 184(8,15), 72(1)\n\t" \
3815 VALGRIND_CALL_NOREDIR_R1 \
3818 VALGRIND_CFI_EPILOGUE \
3820 : "a" (&_argvec[0]) __FRAME_POINTER \
3821 : "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
3823 lval = (__typeof__(lval)) _res; \
3826 #define CALL_FN_W_10W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
3827 arg6, arg7 ,arg8, arg9, arg10) \
3829 volatile OrigFn _orig = (orig); \
3830 volatile unsigned long _argvec[11]; \
3831 volatile unsigned long _res; \
3832 _argvec[0] = (unsigned long)_orig.nraddr; \
3833 _argvec[1] = (unsigned long)arg1; \
3834 _argvec[2] = (unsigned long)arg2; \
3835 _argvec[3] = (unsigned long)arg3; \
3836 _argvec[4] = (unsigned long)arg4; \
3837 _argvec[5] = (unsigned long)arg5; \
3838 _argvec[6] = (unsigned long)arg6; \
3839 _argvec[7] = (unsigned long)arg7; \
3840 _argvec[8] = (unsigned long)arg8; \
3841 _argvec[9] = (unsigned long)arg9; \
3842 _argvec[10] = (unsigned long)arg10; \
3844 VALGRIND_CFI_PROLOGUE \
3845 "aghi 15,-200\n\t" \
3851 "mvc 160(8,15), 48(1)\n\t" \
3852 "mvc 168(8,15), 56(1)\n\t" \
3853 "mvc 176(8,15), 64(1)\n\t" \
3854 "mvc 184(8,15), 72(1)\n\t" \
3855 "mvc 192(8,15), 80(1)\n\t" \
3857 VALGRIND_CALL_NOREDIR_R1 \
3860 VALGRIND_CFI_EPILOGUE \
3862 : "a" (&_argvec[0]) __FRAME_POINTER \
3863 : "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
3865 lval = (__typeof__(lval)) _res; \
3868 #define CALL_FN_W_11W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
3869 arg6, arg7 ,arg8, arg9, arg10, arg11) \
3871 volatile OrigFn _orig = (orig); \
3872 volatile unsigned long _argvec[12]; \
3873 volatile unsigned long _res; \
3874 _argvec[0] = (unsigned long)_orig.nraddr; \
3875 _argvec[1] = (unsigned long)arg1; \
3876 _argvec[2] = (unsigned long)arg2; \
3877 _argvec[3] = (unsigned long)arg3; \
3878 _argvec[4] = (unsigned long)arg4; \
3879 _argvec[5] = (unsigned long)arg5; \
3880 _argvec[6] = (unsigned long)arg6; \
3881 _argvec[7] = (unsigned long)arg7; \
3882 _argvec[8] = (unsigned long)arg8; \
3883 _argvec[9] = (unsigned long)arg9; \
3884 _argvec[10] = (unsigned long)arg10; \
3885 _argvec[11] = (unsigned long)arg11; \
3887 VALGRIND_CFI_PROLOGUE \
3888 "aghi 15,-208\n\t" \
3894 "mvc 160(8,15), 48(1)\n\t" \
3895 "mvc 168(8,15), 56(1)\n\t" \
3896 "mvc 176(8,15), 64(1)\n\t" \
3897 "mvc 184(8,15), 72(1)\n\t" \
3898 "mvc 192(8,15), 80(1)\n\t" \
3899 "mvc 200(8,15), 88(1)\n\t" \
3901 VALGRIND_CALL_NOREDIR_R1 \
3904 VALGRIND_CFI_EPILOGUE \
3906 : "a" (&_argvec[0]) __FRAME_POINTER \
3907 : "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
3909 lval = (__typeof__(lval)) _res; \
3912 #define CALL_FN_W_12W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
3913 arg6, arg7 ,arg8, arg9, arg10, arg11, arg12)\
3915 volatile OrigFn _orig = (orig); \
3916 volatile unsigned long _argvec[13]; \
3917 volatile unsigned long _res; \
3918 _argvec[0] = (unsigned long)_orig.nraddr; \
3919 _argvec[1] = (unsigned long)arg1; \
3920 _argvec[2] = (unsigned long)arg2; \
3921 _argvec[3] = (unsigned long)arg3; \
3922 _argvec[4] = (unsigned long)arg4; \
3923 _argvec[5] = (unsigned long)arg5; \
3924 _argvec[6] = (unsigned long)arg6; \
3925 _argvec[7] = (unsigned long)arg7; \
3926 _argvec[8] = (unsigned long)arg8; \
3927 _argvec[9] = (unsigned long)arg9; \
3928 _argvec[10] = (unsigned long)arg10; \
3929 _argvec[11] = (unsigned long)arg11; \
3930 _argvec[12] = (unsigned long)arg12; \
3932 VALGRIND_CFI_PROLOGUE \
3933 "aghi 15,-216\n\t" \
3939 "mvc 160(8,15), 48(1)\n\t" \
3940 "mvc 168(8,15), 56(1)\n\t" \
3941 "mvc 176(8,15), 64(1)\n\t" \
3942 "mvc 184(8,15), 72(1)\n\t" \
3943 "mvc 192(8,15), 80(1)\n\t" \
3944 "mvc 200(8,15), 88(1)\n\t" \
3945 "mvc 208(8,15), 96(1)\n\t" \
3947 VALGRIND_CALL_NOREDIR_R1 \
3950 VALGRIND_CFI_EPILOGUE \
3952 : "a" (&_argvec[0]) __FRAME_POINTER \
3953 : "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
3955 lval = (__typeof__(lval)) _res; \
3963 #if defined(PLAT_mips32_linux)
3966 #define __CALLER_SAVED_REGS "$2", "$3", "$4", "$5", "$6", \
3967 "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \
3973 #define CALL_FN_W_v(lval, orig) \
3975 volatile OrigFn _orig = (orig); \
3976 volatile unsigned long _argvec[1]; \
3977 volatile unsigned long _res; \
3978 _argvec[0] = (unsigned long)_orig.nraddr; \
3980 "subu $29, $29, 8 \n\t" \
3981 "sw $28, 0($29) \n\t" \
3982 "sw $31, 4($29) \n\t" \
3983 "subu $29, $29, 16 \n\t" \
3984 "lw $25, 0(%1) \n\t" \
3985 VALGRIND_CALL_NOREDIR_T9 \
3986 "addu $29, $29, 16\n\t" \
3987 "lw $28, 0($29) \n\t" \
3988 "lw $31, 4($29) \n\t" \
3989 "addu $29, $29, 8 \n\t" \
3992 : "0" (&_argvec[0]) \
3993 : "memory", __CALLER_SAVED_REGS \
3995 lval = (__typeof__(lval)) _res; \
3998 #define CALL_FN_W_W(lval, orig, arg1) \
4000 volatile OrigFn _orig = (orig); \
4001 volatile unsigned long _argvec[2]; \
4002 volatile unsigned long _res; \
4003 _argvec[0] = (unsigned long)_orig.nraddr; \
4004 _argvec[1] = (unsigned long)(arg1); \
4006 "subu $29, $29, 8 \n\t" \
4007 "sw $28, 0($29) \n\t" \
4008 "sw $31, 4($29) \n\t" \
4009 "subu $29, $29, 16 \n\t" \
4010 "lw $4, 4(%1) \n\t" \
4011 "lw $25, 0(%1) \n\t" \
4012 VALGRIND_CALL_NOREDIR_T9 \
4013 "addu $29, $29, 16 \n\t" \
4014 "lw $28, 0($29) \n\t" \
4015 "lw $31, 4($29) \n\t" \
4016 "addu $29, $29, 8 \n\t" \
4019 : "0" (&_argvec[0]) \
4020 : "memory", __CALLER_SAVED_REGS \
4022 lval = (__typeof__(lval)) _res; \
4025 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
4027 volatile OrigFn _orig = (orig); \
4028 volatile unsigned long _argvec[3]; \
4029 volatile unsigned long _res; \
4030 _argvec[0] = (unsigned long)_orig.nraddr; \
4031 _argvec[1] = (unsigned long)(arg1); \
4032 _argvec[2] = (unsigned long)(arg2); \
4034 "subu $29, $29, 8 \n\t" \
4035 "sw $28, 0($29) \n\t" \
4036 "sw $31, 4($29) \n\t" \
4037 "subu $29, $29, 16 \n\t" \
4038 "lw $4, 4(%1) \n\t" \
4039 "lw $5, 8(%1) \n\t" \
4040 "lw $25, 0(%1) \n\t" \
4041 VALGRIND_CALL_NOREDIR_T9 \
4042 "addu $29, $29, 16 \n\t" \
4043 "lw $28, 0($29) \n\t" \
4044 "lw $31, 4($29) \n\t" \
4045 "addu $29, $29, 8 \n\t" \
4048 : "0" (&_argvec[0]) \
4049 : "memory", __CALLER_SAVED_REGS \
4051 lval = (__typeof__(lval)) _res; \
4054 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
4056 volatile OrigFn _orig = (orig); \
4057 volatile unsigned long _argvec[4]; \
4058 volatile unsigned long _res; \
4059 _argvec[0] = (unsigned long)_orig.nraddr; \
4060 _argvec[1] = (unsigned long)(arg1); \
4061 _argvec[2] = (unsigned long)(arg2); \
4062 _argvec[3] = (unsigned long)(arg3); \
4064 "subu $29, $29, 8 \n\t" \
4065 "sw $28, 0($29) \n\t" \
4066 "sw $31, 4($29) \n\t" \
4067 "subu $29, $29, 16 \n\t" \
4068 "lw $4, 4(%1) \n\t" \
4069 "lw $5, 8(%1) \n\t" \
4070 "lw $6, 12(%1) \n\t" \
4071 "lw $25, 0(%1) \n\t" \
4072 VALGRIND_CALL_NOREDIR_T9 \
4073 "addu $29, $29, 16 \n\t" \
4074 "lw $28, 0($29) \n\t" \
4075 "lw $31, 4($29) \n\t" \
4076 "addu $29, $29, 8 \n\t" \
4079 : "0" (&_argvec[0]) \
4080 : "memory", __CALLER_SAVED_REGS \
4082 lval = (__typeof__(lval)) _res; \
4085 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
4087 volatile OrigFn _orig = (orig); \
4088 volatile unsigned long _argvec[5]; \
4089 volatile unsigned long _res; \
4090 _argvec[0] = (unsigned long)_orig.nraddr; \
4091 _argvec[1] = (unsigned long)(arg1); \
4092 _argvec[2] = (unsigned long)(arg2); \
4093 _argvec[3] = (unsigned long)(arg3); \
4094 _argvec[4] = (unsigned long)(arg4); \
4096 "subu $29, $29, 8 \n\t" \
4097 "sw $28, 0($29) \n\t" \
4098 "sw $31, 4($29) \n\t" \
4099 "subu $29, $29, 16 \n\t" \
4100 "lw $4, 4(%1) \n\t" \
4101 "lw $5, 8(%1) \n\t" \
4102 "lw $6, 12(%1) \n\t" \
4103 "lw $7, 16(%1) \n\t" \
4104 "lw $25, 0(%1) \n\t" \
4105 VALGRIND_CALL_NOREDIR_T9 \
4106 "addu $29, $29, 16 \n\t" \
4107 "lw $28, 0($29) \n\t" \
4108 "lw $31, 4($29) \n\t" \
4109 "addu $29, $29, 8 \n\t" \
4112 : "0" (&_argvec[0]) \
4113 : "memory", __CALLER_SAVED_REGS \
4115 lval = (__typeof__(lval)) _res; \
4118 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
4120 volatile OrigFn _orig = (orig); \
4121 volatile unsigned long _argvec[6]; \
4122 volatile unsigned long _res; \
4123 _argvec[0] = (unsigned long)_orig.nraddr; \
4124 _argvec[1] = (unsigned long)(arg1); \
4125 _argvec[2] = (unsigned long)(arg2); \
4126 _argvec[3] = (unsigned long)(arg3); \
4127 _argvec[4] = (unsigned long)(arg4); \
4128 _argvec[5] = (unsigned long)(arg5); \
4130 "subu $29, $29, 8 \n\t" \
4131 "sw $28, 0($29) \n\t" \
4132 "sw $31, 4($29) \n\t" \
4133 "lw $4, 20(%1) \n\t" \
4134 "subu $29, $29, 24\n\t" \
4135 "sw $4, 16($29) \n\t" \
4136 "lw $4, 4(%1) \n\t" \
4137 "lw $5, 8(%1) \n\t" \
4138 "lw $6, 12(%1) \n\t" \
4139 "lw $7, 16(%1) \n\t" \
4140 "lw $25, 0(%1) \n\t" \
4141 VALGRIND_CALL_NOREDIR_T9 \
4142 "addu $29, $29, 24 \n\t" \
4143 "lw $28, 0($29) \n\t" \
4144 "lw $31, 4($29) \n\t" \
4145 "addu $29, $29, 8 \n\t" \
4148 : "0" (&_argvec[0]) \
4149 : "memory", __CALLER_SAVED_REGS \
4151 lval = (__typeof__(lval)) _res; \
4153 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
4155 volatile OrigFn _orig = (orig); \
4156 volatile unsigned long _argvec[7]; \
4157 volatile unsigned long _res; \
4158 _argvec[0] = (unsigned long)_orig.nraddr; \
4159 _argvec[1] = (unsigned long)(arg1); \
4160 _argvec[2] = (unsigned long)(arg2); \
4161 _argvec[3] = (unsigned long)(arg3); \
4162 _argvec[4] = (unsigned long)(arg4); \
4163 _argvec[5] = (unsigned long)(arg5); \
4164 _argvec[6] = (unsigned long)(arg6); \
4166 "subu $29, $29, 8 \n\t" \
4167 "sw $28, 0($29) \n\t" \
4168 "sw $31, 4($29) \n\t" \
4169 "lw $4, 20(%1) \n\t" \
4170 "subu $29, $29, 32\n\t" \
4171 "sw $4, 16($29) \n\t" \
4172 "lw $4, 24(%1) \n\t" \
4174 "sw $4, 20($29) \n\t" \
4175 "lw $4, 4(%1) \n\t" \
4176 "lw $5, 8(%1) \n\t" \
4177 "lw $6, 12(%1) \n\t" \
4178 "lw $7, 16(%1) \n\t" \
4179 "lw $25, 0(%1) \n\t" \
4180 VALGRIND_CALL_NOREDIR_T9 \
4181 "addu $29, $29, 32 \n\t" \
4182 "lw $28, 0($29) \n\t" \
4183 "lw $31, 4($29) \n\t" \
4184 "addu $29, $29, 8 \n\t" \
4187 : "0" (&_argvec[0]) \
4188 : "memory", __CALLER_SAVED_REGS \
4190 lval = (__typeof__(lval)) _res; \
4193 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
4196 volatile OrigFn _orig = (orig); \
4197 volatile unsigned long _argvec[8]; \
4198 volatile unsigned long _res; \
4199 _argvec[0] = (unsigned long)_orig.nraddr; \
4200 _argvec[1] = (unsigned long)(arg1); \
4201 _argvec[2] = (unsigned long)(arg2); \
4202 _argvec[3] = (unsigned long)(arg3); \
4203 _argvec[4] = (unsigned long)(arg4); \
4204 _argvec[5] = (unsigned long)(arg5); \
4205 _argvec[6] = (unsigned long)(arg6); \
4206 _argvec[7] = (unsigned long)(arg7); \
4208 "subu $29, $29, 8 \n\t" \
4209 "sw $28, 0($29) \n\t" \
4210 "sw $31, 4($29) \n\t" \
4211 "lw $4, 20(%1) \n\t" \
4212 "subu $29, $29, 32\n\t" \
4213 "sw $4, 16($29) \n\t" \
4214 "lw $4, 24(%1) \n\t" \
4215 "sw $4, 20($29) \n\t" \
4216 "lw $4, 28(%1) \n\t" \
4217 "sw $4, 24($29) \n\t" \
4218 "lw $4, 4(%1) \n\t" \
4219 "lw $5, 8(%1) \n\t" \
4220 "lw $6, 12(%1) \n\t" \
4221 "lw $7, 16(%1) \n\t" \
4222 "lw $25, 0(%1) \n\t" \
4223 VALGRIND_CALL_NOREDIR_T9 \
4224 "addu $29, $29, 32 \n\t" \
4225 "lw $28, 0($29) \n\t" \
4226 "lw $31, 4($29) \n\t" \
4227 "addu $29, $29, 8 \n\t" \
4230 : "0" (&_argvec[0]) \
4231 : "memory", __CALLER_SAVED_REGS \
4233 lval = (__typeof__(lval)) _res; \
4236 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
4239 volatile OrigFn _orig = (orig); \
4240 volatile unsigned long _argvec[9]; \
4241 volatile unsigned long _res; \
4242 _argvec[0] = (unsigned long)_orig.nraddr; \
4243 _argvec[1] = (unsigned long)(arg1); \
4244 _argvec[2] = (unsigned long)(arg2); \
4245 _argvec[3] = (unsigned long)(arg3); \
4246 _argvec[4] = (unsigned long)(arg4); \
4247 _argvec[5] = (unsigned long)(arg5); \
4248 _argvec[6] = (unsigned long)(arg6); \
4249 _argvec[7] = (unsigned long)(arg7); \
4250 _argvec[8] = (unsigned long)(arg8); \
4252 "subu $29, $29, 8 \n\t" \
4253 "sw $28, 0($29) \n\t" \
4254 "sw $31, 4($29) \n\t" \
4255 "lw $4, 20(%1) \n\t" \
4256 "subu $29, $29, 40\n\t" \
4257 "sw $4, 16($29) \n\t" \
4258 "lw $4, 24(%1) \n\t" \
4259 "sw $4, 20($29) \n\t" \
4260 "lw $4, 28(%1) \n\t" \
4261 "sw $4, 24($29) \n\t" \
4262 "lw $4, 32(%1) \n\t" \
4263 "sw $4, 28($29) \n\t" \
4264 "lw $4, 4(%1) \n\t" \
4265 "lw $5, 8(%1) \n\t" \
4266 "lw $6, 12(%1) \n\t" \
4267 "lw $7, 16(%1) \n\t" \
4268 "lw $25, 0(%1) \n\t" \
4269 VALGRIND_CALL_NOREDIR_T9 \
4270 "addu $29, $29, 40 \n\t" \
4271 "lw $28, 0($29) \n\t" \
4272 "lw $31, 4($29) \n\t" \
4273 "addu $29, $29, 8 \n\t" \
4276 : "0" (&_argvec[0]) \
4277 : "memory", __CALLER_SAVED_REGS \
4279 lval = (__typeof__(lval)) _res; \
4282 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
4285 volatile OrigFn _orig = (orig); \
4286 volatile unsigned long _argvec[10]; \
4287 volatile unsigned long _res; \
4288 _argvec[0] = (unsigned long)_orig.nraddr; \
4289 _argvec[1] = (unsigned long)(arg1); \
4290 _argvec[2] = (unsigned long)(arg2); \
4291 _argvec[3] = (unsigned long)(arg3); \
4292 _argvec[4] = (unsigned long)(arg4); \
4293 _argvec[5] = (unsigned long)(arg5); \
4294 _argvec[6] = (unsigned long)(arg6); \
4295 _argvec[7] = (unsigned long)(arg7); \
4296 _argvec[8] = (unsigned long)(arg8); \
4297 _argvec[9] = (unsigned long)(arg9); \
4299 "subu $29, $29, 8 \n\t" \
4300 "sw $28, 0($29) \n\t" \
4301 "sw $31, 4($29) \n\t" \
4302 "lw $4, 20(%1) \n\t" \
4303 "subu $29, $29, 40\n\t" \
4304 "sw $4, 16($29) \n\t" \
4305 "lw $4, 24(%1) \n\t" \
4306 "sw $4, 20($29) \n\t" \
4307 "lw $4, 28(%1) \n\t" \
4308 "sw $4, 24($29) \n\t" \
4309 "lw $4, 32(%1) \n\t" \
4310 "sw $4, 28($29) \n\t" \
4311 "lw $4, 36(%1) \n\t" \
4312 "sw $4, 32($29) \n\t" \
4313 "lw $4, 4(%1) \n\t" \
4314 "lw $5, 8(%1) \n\t" \
4315 "lw $6, 12(%1) \n\t" \
4316 "lw $7, 16(%1) \n\t" \
4317 "lw $25, 0(%1) \n\t" \
4318 VALGRIND_CALL_NOREDIR_T9 \
4319 "addu $29, $29, 40 \n\t" \
4320 "lw $28, 0($29) \n\t" \
4321 "lw $31, 4($29) \n\t" \
4322 "addu $29, $29, 8 \n\t" \
4325 : "0" (&_argvec[0]) \
4326 : "memory", __CALLER_SAVED_REGS \
4328 lval = (__typeof__(lval)) _res; \
4331 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
4332 arg7,arg8,arg9,arg10) \
4334 volatile OrigFn _orig = (orig); \
4335 volatile unsigned long _argvec[11]; \
4336 volatile unsigned long _res; \
4337 _argvec[0] = (unsigned long)_orig.nraddr; \
4338 _argvec[1] = (unsigned long)(arg1); \
4339 _argvec[2] = (unsigned long)(arg2); \
4340 _argvec[3] = (unsigned long)(arg3); \
4341 _argvec[4] = (unsigned long)(arg4); \
4342 _argvec[5] = (unsigned long)(arg5); \
4343 _argvec[6] = (unsigned long)(arg6); \
4344 _argvec[7] = (unsigned long)(arg7); \
4345 _argvec[8] = (unsigned long)(arg8); \
4346 _argvec[9] = (unsigned long)(arg9); \
4347 _argvec[10] = (unsigned long)(arg10); \
4349 "subu $29, $29, 8 \n\t" \
4350 "sw $28, 0($29) \n\t" \
4351 "sw $31, 4($29) \n\t" \
4352 "lw $4, 20(%1) \n\t" \
4353 "subu $29, $29, 48\n\t" \
4354 "sw $4, 16($29) \n\t" \
4355 "lw $4, 24(%1) \n\t" \
4356 "sw $4, 20($29) \n\t" \
4357 "lw $4, 28(%1) \n\t" \
4358 "sw $4, 24($29) \n\t" \
4359 "lw $4, 32(%1) \n\t" \
4360 "sw $4, 28($29) \n\t" \
4361 "lw $4, 36(%1) \n\t" \
4362 "sw $4, 32($29) \n\t" \
4363 "lw $4, 40(%1) \n\t" \
4364 "sw $4, 36($29) \n\t" \
4365 "lw $4, 4(%1) \n\t" \
4366 "lw $5, 8(%1) \n\t" \
4367 "lw $6, 12(%1) \n\t" \
4368 "lw $7, 16(%1) \n\t" \
4369 "lw $25, 0(%1) \n\t" \
4370 VALGRIND_CALL_NOREDIR_T9 \
4371 "addu $29, $29, 48 \n\t" \
4372 "lw $28, 0($29) \n\t" \
4373 "lw $31, 4($29) \n\t" \
4374 "addu $29, $29, 8 \n\t" \
4377 : "0" (&_argvec[0]) \
4378 : "memory", __CALLER_SAVED_REGS \
4380 lval = (__typeof__(lval)) _res; \
4383 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
4384 arg6,arg7,arg8,arg9,arg10, \
4387 volatile OrigFn _orig = (orig); \
4388 volatile unsigned long _argvec[12]; \
4389 volatile unsigned long _res; \
4390 _argvec[0] = (unsigned long)_orig.nraddr; \
4391 _argvec[1] = (unsigned long)(arg1); \
4392 _argvec[2] = (unsigned long)(arg2); \
4393 _argvec[3] = (unsigned long)(arg3); \
4394 _argvec[4] = (unsigned long)(arg4); \
4395 _argvec[5] = (unsigned long)(arg5); \
4396 _argvec[6] = (unsigned long)(arg6); \
4397 _argvec[7] = (unsigned long)(arg7); \
4398 _argvec[8] = (unsigned long)(arg8); \
4399 _argvec[9] = (unsigned long)(arg9); \
4400 _argvec[10] = (unsigned long)(arg10); \
4401 _argvec[11] = (unsigned long)(arg11); \
4403 "subu $29, $29, 8 \n\t" \
4404 "sw $28, 0($29) \n\t" \
4405 "sw $31, 4($29) \n\t" \
4406 "lw $4, 20(%1) \n\t" \
4407 "subu $29, $29, 48\n\t" \
4408 "sw $4, 16($29) \n\t" \
4409 "lw $4, 24(%1) \n\t" \
4410 "sw $4, 20($29) \n\t" \
4411 "lw $4, 28(%1) \n\t" \
4412 "sw $4, 24($29) \n\t" \
4413 "lw $4, 32(%1) \n\t" \
4414 "sw $4, 28($29) \n\t" \
4415 "lw $4, 36(%1) \n\t" \
4416 "sw $4, 32($29) \n\t" \
4417 "lw $4, 40(%1) \n\t" \
4418 "sw $4, 36($29) \n\t" \
4419 "lw $4, 44(%1) \n\t" \
4420 "sw $4, 40($29) \n\t" \
4421 "lw $4, 4(%1) \n\t" \
4422 "lw $5, 8(%1) \n\t" \
4423 "lw $6, 12(%1) \n\t" \
4424 "lw $7, 16(%1) \n\t" \
4425 "lw $25, 0(%1) \n\t" \
4426 VALGRIND_CALL_NOREDIR_T9 \
4427 "addu $29, $29, 48 \n\t" \
4428 "lw $28, 0($29) \n\t" \
4429 "lw $31, 4($29) \n\t" \
4430 "addu $29, $29, 8 \n\t" \
4433 : "0" (&_argvec[0]) \
4434 : "memory", __CALLER_SAVED_REGS \
4436 lval = (__typeof__(lval)) _res; \
4439 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
4440 arg6,arg7,arg8,arg9,arg10, \
4443 volatile OrigFn _orig = (orig); \
4444 volatile unsigned long _argvec[13]; \
4445 volatile unsigned long _res; \
4446 _argvec[0] = (unsigned long)_orig.nraddr; \
4447 _argvec[1] = (unsigned long)(arg1); \
4448 _argvec[2] = (unsigned long)(arg2); \
4449 _argvec[3] = (unsigned long)(arg3); \
4450 _argvec[4] = (unsigned long)(arg4); \
4451 _argvec[5] = (unsigned long)(arg5); \
4452 _argvec[6] = (unsigned long)(arg6); \
4453 _argvec[7] = (unsigned long)(arg7); \
4454 _argvec[8] = (unsigned long)(arg8); \
4455 _argvec[9] = (unsigned long)(arg9); \
4456 _argvec[10] = (unsigned long)(arg10); \
4457 _argvec[11] = (unsigned long)(arg11); \
4458 _argvec[12] = (unsigned long)(arg12); \
4460 "subu $29, $29, 8 \n\t" \
4461 "sw $28, 0($29) \n\t" \
4462 "sw $31, 4($29) \n\t" \
4463 "lw $4, 20(%1) \n\t" \
4464 "subu $29, $29, 56\n\t" \
4465 "sw $4, 16($29) \n\t" \
4466 "lw $4, 24(%1) \n\t" \
4467 "sw $4, 20($29) \n\t" \
4468 "lw $4, 28(%1) \n\t" \
4469 "sw $4, 24($29) \n\t" \
4470 "lw $4, 32(%1) \n\t" \
4471 "sw $4, 28($29) \n\t" \
4472 "lw $4, 36(%1) \n\t" \
4473 "sw $4, 32($29) \n\t" \
4474 "lw $4, 40(%1) \n\t" \
4475 "sw $4, 36($29) \n\t" \
4476 "lw $4, 44(%1) \n\t" \
4477 "sw $4, 40($29) \n\t" \
4478 "lw $4, 48(%1) \n\t" \
4479 "sw $4, 44($29) \n\t" \
4480 "lw $4, 4(%1) \n\t" \
4481 "lw $5, 8(%1) \n\t" \
4482 "lw $6, 12(%1) \n\t" \
4483 "lw $7, 16(%1) \n\t" \
4484 "lw $25, 0(%1) \n\t" \
4485 VALGRIND_CALL_NOREDIR_T9 \
4486 "addu $29, $29, 56 \n\t" \
4487 "lw $28, 0($29) \n\t" \
4488 "lw $31, 4($29) \n\t" \
4489 "addu $29, $29, 8 \n\t" \
4492 : "r" (&_argvec[0]) \
4493 : "memory", __CALLER_SAVED_REGS \
4495 lval = (__typeof__(lval)) _res; \
4502 #if defined(PLAT_mips64_linux)
4505 #define __CALLER_SAVED_REGS "$2", "$3", "$4", "$5", "$6", \
4506 "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \
4512 #define CALL_FN_W_v(lval, orig) \
4514 volatile OrigFn _orig = (orig); \
4515 volatile unsigned long _argvec[1]; \
4516 volatile unsigned long _res; \
4517 _argvec[0] = (unsigned long)_orig.nraddr; \
4519 "ld $25, 0(%1)\n\t" \
4520 VALGRIND_CALL_NOREDIR_T9 \
4523 : "0" (&_argvec[0]) \
4524 : "memory", __CALLER_SAVED_REGS \
4526 lval = (__typeof__(lval)) _res; \
4529 #define CALL_FN_W_W(lval, orig, arg1) \
4531 volatile OrigFn _orig = (orig); \
4532 volatile unsigned long _argvec[2]; \
4533 volatile unsigned long _res; \
4534 _argvec[0] = (unsigned long)_orig.nraddr; \
4535 _argvec[1] = (unsigned long)(arg1); \
4537 "ld $4, 8(%1)\n\t" \
4538 "ld $25, 0(%1)\n\t" \
4539 VALGRIND_CALL_NOREDIR_T9 \
4542 : "r" (&_argvec[0]) \
4543 : "memory", __CALLER_SAVED_REGS \
4545 lval = (__typeof__(lval)) _res; \
4548 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
4550 volatile OrigFn _orig = (orig); \
4551 volatile unsigned long _argvec[3]; \
4552 volatile unsigned long _res; \
4553 _argvec[0] = (unsigned long)_orig.nraddr; \
4554 _argvec[1] = (unsigned long)(arg1); \
4555 _argvec[2] = (unsigned long)(arg2); \
4557 "ld $4, 8(%1)\n\t" \
4558 "ld $5, 16(%1)\n\t" \
4559 "ld $25, 0(%1)\n\t" \
4560 VALGRIND_CALL_NOREDIR_T9 \
4563 : "r" (&_argvec[0]) \
4564 : "memory", __CALLER_SAVED_REGS \
4566 lval = (__typeof__(lval)) _res; \
4569 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
4571 volatile OrigFn _orig = (orig); \
4572 volatile unsigned long _argvec[4]; \
4573 volatile unsigned long _res; \
4574 _argvec[0] = (unsigned long)_orig.nraddr; \
4575 _argvec[1] = (unsigned long)(arg1); \
4576 _argvec[2] = (unsigned long)(arg2); \
4577 _argvec[3] = (unsigned long)(arg3); \
4579 "ld $4, 8(%1)\n\t" \
4580 "ld $5, 16(%1)\n\t" \
4581 "ld $6, 24(%1)\n\t" \
4582 "ld $25, 0(%1)\n\t" \
4583 VALGRIND_CALL_NOREDIR_T9 \
4586 : "r" (&_argvec[0]) \
4587 : "memory", __CALLER_SAVED_REGS \
4589 lval = (__typeof__(lval)) _res; \
4592 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
4594 volatile OrigFn _orig = (orig); \
4595 volatile unsigned long _argvec[5]; \
4596 volatile unsigned long _res; \
4597 _argvec[0] = (unsigned long)_orig.nraddr; \
4598 _argvec[1] = (unsigned long)(arg1); \
4599 _argvec[2] = (unsigned long)(arg2); \
4600 _argvec[3] = (unsigned long)(arg3); \
4601 _argvec[4] = (unsigned long)(arg4); \
4603 "ld $4, 8(%1)\n\t" \
4604 "ld $5, 16(%1)\n\t" \
4605 "ld $6, 24(%1)\n\t" \
4606 "ld $7, 32(%1)\n\t" \
4607 "ld $25, 0(%1)\n\t" \
4608 VALGRIND_CALL_NOREDIR_T9 \
4611 : "r" (&_argvec[0]) \
4612 : "memory", __CALLER_SAVED_REGS \
4614 lval = (__typeof__(lval)) _res; \
4617 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
4619 volatile OrigFn _orig = (orig); \
4620 volatile unsigned long _argvec[6]; \
4621 volatile unsigned long _res; \
4622 _argvec[0] = (unsigned long)_orig.nraddr; \
4623 _argvec[1] = (unsigned long)(arg1); \
4624 _argvec[2] = (unsigned long)(arg2); \
4625 _argvec[3] = (unsigned long)(arg3); \
4626 _argvec[4] = (unsigned long)(arg4); \
4627 _argvec[5] = (unsigned long)(arg5); \
4629 "ld $4, 8(%1)\n\t" \
4630 "ld $5, 16(%1)\n\t" \
4631 "ld $6, 24(%1)\n\t" \
4632 "ld $7, 32(%1)\n\t" \
4633 "ld $8, 40(%1)\n\t" \
4634 "ld $25, 0(%1)\n\t" \
4635 VALGRIND_CALL_NOREDIR_T9 \
4638 : "r" (&_argvec[0]) \
4639 : "memory", __CALLER_SAVED_REGS \
4641 lval = (__typeof__(lval)) _res; \
4644 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
4646 volatile OrigFn _orig = (orig); \
4647 volatile unsigned long _argvec[7]; \
4648 volatile unsigned long _res; \
4649 _argvec[0] = (unsigned long)_orig.nraddr; \
4650 _argvec[1] = (unsigned long)(arg1); \
4651 _argvec[2] = (unsigned long)(arg2); \
4652 _argvec[3] = (unsigned long)(arg3); \
4653 _argvec[4] = (unsigned long)(arg4); \
4654 _argvec[5] = (unsigned long)(arg5); \
4655 _argvec[6] = (unsigned long)(arg6); \
4657 "ld $4, 8(%1)\n\t" \
4658 "ld $5, 16(%1)\n\t" \
4659 "ld $6, 24(%1)\n\t" \
4660 "ld $7, 32(%1)\n\t" \
4661 "ld $8, 40(%1)\n\t" \
4662 "ld $9, 48(%1)\n\t" \
4663 "ld $25, 0(%1)\n\t" \
4664 VALGRIND_CALL_NOREDIR_T9 \
4667 : "r" (&_argvec[0]) \
4668 : "memory", __CALLER_SAVED_REGS \
4670 lval = (__typeof__(lval)) _res; \
4673 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
4676 volatile OrigFn _orig = (orig); \
4677 volatile unsigned long _argvec[8]; \
4678 volatile unsigned long _res; \
4679 _argvec[0] = (unsigned long)_orig.nraddr; \
4680 _argvec[1] = (unsigned long)(arg1); \
4681 _argvec[2] = (unsigned long)(arg2); \
4682 _argvec[3] = (unsigned long)(arg3); \
4683 _argvec[4] = (unsigned long)(arg4); \
4684 _argvec[5] = (unsigned long)(arg5); \
4685 _argvec[6] = (unsigned long)(arg6); \
4686 _argvec[7] = (unsigned long)(arg7); \
4688 "ld $4, 8(%1)\n\t" \
4689 "ld $5, 16(%1)\n\t" \
4690 "ld $6, 24(%1)\n\t" \
4691 "ld $7, 32(%1)\n\t" \
4692 "ld $8, 40(%1)\n\t" \
4693 "ld $9, 48(%1)\n\t" \
4694 "ld $10, 56(%1)\n\t" \
4695 "ld $25, 0(%1) \n\t" \
4696 VALGRIND_CALL_NOREDIR_T9 \
4699 : "r" (&_argvec[0]) \
4700 : "memory", __CALLER_SAVED_REGS \
4702 lval = (__typeof__(lval)) _res; \
4705 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
4708 volatile OrigFn _orig = (orig); \
4709 volatile unsigned long _argvec[9]; \
4710 volatile unsigned long _res; \
4711 _argvec[0] = (unsigned long)_orig.nraddr; \
4712 _argvec[1] = (unsigned long)(arg1); \
4713 _argvec[2] = (unsigned long)(arg2); \
4714 _argvec[3] = (unsigned long)(arg3); \
4715 _argvec[4] = (unsigned long)(arg4); \
4716 _argvec[5] = (unsigned long)(arg5); \
4717 _argvec[6] = (unsigned long)(arg6); \
4718 _argvec[7] = (unsigned long)(arg7); \
4719 _argvec[8] = (unsigned long)(arg8); \
4721 "ld $4, 8(%1)\n\t" \
4722 "ld $5, 16(%1)\n\t" \
4723 "ld $6, 24(%1)\n\t" \
4724 "ld $7, 32(%1)\n\t" \
4725 "ld $8, 40(%1)\n\t" \
4726 "ld $9, 48(%1)\n\t" \
4727 "ld $10, 56(%1)\n\t" \
4728 "ld $11, 64(%1)\n\t" \
4729 "ld $25, 0(%1) \n\t" \
4730 VALGRIND_CALL_NOREDIR_T9 \
4733 : "r" (&_argvec[0]) \
4734 : "memory", __CALLER_SAVED_REGS \
4736 lval = (__typeof__(lval)) _res; \
4739 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
4742 volatile OrigFn _orig = (orig); \
4743 volatile unsigned long _argvec[10]; \
4744 volatile unsigned long _res; \
4745 _argvec[0] = (unsigned long)_orig.nraddr; \
4746 _argvec[1] = (unsigned long)(arg1); \
4747 _argvec[2] = (unsigned long)(arg2); \
4748 _argvec[3] = (unsigned long)(arg3); \
4749 _argvec[4] = (unsigned long)(arg4); \
4750 _argvec[5] = (unsigned long)(arg5); \
4751 _argvec[6] = (unsigned long)(arg6); \
4752 _argvec[7] = (unsigned long)(arg7); \
4753 _argvec[8] = (unsigned long)(arg8); \
4754 _argvec[9] = (unsigned long)(arg9); \
4756 "dsubu $29, $29, 8\n\t" \
4757 "ld $4, 72(%1)\n\t" \
4758 "sd $4, 0($29)\n\t" \
4759 "ld $4, 8(%1)\n\t" \
4760 "ld $5, 16(%1)\n\t" \
4761 "ld $6, 24(%1)\n\t" \
4762 "ld $7, 32(%1)\n\t" \
4763 "ld $8, 40(%1)\n\t" \
4764 "ld $9, 48(%1)\n\t" \
4765 "ld $10, 56(%1)\n\t" \
4766 "ld $11, 64(%1)\n\t" \
4767 "ld $25, 0(%1)\n\t" \
4768 VALGRIND_CALL_NOREDIR_T9 \
4769 "daddu $29, $29, 8\n\t" \
4772 : "r" (&_argvec[0]) \
4773 : "memory", __CALLER_SAVED_REGS \
4775 lval = (__typeof__(lval)) _res; \
4778 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
4779 arg7,arg8,arg9,arg10) \
4781 volatile OrigFn _orig = (orig); \
4782 volatile unsigned long _argvec[11]; \
4783 volatile unsigned long _res; \
4784 _argvec[0] = (unsigned long)_orig.nraddr; \
4785 _argvec[1] = (unsigned long)(arg1); \
4786 _argvec[2] = (unsigned long)(arg2); \
4787 _argvec[3] = (unsigned long)(arg3); \
4788 _argvec[4] = (unsigned long)(arg4); \
4789 _argvec[5] = (unsigned long)(arg5); \
4790 _argvec[6] = (unsigned long)(arg6); \
4791 _argvec[7] = (unsigned long)(arg7); \
4792 _argvec[8] = (unsigned long)(arg8); \
4793 _argvec[9] = (unsigned long)(arg9); \
4794 _argvec[10] = (unsigned long)(arg10); \
4796 "dsubu $29, $29, 16\n\t" \
4797 "ld $4, 72(%1)\n\t" \
4798 "sd $4, 0($29)\n\t" \
4799 "ld $4, 80(%1)\n\t" \
4800 "sd $4, 8($29)\n\t" \
4801 "ld $4, 8(%1)\n\t" \
4802 "ld $5, 16(%1)\n\t" \
4803 "ld $6, 24(%1)\n\t" \
4804 "ld $7, 32(%1)\n\t" \
4805 "ld $8, 40(%1)\n\t" \
4806 "ld $9, 48(%1)\n\t" \
4807 "ld $10, 56(%1)\n\t" \
4808 "ld $11, 64(%1)\n\t" \
4809 "ld $25, 0(%1)\n\t" \
4810 VALGRIND_CALL_NOREDIR_T9 \
4811 "daddu $29, $29, 16\n\t" \
4814 : "r" (&_argvec[0]) \
4815 : "memory", __CALLER_SAVED_REGS \
4817 lval = (__typeof__(lval)) _res; \
4820 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
4821 arg6,arg7,arg8,arg9,arg10, \
4824 volatile OrigFn _orig = (orig); \
4825 volatile unsigned long _argvec[12]; \
4826 volatile unsigned long _res; \
4827 _argvec[0] = (unsigned long)_orig.nraddr; \
4828 _argvec[1] = (unsigned long)(arg1); \
4829 _argvec[2] = (unsigned long)(arg2); \
4830 _argvec[3] = (unsigned long)(arg3); \
4831 _argvec[4] = (unsigned long)(arg4); \
4832 _argvec[5] = (unsigned long)(arg5); \
4833 _argvec[6] = (unsigned long)(arg6); \
4834 _argvec[7] = (unsigned long)(arg7); \
4835 _argvec[8] = (unsigned long)(arg8); \
4836 _argvec[9] = (unsigned long)(arg9); \
4837 _argvec[10] = (unsigned long)(arg10); \
4838 _argvec[11] = (unsigned long)(arg11); \
4840 "dsubu $29, $29, 24\n\t" \
4841 "ld $4, 72(%1)\n\t" \
4842 "sd $4, 0($29)\n\t" \
4843 "ld $4, 80(%1)\n\t" \
4844 "sd $4, 8($29)\n\t" \
4845 "ld $4, 88(%1)\n\t" \
4846 "sd $4, 16($29)\n\t" \
4847 "ld $4, 8(%1)\n\t" \
4848 "ld $5, 16(%1)\n\t" \
4849 "ld $6, 24(%1)\n\t" \
4850 "ld $7, 32(%1)\n\t" \
4851 "ld $8, 40(%1)\n\t" \
4852 "ld $9, 48(%1)\n\t" \
4853 "ld $10, 56(%1)\n\t" \
4854 "ld $11, 64(%1)\n\t" \
4855 "ld $25, 0(%1)\n\t" \
4856 VALGRIND_CALL_NOREDIR_T9 \
4857 "daddu $29, $29, 24\n\t" \
4860 : "r" (&_argvec[0]) \
4861 : "memory", __CALLER_SAVED_REGS \
4863 lval = (__typeof__(lval)) _res; \
4866 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
4867 arg6,arg7,arg8,arg9,arg10, \
4870 volatile OrigFn _orig = (orig); \
4871 volatile unsigned long _argvec[13]; \
4872 volatile unsigned long _res; \
4873 _argvec[0] = (unsigned long)_orig.nraddr; \
4874 _argvec[1] = (unsigned long)(arg1); \
4875 _argvec[2] = (unsigned long)(arg2); \
4876 _argvec[3] = (unsigned long)(arg3); \
4877 _argvec[4] = (unsigned long)(arg4); \
4878 _argvec[5] = (unsigned long)(arg5); \
4879 _argvec[6] = (unsigned long)(arg6); \
4880 _argvec[7] = (unsigned long)(arg7); \
4881 _argvec[8] = (unsigned long)(arg8); \
4882 _argvec[9] = (unsigned long)(arg9); \
4883 _argvec[10] = (unsigned long)(arg10); \
4884 _argvec[11] = (unsigned long)(arg11); \
4885 _argvec[12] = (unsigned long)(arg12); \
4887 "dsubu $29, $29, 32\n\t" \
4888 "ld $4, 72(%1)\n\t" \
4889 "sd $4, 0($29)\n\t" \
4890 "ld $4, 80(%1)\n\t" \
4891 "sd $4, 8($29)\n\t" \
4892 "ld $4, 88(%1)\n\t" \
4893 "sd $4, 16($29)\n\t" \
4894 "ld $4, 96(%1)\n\t" \
4895 "sd $4, 24($29)\n\t" \
4896 "ld $4, 8(%1)\n\t" \
4897 "ld $5, 16(%1)\n\t" \
4898 "ld $6, 24(%1)\n\t" \
4899 "ld $7, 32(%1)\n\t" \
4900 "ld $8, 40(%1)\n\t" \
4901 "ld $9, 48(%1)\n\t" \
4902 "ld $10, 56(%1)\n\t" \
4903 "ld $11, 64(%1)\n\t" \
4904 "ld $25, 0(%1)\n\t" \
4905 VALGRIND_CALL_NOREDIR_T9 \
4906 "daddu $29, $29, 32\n\t" \
4909 : "r" (&_argvec[0]) \
4910 : "memory", __CALLER_SAVED_REGS \
4912 lval = (__typeof__(lval)) _res; \
4933 #define VG_USERREQ_TOOL_BASE(a,b) \
4934 ((unsigned int)(((a)&0xff) << 24 | ((b)&0xff) << 16))
4935 #define VG_IS_TOOL_USERREQ(a, b, v) \
4936 (VG_USERREQ_TOOL_BASE(a,b) == ((v) & 0xffff0000))
5015 #if !defined(__GNUC__)
5016 # define __extension__
5024 #define RUNNING_ON_VALGRIND \
5025 (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0 , \
5026 VG_USERREQ__RUNNING_ON_VALGRIND, \
5034 #define VALGRIND_DISCARD_TRANSLATIONS(_qzz_addr,_qzz_len) \
5035 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DISCARD_TRANSLATIONS, \
5036 _qzz_addr, _qzz_len, 0, 0, 0)
5044 #if defined(__GNUC__) || defined(__INTEL_COMPILER) && !defined(_MSC_VER)
5047 static int VALGRIND_PRINTF(
const char *
format, ...)
5051 #if defined(_MSC_VER)
5054 VALGRIND_PRINTF(
const char *format, ...)
5056 #if defined(NVALGRIND)
5059 #if defined(_MSC_VER) || defined(__MINGW64__)
5062 unsigned long _qzz_res;
5065 va_start(vargs, format);
5066 #if defined(_MSC_VER) || defined(__MINGW64__)
5075 (
unsigned long)format,
5076 (
unsigned long)&vargs,
5080 return (
int)_qzz_res;
5084 #if defined(__GNUC__) || defined(__INTEL_COMPILER) && !defined(_MSC_VER)
5085 static int VALGRIND_PRINTF_BACKTRACE(
const char *format, ...)
5089 #if defined(_MSC_VER)
5092 VALGRIND_PRINTF_BACKTRACE(
const char *format, ...)
5094 #if defined(NVALGRIND)
5097 #if defined(_MSC_VER) || defined(__MINGW64__)
5100 unsigned long _qzz_res;
5103 va_start(vargs, format);
5104 #if defined(_MSC_VER) || defined(__MINGW64__)
5113 (
unsigned long)format,
5114 (
unsigned long)&vargs,
5118 return (
int)_qzz_res;
5146 #define VALGRIND_NON_SIMD_CALL0(_qyy_fn) \
5147 VALGRIND_DO_CLIENT_REQUEST_EXPR(0 , \
5148 VG_USERREQ__CLIENT_CALL0, \
5152 #define VALGRIND_NON_SIMD_CALL1(_qyy_fn, _qyy_arg1) \
5153 VALGRIND_DO_CLIENT_REQUEST_EXPR(0 , \
5154 VG_USERREQ__CLIENT_CALL1, \
5158 #define VALGRIND_NON_SIMD_CALL2(_qyy_fn, _qyy_arg1, _qyy_arg2) \
5159 VALGRIND_DO_CLIENT_REQUEST_EXPR(0 , \
5160 VG_USERREQ__CLIENT_CALL2, \
5162 _qyy_arg1, _qyy_arg2, 0, 0)
5164 #define VALGRIND_NON_SIMD_CALL3(_qyy_fn, _qyy_arg1, _qyy_arg2, _qyy_arg3) \
5165 VALGRIND_DO_CLIENT_REQUEST_EXPR(0 , \
5166 VG_USERREQ__CLIENT_CALL3, \
5168 _qyy_arg1, _qyy_arg2, \
5175 #define VALGRIND_COUNT_ERRORS \
5176 (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR( \
5178 VG_USERREQ__COUNT_ERRORS, \
5282 #define VALGRIND_MALLOCLIKE_BLOCK(addr, sizeB, rzB, is_zeroed) \
5283 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MALLOCLIKE_BLOCK, \
5284 addr, sizeB, rzB, is_zeroed, 0)
5289 #define VALGRIND_RESIZEINPLACE_BLOCK(addr, oldSizeB, newSizeB, rzB) \
5290 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__RESIZEINPLACE_BLOCK, \
5291 addr, oldSizeB, newSizeB, rzB, 0)
5296 #define VALGRIND_FREELIKE_BLOCK(addr, rzB) \
5297 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__FREELIKE_BLOCK, \
5301 #define VALGRIND_CREATE_MEMPOOL(pool, rzB, is_zeroed) \
5302 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CREATE_MEMPOOL, \
5303 pool, rzB, is_zeroed, 0, 0)
5306 #define VALGRIND_DESTROY_MEMPOOL(pool) \
5307 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DESTROY_MEMPOOL, \
5311 #define VALGRIND_MEMPOOL_ALLOC(pool, addr, size) \
5312 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_ALLOC, \
5313 pool, addr, size, 0, 0)
5316 #define VALGRIND_MEMPOOL_FREE(pool, addr) \
5317 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_FREE, \
5318 pool, addr, 0, 0, 0)
5321 #define VALGRIND_MEMPOOL_TRIM(pool, addr, size) \
5322 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_TRIM, \
5323 pool, addr, size, 0, 0)
5326 #define VALGRIND_MOVE_MEMPOOL(poolA, poolB) \
5327 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MOVE_MEMPOOL, \
5328 poolA, poolB, 0, 0, 0)
5331 #define VALGRIND_MEMPOOL_CHANGE(pool, addrA, addrB, size) \
5332 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_CHANGE, \
5333 pool, addrA, addrB, size, 0)
5336 #define VALGRIND_MEMPOOL_EXISTS(pool) \
5337 (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
5338 VG_USERREQ__MEMPOOL_EXISTS, \
5342 #define VALGRIND_STACK_REGISTER(start, end) \
5343 (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
5344 VG_USERREQ__STACK_REGISTER, \
5345 start, end, 0, 0, 0)
5349 #define VALGRIND_STACK_DEREGISTER(id) \
5350 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__STACK_DEREGISTER, \
5354 #define VALGRIND_STACK_CHANGE(id, start, end) \
5355 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__STACK_CHANGE, \
5356 id, start, end, 0, 0)
5359 #define VALGRIND_LOAD_PDB_DEBUGINFO(fd, ptr, total_size, delta) \
5360 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__LOAD_PDB_DEBUGINFO, \
5361 fd, ptr, total_size, delta, 0)
5367 #define VALGRIND_MAP_IP_TO_SRCLOC(addr, buf64) \
5368 (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
5369 VG_USERREQ__MAP_IP_TO_SRCLOC, \
5370 addr, buf64, 0, 0, 0)
5380 #define VALGRIND_DISABLE_ERROR_REPORTING \
5381 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CHANGE_ERR_DISABLEMENT, \
5386 #define VALGRIND_ENABLE_ERROR_REPORTING \
5387 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CHANGE_ERR_DISABLEMENT, \
5395 #define VALGRIND_MONITOR_COMMAND(command) \
5396 VALGRIND_DO_CLIENT_REQUEST_EXPR(0, VG_USERREQ__GDB_MONITOR_COMMAND, \
5397 command, 0, 0, 0, 0)
5400 #undef PLAT_x86_darwin
5401 #undef PLAT_amd64_darwin
5402 #undef PLAT_x86_win32
5403 #undef PLAT_amd64_win64
5404 #undef PLAT_x86_linux
5405 #undef PLAT_amd64_linux
5406 #undef PLAT_ppc32_linux
5407 #undef PLAT_ppc64_linux
5408 #undef PLAT_arm_linux
5409 #undef PLAT_s390x_linux
5410 #undef PLAT_mips32_linux
5411 #undef PLAT_mips64_linux
GAUDI_API std::string format(const char *,...)
MsgStream format utility "a la sprintf(...)".
#define VALGRIND_DO_CLIENT_REQUEST_EXPR(_zzq_default, _zzq_request,_zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5)