91 #define __VALGRIND_MAJOR__ 3
92 #define __VALGRIND_MINOR__ 10
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_ppc64be_linux
119 #undef PLAT_ppc64le_linux
120 #undef PLAT_arm_linux
121 #undef PLAT_arm64_linux
122 #undef PLAT_s390x_linux
123 #undef PLAT_mips32_linux
124 #undef PLAT_mips64_linux
127 #if defined(__APPLE__) && defined(__i386__)
128 # define PLAT_x86_darwin 1
129 #elif defined(__APPLE__) && defined(__x86_64__)
130 # define PLAT_amd64_darwin 1
131 #elif (defined(__MINGW32__) && !defined(__MINGW64__)) \
132 || defined(__CYGWIN32__) \
133 || (defined(_WIN32) && defined(_M_IX86) && defined(__GNUC__))
134 # define PLAT_x86_win32 1
135 #elif defined(__MINGW64__) \
136 || (defined(_WIN64) && defined(_M_X64) && defined(__GNUC__))
137 # define PLAT_amd64_win64 1
138 #elif defined(__linux__) && defined(__i386__)
139 # define PLAT_x86_linux 1
140 #elif defined(__linux__) && defined(__x86_64__)
141 # define PLAT_amd64_linux 1
142 #elif defined(__linux__) && defined(__powerpc__) && !defined(__powerpc64__)
143 # define PLAT_ppc32_linux 1
144 #elif defined(__linux__) && defined(__powerpc__) && defined(__powerpc64__) && _CALL_ELF != 2
146 # define PLAT_ppc64be_linux 1
147 #elif defined(__linux__) && defined(__powerpc__) && defined(__powerpc64__) && _CALL_ELF == 2
149 # define PLAT_ppc64le_linux 1
150 #elif defined(__linux__) && defined(__arm__) && !defined(__aarch64__)
151 # define PLAT_arm_linux 1
152 #elif defined(__linux__) && defined(__aarch64__) && !defined(__arm__)
153 # define PLAT_arm64_linux 1
154 #elif defined(__linux__) && defined(__s390__) && defined(__s390x__)
155 # define PLAT_s390x_linux 1
156 #elif defined(__linux__) && defined(__mips__) && (__mips==64)
157 # define PLAT_mips64_linux 1
158 #elif defined(__linux__) && defined(__mips__) && (__mips!=64)
159 # define PLAT_mips32_linux 1
163 # if !defined(NVALGRIND)
187 #define VALGRIND_DO_CLIENT_REQUEST(_zzq_rlval, _zzq_default, \
188 _zzq_request, _zzq_arg1, _zzq_arg2, \
189 _zzq_arg3, _zzq_arg4, _zzq_arg5) \
190 do { (_zzq_rlval) = VALGRIND_DO_CLIENT_REQUEST_EXPR((_zzq_default), \
191 (_zzq_request), (_zzq_arg1), (_zzq_arg2), \
192 (_zzq_arg3), (_zzq_arg4), (_zzq_arg5)); } while (0)
194 #define VALGRIND_DO_CLIENT_REQUEST_STMT(_zzq_request, _zzq_arg1, \
195 _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
196 do { (void) VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
197 (_zzq_request), (_zzq_arg1), (_zzq_arg2), \
198 (_zzq_arg3), (_zzq_arg4), (_zzq_arg5)); } while (0)
200 #if defined(NVALGRIND)
205 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
206 _zzq_default, _zzq_request, \
207 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
249 #if defined(PLAT_x86_linux) || defined(PLAT_x86_darwin) \
250 || (defined(PLAT_x86_win32) && defined(__GNUC__))
258 #define __SPECIAL_INSTRUCTION_PREAMBLE \
259 "roll $3, %%edi ; roll $13, %%edi\n\t" \
260 "roll $29, %%edi ; roll $19, %%edi\n\t"
262 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
263 _zzq_default, _zzq_request, \
264 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
266 ({volatile unsigned int _zzq_args[6]; \
267 volatile unsigned int _zzq_result; \
268 _zzq_args[0] = (unsigned int)(_zzq_request); \
269 _zzq_args[1] = (unsigned int)(_zzq_arg1); \
270 _zzq_args[2] = (unsigned int)(_zzq_arg2); \
271 _zzq_args[3] = (unsigned int)(_zzq_arg3); \
272 _zzq_args[4] = (unsigned int)(_zzq_arg4); \
273 _zzq_args[5] = (unsigned int)(_zzq_arg5); \
274 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
276 "xchgl %%ebx,%%ebx" \
277 : "=d" (_zzq_result) \
278 : "a" (&_zzq_args[0]), "0" (_zzq_default) \
284 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
285 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
286 volatile unsigned int __addr; \
287 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
289 "xchgl %%ecx,%%ecx" \
294 _zzq_orig->nraddr = __addr; \
297 #define VALGRIND_CALL_NOREDIR_EAX \
298 __SPECIAL_INSTRUCTION_PREAMBLE \
300 "xchgl %%edx,%%edx\n\t"
302 #define VALGRIND_VEX_INJECT_IR() \
304 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
305 "xchgl %%edi,%%edi\n\t" \
306 : : : "cc", "memory" \
314 #if defined(PLAT_x86_win32) && !defined(__GNUC__)
322 #if defined(_MSC_VER)
324 #define __SPECIAL_INSTRUCTION_PREAMBLE \
325 __asm rol edi, 3 __asm rol edi, 13 \
326 __asm rol edi, 29 __asm rol edi, 19
328 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
329 _zzq_default, _zzq_request, \
330 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
331 valgrind_do_client_request_expr((uintptr_t)(_zzq_default), \
332 (uintptr_t)(_zzq_request), (uintptr_t)(_zzq_arg1), \
333 (uintptr_t)(_zzq_arg2), (uintptr_t)(_zzq_arg3), \
334 (uintptr_t)(_zzq_arg4), (uintptr_t)(_zzq_arg5))
336 static __inline uintptr_t
337 valgrind_do_client_request_expr(uintptr_t _zzq_default, uintptr_t _zzq_request,
338 uintptr_t _zzq_arg1, uintptr_t _zzq_arg2,
339 uintptr_t _zzq_arg3, uintptr_t _zzq_arg4,
342 volatile uintptr_t _zzq_args[6];
343 volatile unsigned int _zzq_result;
344 _zzq_args[0] = (uintptr_t)(_zzq_request);
345 _zzq_args[1] = (uintptr_t)(_zzq_arg1);
346 _zzq_args[2] = (uintptr_t)(_zzq_arg2);
347 _zzq_args[3] = (uintptr_t)(_zzq_arg3);
348 _zzq_args[4] = (uintptr_t)(_zzq_arg4);
349 _zzq_args[5] = (uintptr_t)(_zzq_arg5);
350 __asm { __asm lea eax, _zzq_args __asm mov edx, _zzq_default
351 __SPECIAL_INSTRUCTION_PREAMBLE
354 __asm mov _zzq_result, edx
359 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
360 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
361 volatile unsigned int __addr; \
362 __asm { __SPECIAL_INSTRUCTION_PREAMBLE \
365 __asm mov __addr, eax \
367 _zzq_orig->nraddr = __addr; \
370 #define VALGRIND_CALL_NOREDIR_EAX ERROR
372 #define VALGRIND_VEX_INJECT_IR() \
374 __asm { __SPECIAL_INSTRUCTION_PREAMBLE \
380 #error Unsupported compiler.
387 #if defined(PLAT_amd64_linux) || defined(PLAT_amd64_darwin) \
388 || (defined(PLAT_amd64_win64) && defined(__GNUC__))
392 unsigned long long int nraddr;
396 #define __SPECIAL_INSTRUCTION_PREAMBLE \
397 "rolq $3, %%rdi ; rolq $13, %%rdi\n\t" \
398 "rolq $61, %%rdi ; rolq $51, %%rdi\n\t"
400 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
401 _zzq_default, _zzq_request, \
402 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
404 ({ volatile unsigned long long int _zzq_args[6]; \
405 volatile unsigned long long int _zzq_result; \
406 _zzq_args[0] = (unsigned long long int)(_zzq_request); \
407 _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \
408 _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \
409 _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \
410 _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \
411 _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \
412 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
414 "xchgq %%rbx,%%rbx" \
415 : "=d" (_zzq_result) \
416 : "a" (&_zzq_args[0]), "0" (_zzq_default) \
422 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
423 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
424 volatile unsigned long long int __addr; \
425 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
427 "xchgq %%rcx,%%rcx" \
432 _zzq_orig->nraddr = __addr; \
435 #define VALGRIND_CALL_NOREDIR_RAX \
436 __SPECIAL_INSTRUCTION_PREAMBLE \
438 "xchgq %%rdx,%%rdx\n\t"
440 #define VALGRIND_VEX_INJECT_IR() \
442 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
443 "xchgq %%rdi,%%rdi\n\t" \
444 : : : "cc", "memory" \
452 #if defined(PLAT_amd64_win64) && !defined(__GNUC__)
454 #error Unsupported compiler.
460 #if defined(PLAT_ppc32_linux)
468 #define __SPECIAL_INSTRUCTION_PREAMBLE \
469 "rlwinm 0,0,3,0,31 ; rlwinm 0,0,13,0,31\n\t" \
470 "rlwinm 0,0,29,0,31 ; rlwinm 0,0,19,0,31\n\t"
472 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
473 _zzq_default, _zzq_request, \
474 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
477 ({ unsigned int _zzq_args[6]; \
478 unsigned int _zzq_result; \
479 unsigned int* _zzq_ptr; \
480 _zzq_args[0] = (unsigned int)(_zzq_request); \
481 _zzq_args[1] = (unsigned int)(_zzq_arg1); \
482 _zzq_args[2] = (unsigned int)(_zzq_arg2); \
483 _zzq_args[3] = (unsigned int)(_zzq_arg3); \
484 _zzq_args[4] = (unsigned int)(_zzq_arg4); \
485 _zzq_args[5] = (unsigned int)(_zzq_arg5); \
486 _zzq_ptr = _zzq_args; \
487 __asm__ volatile("mr 3,%1\n\t" \
489 __SPECIAL_INSTRUCTION_PREAMBLE \
493 : "=b" (_zzq_result) \
494 : "b" (_zzq_default), "b" (_zzq_ptr) \
495 : "cc", "memory", "r3", "r4"); \
499 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
500 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
501 unsigned int __addr; \
502 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
508 : "cc", "memory", "r3" \
510 _zzq_orig->nraddr = __addr; \
513 #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
514 __SPECIAL_INSTRUCTION_PREAMBLE \
518 #define VALGRIND_VEX_INJECT_IR() \
520 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
529 #if defined(PLAT_ppc64be_linux)
533 unsigned long long int nraddr;
534 unsigned long long int r2;
538 #define __SPECIAL_INSTRUCTION_PREAMBLE \
539 "rotldi 0,0,3 ; rotldi 0,0,13\n\t" \
540 "rotldi 0,0,61 ; rotldi 0,0,51\n\t"
542 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
543 _zzq_default, _zzq_request, \
544 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
547 ({ unsigned long long int _zzq_args[6]; \
548 unsigned long long int _zzq_result; \
549 unsigned long long int* _zzq_ptr; \
550 _zzq_args[0] = (unsigned long long int)(_zzq_request); \
551 _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \
552 _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \
553 _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \
554 _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \
555 _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \
556 _zzq_ptr = _zzq_args; \
557 __asm__ volatile("mr 3,%1\n\t" \
559 __SPECIAL_INSTRUCTION_PREAMBLE \
563 : "=b" (_zzq_result) \
564 : "b" (_zzq_default), "b" (_zzq_ptr) \
565 : "cc", "memory", "r3", "r4"); \
569 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
570 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
571 unsigned long long int __addr; \
572 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
578 : "cc", "memory", "r3" \
580 _zzq_orig->nraddr = __addr; \
581 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
587 : "cc", "memory", "r3" \
589 _zzq_orig->r2 = __addr; \
592 #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
593 __SPECIAL_INSTRUCTION_PREAMBLE \
597 #define VALGRIND_VEX_INJECT_IR() \
599 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
606 #if defined(PLAT_ppc64le_linux)
610 unsigned long long int nraddr;
611 unsigned long long int r2;
615 #define __SPECIAL_INSTRUCTION_PREAMBLE \
616 "rotldi 0,0,3 ; rotldi 0,0,13\n\t" \
617 "rotldi 0,0,61 ; rotldi 0,0,51\n\t"
619 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
620 _zzq_default, _zzq_request, \
621 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
624 ({ unsigned long long int _zzq_args[6]; \
625 unsigned long long int _zzq_result; \
626 unsigned long long int* _zzq_ptr; \
627 _zzq_args[0] = (unsigned long long int)(_zzq_request); \
628 _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \
629 _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \
630 _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \
631 _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \
632 _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \
633 _zzq_ptr = _zzq_args; \
634 __asm__ volatile("mr 3,%1\n\t" \
636 __SPECIAL_INSTRUCTION_PREAMBLE \
640 : "=b" (_zzq_result) \
641 : "b" (_zzq_default), "b" (_zzq_ptr) \
642 : "cc", "memory", "r3", "r4"); \
646 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
647 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
648 unsigned long long int __addr; \
649 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
655 : "cc", "memory", "r3" \
657 _zzq_orig->nraddr = __addr; \
658 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
664 : "cc", "memory", "r3" \
666 _zzq_orig->r2 = __addr; \
669 #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \
670 __SPECIAL_INSTRUCTION_PREAMBLE \
674 #define VALGRIND_VEX_INJECT_IR() \
676 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
685 #if defined(PLAT_arm_linux)
693 #define __SPECIAL_INSTRUCTION_PREAMBLE \
694 "mov r12, r12, ror #3 ; mov r12, r12, ror #13 \n\t" \
695 "mov r12, r12, ror #29 ; mov r12, r12, ror #19 \n\t"
697 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
698 _zzq_default, _zzq_request, \
699 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
702 ({volatile unsigned int _zzq_args[6]; \
703 volatile unsigned int _zzq_result; \
704 _zzq_args[0] = (unsigned int)(_zzq_request); \
705 _zzq_args[1] = (unsigned int)(_zzq_arg1); \
706 _zzq_args[2] = (unsigned int)(_zzq_arg2); \
707 _zzq_args[3] = (unsigned int)(_zzq_arg3); \
708 _zzq_args[4] = (unsigned int)(_zzq_arg4); \
709 _zzq_args[5] = (unsigned int)(_zzq_arg5); \
710 __asm__ volatile("mov r3, %1\n\t" \
712 __SPECIAL_INSTRUCTION_PREAMBLE \
714 "orr r10, r10, r10\n\t" \
716 : "=r" (_zzq_result) \
717 : "r" (_zzq_default), "r" (&_zzq_args[0]) \
718 : "cc","memory", "r3", "r4"); \
722 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
723 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
724 unsigned int __addr; \
725 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
727 "orr r11, r11, r11\n\t" \
731 : "cc", "memory", "r3" \
733 _zzq_orig->nraddr = __addr; \
736 #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
737 __SPECIAL_INSTRUCTION_PREAMBLE \
739 "orr r12, r12, r12\n\t"
741 #define VALGRIND_VEX_INJECT_IR() \
743 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
744 "orr r9, r9, r9\n\t" \
745 : : : "cc", "memory" \
753 #if defined(PLAT_arm64_linux)
757 unsigned long long int nraddr;
761 #define __SPECIAL_INSTRUCTION_PREAMBLE \
762 "ror x12, x12, #3 ; ror x12, x12, #13 \n\t" \
763 "ror x12, x12, #51 ; ror x12, x12, #61 \n\t"
765 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
766 _zzq_default, _zzq_request, \
767 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
770 ({volatile unsigned long long int _zzq_args[6]; \
771 volatile unsigned long long int _zzq_result; \
772 _zzq_args[0] = (unsigned long long int)(_zzq_request); \
773 _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \
774 _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \
775 _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \
776 _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \
777 _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \
778 __asm__ volatile("mov x3, %1\n\t" \
780 __SPECIAL_INSTRUCTION_PREAMBLE \
782 "orr x10, x10, x10\n\t" \
784 : "=r" (_zzq_result) \
785 : "r" (_zzq_default), "r" (&_zzq_args[0]) \
786 : "cc","memory", "x3", "x4"); \
790 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
791 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
792 unsigned long long int __addr; \
793 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
795 "orr x11, x11, x11\n\t" \
799 : "cc", "memory", "x3" \
801 _zzq_orig->nraddr = __addr; \
804 #define VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \
805 __SPECIAL_INSTRUCTION_PREAMBLE \
807 "orr x12, x12, x12\n\t"
809 #define VALGRIND_VEX_INJECT_IR() \
811 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
812 "orr x9, x9, x9\n\t" \
813 : : : "cc", "memory" \
821 #if defined(PLAT_s390x_linux)
825 unsigned long long int nraddr;
833 #define __SPECIAL_INSTRUCTION_PREAMBLE \
839 #define __CLIENT_REQUEST_CODE "lr 2,2\n\t"
840 #define __GET_NR_CONTEXT_CODE "lr 3,3\n\t"
841 #define __CALL_NO_REDIR_CODE "lr 4,4\n\t"
842 #define __VEX_INJECT_IR_CODE "lr 5,5\n\t"
844 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
845 _zzq_default, _zzq_request, \
846 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
848 ({volatile unsigned long long int _zzq_args[6]; \
849 volatile unsigned long long int _zzq_result; \
850 _zzq_args[0] = (unsigned long long int)(_zzq_request); \
851 _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \
852 _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \
853 _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \
854 _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \
855 _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \
860 __SPECIAL_INSTRUCTION_PREAMBLE \
861 __CLIENT_REQUEST_CODE \
864 : "=d" (_zzq_result) \
865 : "a" (&_zzq_args[0]), "0" (_zzq_default) \
866 : "cc", "2", "3", "memory" \
871 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
872 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
873 volatile unsigned long long int __addr; \
874 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
875 __GET_NR_CONTEXT_CODE \
879 : "cc", "3", "memory" \
881 _zzq_orig->nraddr = __addr; \
884 #define VALGRIND_CALL_NOREDIR_R1 \
885 __SPECIAL_INSTRUCTION_PREAMBLE \
888 #define VALGRIND_VEX_INJECT_IR() \
890 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
891 __VEX_INJECT_IR_CODE); \
898 #if defined(PLAT_mips32_linux)
910 #define __SPECIAL_INSTRUCTION_PREAMBLE \
911 "srl $0, $0, 13\n\t" \
912 "srl $0, $0, 29\n\t" \
913 "srl $0, $0, 3\n\t" \
916 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
917 _zzq_default, _zzq_request, \
918 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
920 ({ volatile unsigned int _zzq_args[6]; \
921 volatile unsigned int _zzq_result; \
922 _zzq_args[0] = (unsigned int)(_zzq_request); \
923 _zzq_args[1] = (unsigned int)(_zzq_arg1); \
924 _zzq_args[2] = (unsigned int)(_zzq_arg2); \
925 _zzq_args[3] = (unsigned int)(_zzq_arg3); \
926 _zzq_args[4] = (unsigned int)(_zzq_arg4); \
927 _zzq_args[5] = (unsigned int)(_zzq_arg5); \
928 __asm__ volatile("move $11, %1\n\t" \
930 __SPECIAL_INSTRUCTION_PREAMBLE \
932 "or $13, $13, $13\n\t" \
934 : "=r" (_zzq_result) \
935 : "r" (_zzq_default), "r" (&_zzq_args[0]) \
940 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
941 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
942 volatile unsigned int __addr; \
943 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
945 "or $14, $14, $14\n\t" \
951 _zzq_orig->nraddr = __addr; \
954 #define VALGRIND_CALL_NOREDIR_T9 \
955 __SPECIAL_INSTRUCTION_PREAMBLE \
957 "or $15, $15, $15\n\t"
959 #define VALGRIND_VEX_INJECT_IR() \
961 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
962 "or $11, $11, $11\n\t" \
971 #if defined(PLAT_mips64_linux)
975 unsigned long long nraddr;
983 #define __SPECIAL_INSTRUCTION_PREAMBLE \
984 "dsll $0,$0, 3 ; dsll $0,$0,13\n\t" \
985 "dsll $0,$0,29 ; dsll $0,$0,19\n\t"
987 #define VALGRIND_DO_CLIENT_REQUEST_EXPR( \
988 _zzq_default, _zzq_request, \
989 _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \
991 ({ volatile unsigned long long int _zzq_args[6]; \
992 volatile unsigned long long int _zzq_result; \
993 _zzq_args[0] = (unsigned long long int)(_zzq_request); \
994 _zzq_args[1] = (unsigned long long int)(_zzq_arg1); \
995 _zzq_args[2] = (unsigned long long int)(_zzq_arg2); \
996 _zzq_args[3] = (unsigned long long int)(_zzq_arg3); \
997 _zzq_args[4] = (unsigned long long int)(_zzq_arg4); \
998 _zzq_args[5] = (unsigned long long int)(_zzq_arg5); \
999 __asm__ volatile("move $11, %1\n\t" \
1000 "move $12, %2\n\t" \
1001 __SPECIAL_INSTRUCTION_PREAMBLE \
1003 "or $13, $13, $13\n\t" \
1004 "move %0, $11\n\t" \
1005 : "=r" (_zzq_result) \
1006 : "r" (_zzq_default), "r" (&_zzq_args[0]) \
1011 #define VALGRIND_GET_NR_CONTEXT(_zzq_rlval) \
1012 { volatile OrigFn* _zzq_orig = &(_zzq_rlval); \
1013 volatile unsigned long long int __addr; \
1014 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
1016 "or $14, $14, $14\n\t" \
1021 _zzq_orig->nraddr = __addr; \
1024 #define VALGRIND_CALL_NOREDIR_T9 \
1025 __SPECIAL_INSTRUCTION_PREAMBLE \
1027 "or $15, $15, $15\n\t"
1029 #define VALGRIND_VEX_INJECT_IR() \
1031 __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \
1032 "or $11, $11, $11\n\t" \
1074 #define VG_CONCAT4(_aa,_bb,_cc,_dd) _aa##_bb##_cc##_dd
1076 #define I_WRAP_SONAME_FNNAME_ZU(soname,fnname) \
1077 VG_CONCAT4(_vgw00000ZU_,soname,_,fnname)
1079 #define I_WRAP_SONAME_FNNAME_ZZ(soname,fnname) \
1080 VG_CONCAT4(_vgw00000ZZ_,soname,_,fnname)
1086 #define VALGRIND_GET_ORIG_FN(_lval) VALGRIND_GET_NR_CONTEXT(_lval)
1094 #define I_REPLACE_SONAME_FNNAME_ZU(soname,fnname) \
1095 VG_CONCAT4(_vgr00000ZU_,soname,_,fnname)
1097 #define I_REPLACE_SONAME_FNNAME_ZZ(soname,fnname) \
1098 VG_CONCAT4(_vgr00000ZZ_,soname,_,fnname)
1103 #define CALL_FN_v_v(fnptr) \
1104 do { volatile unsigned long _junk; \
1105 CALL_FN_W_v(_junk,fnptr); } while (0)
1107 #define CALL_FN_v_W(fnptr, arg1) \
1108 do { volatile unsigned long _junk; \
1109 CALL_FN_W_W(_junk,fnptr,arg1); } while (0)
1111 #define CALL_FN_v_WW(fnptr, arg1,arg2) \
1112 do { volatile unsigned long _junk; \
1113 CALL_FN_W_WW(_junk,fnptr,arg1,arg2); } while (0)
1115 #define CALL_FN_v_WWW(fnptr, arg1,arg2,arg3) \
1116 do { volatile unsigned long _junk; \
1117 CALL_FN_W_WWW(_junk,fnptr,arg1,arg2,arg3); } while (0)
1119 #define CALL_FN_v_WWWW(fnptr, arg1,arg2,arg3,arg4) \
1120 do { volatile unsigned long _junk; \
1121 CALL_FN_W_WWWW(_junk,fnptr,arg1,arg2,arg3,arg4); } while (0)
1123 #define CALL_FN_v_5W(fnptr, arg1,arg2,arg3,arg4,arg5) \
1124 do { volatile unsigned long _junk; \
1125 CALL_FN_W_5W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5); } while (0)
1127 #define CALL_FN_v_6W(fnptr, arg1,arg2,arg3,arg4,arg5,arg6) \
1128 do { volatile unsigned long _junk; \
1129 CALL_FN_W_6W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5,arg6); } while (0)
1131 #define CALL_FN_v_7W(fnptr, arg1,arg2,arg3,arg4,arg5,arg6,arg7) \
1132 do { volatile unsigned long _junk; \
1133 CALL_FN_W_7W(_junk,fnptr,arg1,arg2,arg3,arg4,arg5,arg6,arg7); } while (0)
1137 #if defined(PLAT_x86_linux) || defined(PLAT_x86_darwin)
1141 #define __CALLER_SAVED_REGS "ecx", "edx"
1148 #define VALGRIND_ALIGN_STACK \
1149 "movl %%esp,%%edi\n\t" \
1150 "andl $0xfffffff0,%%esp\n\t"
1151 #define VALGRIND_RESTORE_STACK \
1152 "movl %%edi,%%esp\n\t"
1157 #define CALL_FN_W_v(lval, orig) \
1159 volatile OrigFn _orig = (orig); \
1160 volatile unsigned long _argvec[1]; \
1161 volatile unsigned long _res; \
1162 _argvec[0] = (unsigned long)_orig.nraddr; \
1164 VALGRIND_ALIGN_STACK \
1165 "movl (%%eax), %%eax\n\t" \
1166 VALGRIND_CALL_NOREDIR_EAX \
1167 VALGRIND_RESTORE_STACK \
1169 : "a" (&_argvec[0]) \
1170 : "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1172 lval = (__typeof__(lval)) _res; \
1175 #define CALL_FN_W_W(lval, orig, arg1) \
1177 volatile OrigFn _orig = (orig); \
1178 volatile unsigned long _argvec[2]; \
1179 volatile unsigned long _res; \
1180 _argvec[0] = (unsigned long)_orig.nraddr; \
1181 _argvec[1] = (unsigned long)(arg1); \
1183 VALGRIND_ALIGN_STACK \
1184 "subl $12, %%esp\n\t" \
1185 "pushl 4(%%eax)\n\t" \
1186 "movl (%%eax), %%eax\n\t" \
1187 VALGRIND_CALL_NOREDIR_EAX \
1188 VALGRIND_RESTORE_STACK \
1190 : "a" (&_argvec[0]) \
1191 : "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1193 lval = (__typeof__(lval)) _res; \
1196 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
1198 volatile OrigFn _orig = (orig); \
1199 volatile unsigned long _argvec[3]; \
1200 volatile unsigned long _res; \
1201 _argvec[0] = (unsigned long)_orig.nraddr; \
1202 _argvec[1] = (unsigned long)(arg1); \
1203 _argvec[2] = (unsigned long)(arg2); \
1205 VALGRIND_ALIGN_STACK \
1206 "subl $8, %%esp\n\t" \
1207 "pushl 8(%%eax)\n\t" \
1208 "pushl 4(%%eax)\n\t" \
1209 "movl (%%eax), %%eax\n\t" \
1210 VALGRIND_CALL_NOREDIR_EAX \
1211 VALGRIND_RESTORE_STACK \
1213 : "a" (&_argvec[0]) \
1214 : "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1216 lval = (__typeof__(lval)) _res; \
1219 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
1221 volatile OrigFn _orig = (orig); \
1222 volatile unsigned long _argvec[4]; \
1223 volatile unsigned long _res; \
1224 _argvec[0] = (unsigned long)_orig.nraddr; \
1225 _argvec[1] = (unsigned long)(arg1); \
1226 _argvec[2] = (unsigned long)(arg2); \
1227 _argvec[3] = (unsigned long)(arg3); \
1229 VALGRIND_ALIGN_STACK \
1230 "subl $4, %%esp\n\t" \
1231 "pushl 12(%%eax)\n\t" \
1232 "pushl 8(%%eax)\n\t" \
1233 "pushl 4(%%eax)\n\t" \
1234 "movl (%%eax), %%eax\n\t" \
1235 VALGRIND_CALL_NOREDIR_EAX \
1236 VALGRIND_RESTORE_STACK \
1238 : "a" (&_argvec[0]) \
1239 : "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1241 lval = (__typeof__(lval)) _res; \
1244 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
1246 volatile OrigFn _orig = (orig); \
1247 volatile unsigned long _argvec[5]; \
1248 volatile unsigned long _res; \
1249 _argvec[0] = (unsigned long)_orig.nraddr; \
1250 _argvec[1] = (unsigned long)(arg1); \
1251 _argvec[2] = (unsigned long)(arg2); \
1252 _argvec[3] = (unsigned long)(arg3); \
1253 _argvec[4] = (unsigned long)(arg4); \
1255 VALGRIND_ALIGN_STACK \
1256 "pushl 16(%%eax)\n\t" \
1257 "pushl 12(%%eax)\n\t" \
1258 "pushl 8(%%eax)\n\t" \
1259 "pushl 4(%%eax)\n\t" \
1260 "movl (%%eax), %%eax\n\t" \
1261 VALGRIND_CALL_NOREDIR_EAX \
1262 VALGRIND_RESTORE_STACK \
1264 : "a" (&_argvec[0]) \
1265 : "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1267 lval = (__typeof__(lval)) _res; \
1270 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
1272 volatile OrigFn _orig = (orig); \
1273 volatile unsigned long _argvec[6]; \
1274 volatile unsigned long _res; \
1275 _argvec[0] = (unsigned long)_orig.nraddr; \
1276 _argvec[1] = (unsigned long)(arg1); \
1277 _argvec[2] = (unsigned long)(arg2); \
1278 _argvec[3] = (unsigned long)(arg3); \
1279 _argvec[4] = (unsigned long)(arg4); \
1280 _argvec[5] = (unsigned long)(arg5); \
1282 VALGRIND_ALIGN_STACK \
1283 "subl $12, %%esp\n\t" \
1284 "pushl 20(%%eax)\n\t" \
1285 "pushl 16(%%eax)\n\t" \
1286 "pushl 12(%%eax)\n\t" \
1287 "pushl 8(%%eax)\n\t" \
1288 "pushl 4(%%eax)\n\t" \
1289 "movl (%%eax), %%eax\n\t" \
1290 VALGRIND_CALL_NOREDIR_EAX \
1291 VALGRIND_RESTORE_STACK \
1293 : "a" (&_argvec[0]) \
1294 : "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1296 lval = (__typeof__(lval)) _res; \
1299 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
1301 volatile OrigFn _orig = (orig); \
1302 volatile unsigned long _argvec[7]; \
1303 volatile unsigned long _res; \
1304 _argvec[0] = (unsigned long)_orig.nraddr; \
1305 _argvec[1] = (unsigned long)(arg1); \
1306 _argvec[2] = (unsigned long)(arg2); \
1307 _argvec[3] = (unsigned long)(arg3); \
1308 _argvec[4] = (unsigned long)(arg4); \
1309 _argvec[5] = (unsigned long)(arg5); \
1310 _argvec[6] = (unsigned long)(arg6); \
1312 VALGRIND_ALIGN_STACK \
1313 "subl $8, %%esp\n\t" \
1314 "pushl 24(%%eax)\n\t" \
1315 "pushl 20(%%eax)\n\t" \
1316 "pushl 16(%%eax)\n\t" \
1317 "pushl 12(%%eax)\n\t" \
1318 "pushl 8(%%eax)\n\t" \
1319 "pushl 4(%%eax)\n\t" \
1320 "movl (%%eax), %%eax\n\t" \
1321 VALGRIND_CALL_NOREDIR_EAX \
1322 VALGRIND_RESTORE_STACK \
1324 : "a" (&_argvec[0]) \
1325 : "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1327 lval = (__typeof__(lval)) _res; \
1330 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1333 volatile OrigFn _orig = (orig); \
1334 volatile unsigned long _argvec[8]; \
1335 volatile unsigned long _res; \
1336 _argvec[0] = (unsigned long)_orig.nraddr; \
1337 _argvec[1] = (unsigned long)(arg1); \
1338 _argvec[2] = (unsigned long)(arg2); \
1339 _argvec[3] = (unsigned long)(arg3); \
1340 _argvec[4] = (unsigned long)(arg4); \
1341 _argvec[5] = (unsigned long)(arg5); \
1342 _argvec[6] = (unsigned long)(arg6); \
1343 _argvec[7] = (unsigned long)(arg7); \
1345 VALGRIND_ALIGN_STACK \
1346 "subl $4, %%esp\n\t" \
1347 "pushl 28(%%eax)\n\t" \
1348 "pushl 24(%%eax)\n\t" \
1349 "pushl 20(%%eax)\n\t" \
1350 "pushl 16(%%eax)\n\t" \
1351 "pushl 12(%%eax)\n\t" \
1352 "pushl 8(%%eax)\n\t" \
1353 "pushl 4(%%eax)\n\t" \
1354 "movl (%%eax), %%eax\n\t" \
1355 VALGRIND_CALL_NOREDIR_EAX \
1356 VALGRIND_RESTORE_STACK \
1358 : "a" (&_argvec[0]) \
1359 : "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1361 lval = (__typeof__(lval)) _res; \
1364 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1367 volatile OrigFn _orig = (orig); \
1368 volatile unsigned long _argvec[9]; \
1369 volatile unsigned long _res; \
1370 _argvec[0] = (unsigned long)_orig.nraddr; \
1371 _argvec[1] = (unsigned long)(arg1); \
1372 _argvec[2] = (unsigned long)(arg2); \
1373 _argvec[3] = (unsigned long)(arg3); \
1374 _argvec[4] = (unsigned long)(arg4); \
1375 _argvec[5] = (unsigned long)(arg5); \
1376 _argvec[6] = (unsigned long)(arg6); \
1377 _argvec[7] = (unsigned long)(arg7); \
1378 _argvec[8] = (unsigned long)(arg8); \
1380 VALGRIND_ALIGN_STACK \
1381 "pushl 32(%%eax)\n\t" \
1382 "pushl 28(%%eax)\n\t" \
1383 "pushl 24(%%eax)\n\t" \
1384 "pushl 20(%%eax)\n\t" \
1385 "pushl 16(%%eax)\n\t" \
1386 "pushl 12(%%eax)\n\t" \
1387 "pushl 8(%%eax)\n\t" \
1388 "pushl 4(%%eax)\n\t" \
1389 "movl (%%eax), %%eax\n\t" \
1390 VALGRIND_CALL_NOREDIR_EAX \
1391 VALGRIND_RESTORE_STACK \
1393 : "a" (&_argvec[0]) \
1394 : "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1396 lval = (__typeof__(lval)) _res; \
1399 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1402 volatile OrigFn _orig = (orig); \
1403 volatile unsigned long _argvec[10]; \
1404 volatile unsigned long _res; \
1405 _argvec[0] = (unsigned long)_orig.nraddr; \
1406 _argvec[1] = (unsigned long)(arg1); \
1407 _argvec[2] = (unsigned long)(arg2); \
1408 _argvec[3] = (unsigned long)(arg3); \
1409 _argvec[4] = (unsigned long)(arg4); \
1410 _argvec[5] = (unsigned long)(arg5); \
1411 _argvec[6] = (unsigned long)(arg6); \
1412 _argvec[7] = (unsigned long)(arg7); \
1413 _argvec[8] = (unsigned long)(arg8); \
1414 _argvec[9] = (unsigned long)(arg9); \
1416 VALGRIND_ALIGN_STACK \
1417 "subl $12, %%esp\n\t" \
1418 "pushl 36(%%eax)\n\t" \
1419 "pushl 32(%%eax)\n\t" \
1420 "pushl 28(%%eax)\n\t" \
1421 "pushl 24(%%eax)\n\t" \
1422 "pushl 20(%%eax)\n\t" \
1423 "pushl 16(%%eax)\n\t" \
1424 "pushl 12(%%eax)\n\t" \
1425 "pushl 8(%%eax)\n\t" \
1426 "pushl 4(%%eax)\n\t" \
1427 "movl (%%eax), %%eax\n\t" \
1428 VALGRIND_CALL_NOREDIR_EAX \
1429 VALGRIND_RESTORE_STACK \
1431 : "a" (&_argvec[0]) \
1432 : "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1434 lval = (__typeof__(lval)) _res; \
1437 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1438 arg7,arg8,arg9,arg10) \
1440 volatile OrigFn _orig = (orig); \
1441 volatile unsigned long _argvec[11]; \
1442 volatile unsigned long _res; \
1443 _argvec[0] = (unsigned long)_orig.nraddr; \
1444 _argvec[1] = (unsigned long)(arg1); \
1445 _argvec[2] = (unsigned long)(arg2); \
1446 _argvec[3] = (unsigned long)(arg3); \
1447 _argvec[4] = (unsigned long)(arg4); \
1448 _argvec[5] = (unsigned long)(arg5); \
1449 _argvec[6] = (unsigned long)(arg6); \
1450 _argvec[7] = (unsigned long)(arg7); \
1451 _argvec[8] = (unsigned long)(arg8); \
1452 _argvec[9] = (unsigned long)(arg9); \
1453 _argvec[10] = (unsigned long)(arg10); \
1455 VALGRIND_ALIGN_STACK \
1456 "subl $8, %%esp\n\t" \
1457 "pushl 40(%%eax)\n\t" \
1458 "pushl 36(%%eax)\n\t" \
1459 "pushl 32(%%eax)\n\t" \
1460 "pushl 28(%%eax)\n\t" \
1461 "pushl 24(%%eax)\n\t" \
1462 "pushl 20(%%eax)\n\t" \
1463 "pushl 16(%%eax)\n\t" \
1464 "pushl 12(%%eax)\n\t" \
1465 "pushl 8(%%eax)\n\t" \
1466 "pushl 4(%%eax)\n\t" \
1467 "movl (%%eax), %%eax\n\t" \
1468 VALGRIND_CALL_NOREDIR_EAX \
1469 VALGRIND_RESTORE_STACK \
1471 : "a" (&_argvec[0]) \
1472 : "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1474 lval = (__typeof__(lval)) _res; \
1477 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
1478 arg6,arg7,arg8,arg9,arg10, \
1481 volatile OrigFn _orig = (orig); \
1482 volatile unsigned long _argvec[12]; \
1483 volatile unsigned long _res; \
1484 _argvec[0] = (unsigned long)_orig.nraddr; \
1485 _argvec[1] = (unsigned long)(arg1); \
1486 _argvec[2] = (unsigned long)(arg2); \
1487 _argvec[3] = (unsigned long)(arg3); \
1488 _argvec[4] = (unsigned long)(arg4); \
1489 _argvec[5] = (unsigned long)(arg5); \
1490 _argvec[6] = (unsigned long)(arg6); \
1491 _argvec[7] = (unsigned long)(arg7); \
1492 _argvec[8] = (unsigned long)(arg8); \
1493 _argvec[9] = (unsigned long)(arg9); \
1494 _argvec[10] = (unsigned long)(arg10); \
1495 _argvec[11] = (unsigned long)(arg11); \
1497 VALGRIND_ALIGN_STACK \
1498 "subl $4, %%esp\n\t" \
1499 "pushl 44(%%eax)\n\t" \
1500 "pushl 40(%%eax)\n\t" \
1501 "pushl 36(%%eax)\n\t" \
1502 "pushl 32(%%eax)\n\t" \
1503 "pushl 28(%%eax)\n\t" \
1504 "pushl 24(%%eax)\n\t" \
1505 "pushl 20(%%eax)\n\t" \
1506 "pushl 16(%%eax)\n\t" \
1507 "pushl 12(%%eax)\n\t" \
1508 "pushl 8(%%eax)\n\t" \
1509 "pushl 4(%%eax)\n\t" \
1510 "movl (%%eax), %%eax\n\t" \
1511 VALGRIND_CALL_NOREDIR_EAX \
1512 VALGRIND_RESTORE_STACK \
1514 : "a" (&_argvec[0]) \
1515 : "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1517 lval = (__typeof__(lval)) _res; \
1520 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
1521 arg6,arg7,arg8,arg9,arg10, \
1524 volatile OrigFn _orig = (orig); \
1525 volatile unsigned long _argvec[13]; \
1526 volatile unsigned long _res; \
1527 _argvec[0] = (unsigned long)_orig.nraddr; \
1528 _argvec[1] = (unsigned long)(arg1); \
1529 _argvec[2] = (unsigned long)(arg2); \
1530 _argvec[3] = (unsigned long)(arg3); \
1531 _argvec[4] = (unsigned long)(arg4); \
1532 _argvec[5] = (unsigned long)(arg5); \
1533 _argvec[6] = (unsigned long)(arg6); \
1534 _argvec[7] = (unsigned long)(arg7); \
1535 _argvec[8] = (unsigned long)(arg8); \
1536 _argvec[9] = (unsigned long)(arg9); \
1537 _argvec[10] = (unsigned long)(arg10); \
1538 _argvec[11] = (unsigned long)(arg11); \
1539 _argvec[12] = (unsigned long)(arg12); \
1541 VALGRIND_ALIGN_STACK \
1542 "pushl 48(%%eax)\n\t" \
1543 "pushl 44(%%eax)\n\t" \
1544 "pushl 40(%%eax)\n\t" \
1545 "pushl 36(%%eax)\n\t" \
1546 "pushl 32(%%eax)\n\t" \
1547 "pushl 28(%%eax)\n\t" \
1548 "pushl 24(%%eax)\n\t" \
1549 "pushl 20(%%eax)\n\t" \
1550 "pushl 16(%%eax)\n\t" \
1551 "pushl 12(%%eax)\n\t" \
1552 "pushl 8(%%eax)\n\t" \
1553 "pushl 4(%%eax)\n\t" \
1554 "movl (%%eax), %%eax\n\t" \
1555 VALGRIND_CALL_NOREDIR_EAX \
1556 VALGRIND_RESTORE_STACK \
1558 : "a" (&_argvec[0]) \
1559 : "cc", "memory", __CALLER_SAVED_REGS, "edi" \
1561 lval = (__typeof__(lval)) _res; \
1568 #if defined(PLAT_amd64_linux) || defined(PLAT_amd64_darwin)
1573 #define __CALLER_SAVED_REGS "rcx", "rdx", "rsi", \
1574 "rdi", "r8", "r9", "r10", "r11"
1630 #if defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM)
1631 # define __FRAME_POINTER \
1632 ,"r"(__builtin_dwarf_cfa())
1633 # define VALGRIND_CFI_PROLOGUE \
1634 "movq %%rbp, %%r15\n\t" \
1635 "movq %2, %%rbp\n\t" \
1636 ".cfi_remember_state\n\t" \
1637 ".cfi_def_cfa rbp, 0\n\t"
1638 # define VALGRIND_CFI_EPILOGUE \
1639 "movq %%r15, %%rbp\n\t" \
1640 ".cfi_restore_state\n\t"
1642 # define __FRAME_POINTER
1643 # define VALGRIND_CFI_PROLOGUE
1644 # define VALGRIND_CFI_EPILOGUE
1652 #define VALGRIND_ALIGN_STACK \
1653 "movq %%rsp,%%r14\n\t" \
1654 "andq $0xfffffffffffffff0,%%rsp\n\t"
1655 #define VALGRIND_RESTORE_STACK \
1656 "movq %%r14,%%rsp\n\t"
1682 #define CALL_FN_W_v(lval, orig) \
1684 volatile OrigFn _orig = (orig); \
1685 volatile unsigned long _argvec[1]; \
1686 volatile unsigned long _res; \
1687 _argvec[0] = (unsigned long)_orig.nraddr; \
1689 VALGRIND_CFI_PROLOGUE \
1690 VALGRIND_ALIGN_STACK \
1691 "subq $128,%%rsp\n\t" \
1692 "movq (%%rax), %%rax\n\t" \
1693 VALGRIND_CALL_NOREDIR_RAX \
1694 VALGRIND_RESTORE_STACK \
1695 VALGRIND_CFI_EPILOGUE \
1697 : "a" (&_argvec[0]) __FRAME_POINTER \
1698 : "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1700 lval = (__typeof__(lval)) _res; \
1703 #define CALL_FN_W_W(lval, orig, arg1) \
1705 volatile OrigFn _orig = (orig); \
1706 volatile unsigned long _argvec[2]; \
1707 volatile unsigned long _res; \
1708 _argvec[0] = (unsigned long)_orig.nraddr; \
1709 _argvec[1] = (unsigned long)(arg1); \
1711 VALGRIND_CFI_PROLOGUE \
1712 VALGRIND_ALIGN_STACK \
1713 "subq $128,%%rsp\n\t" \
1714 "movq 8(%%rax), %%rdi\n\t" \
1715 "movq (%%rax), %%rax\n\t" \
1716 VALGRIND_CALL_NOREDIR_RAX \
1717 VALGRIND_RESTORE_STACK \
1718 VALGRIND_CFI_EPILOGUE \
1720 : "a" (&_argvec[0]) __FRAME_POINTER \
1721 : "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1723 lval = (__typeof__(lval)) _res; \
1726 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
1728 volatile OrigFn _orig = (orig); \
1729 volatile unsigned long _argvec[3]; \
1730 volatile unsigned long _res; \
1731 _argvec[0] = (unsigned long)_orig.nraddr; \
1732 _argvec[1] = (unsigned long)(arg1); \
1733 _argvec[2] = (unsigned long)(arg2); \
1735 VALGRIND_CFI_PROLOGUE \
1736 VALGRIND_ALIGN_STACK \
1737 "subq $128,%%rsp\n\t" \
1738 "movq 16(%%rax), %%rsi\n\t" \
1739 "movq 8(%%rax), %%rdi\n\t" \
1740 "movq (%%rax), %%rax\n\t" \
1741 VALGRIND_CALL_NOREDIR_RAX \
1742 VALGRIND_RESTORE_STACK \
1743 VALGRIND_CFI_EPILOGUE \
1745 : "a" (&_argvec[0]) __FRAME_POINTER \
1746 : "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1748 lval = (__typeof__(lval)) _res; \
1751 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
1753 volatile OrigFn _orig = (orig); \
1754 volatile unsigned long _argvec[4]; \
1755 volatile unsigned long _res; \
1756 _argvec[0] = (unsigned long)_orig.nraddr; \
1757 _argvec[1] = (unsigned long)(arg1); \
1758 _argvec[2] = (unsigned long)(arg2); \
1759 _argvec[3] = (unsigned long)(arg3); \
1761 VALGRIND_CFI_PROLOGUE \
1762 VALGRIND_ALIGN_STACK \
1763 "subq $128,%%rsp\n\t" \
1764 "movq 24(%%rax), %%rdx\n\t" \
1765 "movq 16(%%rax), %%rsi\n\t" \
1766 "movq 8(%%rax), %%rdi\n\t" \
1767 "movq (%%rax), %%rax\n\t" \
1768 VALGRIND_CALL_NOREDIR_RAX \
1769 VALGRIND_RESTORE_STACK \
1770 VALGRIND_CFI_EPILOGUE \
1772 : "a" (&_argvec[0]) __FRAME_POINTER \
1773 : "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1775 lval = (__typeof__(lval)) _res; \
1778 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
1780 volatile OrigFn _orig = (orig); \
1781 volatile unsigned long _argvec[5]; \
1782 volatile unsigned long _res; \
1783 _argvec[0] = (unsigned long)_orig.nraddr; \
1784 _argvec[1] = (unsigned long)(arg1); \
1785 _argvec[2] = (unsigned long)(arg2); \
1786 _argvec[3] = (unsigned long)(arg3); \
1787 _argvec[4] = (unsigned long)(arg4); \
1789 VALGRIND_CFI_PROLOGUE \
1790 VALGRIND_ALIGN_STACK \
1791 "subq $128,%%rsp\n\t" \
1792 "movq 32(%%rax), %%rcx\n\t" \
1793 "movq 24(%%rax), %%rdx\n\t" \
1794 "movq 16(%%rax), %%rsi\n\t" \
1795 "movq 8(%%rax), %%rdi\n\t" \
1796 "movq (%%rax), %%rax\n\t" \
1797 VALGRIND_CALL_NOREDIR_RAX \
1798 VALGRIND_RESTORE_STACK \
1799 VALGRIND_CFI_EPILOGUE \
1801 : "a" (&_argvec[0]) __FRAME_POINTER \
1802 : "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1804 lval = (__typeof__(lval)) _res; \
1807 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
1809 volatile OrigFn _orig = (orig); \
1810 volatile unsigned long _argvec[6]; \
1811 volatile unsigned long _res; \
1812 _argvec[0] = (unsigned long)_orig.nraddr; \
1813 _argvec[1] = (unsigned long)(arg1); \
1814 _argvec[2] = (unsigned long)(arg2); \
1815 _argvec[3] = (unsigned long)(arg3); \
1816 _argvec[4] = (unsigned long)(arg4); \
1817 _argvec[5] = (unsigned long)(arg5); \
1819 VALGRIND_CFI_PROLOGUE \
1820 VALGRIND_ALIGN_STACK \
1821 "subq $128,%%rsp\n\t" \
1822 "movq 40(%%rax), %%r8\n\t" \
1823 "movq 32(%%rax), %%rcx\n\t" \
1824 "movq 24(%%rax), %%rdx\n\t" \
1825 "movq 16(%%rax), %%rsi\n\t" \
1826 "movq 8(%%rax), %%rdi\n\t" \
1827 "movq (%%rax), %%rax\n\t" \
1828 VALGRIND_CALL_NOREDIR_RAX \
1829 VALGRIND_RESTORE_STACK \
1830 VALGRIND_CFI_EPILOGUE \
1832 : "a" (&_argvec[0]) __FRAME_POINTER \
1833 : "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1835 lval = (__typeof__(lval)) _res; \
1838 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
1840 volatile OrigFn _orig = (orig); \
1841 volatile unsigned long _argvec[7]; \
1842 volatile unsigned long _res; \
1843 _argvec[0] = (unsigned long)_orig.nraddr; \
1844 _argvec[1] = (unsigned long)(arg1); \
1845 _argvec[2] = (unsigned long)(arg2); \
1846 _argvec[3] = (unsigned long)(arg3); \
1847 _argvec[4] = (unsigned long)(arg4); \
1848 _argvec[5] = (unsigned long)(arg5); \
1849 _argvec[6] = (unsigned long)(arg6); \
1851 VALGRIND_CFI_PROLOGUE \
1852 VALGRIND_ALIGN_STACK \
1853 "subq $128,%%rsp\n\t" \
1854 "movq 48(%%rax), %%r9\n\t" \
1855 "movq 40(%%rax), %%r8\n\t" \
1856 "movq 32(%%rax), %%rcx\n\t" \
1857 "movq 24(%%rax), %%rdx\n\t" \
1858 "movq 16(%%rax), %%rsi\n\t" \
1859 "movq 8(%%rax), %%rdi\n\t" \
1860 "movq (%%rax), %%rax\n\t" \
1861 VALGRIND_CALL_NOREDIR_RAX \
1862 VALGRIND_RESTORE_STACK \
1863 VALGRIND_CFI_EPILOGUE \
1865 : "a" (&_argvec[0]) __FRAME_POINTER \
1866 : "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1868 lval = (__typeof__(lval)) _res; \
1871 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1874 volatile OrigFn _orig = (orig); \
1875 volatile unsigned long _argvec[8]; \
1876 volatile unsigned long _res; \
1877 _argvec[0] = (unsigned long)_orig.nraddr; \
1878 _argvec[1] = (unsigned long)(arg1); \
1879 _argvec[2] = (unsigned long)(arg2); \
1880 _argvec[3] = (unsigned long)(arg3); \
1881 _argvec[4] = (unsigned long)(arg4); \
1882 _argvec[5] = (unsigned long)(arg5); \
1883 _argvec[6] = (unsigned long)(arg6); \
1884 _argvec[7] = (unsigned long)(arg7); \
1886 VALGRIND_CFI_PROLOGUE \
1887 VALGRIND_ALIGN_STACK \
1888 "subq $136,%%rsp\n\t" \
1889 "pushq 56(%%rax)\n\t" \
1890 "movq 48(%%rax), %%r9\n\t" \
1891 "movq 40(%%rax), %%r8\n\t" \
1892 "movq 32(%%rax), %%rcx\n\t" \
1893 "movq 24(%%rax), %%rdx\n\t" \
1894 "movq 16(%%rax), %%rsi\n\t" \
1895 "movq 8(%%rax), %%rdi\n\t" \
1896 "movq (%%rax), %%rax\n\t" \
1897 VALGRIND_CALL_NOREDIR_RAX \
1898 VALGRIND_RESTORE_STACK \
1899 VALGRIND_CFI_EPILOGUE \
1901 : "a" (&_argvec[0]) __FRAME_POINTER \
1902 : "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1904 lval = (__typeof__(lval)) _res; \
1907 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1910 volatile OrigFn _orig = (orig); \
1911 volatile unsigned long _argvec[9]; \
1912 volatile unsigned long _res; \
1913 _argvec[0] = (unsigned long)_orig.nraddr; \
1914 _argvec[1] = (unsigned long)(arg1); \
1915 _argvec[2] = (unsigned long)(arg2); \
1916 _argvec[3] = (unsigned long)(arg3); \
1917 _argvec[4] = (unsigned long)(arg4); \
1918 _argvec[5] = (unsigned long)(arg5); \
1919 _argvec[6] = (unsigned long)(arg6); \
1920 _argvec[7] = (unsigned long)(arg7); \
1921 _argvec[8] = (unsigned long)(arg8); \
1923 VALGRIND_CFI_PROLOGUE \
1924 VALGRIND_ALIGN_STACK \
1925 "subq $128,%%rsp\n\t" \
1926 "pushq 64(%%rax)\n\t" \
1927 "pushq 56(%%rax)\n\t" \
1928 "movq 48(%%rax), %%r9\n\t" \
1929 "movq 40(%%rax), %%r8\n\t" \
1930 "movq 32(%%rax), %%rcx\n\t" \
1931 "movq 24(%%rax), %%rdx\n\t" \
1932 "movq 16(%%rax), %%rsi\n\t" \
1933 "movq 8(%%rax), %%rdi\n\t" \
1934 "movq (%%rax), %%rax\n\t" \
1935 VALGRIND_CALL_NOREDIR_RAX \
1936 VALGRIND_RESTORE_STACK \
1937 VALGRIND_CFI_EPILOGUE \
1939 : "a" (&_argvec[0]) __FRAME_POINTER \
1940 : "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1942 lval = (__typeof__(lval)) _res; \
1945 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1948 volatile OrigFn _orig = (orig); \
1949 volatile unsigned long _argvec[10]; \
1950 volatile unsigned long _res; \
1951 _argvec[0] = (unsigned long)_orig.nraddr; \
1952 _argvec[1] = (unsigned long)(arg1); \
1953 _argvec[2] = (unsigned long)(arg2); \
1954 _argvec[3] = (unsigned long)(arg3); \
1955 _argvec[4] = (unsigned long)(arg4); \
1956 _argvec[5] = (unsigned long)(arg5); \
1957 _argvec[6] = (unsigned long)(arg6); \
1958 _argvec[7] = (unsigned long)(arg7); \
1959 _argvec[8] = (unsigned long)(arg8); \
1960 _argvec[9] = (unsigned long)(arg9); \
1962 VALGRIND_CFI_PROLOGUE \
1963 VALGRIND_ALIGN_STACK \
1964 "subq $136,%%rsp\n\t" \
1965 "pushq 72(%%rax)\n\t" \
1966 "pushq 64(%%rax)\n\t" \
1967 "pushq 56(%%rax)\n\t" \
1968 "movq 48(%%rax), %%r9\n\t" \
1969 "movq 40(%%rax), %%r8\n\t" \
1970 "movq 32(%%rax), %%rcx\n\t" \
1971 "movq 24(%%rax), %%rdx\n\t" \
1972 "movq 16(%%rax), %%rsi\n\t" \
1973 "movq 8(%%rax), %%rdi\n\t" \
1974 "movq (%%rax), %%rax\n\t" \
1975 VALGRIND_CALL_NOREDIR_RAX \
1976 VALGRIND_RESTORE_STACK \
1977 VALGRIND_CFI_EPILOGUE \
1979 : "a" (&_argvec[0]) __FRAME_POINTER \
1980 : "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
1982 lval = (__typeof__(lval)) _res; \
1985 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
1986 arg7,arg8,arg9,arg10) \
1988 volatile OrigFn _orig = (orig); \
1989 volatile unsigned long _argvec[11]; \
1990 volatile unsigned long _res; \
1991 _argvec[0] = (unsigned long)_orig.nraddr; \
1992 _argvec[1] = (unsigned long)(arg1); \
1993 _argvec[2] = (unsigned long)(arg2); \
1994 _argvec[3] = (unsigned long)(arg3); \
1995 _argvec[4] = (unsigned long)(arg4); \
1996 _argvec[5] = (unsigned long)(arg5); \
1997 _argvec[6] = (unsigned long)(arg6); \
1998 _argvec[7] = (unsigned long)(arg7); \
1999 _argvec[8] = (unsigned long)(arg8); \
2000 _argvec[9] = (unsigned long)(arg9); \
2001 _argvec[10] = (unsigned long)(arg10); \
2003 VALGRIND_CFI_PROLOGUE \
2004 VALGRIND_ALIGN_STACK \
2005 "subq $128,%%rsp\n\t" \
2006 "pushq 80(%%rax)\n\t" \
2007 "pushq 72(%%rax)\n\t" \
2008 "pushq 64(%%rax)\n\t" \
2009 "pushq 56(%%rax)\n\t" \
2010 "movq 48(%%rax), %%r9\n\t" \
2011 "movq 40(%%rax), %%r8\n\t" \
2012 "movq 32(%%rax), %%rcx\n\t" \
2013 "movq 24(%%rax), %%rdx\n\t" \
2014 "movq 16(%%rax), %%rsi\n\t" \
2015 "movq 8(%%rax), %%rdi\n\t" \
2016 "movq (%%rax), %%rax\n\t" \
2017 VALGRIND_CALL_NOREDIR_RAX \
2018 VALGRIND_RESTORE_STACK \
2019 VALGRIND_CFI_EPILOGUE \
2021 : "a" (&_argvec[0]) __FRAME_POINTER \
2022 : "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
2024 lval = (__typeof__(lval)) _res; \
2027 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2028 arg7,arg8,arg9,arg10,arg11) \
2030 volatile OrigFn _orig = (orig); \
2031 volatile unsigned long _argvec[12]; \
2032 volatile unsigned long _res; \
2033 _argvec[0] = (unsigned long)_orig.nraddr; \
2034 _argvec[1] = (unsigned long)(arg1); \
2035 _argvec[2] = (unsigned long)(arg2); \
2036 _argvec[3] = (unsigned long)(arg3); \
2037 _argvec[4] = (unsigned long)(arg4); \
2038 _argvec[5] = (unsigned long)(arg5); \
2039 _argvec[6] = (unsigned long)(arg6); \
2040 _argvec[7] = (unsigned long)(arg7); \
2041 _argvec[8] = (unsigned long)(arg8); \
2042 _argvec[9] = (unsigned long)(arg9); \
2043 _argvec[10] = (unsigned long)(arg10); \
2044 _argvec[11] = (unsigned long)(arg11); \
2046 VALGRIND_CFI_PROLOGUE \
2047 VALGRIND_ALIGN_STACK \
2048 "subq $136,%%rsp\n\t" \
2049 "pushq 88(%%rax)\n\t" \
2050 "pushq 80(%%rax)\n\t" \
2051 "pushq 72(%%rax)\n\t" \
2052 "pushq 64(%%rax)\n\t" \
2053 "pushq 56(%%rax)\n\t" \
2054 "movq 48(%%rax), %%r9\n\t" \
2055 "movq 40(%%rax), %%r8\n\t" \
2056 "movq 32(%%rax), %%rcx\n\t" \
2057 "movq 24(%%rax), %%rdx\n\t" \
2058 "movq 16(%%rax), %%rsi\n\t" \
2059 "movq 8(%%rax), %%rdi\n\t" \
2060 "movq (%%rax), %%rax\n\t" \
2061 VALGRIND_CALL_NOREDIR_RAX \
2062 VALGRIND_RESTORE_STACK \
2063 VALGRIND_CFI_EPILOGUE \
2065 : "a" (&_argvec[0]) __FRAME_POINTER \
2066 : "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
2068 lval = (__typeof__(lval)) _res; \
2071 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2072 arg7,arg8,arg9,arg10,arg11,arg12) \
2074 volatile OrigFn _orig = (orig); \
2075 volatile unsigned long _argvec[13]; \
2076 volatile unsigned long _res; \
2077 _argvec[0] = (unsigned long)_orig.nraddr; \
2078 _argvec[1] = (unsigned long)(arg1); \
2079 _argvec[2] = (unsigned long)(arg2); \
2080 _argvec[3] = (unsigned long)(arg3); \
2081 _argvec[4] = (unsigned long)(arg4); \
2082 _argvec[5] = (unsigned long)(arg5); \
2083 _argvec[6] = (unsigned long)(arg6); \
2084 _argvec[7] = (unsigned long)(arg7); \
2085 _argvec[8] = (unsigned long)(arg8); \
2086 _argvec[9] = (unsigned long)(arg9); \
2087 _argvec[10] = (unsigned long)(arg10); \
2088 _argvec[11] = (unsigned long)(arg11); \
2089 _argvec[12] = (unsigned long)(arg12); \
2091 VALGRIND_CFI_PROLOGUE \
2092 VALGRIND_ALIGN_STACK \
2093 "subq $128,%%rsp\n\t" \
2094 "pushq 96(%%rax)\n\t" \
2095 "pushq 88(%%rax)\n\t" \
2096 "pushq 80(%%rax)\n\t" \
2097 "pushq 72(%%rax)\n\t" \
2098 "pushq 64(%%rax)\n\t" \
2099 "pushq 56(%%rax)\n\t" \
2100 "movq 48(%%rax), %%r9\n\t" \
2101 "movq 40(%%rax), %%r8\n\t" \
2102 "movq 32(%%rax), %%rcx\n\t" \
2103 "movq 24(%%rax), %%rdx\n\t" \
2104 "movq 16(%%rax), %%rsi\n\t" \
2105 "movq 8(%%rax), %%rdi\n\t" \
2106 "movq (%%rax), %%rax\n\t" \
2107 VALGRIND_CALL_NOREDIR_RAX \
2108 VALGRIND_RESTORE_STACK \
2109 VALGRIND_CFI_EPILOGUE \
2111 : "a" (&_argvec[0]) __FRAME_POINTER \
2112 : "cc", "memory", __CALLER_SAVED_REGS, "r14", "r15" \
2114 lval = (__typeof__(lval)) _res; \
2121 #if defined(PLAT_ppc32_linux)
2147 #define __CALLER_SAVED_REGS \
2148 "lr", "ctr", "xer", \
2149 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \
2150 "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \
2158 #define VALGRIND_ALIGN_STACK \
2160 "rlwinm 1,1,0,0,27\n\t"
2161 #define VALGRIND_RESTORE_STACK \
2167 #define CALL_FN_W_v(lval, orig) \
2169 volatile OrigFn _orig = (orig); \
2170 volatile unsigned long _argvec[1]; \
2171 volatile unsigned long _res; \
2172 _argvec[0] = (unsigned long)_orig.nraddr; \
2174 VALGRIND_ALIGN_STACK \
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_W(lval, orig, arg1) \
2189 volatile OrigFn _orig = (orig); \
2190 volatile unsigned long _argvec[2]; \
2191 volatile unsigned long _res; \
2192 _argvec[0] = (unsigned long)_orig.nraddr; \
2193 _argvec[1] = (unsigned long)arg1; \
2195 VALGRIND_ALIGN_STACK \
2198 "lwz 11,0(11)\n\t" \
2199 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2200 VALGRIND_RESTORE_STACK \
2203 : "r" (&_argvec[0]) \
2204 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2206 lval = (__typeof__(lval)) _res; \
2209 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
2211 volatile OrigFn _orig = (orig); \
2212 volatile unsigned long _argvec[3]; \
2213 volatile unsigned long _res; \
2214 _argvec[0] = (unsigned long)_orig.nraddr; \
2215 _argvec[1] = (unsigned long)arg1; \
2216 _argvec[2] = (unsigned long)arg2; \
2218 VALGRIND_ALIGN_STACK \
2222 "lwz 11,0(11)\n\t" \
2223 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2224 VALGRIND_RESTORE_STACK \
2227 : "r" (&_argvec[0]) \
2228 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2230 lval = (__typeof__(lval)) _res; \
2233 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
2235 volatile OrigFn _orig = (orig); \
2236 volatile unsigned long _argvec[4]; \
2237 volatile unsigned long _res; \
2238 _argvec[0] = (unsigned long)_orig.nraddr; \
2239 _argvec[1] = (unsigned long)arg1; \
2240 _argvec[2] = (unsigned long)arg2; \
2241 _argvec[3] = (unsigned long)arg3; \
2243 VALGRIND_ALIGN_STACK \
2247 "lwz 5,12(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_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
2261 volatile OrigFn _orig = (orig); \
2262 volatile unsigned long _argvec[5]; \
2263 volatile unsigned long _res; \
2264 _argvec[0] = (unsigned long)_orig.nraddr; \
2265 _argvec[1] = (unsigned long)arg1; \
2266 _argvec[2] = (unsigned long)arg2; \
2267 _argvec[3] = (unsigned long)arg3; \
2268 _argvec[4] = (unsigned long)arg4; \
2270 VALGRIND_ALIGN_STACK \
2274 "lwz 5,12(11)\n\t" \
2275 "lwz 6,16(11)\n\t" \
2276 "lwz 11,0(11)\n\t" \
2277 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2278 VALGRIND_RESTORE_STACK \
2281 : "r" (&_argvec[0]) \
2282 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2284 lval = (__typeof__(lval)) _res; \
2287 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
2289 volatile OrigFn _orig = (orig); \
2290 volatile unsigned long _argvec[6]; \
2291 volatile unsigned long _res; \
2292 _argvec[0] = (unsigned long)_orig.nraddr; \
2293 _argvec[1] = (unsigned long)arg1; \
2294 _argvec[2] = (unsigned long)arg2; \
2295 _argvec[3] = (unsigned long)arg3; \
2296 _argvec[4] = (unsigned long)arg4; \
2297 _argvec[5] = (unsigned long)arg5; \
2299 VALGRIND_ALIGN_STACK \
2303 "lwz 5,12(11)\n\t" \
2304 "lwz 6,16(11)\n\t" \
2305 "lwz 7,20(11)\n\t" \
2306 "lwz 11,0(11)\n\t" \
2307 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2308 VALGRIND_RESTORE_STACK \
2311 : "r" (&_argvec[0]) \
2312 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2314 lval = (__typeof__(lval)) _res; \
2317 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
2319 volatile OrigFn _orig = (orig); \
2320 volatile unsigned long _argvec[7]; \
2321 volatile unsigned long _res; \
2322 _argvec[0] = (unsigned long)_orig.nraddr; \
2323 _argvec[1] = (unsigned long)arg1; \
2324 _argvec[2] = (unsigned long)arg2; \
2325 _argvec[3] = (unsigned long)arg3; \
2326 _argvec[4] = (unsigned long)arg4; \
2327 _argvec[5] = (unsigned long)arg5; \
2328 _argvec[6] = (unsigned long)arg6; \
2330 VALGRIND_ALIGN_STACK \
2334 "lwz 5,12(11)\n\t" \
2335 "lwz 6,16(11)\n\t" \
2336 "lwz 7,20(11)\n\t" \
2337 "lwz 8,24(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_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2352 volatile OrigFn _orig = (orig); \
2353 volatile unsigned long _argvec[8]; \
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; \
2364 VALGRIND_ALIGN_STACK \
2368 "lwz 5,12(11)\n\t" \
2369 "lwz 6,16(11)\n\t" \
2370 "lwz 7,20(11)\n\t" \
2371 "lwz 8,24(11)\n\t" \
2372 "lwz 9,28(11)\n\t" \
2373 "lwz 11,0(11)\n\t" \
2374 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2375 VALGRIND_RESTORE_STACK \
2378 : "r" (&_argvec[0]) \
2379 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2381 lval = (__typeof__(lval)) _res; \
2384 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2387 volatile OrigFn _orig = (orig); \
2388 volatile unsigned long _argvec[9]; \
2389 volatile unsigned long _res; \
2390 _argvec[0] = (unsigned long)_orig.nraddr; \
2391 _argvec[1] = (unsigned long)arg1; \
2392 _argvec[2] = (unsigned long)arg2; \
2393 _argvec[3] = (unsigned long)arg3; \
2394 _argvec[4] = (unsigned long)arg4; \
2395 _argvec[5] = (unsigned long)arg5; \
2396 _argvec[6] = (unsigned long)arg6; \
2397 _argvec[7] = (unsigned long)arg7; \
2398 _argvec[8] = (unsigned long)arg8; \
2400 VALGRIND_ALIGN_STACK \
2404 "lwz 5,12(11)\n\t" \
2405 "lwz 6,16(11)\n\t" \
2406 "lwz 7,20(11)\n\t" \
2407 "lwz 8,24(11)\n\t" \
2408 "lwz 9,28(11)\n\t" \
2409 "lwz 10,32(11)\n\t" \
2410 "lwz 11,0(11)\n\t" \
2411 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2412 VALGRIND_RESTORE_STACK \
2415 : "r" (&_argvec[0]) \
2416 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2418 lval = (__typeof__(lval)) _res; \
2421 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2424 volatile OrigFn _orig = (orig); \
2425 volatile unsigned long _argvec[10]; \
2426 volatile unsigned long _res; \
2427 _argvec[0] = (unsigned long)_orig.nraddr; \
2428 _argvec[1] = (unsigned long)arg1; \
2429 _argvec[2] = (unsigned long)arg2; \
2430 _argvec[3] = (unsigned long)arg3; \
2431 _argvec[4] = (unsigned long)arg4; \
2432 _argvec[5] = (unsigned long)arg5; \
2433 _argvec[6] = (unsigned long)arg6; \
2434 _argvec[7] = (unsigned long)arg7; \
2435 _argvec[8] = (unsigned long)arg8; \
2436 _argvec[9] = (unsigned long)arg9; \
2438 VALGRIND_ALIGN_STACK \
2440 "addi 1,1,-16\n\t" \
2442 "lwz 3,36(11)\n\t" \
2447 "lwz 5,12(11)\n\t" \
2448 "lwz 6,16(11)\n\t" \
2449 "lwz 7,20(11)\n\t" \
2450 "lwz 8,24(11)\n\t" \
2451 "lwz 9,28(11)\n\t" \
2452 "lwz 10,32(11)\n\t" \
2453 "lwz 11,0(11)\n\t" \
2454 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2455 VALGRIND_RESTORE_STACK \
2458 : "r" (&_argvec[0]) \
2459 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2461 lval = (__typeof__(lval)) _res; \
2464 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2465 arg7,arg8,arg9,arg10) \
2467 volatile OrigFn _orig = (orig); \
2468 volatile unsigned long _argvec[11]; \
2469 volatile unsigned long _res; \
2470 _argvec[0] = (unsigned long)_orig.nraddr; \
2471 _argvec[1] = (unsigned long)arg1; \
2472 _argvec[2] = (unsigned long)arg2; \
2473 _argvec[3] = (unsigned long)arg3; \
2474 _argvec[4] = (unsigned long)arg4; \
2475 _argvec[5] = (unsigned long)arg5; \
2476 _argvec[6] = (unsigned long)arg6; \
2477 _argvec[7] = (unsigned long)arg7; \
2478 _argvec[8] = (unsigned long)arg8; \
2479 _argvec[9] = (unsigned long)arg9; \
2480 _argvec[10] = (unsigned long)arg10; \
2482 VALGRIND_ALIGN_STACK \
2484 "addi 1,1,-16\n\t" \
2486 "lwz 3,40(11)\n\t" \
2489 "lwz 3,36(11)\n\t" \
2494 "lwz 5,12(11)\n\t" \
2495 "lwz 6,16(11)\n\t" \
2496 "lwz 7,20(11)\n\t" \
2497 "lwz 8,24(11)\n\t" \
2498 "lwz 9,28(11)\n\t" \
2499 "lwz 10,32(11)\n\t" \
2500 "lwz 11,0(11)\n\t" \
2501 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2502 VALGRIND_RESTORE_STACK \
2505 : "r" (&_argvec[0]) \
2506 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2508 lval = (__typeof__(lval)) _res; \
2511 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2512 arg7,arg8,arg9,arg10,arg11) \
2514 volatile OrigFn _orig = (orig); \
2515 volatile unsigned long _argvec[12]; \
2516 volatile unsigned long _res; \
2517 _argvec[0] = (unsigned long)_orig.nraddr; \
2518 _argvec[1] = (unsigned long)arg1; \
2519 _argvec[2] = (unsigned long)arg2; \
2520 _argvec[3] = (unsigned long)arg3; \
2521 _argvec[4] = (unsigned long)arg4; \
2522 _argvec[5] = (unsigned long)arg5; \
2523 _argvec[6] = (unsigned long)arg6; \
2524 _argvec[7] = (unsigned long)arg7; \
2525 _argvec[8] = (unsigned long)arg8; \
2526 _argvec[9] = (unsigned long)arg9; \
2527 _argvec[10] = (unsigned long)arg10; \
2528 _argvec[11] = (unsigned long)arg11; \
2530 VALGRIND_ALIGN_STACK \
2532 "addi 1,1,-32\n\t" \
2534 "lwz 3,44(11)\n\t" \
2537 "lwz 3,40(11)\n\t" \
2540 "lwz 3,36(11)\n\t" \
2545 "lwz 5,12(11)\n\t" \
2546 "lwz 6,16(11)\n\t" \
2547 "lwz 7,20(11)\n\t" \
2548 "lwz 8,24(11)\n\t" \
2549 "lwz 9,28(11)\n\t" \
2550 "lwz 10,32(11)\n\t" \
2551 "lwz 11,0(11)\n\t" \
2552 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2553 VALGRIND_RESTORE_STACK \
2556 : "r" (&_argvec[0]) \
2557 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2559 lval = (__typeof__(lval)) _res; \
2562 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2563 arg7,arg8,arg9,arg10,arg11,arg12) \
2565 volatile OrigFn _orig = (orig); \
2566 volatile unsigned long _argvec[13]; \
2567 volatile unsigned long _res; \
2568 _argvec[0] = (unsigned long)_orig.nraddr; \
2569 _argvec[1] = (unsigned long)arg1; \
2570 _argvec[2] = (unsigned long)arg2; \
2571 _argvec[3] = (unsigned long)arg3; \
2572 _argvec[4] = (unsigned long)arg4; \
2573 _argvec[5] = (unsigned long)arg5; \
2574 _argvec[6] = (unsigned long)arg6; \
2575 _argvec[7] = (unsigned long)arg7; \
2576 _argvec[8] = (unsigned long)arg8; \
2577 _argvec[9] = (unsigned long)arg9; \
2578 _argvec[10] = (unsigned long)arg10; \
2579 _argvec[11] = (unsigned long)arg11; \
2580 _argvec[12] = (unsigned long)arg12; \
2582 VALGRIND_ALIGN_STACK \
2584 "addi 1,1,-32\n\t" \
2586 "lwz 3,48(11)\n\t" \
2589 "lwz 3,44(11)\n\t" \
2592 "lwz 3,40(11)\n\t" \
2595 "lwz 3,36(11)\n\t" \
2600 "lwz 5,12(11)\n\t" \
2601 "lwz 6,16(11)\n\t" \
2602 "lwz 7,20(11)\n\t" \
2603 "lwz 8,24(11)\n\t" \
2604 "lwz 9,28(11)\n\t" \
2605 "lwz 10,32(11)\n\t" \
2606 "lwz 11,0(11)\n\t" \
2607 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2608 VALGRIND_RESTORE_STACK \
2611 : "r" (&_argvec[0]) \
2612 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2614 lval = (__typeof__(lval)) _res; \
2621 #if defined(PLAT_ppc64be_linux)
2626 #define __CALLER_SAVED_REGS \
2627 "lr", "ctr", "xer", \
2628 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \
2629 "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \
2637 #define VALGRIND_ALIGN_STACK \
2639 "rldicr 1,1,0,59\n\t"
2640 #define VALGRIND_RESTORE_STACK \
2646 #define CALL_FN_W_v(lval, orig) \
2648 volatile OrigFn _orig = (orig); \
2649 volatile unsigned long _argvec[3+0]; \
2650 volatile unsigned long _res; \
2652 _argvec[1] = (unsigned long)_orig.r2; \
2653 _argvec[2] = (unsigned long)_orig.nraddr; \
2655 VALGRIND_ALIGN_STACK \
2657 "std 2,-16(11)\n\t" \
2659 "ld 11, 0(11)\n\t" \
2660 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2663 "ld 2,-16(11)\n\t" \
2664 VALGRIND_RESTORE_STACK \
2666 : "r" (&_argvec[2]) \
2667 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2669 lval = (__typeof__(lval)) _res; \
2672 #define CALL_FN_W_W(lval, orig, arg1) \
2674 volatile OrigFn _orig = (orig); \
2675 volatile unsigned long _argvec[3+1]; \
2676 volatile unsigned long _res; \
2678 _argvec[1] = (unsigned long)_orig.r2; \
2679 _argvec[2] = (unsigned long)_orig.nraddr; \
2680 _argvec[2+1] = (unsigned long)arg1; \
2682 VALGRIND_ALIGN_STACK \
2684 "std 2,-16(11)\n\t" \
2687 "ld 11, 0(11)\n\t" \
2688 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2691 "ld 2,-16(11)\n\t" \
2692 VALGRIND_RESTORE_STACK \
2694 : "r" (&_argvec[2]) \
2695 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2697 lval = (__typeof__(lval)) _res; \
2700 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
2702 volatile OrigFn _orig = (orig); \
2703 volatile unsigned long _argvec[3+2]; \
2704 volatile unsigned long _res; \
2706 _argvec[1] = (unsigned long)_orig.r2; \
2707 _argvec[2] = (unsigned long)_orig.nraddr; \
2708 _argvec[2+1] = (unsigned long)arg1; \
2709 _argvec[2+2] = (unsigned long)arg2; \
2711 VALGRIND_ALIGN_STACK \
2713 "std 2,-16(11)\n\t" \
2716 "ld 4, 16(11)\n\t" \
2717 "ld 11, 0(11)\n\t" \
2718 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2721 "ld 2,-16(11)\n\t" \
2722 VALGRIND_RESTORE_STACK \
2724 : "r" (&_argvec[2]) \
2725 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2727 lval = (__typeof__(lval)) _res; \
2730 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
2732 volatile OrigFn _orig = (orig); \
2733 volatile unsigned long _argvec[3+3]; \
2734 volatile unsigned long _res; \
2736 _argvec[1] = (unsigned long)_orig.r2; \
2737 _argvec[2] = (unsigned long)_orig.nraddr; \
2738 _argvec[2+1] = (unsigned long)arg1; \
2739 _argvec[2+2] = (unsigned long)arg2; \
2740 _argvec[2+3] = (unsigned long)arg3; \
2742 VALGRIND_ALIGN_STACK \
2744 "std 2,-16(11)\n\t" \
2747 "ld 4, 16(11)\n\t" \
2748 "ld 5, 24(11)\n\t" \
2749 "ld 11, 0(11)\n\t" \
2750 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2753 "ld 2,-16(11)\n\t" \
2754 VALGRIND_RESTORE_STACK \
2756 : "r" (&_argvec[2]) \
2757 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2759 lval = (__typeof__(lval)) _res; \
2762 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
2764 volatile OrigFn _orig = (orig); \
2765 volatile unsigned long _argvec[3+4]; \
2766 volatile unsigned long _res; \
2768 _argvec[1] = (unsigned long)_orig.r2; \
2769 _argvec[2] = (unsigned long)_orig.nraddr; \
2770 _argvec[2+1] = (unsigned long)arg1; \
2771 _argvec[2+2] = (unsigned long)arg2; \
2772 _argvec[2+3] = (unsigned long)arg3; \
2773 _argvec[2+4] = (unsigned long)arg4; \
2775 VALGRIND_ALIGN_STACK \
2777 "std 2,-16(11)\n\t" \
2780 "ld 4, 16(11)\n\t" \
2781 "ld 5, 24(11)\n\t" \
2782 "ld 6, 32(11)\n\t" \
2783 "ld 11, 0(11)\n\t" \
2784 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2787 "ld 2,-16(11)\n\t" \
2788 VALGRIND_RESTORE_STACK \
2790 : "r" (&_argvec[2]) \
2791 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2793 lval = (__typeof__(lval)) _res; \
2796 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
2798 volatile OrigFn _orig = (orig); \
2799 volatile unsigned long _argvec[3+5]; \
2800 volatile unsigned long _res; \
2802 _argvec[1] = (unsigned long)_orig.r2; \
2803 _argvec[2] = (unsigned long)_orig.nraddr; \
2804 _argvec[2+1] = (unsigned long)arg1; \
2805 _argvec[2+2] = (unsigned long)arg2; \
2806 _argvec[2+3] = (unsigned long)arg3; \
2807 _argvec[2+4] = (unsigned long)arg4; \
2808 _argvec[2+5] = (unsigned long)arg5; \
2810 VALGRIND_ALIGN_STACK \
2812 "std 2,-16(11)\n\t" \
2815 "ld 4, 16(11)\n\t" \
2816 "ld 5, 24(11)\n\t" \
2817 "ld 6, 32(11)\n\t" \
2818 "ld 7, 40(11)\n\t" \
2819 "ld 11, 0(11)\n\t" \
2820 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2823 "ld 2,-16(11)\n\t" \
2824 VALGRIND_RESTORE_STACK \
2826 : "r" (&_argvec[2]) \
2827 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2829 lval = (__typeof__(lval)) _res; \
2832 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
2834 volatile OrigFn _orig = (orig); \
2835 volatile unsigned long _argvec[3+6]; \
2836 volatile unsigned long _res; \
2838 _argvec[1] = (unsigned long)_orig.r2; \
2839 _argvec[2] = (unsigned long)_orig.nraddr; \
2840 _argvec[2+1] = (unsigned long)arg1; \
2841 _argvec[2+2] = (unsigned long)arg2; \
2842 _argvec[2+3] = (unsigned long)arg3; \
2843 _argvec[2+4] = (unsigned long)arg4; \
2844 _argvec[2+5] = (unsigned long)arg5; \
2845 _argvec[2+6] = (unsigned long)arg6; \
2847 VALGRIND_ALIGN_STACK \
2849 "std 2,-16(11)\n\t" \
2852 "ld 4, 16(11)\n\t" \
2853 "ld 5, 24(11)\n\t" \
2854 "ld 6, 32(11)\n\t" \
2855 "ld 7, 40(11)\n\t" \
2856 "ld 8, 48(11)\n\t" \
2857 "ld 11, 0(11)\n\t" \
2858 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2861 "ld 2,-16(11)\n\t" \
2862 VALGRIND_RESTORE_STACK \
2864 : "r" (&_argvec[2]) \
2865 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2867 lval = (__typeof__(lval)) _res; \
2870 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2873 volatile OrigFn _orig = (orig); \
2874 volatile unsigned long _argvec[3+7]; \
2875 volatile unsigned long _res; \
2877 _argvec[1] = (unsigned long)_orig.r2; \
2878 _argvec[2] = (unsigned long)_orig.nraddr; \
2879 _argvec[2+1] = (unsigned long)arg1; \
2880 _argvec[2+2] = (unsigned long)arg2; \
2881 _argvec[2+3] = (unsigned long)arg3; \
2882 _argvec[2+4] = (unsigned long)arg4; \
2883 _argvec[2+5] = (unsigned long)arg5; \
2884 _argvec[2+6] = (unsigned long)arg6; \
2885 _argvec[2+7] = (unsigned long)arg7; \
2887 VALGRIND_ALIGN_STACK \
2889 "std 2,-16(11)\n\t" \
2892 "ld 4, 16(11)\n\t" \
2893 "ld 5, 24(11)\n\t" \
2894 "ld 6, 32(11)\n\t" \
2895 "ld 7, 40(11)\n\t" \
2896 "ld 8, 48(11)\n\t" \
2897 "ld 9, 56(11)\n\t" \
2898 "ld 11, 0(11)\n\t" \
2899 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2902 "ld 2,-16(11)\n\t" \
2903 VALGRIND_RESTORE_STACK \
2905 : "r" (&_argvec[2]) \
2906 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2908 lval = (__typeof__(lval)) _res; \
2911 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2914 volatile OrigFn _orig = (orig); \
2915 volatile unsigned long _argvec[3+8]; \
2916 volatile unsigned long _res; \
2918 _argvec[1] = (unsigned long)_orig.r2; \
2919 _argvec[2] = (unsigned long)_orig.nraddr; \
2920 _argvec[2+1] = (unsigned long)arg1; \
2921 _argvec[2+2] = (unsigned long)arg2; \
2922 _argvec[2+3] = (unsigned long)arg3; \
2923 _argvec[2+4] = (unsigned long)arg4; \
2924 _argvec[2+5] = (unsigned long)arg5; \
2925 _argvec[2+6] = (unsigned long)arg6; \
2926 _argvec[2+7] = (unsigned long)arg7; \
2927 _argvec[2+8] = (unsigned long)arg8; \
2929 VALGRIND_ALIGN_STACK \
2931 "std 2,-16(11)\n\t" \
2934 "ld 4, 16(11)\n\t" \
2935 "ld 5, 24(11)\n\t" \
2936 "ld 6, 32(11)\n\t" \
2937 "ld 7, 40(11)\n\t" \
2938 "ld 8, 48(11)\n\t" \
2939 "ld 9, 56(11)\n\t" \
2940 "ld 10, 64(11)\n\t" \
2941 "ld 11, 0(11)\n\t" \
2942 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2945 "ld 2,-16(11)\n\t" \
2946 VALGRIND_RESTORE_STACK \
2948 : "r" (&_argvec[2]) \
2949 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
2951 lval = (__typeof__(lval)) _res; \
2954 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
2957 volatile OrigFn _orig = (orig); \
2958 volatile unsigned long _argvec[3+9]; \
2959 volatile unsigned long _res; \
2961 _argvec[1] = (unsigned long)_orig.r2; \
2962 _argvec[2] = (unsigned long)_orig.nraddr; \
2963 _argvec[2+1] = (unsigned long)arg1; \
2964 _argvec[2+2] = (unsigned long)arg2; \
2965 _argvec[2+3] = (unsigned long)arg3; \
2966 _argvec[2+4] = (unsigned long)arg4; \
2967 _argvec[2+5] = (unsigned long)arg5; \
2968 _argvec[2+6] = (unsigned long)arg6; \
2969 _argvec[2+7] = (unsigned long)arg7; \
2970 _argvec[2+8] = (unsigned long)arg8; \
2971 _argvec[2+9] = (unsigned long)arg9; \
2973 VALGRIND_ALIGN_STACK \
2975 "std 2,-16(11)\n\t" \
2977 "addi 1,1,-128\n\t" \
2980 "std 3,112(1)\n\t" \
2983 "ld 4, 16(11)\n\t" \
2984 "ld 5, 24(11)\n\t" \
2985 "ld 6, 32(11)\n\t" \
2986 "ld 7, 40(11)\n\t" \
2987 "ld 8, 48(11)\n\t" \
2988 "ld 9, 56(11)\n\t" \
2989 "ld 10, 64(11)\n\t" \
2990 "ld 11, 0(11)\n\t" \
2991 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
2994 "ld 2,-16(11)\n\t" \
2995 VALGRIND_RESTORE_STACK \
2997 : "r" (&_argvec[2]) \
2998 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3000 lval = (__typeof__(lval)) _res; \
3003 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3004 arg7,arg8,arg9,arg10) \
3006 volatile OrigFn _orig = (orig); \
3007 volatile unsigned long _argvec[3+10]; \
3008 volatile unsigned long _res; \
3010 _argvec[1] = (unsigned long)_orig.r2; \
3011 _argvec[2] = (unsigned long)_orig.nraddr; \
3012 _argvec[2+1] = (unsigned long)arg1; \
3013 _argvec[2+2] = (unsigned long)arg2; \
3014 _argvec[2+3] = (unsigned long)arg3; \
3015 _argvec[2+4] = (unsigned long)arg4; \
3016 _argvec[2+5] = (unsigned long)arg5; \
3017 _argvec[2+6] = (unsigned long)arg6; \
3018 _argvec[2+7] = (unsigned long)arg7; \
3019 _argvec[2+8] = (unsigned long)arg8; \
3020 _argvec[2+9] = (unsigned long)arg9; \
3021 _argvec[2+10] = (unsigned long)arg10; \
3023 VALGRIND_ALIGN_STACK \
3025 "std 2,-16(11)\n\t" \
3027 "addi 1,1,-128\n\t" \
3030 "std 3,120(1)\n\t" \
3033 "std 3,112(1)\n\t" \
3036 "ld 4, 16(11)\n\t" \
3037 "ld 5, 24(11)\n\t" \
3038 "ld 6, 32(11)\n\t" \
3039 "ld 7, 40(11)\n\t" \
3040 "ld 8, 48(11)\n\t" \
3041 "ld 9, 56(11)\n\t" \
3042 "ld 10, 64(11)\n\t" \
3043 "ld 11, 0(11)\n\t" \
3044 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3047 "ld 2,-16(11)\n\t" \
3048 VALGRIND_RESTORE_STACK \
3050 : "r" (&_argvec[2]) \
3051 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3053 lval = (__typeof__(lval)) _res; \
3056 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3057 arg7,arg8,arg9,arg10,arg11) \
3059 volatile OrigFn _orig = (orig); \
3060 volatile unsigned long _argvec[3+11]; \
3061 volatile unsigned long _res; \
3063 _argvec[1] = (unsigned long)_orig.r2; \
3064 _argvec[2] = (unsigned long)_orig.nraddr; \
3065 _argvec[2+1] = (unsigned long)arg1; \
3066 _argvec[2+2] = (unsigned long)arg2; \
3067 _argvec[2+3] = (unsigned long)arg3; \
3068 _argvec[2+4] = (unsigned long)arg4; \
3069 _argvec[2+5] = (unsigned long)arg5; \
3070 _argvec[2+6] = (unsigned long)arg6; \
3071 _argvec[2+7] = (unsigned long)arg7; \
3072 _argvec[2+8] = (unsigned long)arg8; \
3073 _argvec[2+9] = (unsigned long)arg9; \
3074 _argvec[2+10] = (unsigned long)arg10; \
3075 _argvec[2+11] = (unsigned long)arg11; \
3077 VALGRIND_ALIGN_STACK \
3079 "std 2,-16(11)\n\t" \
3081 "addi 1,1,-144\n\t" \
3084 "std 3,128(1)\n\t" \
3087 "std 3,120(1)\n\t" \
3090 "std 3,112(1)\n\t" \
3093 "ld 4, 16(11)\n\t" \
3094 "ld 5, 24(11)\n\t" \
3095 "ld 6, 32(11)\n\t" \
3096 "ld 7, 40(11)\n\t" \
3097 "ld 8, 48(11)\n\t" \
3098 "ld 9, 56(11)\n\t" \
3099 "ld 10, 64(11)\n\t" \
3100 "ld 11, 0(11)\n\t" \
3101 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3104 "ld 2,-16(11)\n\t" \
3105 VALGRIND_RESTORE_STACK \
3107 : "r" (&_argvec[2]) \
3108 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3110 lval = (__typeof__(lval)) _res; \
3113 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3114 arg7,arg8,arg9,arg10,arg11,arg12) \
3116 volatile OrigFn _orig = (orig); \
3117 volatile unsigned long _argvec[3+12]; \
3118 volatile unsigned long _res; \
3120 _argvec[1] = (unsigned long)_orig.r2; \
3121 _argvec[2] = (unsigned long)_orig.nraddr; \
3122 _argvec[2+1] = (unsigned long)arg1; \
3123 _argvec[2+2] = (unsigned long)arg2; \
3124 _argvec[2+3] = (unsigned long)arg3; \
3125 _argvec[2+4] = (unsigned long)arg4; \
3126 _argvec[2+5] = (unsigned long)arg5; \
3127 _argvec[2+6] = (unsigned long)arg6; \
3128 _argvec[2+7] = (unsigned long)arg7; \
3129 _argvec[2+8] = (unsigned long)arg8; \
3130 _argvec[2+9] = (unsigned long)arg9; \
3131 _argvec[2+10] = (unsigned long)arg10; \
3132 _argvec[2+11] = (unsigned long)arg11; \
3133 _argvec[2+12] = (unsigned long)arg12; \
3135 VALGRIND_ALIGN_STACK \
3137 "std 2,-16(11)\n\t" \
3139 "addi 1,1,-144\n\t" \
3142 "std 3,136(1)\n\t" \
3145 "std 3,128(1)\n\t" \
3148 "std 3,120(1)\n\t" \
3151 "std 3,112(1)\n\t" \
3154 "ld 4, 16(11)\n\t" \
3155 "ld 5, 24(11)\n\t" \
3156 "ld 6, 32(11)\n\t" \
3157 "ld 7, 40(11)\n\t" \
3158 "ld 8, 48(11)\n\t" \
3159 "ld 9, 56(11)\n\t" \
3160 "ld 10, 64(11)\n\t" \
3161 "ld 11, 0(11)\n\t" \
3162 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R11 \
3165 "ld 2,-16(11)\n\t" \
3166 VALGRIND_RESTORE_STACK \
3168 : "r" (&_argvec[2]) \
3169 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3171 lval = (__typeof__(lval)) _res; \
3177 #if defined(PLAT_ppc64le_linux)
3182 #define __CALLER_SAVED_REGS \
3183 "lr", "ctr", "xer", \
3184 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \
3185 "r0", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", \
3193 #define VALGRIND_ALIGN_STACK \
3195 "rldicr 1,1,0,59\n\t"
3196 #define VALGRIND_RESTORE_STACK \
3202 #define CALL_FN_W_v(lval, orig) \
3204 volatile OrigFn _orig = (orig); \
3205 volatile unsigned long _argvec[3+0]; \
3206 volatile unsigned long _res; \
3208 _argvec[1] = (unsigned long)_orig.r2; \
3209 _argvec[2] = (unsigned long)_orig.nraddr; \
3211 VALGRIND_ALIGN_STACK \
3213 "std 2,-16(12)\n\t" \
3215 "ld 12, 0(12)\n\t" \
3216 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \
3219 "ld 2,-16(12)\n\t" \
3220 VALGRIND_RESTORE_STACK \
3222 : "r" (&_argvec[2]) \
3223 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3225 lval = (__typeof__(lval)) _res; \
3228 #define CALL_FN_W_W(lval, orig, arg1) \
3230 volatile OrigFn _orig = (orig); \
3231 volatile unsigned long _argvec[3+1]; \
3232 volatile unsigned long _res; \
3234 _argvec[1] = (unsigned long)_orig.r2; \
3235 _argvec[2] = (unsigned long)_orig.nraddr; \
3236 _argvec[2+1] = (unsigned long)arg1; \
3238 VALGRIND_ALIGN_STACK \
3240 "std 2,-16(12)\n\t" \
3243 "ld 12, 0(12)\n\t" \
3244 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \
3247 "ld 2,-16(12)\n\t" \
3248 VALGRIND_RESTORE_STACK \
3250 : "r" (&_argvec[2]) \
3251 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3253 lval = (__typeof__(lval)) _res; \
3256 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
3258 volatile OrigFn _orig = (orig); \
3259 volatile unsigned long _argvec[3+2]; \
3260 volatile unsigned long _res; \
3262 _argvec[1] = (unsigned long)_orig.r2; \
3263 _argvec[2] = (unsigned long)_orig.nraddr; \
3264 _argvec[2+1] = (unsigned long)arg1; \
3265 _argvec[2+2] = (unsigned long)arg2; \
3267 VALGRIND_ALIGN_STACK \
3269 "std 2,-16(12)\n\t" \
3272 "ld 4, 16(12)\n\t" \
3273 "ld 12, 0(12)\n\t" \
3274 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \
3277 "ld 2,-16(12)\n\t" \
3278 VALGRIND_RESTORE_STACK \
3280 : "r" (&_argvec[2]) \
3281 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3283 lval = (__typeof__(lval)) _res; \
3286 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
3288 volatile OrigFn _orig = (orig); \
3289 volatile unsigned long _argvec[3+3]; \
3290 volatile unsigned long _res; \
3292 _argvec[1] = (unsigned long)_orig.r2; \
3293 _argvec[2] = (unsigned long)_orig.nraddr; \
3294 _argvec[2+1] = (unsigned long)arg1; \
3295 _argvec[2+2] = (unsigned long)arg2; \
3296 _argvec[2+3] = (unsigned long)arg3; \
3298 VALGRIND_ALIGN_STACK \
3300 "std 2,-16(12)\n\t" \
3303 "ld 4, 16(12)\n\t" \
3304 "ld 5, 24(12)\n\t" \
3305 "ld 12, 0(12)\n\t" \
3306 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \
3309 "ld 2,-16(12)\n\t" \
3310 VALGRIND_RESTORE_STACK \
3312 : "r" (&_argvec[2]) \
3313 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3315 lval = (__typeof__(lval)) _res; \
3318 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
3320 volatile OrigFn _orig = (orig); \
3321 volatile unsigned long _argvec[3+4]; \
3322 volatile unsigned long _res; \
3324 _argvec[1] = (unsigned long)_orig.r2; \
3325 _argvec[2] = (unsigned long)_orig.nraddr; \
3326 _argvec[2+1] = (unsigned long)arg1; \
3327 _argvec[2+2] = (unsigned long)arg2; \
3328 _argvec[2+3] = (unsigned long)arg3; \
3329 _argvec[2+4] = (unsigned long)arg4; \
3331 VALGRIND_ALIGN_STACK \
3333 "std 2,-16(12)\n\t" \
3336 "ld 4, 16(12)\n\t" \
3337 "ld 5, 24(12)\n\t" \
3338 "ld 6, 32(12)\n\t" \
3339 "ld 12, 0(12)\n\t" \
3340 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \
3343 "ld 2,-16(12)\n\t" \
3344 VALGRIND_RESTORE_STACK \
3346 : "r" (&_argvec[2]) \
3347 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3349 lval = (__typeof__(lval)) _res; \
3352 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
3354 volatile OrigFn _orig = (orig); \
3355 volatile unsigned long _argvec[3+5]; \
3356 volatile unsigned long _res; \
3358 _argvec[1] = (unsigned long)_orig.r2; \
3359 _argvec[2] = (unsigned long)_orig.nraddr; \
3360 _argvec[2+1] = (unsigned long)arg1; \
3361 _argvec[2+2] = (unsigned long)arg2; \
3362 _argvec[2+3] = (unsigned long)arg3; \
3363 _argvec[2+4] = (unsigned long)arg4; \
3364 _argvec[2+5] = (unsigned long)arg5; \
3366 VALGRIND_ALIGN_STACK \
3368 "std 2,-16(12)\n\t" \
3371 "ld 4, 16(12)\n\t" \
3372 "ld 5, 24(12)\n\t" \
3373 "ld 6, 32(12)\n\t" \
3374 "ld 7, 40(12)\n\t" \
3375 "ld 12, 0(12)\n\t" \
3376 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \
3379 "ld 2,-16(12)\n\t" \
3380 VALGRIND_RESTORE_STACK \
3382 : "r" (&_argvec[2]) \
3383 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3385 lval = (__typeof__(lval)) _res; \
3388 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
3390 volatile OrigFn _orig = (orig); \
3391 volatile unsigned long _argvec[3+6]; \
3392 volatile unsigned long _res; \
3394 _argvec[1] = (unsigned long)_orig.r2; \
3395 _argvec[2] = (unsigned long)_orig.nraddr; \
3396 _argvec[2+1] = (unsigned long)arg1; \
3397 _argvec[2+2] = (unsigned long)arg2; \
3398 _argvec[2+3] = (unsigned long)arg3; \
3399 _argvec[2+4] = (unsigned long)arg4; \
3400 _argvec[2+5] = (unsigned long)arg5; \
3401 _argvec[2+6] = (unsigned long)arg6; \
3403 VALGRIND_ALIGN_STACK \
3405 "std 2,-16(12)\n\t" \
3408 "ld 4, 16(12)\n\t" \
3409 "ld 5, 24(12)\n\t" \
3410 "ld 6, 32(12)\n\t" \
3411 "ld 7, 40(12)\n\t" \
3412 "ld 8, 48(12)\n\t" \
3413 "ld 12, 0(12)\n\t" \
3414 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \
3417 "ld 2,-16(12)\n\t" \
3418 VALGRIND_RESTORE_STACK \
3420 : "r" (&_argvec[2]) \
3421 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3423 lval = (__typeof__(lval)) _res; \
3426 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3429 volatile OrigFn _orig = (orig); \
3430 volatile unsigned long _argvec[3+7]; \
3431 volatile unsigned long _res; \
3433 _argvec[1] = (unsigned long)_orig.r2; \
3434 _argvec[2] = (unsigned long)_orig.nraddr; \
3435 _argvec[2+1] = (unsigned long)arg1; \
3436 _argvec[2+2] = (unsigned long)arg2; \
3437 _argvec[2+3] = (unsigned long)arg3; \
3438 _argvec[2+4] = (unsigned long)arg4; \
3439 _argvec[2+5] = (unsigned long)arg5; \
3440 _argvec[2+6] = (unsigned long)arg6; \
3441 _argvec[2+7] = (unsigned long)arg7; \
3443 VALGRIND_ALIGN_STACK \
3445 "std 2,-16(12)\n\t" \
3448 "ld 4, 16(12)\n\t" \
3449 "ld 5, 24(12)\n\t" \
3450 "ld 6, 32(12)\n\t" \
3451 "ld 7, 40(12)\n\t" \
3452 "ld 8, 48(12)\n\t" \
3453 "ld 9, 56(12)\n\t" \
3454 "ld 12, 0(12)\n\t" \
3455 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \
3458 "ld 2,-16(12)\n\t" \
3459 VALGRIND_RESTORE_STACK \
3461 : "r" (&_argvec[2]) \
3462 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3464 lval = (__typeof__(lval)) _res; \
3467 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3470 volatile OrigFn _orig = (orig); \
3471 volatile unsigned long _argvec[3+8]; \
3472 volatile unsigned long _res; \
3474 _argvec[1] = (unsigned long)_orig.r2; \
3475 _argvec[2] = (unsigned long)_orig.nraddr; \
3476 _argvec[2+1] = (unsigned long)arg1; \
3477 _argvec[2+2] = (unsigned long)arg2; \
3478 _argvec[2+3] = (unsigned long)arg3; \
3479 _argvec[2+4] = (unsigned long)arg4; \
3480 _argvec[2+5] = (unsigned long)arg5; \
3481 _argvec[2+6] = (unsigned long)arg6; \
3482 _argvec[2+7] = (unsigned long)arg7; \
3483 _argvec[2+8] = (unsigned long)arg8; \
3485 VALGRIND_ALIGN_STACK \
3487 "std 2,-16(12)\n\t" \
3490 "ld 4, 16(12)\n\t" \
3491 "ld 5, 24(12)\n\t" \
3492 "ld 6, 32(12)\n\t" \
3493 "ld 7, 40(12)\n\t" \
3494 "ld 8, 48(12)\n\t" \
3495 "ld 9, 56(12)\n\t" \
3496 "ld 10, 64(12)\n\t" \
3497 "ld 12, 0(12)\n\t" \
3498 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \
3501 "ld 2,-16(12)\n\t" \
3502 VALGRIND_RESTORE_STACK \
3504 : "r" (&_argvec[2]) \
3505 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3507 lval = (__typeof__(lval)) _res; \
3510 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3513 volatile OrigFn _orig = (orig); \
3514 volatile unsigned long _argvec[3+9]; \
3515 volatile unsigned long _res; \
3517 _argvec[1] = (unsigned long)_orig.r2; \
3518 _argvec[2] = (unsigned long)_orig.nraddr; \
3519 _argvec[2+1] = (unsigned long)arg1; \
3520 _argvec[2+2] = (unsigned long)arg2; \
3521 _argvec[2+3] = (unsigned long)arg3; \
3522 _argvec[2+4] = (unsigned long)arg4; \
3523 _argvec[2+5] = (unsigned long)arg5; \
3524 _argvec[2+6] = (unsigned long)arg6; \
3525 _argvec[2+7] = (unsigned long)arg7; \
3526 _argvec[2+8] = (unsigned long)arg8; \
3527 _argvec[2+9] = (unsigned long)arg9; \
3529 VALGRIND_ALIGN_STACK \
3531 "std 2,-16(12)\n\t" \
3533 "addi 1,1,-128\n\t" \
3539 "ld 4, 16(12)\n\t" \
3540 "ld 5, 24(12)\n\t" \
3541 "ld 6, 32(12)\n\t" \
3542 "ld 7, 40(12)\n\t" \
3543 "ld 8, 48(12)\n\t" \
3544 "ld 9, 56(12)\n\t" \
3545 "ld 10, 64(12)\n\t" \
3546 "ld 12, 0(12)\n\t" \
3547 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \
3550 "ld 2,-16(12)\n\t" \
3551 VALGRIND_RESTORE_STACK \
3553 : "r" (&_argvec[2]) \
3554 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3556 lval = (__typeof__(lval)) _res; \
3559 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3560 arg7,arg8,arg9,arg10) \
3562 volatile OrigFn _orig = (orig); \
3563 volatile unsigned long _argvec[3+10]; \
3564 volatile unsigned long _res; \
3566 _argvec[1] = (unsigned long)_orig.r2; \
3567 _argvec[2] = (unsigned long)_orig.nraddr; \
3568 _argvec[2+1] = (unsigned long)arg1; \
3569 _argvec[2+2] = (unsigned long)arg2; \
3570 _argvec[2+3] = (unsigned long)arg3; \
3571 _argvec[2+4] = (unsigned long)arg4; \
3572 _argvec[2+5] = (unsigned long)arg5; \
3573 _argvec[2+6] = (unsigned long)arg6; \
3574 _argvec[2+7] = (unsigned long)arg7; \
3575 _argvec[2+8] = (unsigned long)arg8; \
3576 _argvec[2+9] = (unsigned long)arg9; \
3577 _argvec[2+10] = (unsigned long)arg10; \
3579 VALGRIND_ALIGN_STACK \
3581 "std 2,-16(12)\n\t" \
3583 "addi 1,1,-128\n\t" \
3586 "std 3,104(1)\n\t" \
3592 "ld 4, 16(12)\n\t" \
3593 "ld 5, 24(12)\n\t" \
3594 "ld 6, 32(12)\n\t" \
3595 "ld 7, 40(12)\n\t" \
3596 "ld 8, 48(12)\n\t" \
3597 "ld 9, 56(12)\n\t" \
3598 "ld 10, 64(12)\n\t" \
3599 "ld 12, 0(12)\n\t" \
3600 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \
3603 "ld 2,-16(12)\n\t" \
3604 VALGRIND_RESTORE_STACK \
3606 : "r" (&_argvec[2]) \
3607 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3609 lval = (__typeof__(lval)) _res; \
3612 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3613 arg7,arg8,arg9,arg10,arg11) \
3615 volatile OrigFn _orig = (orig); \
3616 volatile unsigned long _argvec[3+11]; \
3617 volatile unsigned long _res; \
3619 _argvec[1] = (unsigned long)_orig.r2; \
3620 _argvec[2] = (unsigned long)_orig.nraddr; \
3621 _argvec[2+1] = (unsigned long)arg1; \
3622 _argvec[2+2] = (unsigned long)arg2; \
3623 _argvec[2+3] = (unsigned long)arg3; \
3624 _argvec[2+4] = (unsigned long)arg4; \
3625 _argvec[2+5] = (unsigned long)arg5; \
3626 _argvec[2+6] = (unsigned long)arg6; \
3627 _argvec[2+7] = (unsigned long)arg7; \
3628 _argvec[2+8] = (unsigned long)arg8; \
3629 _argvec[2+9] = (unsigned long)arg9; \
3630 _argvec[2+10] = (unsigned long)arg10; \
3631 _argvec[2+11] = (unsigned long)arg11; \
3633 VALGRIND_ALIGN_STACK \
3635 "std 2,-16(12)\n\t" \
3637 "addi 1,1,-144\n\t" \
3640 "std 3,112(1)\n\t" \
3643 "std 3,104(1)\n\t" \
3649 "ld 4, 16(12)\n\t" \
3650 "ld 5, 24(12)\n\t" \
3651 "ld 6, 32(12)\n\t" \
3652 "ld 7, 40(12)\n\t" \
3653 "ld 8, 48(12)\n\t" \
3654 "ld 9, 56(12)\n\t" \
3655 "ld 10, 64(12)\n\t" \
3656 "ld 12, 0(12)\n\t" \
3657 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \
3660 "ld 2,-16(12)\n\t" \
3661 VALGRIND_RESTORE_STACK \
3663 : "r" (&_argvec[2]) \
3664 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3666 lval = (__typeof__(lval)) _res; \
3669 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3670 arg7,arg8,arg9,arg10,arg11,arg12) \
3672 volatile OrigFn _orig = (orig); \
3673 volatile unsigned long _argvec[3+12]; \
3674 volatile unsigned long _res; \
3676 _argvec[1] = (unsigned long)_orig.r2; \
3677 _argvec[2] = (unsigned long)_orig.nraddr; \
3678 _argvec[2+1] = (unsigned long)arg1; \
3679 _argvec[2+2] = (unsigned long)arg2; \
3680 _argvec[2+3] = (unsigned long)arg3; \
3681 _argvec[2+4] = (unsigned long)arg4; \
3682 _argvec[2+5] = (unsigned long)arg5; \
3683 _argvec[2+6] = (unsigned long)arg6; \
3684 _argvec[2+7] = (unsigned long)arg7; \
3685 _argvec[2+8] = (unsigned long)arg8; \
3686 _argvec[2+9] = (unsigned long)arg9; \
3687 _argvec[2+10] = (unsigned long)arg10; \
3688 _argvec[2+11] = (unsigned long)arg11; \
3689 _argvec[2+12] = (unsigned long)arg12; \
3691 VALGRIND_ALIGN_STACK \
3693 "std 2,-16(12)\n\t" \
3695 "addi 1,1,-144\n\t" \
3698 "std 3,120(1)\n\t" \
3701 "std 3,112(1)\n\t" \
3704 "std 3,104(1)\n\t" \
3710 "ld 4, 16(12)\n\t" \
3711 "ld 5, 24(12)\n\t" \
3712 "ld 6, 32(12)\n\t" \
3713 "ld 7, 40(12)\n\t" \
3714 "ld 8, 48(12)\n\t" \
3715 "ld 9, 56(12)\n\t" \
3716 "ld 10, 64(12)\n\t" \
3717 "ld 12, 0(12)\n\t" \
3718 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R12 \
3721 "ld 2,-16(12)\n\t" \
3722 VALGRIND_RESTORE_STACK \
3724 : "r" (&_argvec[2]) \
3725 : "cc", "memory", __CALLER_SAVED_REGS, "r28" \
3727 lval = (__typeof__(lval)) _res; \
3734 #if defined(PLAT_arm_linux)
3737 #define __CALLER_SAVED_REGS "r0", "r1", "r2", "r3","r4","r14"
3752 #define VALGRIND_ALIGN_STACK \
3755 "bic r4, r4, #7\n\t" \
3757 #define VALGRIND_RESTORE_STACK \
3763 #define CALL_FN_W_v(lval, orig) \
3765 volatile OrigFn _orig = (orig); \
3766 volatile unsigned long _argvec[1]; \
3767 volatile unsigned long _res; \
3768 _argvec[0] = (unsigned long)_orig.nraddr; \
3770 VALGRIND_ALIGN_STACK \
3771 "ldr r4, [%1] \n\t" \
3772 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
3773 VALGRIND_RESTORE_STACK \
3776 : "0" (&_argvec[0]) \
3777 : "cc", "memory", __CALLER_SAVED_REGS, "r10" \
3779 lval = (__typeof__(lval)) _res; \
3782 #define CALL_FN_W_W(lval, orig, arg1) \
3784 volatile OrigFn _orig = (orig); \
3785 volatile unsigned long _argvec[2]; \
3786 volatile unsigned long _res; \
3787 _argvec[0] = (unsigned long)_orig.nraddr; \
3788 _argvec[1] = (unsigned long)(arg1); \
3790 VALGRIND_ALIGN_STACK \
3791 "ldr r0, [%1, #4] \n\t" \
3792 "ldr r4, [%1] \n\t" \
3793 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
3794 VALGRIND_RESTORE_STACK \
3797 : "0" (&_argvec[0]) \
3798 : "cc", "memory", __CALLER_SAVED_REGS, "r10" \
3800 lval = (__typeof__(lval)) _res; \
3803 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
3805 volatile OrigFn _orig = (orig); \
3806 volatile unsigned long _argvec[3]; \
3807 volatile unsigned long _res; \
3808 _argvec[0] = (unsigned long)_orig.nraddr; \
3809 _argvec[1] = (unsigned long)(arg1); \
3810 _argvec[2] = (unsigned long)(arg2); \
3812 VALGRIND_ALIGN_STACK \
3813 "ldr r0, [%1, #4] \n\t" \
3814 "ldr r1, [%1, #8] \n\t" \
3815 "ldr r4, [%1] \n\t" \
3816 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
3817 VALGRIND_RESTORE_STACK \
3820 : "0" (&_argvec[0]) \
3821 : "cc", "memory", __CALLER_SAVED_REGS, "r10" \
3823 lval = (__typeof__(lval)) _res; \
3826 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
3828 volatile OrigFn _orig = (orig); \
3829 volatile unsigned long _argvec[4]; \
3830 volatile unsigned long _res; \
3831 _argvec[0] = (unsigned long)_orig.nraddr; \
3832 _argvec[1] = (unsigned long)(arg1); \
3833 _argvec[2] = (unsigned long)(arg2); \
3834 _argvec[3] = (unsigned long)(arg3); \
3836 VALGRIND_ALIGN_STACK \
3837 "ldr r0, [%1, #4] \n\t" \
3838 "ldr r1, [%1, #8] \n\t" \
3839 "ldr r2, [%1, #12] \n\t" \
3840 "ldr r4, [%1] \n\t" \
3841 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
3842 VALGRIND_RESTORE_STACK \
3845 : "0" (&_argvec[0]) \
3846 : "cc", "memory", __CALLER_SAVED_REGS, "r10" \
3848 lval = (__typeof__(lval)) _res; \
3851 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
3853 volatile OrigFn _orig = (orig); \
3854 volatile unsigned long _argvec[5]; \
3855 volatile unsigned long _res; \
3856 _argvec[0] = (unsigned long)_orig.nraddr; \
3857 _argvec[1] = (unsigned long)(arg1); \
3858 _argvec[2] = (unsigned long)(arg2); \
3859 _argvec[3] = (unsigned long)(arg3); \
3860 _argvec[4] = (unsigned long)(arg4); \
3862 VALGRIND_ALIGN_STACK \
3863 "ldr r0, [%1, #4] \n\t" \
3864 "ldr r1, [%1, #8] \n\t" \
3865 "ldr r2, [%1, #12] \n\t" \
3866 "ldr r3, [%1, #16] \n\t" \
3867 "ldr r4, [%1] \n\t" \
3868 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
3869 VALGRIND_RESTORE_STACK \
3872 : "0" (&_argvec[0]) \
3873 : "cc", "memory", __CALLER_SAVED_REGS, "r10" \
3875 lval = (__typeof__(lval)) _res; \
3878 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
3880 volatile OrigFn _orig = (orig); \
3881 volatile unsigned long _argvec[6]; \
3882 volatile unsigned long _res; \
3883 _argvec[0] = (unsigned long)_orig.nraddr; \
3884 _argvec[1] = (unsigned long)(arg1); \
3885 _argvec[2] = (unsigned long)(arg2); \
3886 _argvec[3] = (unsigned long)(arg3); \
3887 _argvec[4] = (unsigned long)(arg4); \
3888 _argvec[5] = (unsigned long)(arg5); \
3890 VALGRIND_ALIGN_STACK \
3891 "sub sp, sp, #4 \n\t" \
3892 "ldr r0, [%1, #20] \n\t" \
3894 "ldr r0, [%1, #4] \n\t" \
3895 "ldr r1, [%1, #8] \n\t" \
3896 "ldr r2, [%1, #12] \n\t" \
3897 "ldr r3, [%1, #16] \n\t" \
3898 "ldr r4, [%1] \n\t" \
3899 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
3900 VALGRIND_RESTORE_STACK \
3903 : "0" (&_argvec[0]) \
3904 : "cc", "memory", __CALLER_SAVED_REGS, "r10" \
3906 lval = (__typeof__(lval)) _res; \
3909 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
3911 volatile OrigFn _orig = (orig); \
3912 volatile unsigned long _argvec[7]; \
3913 volatile unsigned long _res; \
3914 _argvec[0] = (unsigned long)_orig.nraddr; \
3915 _argvec[1] = (unsigned long)(arg1); \
3916 _argvec[2] = (unsigned long)(arg2); \
3917 _argvec[3] = (unsigned long)(arg3); \
3918 _argvec[4] = (unsigned long)(arg4); \
3919 _argvec[5] = (unsigned long)(arg5); \
3920 _argvec[6] = (unsigned long)(arg6); \
3922 VALGRIND_ALIGN_STACK \
3923 "ldr r0, [%1, #20] \n\t" \
3924 "ldr r1, [%1, #24] \n\t" \
3925 "push {r0, r1} \n\t" \
3926 "ldr r0, [%1, #4] \n\t" \
3927 "ldr r1, [%1, #8] \n\t" \
3928 "ldr r2, [%1, #12] \n\t" \
3929 "ldr r3, [%1, #16] \n\t" \
3930 "ldr r4, [%1] \n\t" \
3931 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
3932 VALGRIND_RESTORE_STACK \
3935 : "0" (&_argvec[0]) \
3936 : "cc", "memory", __CALLER_SAVED_REGS, "r10" \
3938 lval = (__typeof__(lval)) _res; \
3941 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3944 volatile OrigFn _orig = (orig); \
3945 volatile unsigned long _argvec[8]; \
3946 volatile unsigned long _res; \
3947 _argvec[0] = (unsigned long)_orig.nraddr; \
3948 _argvec[1] = (unsigned long)(arg1); \
3949 _argvec[2] = (unsigned long)(arg2); \
3950 _argvec[3] = (unsigned long)(arg3); \
3951 _argvec[4] = (unsigned long)(arg4); \
3952 _argvec[5] = (unsigned long)(arg5); \
3953 _argvec[6] = (unsigned long)(arg6); \
3954 _argvec[7] = (unsigned long)(arg7); \
3956 VALGRIND_ALIGN_STACK \
3957 "sub sp, sp, #4 \n\t" \
3958 "ldr r0, [%1, #20] \n\t" \
3959 "ldr r1, [%1, #24] \n\t" \
3960 "ldr r2, [%1, #28] \n\t" \
3961 "push {r0, r1, r2} \n\t" \
3962 "ldr r0, [%1, #4] \n\t" \
3963 "ldr r1, [%1, #8] \n\t" \
3964 "ldr r2, [%1, #12] \n\t" \
3965 "ldr r3, [%1, #16] \n\t" \
3966 "ldr r4, [%1] \n\t" \
3967 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
3968 VALGRIND_RESTORE_STACK \
3971 : "0" (&_argvec[0]) \
3972 : "cc", "memory", __CALLER_SAVED_REGS, "r10" \
3974 lval = (__typeof__(lval)) _res; \
3977 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
3980 volatile OrigFn _orig = (orig); \
3981 volatile unsigned long _argvec[9]; \
3982 volatile unsigned long _res; \
3983 _argvec[0] = (unsigned long)_orig.nraddr; \
3984 _argvec[1] = (unsigned long)(arg1); \
3985 _argvec[2] = (unsigned long)(arg2); \
3986 _argvec[3] = (unsigned long)(arg3); \
3987 _argvec[4] = (unsigned long)(arg4); \
3988 _argvec[5] = (unsigned long)(arg5); \
3989 _argvec[6] = (unsigned long)(arg6); \
3990 _argvec[7] = (unsigned long)(arg7); \
3991 _argvec[8] = (unsigned long)(arg8); \
3993 VALGRIND_ALIGN_STACK \
3994 "ldr r0, [%1, #20] \n\t" \
3995 "ldr r1, [%1, #24] \n\t" \
3996 "ldr r2, [%1, #28] \n\t" \
3997 "ldr r3, [%1, #32] \n\t" \
3998 "push {r0, r1, r2, r3} \n\t" \
3999 "ldr r0, [%1, #4] \n\t" \
4000 "ldr r1, [%1, #8] \n\t" \
4001 "ldr r2, [%1, #12] \n\t" \
4002 "ldr r3, [%1, #16] \n\t" \
4003 "ldr r4, [%1] \n\t" \
4004 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
4005 VALGRIND_RESTORE_STACK \
4008 : "0" (&_argvec[0]) \
4009 : "cc", "memory", __CALLER_SAVED_REGS, "r10" \
4011 lval = (__typeof__(lval)) _res; \
4014 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
4017 volatile OrigFn _orig = (orig); \
4018 volatile unsigned long _argvec[10]; \
4019 volatile unsigned long _res; \
4020 _argvec[0] = (unsigned long)_orig.nraddr; \
4021 _argvec[1] = (unsigned long)(arg1); \
4022 _argvec[2] = (unsigned long)(arg2); \
4023 _argvec[3] = (unsigned long)(arg3); \
4024 _argvec[4] = (unsigned long)(arg4); \
4025 _argvec[5] = (unsigned long)(arg5); \
4026 _argvec[6] = (unsigned long)(arg6); \
4027 _argvec[7] = (unsigned long)(arg7); \
4028 _argvec[8] = (unsigned long)(arg8); \
4029 _argvec[9] = (unsigned long)(arg9); \
4031 VALGRIND_ALIGN_STACK \
4032 "sub sp, sp, #4 \n\t" \
4033 "ldr r0, [%1, #20] \n\t" \
4034 "ldr r1, [%1, #24] \n\t" \
4035 "ldr r2, [%1, #28] \n\t" \
4036 "ldr r3, [%1, #32] \n\t" \
4037 "ldr r4, [%1, #36] \n\t" \
4038 "push {r0, r1, r2, r3, r4} \n\t" \
4039 "ldr r0, [%1, #4] \n\t" \
4040 "ldr r1, [%1, #8] \n\t" \
4041 "ldr r2, [%1, #12] \n\t" \
4042 "ldr r3, [%1, #16] \n\t" \
4043 "ldr r4, [%1] \n\t" \
4044 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
4045 VALGRIND_RESTORE_STACK \
4048 : "0" (&_argvec[0]) \
4049 : "cc", "memory", __CALLER_SAVED_REGS, "r10" \
4051 lval = (__typeof__(lval)) _res; \
4054 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
4055 arg7,arg8,arg9,arg10) \
4057 volatile OrigFn _orig = (orig); \
4058 volatile unsigned long _argvec[11]; \
4059 volatile unsigned long _res; \
4060 _argvec[0] = (unsigned long)_orig.nraddr; \
4061 _argvec[1] = (unsigned long)(arg1); \
4062 _argvec[2] = (unsigned long)(arg2); \
4063 _argvec[3] = (unsigned long)(arg3); \
4064 _argvec[4] = (unsigned long)(arg4); \
4065 _argvec[5] = (unsigned long)(arg5); \
4066 _argvec[6] = (unsigned long)(arg6); \
4067 _argvec[7] = (unsigned long)(arg7); \
4068 _argvec[8] = (unsigned long)(arg8); \
4069 _argvec[9] = (unsigned long)(arg9); \
4070 _argvec[10] = (unsigned long)(arg10); \
4072 VALGRIND_ALIGN_STACK \
4073 "ldr r0, [%1, #40] \n\t" \
4075 "ldr r0, [%1, #20] \n\t" \
4076 "ldr r1, [%1, #24] \n\t" \
4077 "ldr r2, [%1, #28] \n\t" \
4078 "ldr r3, [%1, #32] \n\t" \
4079 "ldr r4, [%1, #36] \n\t" \
4080 "push {r0, r1, r2, r3, r4} \n\t" \
4081 "ldr r0, [%1, #4] \n\t" \
4082 "ldr r1, [%1, #8] \n\t" \
4083 "ldr r2, [%1, #12] \n\t" \
4084 "ldr r3, [%1, #16] \n\t" \
4085 "ldr r4, [%1] \n\t" \
4086 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
4087 VALGRIND_RESTORE_STACK \
4090 : "0" (&_argvec[0]) \
4091 : "cc", "memory", __CALLER_SAVED_REGS, "r10" \
4093 lval = (__typeof__(lval)) _res; \
4096 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
4097 arg6,arg7,arg8,arg9,arg10, \
4100 volatile OrigFn _orig = (orig); \
4101 volatile unsigned long _argvec[12]; \
4102 volatile unsigned long _res; \
4103 _argvec[0] = (unsigned long)_orig.nraddr; \
4104 _argvec[1] = (unsigned long)(arg1); \
4105 _argvec[2] = (unsigned long)(arg2); \
4106 _argvec[3] = (unsigned long)(arg3); \
4107 _argvec[4] = (unsigned long)(arg4); \
4108 _argvec[5] = (unsigned long)(arg5); \
4109 _argvec[6] = (unsigned long)(arg6); \
4110 _argvec[7] = (unsigned long)(arg7); \
4111 _argvec[8] = (unsigned long)(arg8); \
4112 _argvec[9] = (unsigned long)(arg9); \
4113 _argvec[10] = (unsigned long)(arg10); \
4114 _argvec[11] = (unsigned long)(arg11); \
4116 VALGRIND_ALIGN_STACK \
4117 "sub sp, sp, #4 \n\t" \
4118 "ldr r0, [%1, #40] \n\t" \
4119 "ldr r1, [%1, #44] \n\t" \
4120 "push {r0, r1} \n\t" \
4121 "ldr r0, [%1, #20] \n\t" \
4122 "ldr r1, [%1, #24] \n\t" \
4123 "ldr r2, [%1, #28] \n\t" \
4124 "ldr r3, [%1, #32] \n\t" \
4125 "ldr r4, [%1, #36] \n\t" \
4126 "push {r0, r1, r2, r3, r4} \n\t" \
4127 "ldr r0, [%1, #4] \n\t" \
4128 "ldr r1, [%1, #8] \n\t" \
4129 "ldr r2, [%1, #12] \n\t" \
4130 "ldr r3, [%1, #16] \n\t" \
4131 "ldr r4, [%1] \n\t" \
4132 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
4133 VALGRIND_RESTORE_STACK \
4136 : "0" (&_argvec[0]) \
4137 : "cc", "memory", __CALLER_SAVED_REGS, "r10" \
4139 lval = (__typeof__(lval)) _res; \
4142 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
4143 arg6,arg7,arg8,arg9,arg10, \
4146 volatile OrigFn _orig = (orig); \
4147 volatile unsigned long _argvec[13]; \
4148 volatile unsigned long _res; \
4149 _argvec[0] = (unsigned long)_orig.nraddr; \
4150 _argvec[1] = (unsigned long)(arg1); \
4151 _argvec[2] = (unsigned long)(arg2); \
4152 _argvec[3] = (unsigned long)(arg3); \
4153 _argvec[4] = (unsigned long)(arg4); \
4154 _argvec[5] = (unsigned long)(arg5); \
4155 _argvec[6] = (unsigned long)(arg6); \
4156 _argvec[7] = (unsigned long)(arg7); \
4157 _argvec[8] = (unsigned long)(arg8); \
4158 _argvec[9] = (unsigned long)(arg9); \
4159 _argvec[10] = (unsigned long)(arg10); \
4160 _argvec[11] = (unsigned long)(arg11); \
4161 _argvec[12] = (unsigned long)(arg12); \
4163 VALGRIND_ALIGN_STACK \
4164 "ldr r0, [%1, #40] \n\t" \
4165 "ldr r1, [%1, #44] \n\t" \
4166 "ldr r2, [%1, #48] \n\t" \
4167 "push {r0, r1, r2} \n\t" \
4168 "ldr r0, [%1, #20] \n\t" \
4169 "ldr r1, [%1, #24] \n\t" \
4170 "ldr r2, [%1, #28] \n\t" \
4171 "ldr r3, [%1, #32] \n\t" \
4172 "ldr r4, [%1, #36] \n\t" \
4173 "push {r0, r1, r2, r3, r4} \n\t" \
4174 "ldr r0, [%1, #4] \n\t" \
4175 "ldr r1, [%1, #8] \n\t" \
4176 "ldr r2, [%1, #12] \n\t" \
4177 "ldr r3, [%1, #16] \n\t" \
4178 "ldr r4, [%1] \n\t" \
4179 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_R4 \
4180 VALGRIND_RESTORE_STACK \
4183 : "0" (&_argvec[0]) \
4184 : "cc", "memory", __CALLER_SAVED_REGS, "r10" \
4186 lval = (__typeof__(lval)) _res; \
4193 #if defined(PLAT_arm64_linux)
4196 #define __CALLER_SAVED_REGS \
4197 "x0", "x1", "x2", "x3","x4", "x5", "x6", "x7", "x8", "x9", \
4198 "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", \
4199 "x18", "x19", "x20", "x30", \
4200 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", \
4201 "v10", "v11", "v12", "v13", "v14", "v15", "v16", "v17", \
4202 "v18", "v19", "v20", "v21", "v22", "v23", "v24", "v25", \
4203 "v26", "v27", "v28", "v29", "v30", "v31"
4207 #define VALGRIND_ALIGN_STACK \
4209 "bic sp, x21, #15\n\t"
4210 #define VALGRIND_RESTORE_STACK \
4216 #define CALL_FN_W_v(lval, orig) \
4218 volatile OrigFn _orig = (orig); \
4219 volatile unsigned long _argvec[1]; \
4220 volatile unsigned long _res; \
4221 _argvec[0] = (unsigned long)_orig.nraddr; \
4223 VALGRIND_ALIGN_STACK \
4224 "ldr x8, [%1] \n\t" \
4225 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \
4226 VALGRIND_RESTORE_STACK \
4229 : "0" (&_argvec[0]) \
4230 : "cc", "memory", __CALLER_SAVED_REGS, "x21" \
4232 lval = (__typeof__(lval)) _res; \
4235 #define CALL_FN_W_W(lval, orig, arg1) \
4237 volatile OrigFn _orig = (orig); \
4238 volatile unsigned long _argvec[2]; \
4239 volatile unsigned long _res; \
4240 _argvec[0] = (unsigned long)_orig.nraddr; \
4241 _argvec[1] = (unsigned long)(arg1); \
4243 VALGRIND_ALIGN_STACK \
4244 "ldr x0, [%1, #8] \n\t" \
4245 "ldr x8, [%1] \n\t" \
4246 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \
4247 VALGRIND_RESTORE_STACK \
4250 : "0" (&_argvec[0]) \
4251 : "cc", "memory", __CALLER_SAVED_REGS, "x21" \
4253 lval = (__typeof__(lval)) _res; \
4256 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
4258 volatile OrigFn _orig = (orig); \
4259 volatile unsigned long _argvec[3]; \
4260 volatile unsigned long _res; \
4261 _argvec[0] = (unsigned long)_orig.nraddr; \
4262 _argvec[1] = (unsigned long)(arg1); \
4263 _argvec[2] = (unsigned long)(arg2); \
4265 VALGRIND_ALIGN_STACK \
4266 "ldr x0, [%1, #8] \n\t" \
4267 "ldr x1, [%1, #16] \n\t" \
4268 "ldr x8, [%1] \n\t" \
4269 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \
4270 VALGRIND_RESTORE_STACK \
4273 : "0" (&_argvec[0]) \
4274 : "cc", "memory", __CALLER_SAVED_REGS, "x21" \
4276 lval = (__typeof__(lval)) _res; \
4279 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
4281 volatile OrigFn _orig = (orig); \
4282 volatile unsigned long _argvec[4]; \
4283 volatile unsigned long _res; \
4284 _argvec[0] = (unsigned long)_orig.nraddr; \
4285 _argvec[1] = (unsigned long)(arg1); \
4286 _argvec[2] = (unsigned long)(arg2); \
4287 _argvec[3] = (unsigned long)(arg3); \
4289 VALGRIND_ALIGN_STACK \
4290 "ldr x0, [%1, #8] \n\t" \
4291 "ldr x1, [%1, #16] \n\t" \
4292 "ldr x2, [%1, #24] \n\t" \
4293 "ldr x8, [%1] \n\t" \
4294 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \
4295 VALGRIND_RESTORE_STACK \
4298 : "0" (&_argvec[0]) \
4299 : "cc", "memory", __CALLER_SAVED_REGS, "x21" \
4301 lval = (__typeof__(lval)) _res; \
4304 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
4306 volatile OrigFn _orig = (orig); \
4307 volatile unsigned long _argvec[5]; \
4308 volatile unsigned long _res; \
4309 _argvec[0] = (unsigned long)_orig.nraddr; \
4310 _argvec[1] = (unsigned long)(arg1); \
4311 _argvec[2] = (unsigned long)(arg2); \
4312 _argvec[3] = (unsigned long)(arg3); \
4313 _argvec[4] = (unsigned long)(arg4); \
4315 VALGRIND_ALIGN_STACK \
4316 "ldr x0, [%1, #8] \n\t" \
4317 "ldr x1, [%1, #16] \n\t" \
4318 "ldr x2, [%1, #24] \n\t" \
4319 "ldr x3, [%1, #32] \n\t" \
4320 "ldr x8, [%1] \n\t" \
4321 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \
4322 VALGRIND_RESTORE_STACK \
4325 : "0" (&_argvec[0]) \
4326 : "cc", "memory", __CALLER_SAVED_REGS, "x21" \
4328 lval = (__typeof__(lval)) _res; \
4331 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
4333 volatile OrigFn _orig = (orig); \
4334 volatile unsigned long _argvec[6]; \
4335 volatile unsigned long _res; \
4336 _argvec[0] = (unsigned long)_orig.nraddr; \
4337 _argvec[1] = (unsigned long)(arg1); \
4338 _argvec[2] = (unsigned long)(arg2); \
4339 _argvec[3] = (unsigned long)(arg3); \
4340 _argvec[4] = (unsigned long)(arg4); \
4341 _argvec[5] = (unsigned long)(arg5); \
4343 VALGRIND_ALIGN_STACK \
4344 "ldr x0, [%1, #8] \n\t" \
4345 "ldr x1, [%1, #16] \n\t" \
4346 "ldr x2, [%1, #24] \n\t" \
4347 "ldr x3, [%1, #32] \n\t" \
4348 "ldr x4, [%1, #40] \n\t" \
4349 "ldr x8, [%1] \n\t" \
4350 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \
4351 VALGRIND_RESTORE_STACK \
4354 : "0" (&_argvec[0]) \
4355 : "cc", "memory", __CALLER_SAVED_REGS, "x21" \
4357 lval = (__typeof__(lval)) _res; \
4360 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
4362 volatile OrigFn _orig = (orig); \
4363 volatile unsigned long _argvec[7]; \
4364 volatile unsigned long _res; \
4365 _argvec[0] = (unsigned long)_orig.nraddr; \
4366 _argvec[1] = (unsigned long)(arg1); \
4367 _argvec[2] = (unsigned long)(arg2); \
4368 _argvec[3] = (unsigned long)(arg3); \
4369 _argvec[4] = (unsigned long)(arg4); \
4370 _argvec[5] = (unsigned long)(arg5); \
4371 _argvec[6] = (unsigned long)(arg6); \
4373 VALGRIND_ALIGN_STACK \
4374 "ldr x0, [%1, #8] \n\t" \
4375 "ldr x1, [%1, #16] \n\t" \
4376 "ldr x2, [%1, #24] \n\t" \
4377 "ldr x3, [%1, #32] \n\t" \
4378 "ldr x4, [%1, #40] \n\t" \
4379 "ldr x5, [%1, #48] \n\t" \
4380 "ldr x8, [%1] \n\t" \
4381 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \
4382 VALGRIND_RESTORE_STACK \
4385 : "0" (&_argvec[0]) \
4386 : "cc", "memory", __CALLER_SAVED_REGS, "x21" \
4388 lval = (__typeof__(lval)) _res; \
4391 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
4394 volatile OrigFn _orig = (orig); \
4395 volatile unsigned long _argvec[8]; \
4396 volatile unsigned long _res; \
4397 _argvec[0] = (unsigned long)_orig.nraddr; \
4398 _argvec[1] = (unsigned long)(arg1); \
4399 _argvec[2] = (unsigned long)(arg2); \
4400 _argvec[3] = (unsigned long)(arg3); \
4401 _argvec[4] = (unsigned long)(arg4); \
4402 _argvec[5] = (unsigned long)(arg5); \
4403 _argvec[6] = (unsigned long)(arg6); \
4404 _argvec[7] = (unsigned long)(arg7); \
4406 VALGRIND_ALIGN_STACK \
4407 "ldr x0, [%1, #8] \n\t" \
4408 "ldr x1, [%1, #16] \n\t" \
4409 "ldr x2, [%1, #24] \n\t" \
4410 "ldr x3, [%1, #32] \n\t" \
4411 "ldr x4, [%1, #40] \n\t" \
4412 "ldr x5, [%1, #48] \n\t" \
4413 "ldr x6, [%1, #56] \n\t" \
4414 "ldr x8, [%1] \n\t" \
4415 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \
4416 VALGRIND_RESTORE_STACK \
4419 : "0" (&_argvec[0]) \
4420 : "cc", "memory", __CALLER_SAVED_REGS, "x21" \
4422 lval = (__typeof__(lval)) _res; \
4425 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
4428 volatile OrigFn _orig = (orig); \
4429 volatile unsigned long _argvec[9]; \
4430 volatile unsigned long _res; \
4431 _argvec[0] = (unsigned long)_orig.nraddr; \
4432 _argvec[1] = (unsigned long)(arg1); \
4433 _argvec[2] = (unsigned long)(arg2); \
4434 _argvec[3] = (unsigned long)(arg3); \
4435 _argvec[4] = (unsigned long)(arg4); \
4436 _argvec[5] = (unsigned long)(arg5); \
4437 _argvec[6] = (unsigned long)(arg6); \
4438 _argvec[7] = (unsigned long)(arg7); \
4439 _argvec[8] = (unsigned long)(arg8); \
4441 VALGRIND_ALIGN_STACK \
4442 "ldr x0, [%1, #8] \n\t" \
4443 "ldr x1, [%1, #16] \n\t" \
4444 "ldr x2, [%1, #24] \n\t" \
4445 "ldr x3, [%1, #32] \n\t" \
4446 "ldr x4, [%1, #40] \n\t" \
4447 "ldr x5, [%1, #48] \n\t" \
4448 "ldr x6, [%1, #56] \n\t" \
4449 "ldr x7, [%1, #64] \n\t" \
4450 "ldr x8, [%1] \n\t" \
4451 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \
4452 VALGRIND_RESTORE_STACK \
4455 : "0" (&_argvec[0]) \
4456 : "cc", "memory", __CALLER_SAVED_REGS, "x21" \
4458 lval = (__typeof__(lval)) _res; \
4461 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
4464 volatile OrigFn _orig = (orig); \
4465 volatile unsigned long _argvec[10]; \
4466 volatile unsigned long _res; \
4467 _argvec[0] = (unsigned long)_orig.nraddr; \
4468 _argvec[1] = (unsigned long)(arg1); \
4469 _argvec[2] = (unsigned long)(arg2); \
4470 _argvec[3] = (unsigned long)(arg3); \
4471 _argvec[4] = (unsigned long)(arg4); \
4472 _argvec[5] = (unsigned long)(arg5); \
4473 _argvec[6] = (unsigned long)(arg6); \
4474 _argvec[7] = (unsigned long)(arg7); \
4475 _argvec[8] = (unsigned long)(arg8); \
4476 _argvec[9] = (unsigned long)(arg9); \
4478 VALGRIND_ALIGN_STACK \
4479 "sub sp, sp, #0x20 \n\t" \
4480 "ldr x0, [%1, #8] \n\t" \
4481 "ldr x1, [%1, #16] \n\t" \
4482 "ldr x2, [%1, #24] \n\t" \
4483 "ldr x3, [%1, #32] \n\t" \
4484 "ldr x4, [%1, #40] \n\t" \
4485 "ldr x5, [%1, #48] \n\t" \
4486 "ldr x6, [%1, #56] \n\t" \
4487 "ldr x7, [%1, #64] \n\t" \
4488 "ldr x8, [%1, #72] \n\t" \
4489 "str x8, [sp, #0] \n\t" \
4490 "ldr x8, [%1] \n\t" \
4491 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \
4492 VALGRIND_RESTORE_STACK \
4495 : "0" (&_argvec[0]) \
4496 : "cc", "memory", __CALLER_SAVED_REGS, "x21" \
4498 lval = (__typeof__(lval)) _res; \
4501 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
4502 arg7,arg8,arg9,arg10) \
4504 volatile OrigFn _orig = (orig); \
4505 volatile unsigned long _argvec[11]; \
4506 volatile unsigned long _res; \
4507 _argvec[0] = (unsigned long)_orig.nraddr; \
4508 _argvec[1] = (unsigned long)(arg1); \
4509 _argvec[2] = (unsigned long)(arg2); \
4510 _argvec[3] = (unsigned long)(arg3); \
4511 _argvec[4] = (unsigned long)(arg4); \
4512 _argvec[5] = (unsigned long)(arg5); \
4513 _argvec[6] = (unsigned long)(arg6); \
4514 _argvec[7] = (unsigned long)(arg7); \
4515 _argvec[8] = (unsigned long)(arg8); \
4516 _argvec[9] = (unsigned long)(arg9); \
4517 _argvec[10] = (unsigned long)(arg10); \
4519 VALGRIND_ALIGN_STACK \
4520 "sub sp, sp, #0x20 \n\t" \
4521 "ldr x0, [%1, #8] \n\t" \
4522 "ldr x1, [%1, #16] \n\t" \
4523 "ldr x2, [%1, #24] \n\t" \
4524 "ldr x3, [%1, #32] \n\t" \
4525 "ldr x4, [%1, #40] \n\t" \
4526 "ldr x5, [%1, #48] \n\t" \
4527 "ldr x6, [%1, #56] \n\t" \
4528 "ldr x7, [%1, #64] \n\t" \
4529 "ldr x8, [%1, #72] \n\t" \
4530 "str x8, [sp, #0] \n\t" \
4531 "ldr x8, [%1, #80] \n\t" \
4532 "str x8, [sp, #8] \n\t" \
4533 "ldr x8, [%1] \n\t" \
4534 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \
4535 VALGRIND_RESTORE_STACK \
4538 : "0" (&_argvec[0]) \
4539 : "cc", "memory", __CALLER_SAVED_REGS, "x21" \
4541 lval = (__typeof__(lval)) _res; \
4544 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
4545 arg7,arg8,arg9,arg10,arg11) \
4547 volatile OrigFn _orig = (orig); \
4548 volatile unsigned long _argvec[12]; \
4549 volatile unsigned long _res; \
4550 _argvec[0] = (unsigned long)_orig.nraddr; \
4551 _argvec[1] = (unsigned long)(arg1); \
4552 _argvec[2] = (unsigned long)(arg2); \
4553 _argvec[3] = (unsigned long)(arg3); \
4554 _argvec[4] = (unsigned long)(arg4); \
4555 _argvec[5] = (unsigned long)(arg5); \
4556 _argvec[6] = (unsigned long)(arg6); \
4557 _argvec[7] = (unsigned long)(arg7); \
4558 _argvec[8] = (unsigned long)(arg8); \
4559 _argvec[9] = (unsigned long)(arg9); \
4560 _argvec[10] = (unsigned long)(arg10); \
4561 _argvec[11] = (unsigned long)(arg11); \
4563 VALGRIND_ALIGN_STACK \
4564 "sub sp, sp, #0x30 \n\t" \
4565 "ldr x0, [%1, #8] \n\t" \
4566 "ldr x1, [%1, #16] \n\t" \
4567 "ldr x2, [%1, #24] \n\t" \
4568 "ldr x3, [%1, #32] \n\t" \
4569 "ldr x4, [%1, #40] \n\t" \
4570 "ldr x5, [%1, #48] \n\t" \
4571 "ldr x6, [%1, #56] \n\t" \
4572 "ldr x7, [%1, #64] \n\t" \
4573 "ldr x8, [%1, #72] \n\t" \
4574 "str x8, [sp, #0] \n\t" \
4575 "ldr x8, [%1, #80] \n\t" \
4576 "str x8, [sp, #8] \n\t" \
4577 "ldr x8, [%1, #88] \n\t" \
4578 "str x8, [sp, #16] \n\t" \
4579 "ldr x8, [%1] \n\t" \
4580 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \
4581 VALGRIND_RESTORE_STACK \
4584 : "0" (&_argvec[0]) \
4585 : "cc", "memory", __CALLER_SAVED_REGS, "x21" \
4587 lval = (__typeof__(lval)) _res; \
4590 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
4591 arg7,arg8,arg9,arg10,arg11, \
4594 volatile OrigFn _orig = (orig); \
4595 volatile unsigned long _argvec[13]; \
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); \
4602 _argvec[5] = (unsigned long)(arg5); \
4603 _argvec[6] = (unsigned long)(arg6); \
4604 _argvec[7] = (unsigned long)(arg7); \
4605 _argvec[8] = (unsigned long)(arg8); \
4606 _argvec[9] = (unsigned long)(arg9); \
4607 _argvec[10] = (unsigned long)(arg10); \
4608 _argvec[11] = (unsigned long)(arg11); \
4609 _argvec[12] = (unsigned long)(arg12); \
4611 VALGRIND_ALIGN_STACK \
4612 "sub sp, sp, #0x30 \n\t" \
4613 "ldr x0, [%1, #8] \n\t" \
4614 "ldr x1, [%1, #16] \n\t" \
4615 "ldr x2, [%1, #24] \n\t" \
4616 "ldr x3, [%1, #32] \n\t" \
4617 "ldr x4, [%1, #40] \n\t" \
4618 "ldr x5, [%1, #48] \n\t" \
4619 "ldr x6, [%1, #56] \n\t" \
4620 "ldr x7, [%1, #64] \n\t" \
4621 "ldr x8, [%1, #72] \n\t" \
4622 "str x8, [sp, #0] \n\t" \
4623 "ldr x8, [%1, #80] \n\t" \
4624 "str x8, [sp, #8] \n\t" \
4625 "ldr x8, [%1, #88] \n\t" \
4626 "str x8, [sp, #16] \n\t" \
4627 "ldr x8, [%1, #96] \n\t" \
4628 "str x8, [sp, #24] \n\t" \
4629 "ldr x8, [%1] \n\t" \
4630 VALGRIND_BRANCH_AND_LINK_TO_NOREDIR_X8 \
4631 VALGRIND_RESTORE_STACK \
4634 : "0" (&_argvec[0]) \
4635 : "cc", "memory", __CALLER_SAVED_REGS, "x21" \
4637 lval = (__typeof__(lval)) _res; \
4644 #if defined(PLAT_s390x_linux)
4650 #if defined(__GNUC__) && defined(__GCC_HAVE_DWARF2_CFI_ASM)
4651 # define __FRAME_POINTER \
4652 ,"d"(__builtin_dwarf_cfa())
4653 # define VALGRIND_CFI_PROLOGUE \
4654 ".cfi_remember_state\n\t" \
4658 ".cfi_def_cfa r11, 0\n\t"
4659 # define VALGRIND_CFI_EPILOGUE \
4661 ".cfi_restore_state\n\t"
4663 # define __FRAME_POINTER
4664 # define VALGRIND_CFI_PROLOGUE \
4666 # define VALGRIND_CFI_EPILOGUE
4678 #define __CALLER_SAVED_REGS "0","1","2","3","4","5","14", \
4679 "f0","f1","f2","f3","f4","f5","f6","f7"
4690 #define CALL_FN_W_v(lval, orig) \
4692 volatile OrigFn _orig = (orig); \
4693 volatile unsigned long _argvec[1]; \
4694 volatile unsigned long _res; \
4695 _argvec[0] = (unsigned long)_orig.nraddr; \
4697 VALGRIND_CFI_PROLOGUE \
4698 "aghi 15,-160\n\t" \
4700 VALGRIND_CALL_NOREDIR_R1 \
4703 VALGRIND_CFI_EPILOGUE \
4705 : "d" (&_argvec[0]) __FRAME_POINTER \
4706 : "cc", "memory", __CALLER_SAVED_REGS,"7" \
4708 lval = (__typeof__(lval)) _res; \
4712 #define CALL_FN_W_W(lval, orig, arg1) \
4714 volatile OrigFn _orig = (orig); \
4715 volatile unsigned long _argvec[2]; \
4716 volatile unsigned long _res; \
4717 _argvec[0] = (unsigned long)_orig.nraddr; \
4718 _argvec[1] = (unsigned long)arg1; \
4720 VALGRIND_CFI_PROLOGUE \
4721 "aghi 15,-160\n\t" \
4724 VALGRIND_CALL_NOREDIR_R1 \
4727 VALGRIND_CFI_EPILOGUE \
4729 : "a" (&_argvec[0]) __FRAME_POINTER \
4730 : "cc", "memory", __CALLER_SAVED_REGS,"7" \
4732 lval = (__typeof__(lval)) _res; \
4735 #define CALL_FN_W_WW(lval, orig, arg1, arg2) \
4737 volatile OrigFn _orig = (orig); \
4738 volatile unsigned long _argvec[3]; \
4739 volatile unsigned long _res; \
4740 _argvec[0] = (unsigned long)_orig.nraddr; \
4741 _argvec[1] = (unsigned long)arg1; \
4742 _argvec[2] = (unsigned long)arg2; \
4744 VALGRIND_CFI_PROLOGUE \
4745 "aghi 15,-160\n\t" \
4749 VALGRIND_CALL_NOREDIR_R1 \
4752 VALGRIND_CFI_EPILOGUE \
4754 : "a" (&_argvec[0]) __FRAME_POINTER \
4755 : "cc", "memory", __CALLER_SAVED_REGS,"7" \
4757 lval = (__typeof__(lval)) _res; \
4760 #define CALL_FN_W_WWW(lval, orig, arg1, arg2, arg3) \
4762 volatile OrigFn _orig = (orig); \
4763 volatile unsigned long _argvec[4]; \
4764 volatile unsigned long _res; \
4765 _argvec[0] = (unsigned long)_orig.nraddr; \
4766 _argvec[1] = (unsigned long)arg1; \
4767 _argvec[2] = (unsigned long)arg2; \
4768 _argvec[3] = (unsigned long)arg3; \
4770 VALGRIND_CFI_PROLOGUE \
4771 "aghi 15,-160\n\t" \
4776 VALGRIND_CALL_NOREDIR_R1 \
4779 VALGRIND_CFI_EPILOGUE \
4781 : "a" (&_argvec[0]) __FRAME_POINTER \
4782 : "cc", "memory", __CALLER_SAVED_REGS,"7" \
4784 lval = (__typeof__(lval)) _res; \
4787 #define CALL_FN_W_WWWW(lval, orig, arg1, arg2, arg3, arg4) \
4789 volatile OrigFn _orig = (orig); \
4790 volatile unsigned long _argvec[5]; \
4791 volatile unsigned long _res; \
4792 _argvec[0] = (unsigned long)_orig.nraddr; \
4793 _argvec[1] = (unsigned long)arg1; \
4794 _argvec[2] = (unsigned long)arg2; \
4795 _argvec[3] = (unsigned long)arg3; \
4796 _argvec[4] = (unsigned long)arg4; \
4798 VALGRIND_CFI_PROLOGUE \
4799 "aghi 15,-160\n\t" \
4805 VALGRIND_CALL_NOREDIR_R1 \
4808 VALGRIND_CFI_EPILOGUE \
4810 : "a" (&_argvec[0]) __FRAME_POINTER \
4811 : "cc", "memory", __CALLER_SAVED_REGS,"7" \
4813 lval = (__typeof__(lval)) _res; \
4816 #define CALL_FN_W_5W(lval, orig, arg1, arg2, arg3, arg4, arg5) \
4818 volatile OrigFn _orig = (orig); \
4819 volatile unsigned long _argvec[6]; \
4820 volatile unsigned long _res; \
4821 _argvec[0] = (unsigned long)_orig.nraddr; \
4822 _argvec[1] = (unsigned long)arg1; \
4823 _argvec[2] = (unsigned long)arg2; \
4824 _argvec[3] = (unsigned long)arg3; \
4825 _argvec[4] = (unsigned long)arg4; \
4826 _argvec[5] = (unsigned long)arg5; \
4828 VALGRIND_CFI_PROLOGUE \
4829 "aghi 15,-160\n\t" \
4836 VALGRIND_CALL_NOREDIR_R1 \
4839 VALGRIND_CFI_EPILOGUE \
4841 : "a" (&_argvec[0]) __FRAME_POINTER \
4842 : "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
4844 lval = (__typeof__(lval)) _res; \
4847 #define CALL_FN_W_6W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
4850 volatile OrigFn _orig = (orig); \
4851 volatile unsigned long _argvec[7]; \
4852 volatile unsigned long _res; \
4853 _argvec[0] = (unsigned long)_orig.nraddr; \
4854 _argvec[1] = (unsigned long)arg1; \
4855 _argvec[2] = (unsigned long)arg2; \
4856 _argvec[3] = (unsigned long)arg3; \
4857 _argvec[4] = (unsigned long)arg4; \
4858 _argvec[5] = (unsigned long)arg5; \
4859 _argvec[6] = (unsigned long)arg6; \
4861 VALGRIND_CFI_PROLOGUE \
4862 "aghi 15,-168\n\t" \
4868 "mvc 160(8,15), 48(1)\n\t" \
4870 VALGRIND_CALL_NOREDIR_R1 \
4873 VALGRIND_CFI_EPILOGUE \
4875 : "a" (&_argvec[0]) __FRAME_POINTER \
4876 : "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
4878 lval = (__typeof__(lval)) _res; \
4881 #define CALL_FN_W_7W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
4884 volatile OrigFn _orig = (orig); \
4885 volatile unsigned long _argvec[8]; \
4886 volatile unsigned long _res; \
4887 _argvec[0] = (unsigned long)_orig.nraddr; \
4888 _argvec[1] = (unsigned long)arg1; \
4889 _argvec[2] = (unsigned long)arg2; \
4890 _argvec[3] = (unsigned long)arg3; \
4891 _argvec[4] = (unsigned long)arg4; \
4892 _argvec[5] = (unsigned long)arg5; \
4893 _argvec[6] = (unsigned long)arg6; \
4894 _argvec[7] = (unsigned long)arg7; \
4896 VALGRIND_CFI_PROLOGUE \
4897 "aghi 15,-176\n\t" \
4903 "mvc 160(8,15), 48(1)\n\t" \
4904 "mvc 168(8,15), 56(1)\n\t" \
4906 VALGRIND_CALL_NOREDIR_R1 \
4909 VALGRIND_CFI_EPILOGUE \
4911 : "a" (&_argvec[0]) __FRAME_POINTER \
4912 : "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
4914 lval = (__typeof__(lval)) _res; \
4917 #define CALL_FN_W_8W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
4920 volatile OrigFn _orig = (orig); \
4921 volatile unsigned long _argvec[9]; \
4922 volatile unsigned long _res; \
4923 _argvec[0] = (unsigned long)_orig.nraddr; \
4924 _argvec[1] = (unsigned long)arg1; \
4925 _argvec[2] = (unsigned long)arg2; \
4926 _argvec[3] = (unsigned long)arg3; \
4927 _argvec[4] = (unsigned long)arg4; \
4928 _argvec[5] = (unsigned long)arg5; \
4929 _argvec[6] = (unsigned long)arg6; \
4930 _argvec[7] = (unsigned long)arg7; \
4931 _argvec[8] = (unsigned long)arg8; \
4933 VALGRIND_CFI_PROLOGUE \
4934 "aghi 15,-184\n\t" \
4940 "mvc 160(8,15), 48(1)\n\t" \
4941 "mvc 168(8,15), 56(1)\n\t" \
4942 "mvc 176(8,15), 64(1)\n\t" \
4944 VALGRIND_CALL_NOREDIR_R1 \
4947 VALGRIND_CFI_EPILOGUE \
4949 : "a" (&_argvec[0]) __FRAME_POINTER \
4950 : "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
4952 lval = (__typeof__(lval)) _res; \
4955 #define CALL_FN_W_9W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
4956 arg6, arg7 ,arg8, arg9) \
4958 volatile OrigFn _orig = (orig); \
4959 volatile unsigned long _argvec[10]; \
4960 volatile unsigned long _res; \
4961 _argvec[0] = (unsigned long)_orig.nraddr; \
4962 _argvec[1] = (unsigned long)arg1; \
4963 _argvec[2] = (unsigned long)arg2; \
4964 _argvec[3] = (unsigned long)arg3; \
4965 _argvec[4] = (unsigned long)arg4; \
4966 _argvec[5] = (unsigned long)arg5; \
4967 _argvec[6] = (unsigned long)arg6; \
4968 _argvec[7] = (unsigned long)arg7; \
4969 _argvec[8] = (unsigned long)arg8; \
4970 _argvec[9] = (unsigned long)arg9; \
4972 VALGRIND_CFI_PROLOGUE \
4973 "aghi 15,-192\n\t" \
4979 "mvc 160(8,15), 48(1)\n\t" \
4980 "mvc 168(8,15), 56(1)\n\t" \
4981 "mvc 176(8,15), 64(1)\n\t" \
4982 "mvc 184(8,15), 72(1)\n\t" \
4984 VALGRIND_CALL_NOREDIR_R1 \
4987 VALGRIND_CFI_EPILOGUE \
4989 : "a" (&_argvec[0]) __FRAME_POINTER \
4990 : "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
4992 lval = (__typeof__(lval)) _res; \
4995 #define CALL_FN_W_10W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
4996 arg6, arg7 ,arg8, arg9, arg10) \
4998 volatile OrigFn _orig = (orig); \
4999 volatile unsigned long _argvec[11]; \
5000 volatile unsigned long _res; \
5001 _argvec[0] = (unsigned long)_orig.nraddr; \
5002 _argvec[1] = (unsigned long)arg1; \
5003 _argvec[2] = (unsigned long)arg2; \
5004 _argvec[3] = (unsigned long)arg3; \
5005 _argvec[4] = (unsigned long)arg4; \
5006 _argvec[5] = (unsigned long)arg5; \
5007 _argvec[6] = (unsigned long)arg6; \
5008 _argvec[7] = (unsigned long)arg7; \
5009 _argvec[8] = (unsigned long)arg8; \
5010 _argvec[9] = (unsigned long)arg9; \
5011 _argvec[10] = (unsigned long)arg10; \
5013 VALGRIND_CFI_PROLOGUE \
5014 "aghi 15,-200\n\t" \
5020 "mvc 160(8,15), 48(1)\n\t" \
5021 "mvc 168(8,15), 56(1)\n\t" \
5022 "mvc 176(8,15), 64(1)\n\t" \
5023 "mvc 184(8,15), 72(1)\n\t" \
5024 "mvc 192(8,15), 80(1)\n\t" \
5026 VALGRIND_CALL_NOREDIR_R1 \
5029 VALGRIND_CFI_EPILOGUE \
5031 : "a" (&_argvec[0]) __FRAME_POINTER \
5032 : "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
5034 lval = (__typeof__(lval)) _res; \
5037 #define CALL_FN_W_11W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
5038 arg6, arg7 ,arg8, arg9, arg10, arg11) \
5040 volatile OrigFn _orig = (orig); \
5041 volatile unsigned long _argvec[12]; \
5042 volatile unsigned long _res; \
5043 _argvec[0] = (unsigned long)_orig.nraddr; \
5044 _argvec[1] = (unsigned long)arg1; \
5045 _argvec[2] = (unsigned long)arg2; \
5046 _argvec[3] = (unsigned long)arg3; \
5047 _argvec[4] = (unsigned long)arg4; \
5048 _argvec[5] = (unsigned long)arg5; \
5049 _argvec[6] = (unsigned long)arg6; \
5050 _argvec[7] = (unsigned long)arg7; \
5051 _argvec[8] = (unsigned long)arg8; \
5052 _argvec[9] = (unsigned long)arg9; \
5053 _argvec[10] = (unsigned long)arg10; \
5054 _argvec[11] = (unsigned long)arg11; \
5056 VALGRIND_CFI_PROLOGUE \
5057 "aghi 15,-208\n\t" \
5063 "mvc 160(8,15), 48(1)\n\t" \
5064 "mvc 168(8,15), 56(1)\n\t" \
5065 "mvc 176(8,15), 64(1)\n\t" \
5066 "mvc 184(8,15), 72(1)\n\t" \
5067 "mvc 192(8,15), 80(1)\n\t" \
5068 "mvc 200(8,15), 88(1)\n\t" \
5070 VALGRIND_CALL_NOREDIR_R1 \
5073 VALGRIND_CFI_EPILOGUE \
5075 : "a" (&_argvec[0]) __FRAME_POINTER \
5076 : "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
5078 lval = (__typeof__(lval)) _res; \
5081 #define CALL_FN_W_12W(lval, orig, arg1, arg2, arg3, arg4, arg5, \
5082 arg6, arg7 ,arg8, arg9, arg10, arg11, arg12)\
5084 volatile OrigFn _orig = (orig); \
5085 volatile unsigned long _argvec[13]; \
5086 volatile unsigned long _res; \
5087 _argvec[0] = (unsigned long)_orig.nraddr; \
5088 _argvec[1] = (unsigned long)arg1; \
5089 _argvec[2] = (unsigned long)arg2; \
5090 _argvec[3] = (unsigned long)arg3; \
5091 _argvec[4] = (unsigned long)arg4; \
5092 _argvec[5] = (unsigned long)arg5; \
5093 _argvec[6] = (unsigned long)arg6; \
5094 _argvec[7] = (unsigned long)arg7; \
5095 _argvec[8] = (unsigned long)arg8; \
5096 _argvec[9] = (unsigned long)arg9; \
5097 _argvec[10] = (unsigned long)arg10; \
5098 _argvec[11] = (unsigned long)arg11; \
5099 _argvec[12] = (unsigned long)arg12; \
5101 VALGRIND_CFI_PROLOGUE \
5102 "aghi 15,-216\n\t" \
5108 "mvc 160(8,15), 48(1)\n\t" \
5109 "mvc 168(8,15), 56(1)\n\t" \
5110 "mvc 176(8,15), 64(1)\n\t" \
5111 "mvc 184(8,15), 72(1)\n\t" \
5112 "mvc 192(8,15), 80(1)\n\t" \
5113 "mvc 200(8,15), 88(1)\n\t" \
5114 "mvc 208(8,15), 96(1)\n\t" \
5116 VALGRIND_CALL_NOREDIR_R1 \
5119 VALGRIND_CFI_EPILOGUE \
5121 : "a" (&_argvec[0]) __FRAME_POINTER \
5122 : "cc", "memory", __CALLER_SAVED_REGS,"6","7" \
5124 lval = (__typeof__(lval)) _res; \
5132 #if defined(PLAT_mips32_linux)
5135 #define __CALLER_SAVED_REGS "$2", "$3", "$4", "$5", "$6", \
5136 "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \
5142 #define CALL_FN_W_v(lval, orig) \
5144 volatile OrigFn _orig = (orig); \
5145 volatile unsigned long _argvec[1]; \
5146 volatile unsigned long _res; \
5147 _argvec[0] = (unsigned long)_orig.nraddr; \
5149 "subu $29, $29, 8 \n\t" \
5150 "sw $28, 0($29) \n\t" \
5151 "sw $31, 4($29) \n\t" \
5152 "subu $29, $29, 16 \n\t" \
5153 "lw $25, 0(%1) \n\t" \
5154 VALGRIND_CALL_NOREDIR_T9 \
5155 "addu $29, $29, 16\n\t" \
5156 "lw $28, 0($29) \n\t" \
5157 "lw $31, 4($29) \n\t" \
5158 "addu $29, $29, 8 \n\t" \
5161 : "0" (&_argvec[0]) \
5162 : "memory", __CALLER_SAVED_REGS \
5164 lval = (__typeof__(lval)) _res; \
5167 #define CALL_FN_W_W(lval, orig, arg1) \
5169 volatile OrigFn _orig = (orig); \
5170 volatile unsigned long _argvec[2]; \
5171 volatile unsigned long _res; \
5172 _argvec[0] = (unsigned long)_orig.nraddr; \
5173 _argvec[1] = (unsigned long)(arg1); \
5175 "subu $29, $29, 8 \n\t" \
5176 "sw $28, 0($29) \n\t" \
5177 "sw $31, 4($29) \n\t" \
5178 "subu $29, $29, 16 \n\t" \
5179 "lw $4, 4(%1) \n\t" \
5180 "lw $25, 0(%1) \n\t" \
5181 VALGRIND_CALL_NOREDIR_T9 \
5182 "addu $29, $29, 16 \n\t" \
5183 "lw $28, 0($29) \n\t" \
5184 "lw $31, 4($29) \n\t" \
5185 "addu $29, $29, 8 \n\t" \
5188 : "0" (&_argvec[0]) \
5189 : "memory", __CALLER_SAVED_REGS \
5191 lval = (__typeof__(lval)) _res; \
5194 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
5196 volatile OrigFn _orig = (orig); \
5197 volatile unsigned long _argvec[3]; \
5198 volatile unsigned long _res; \
5199 _argvec[0] = (unsigned long)_orig.nraddr; \
5200 _argvec[1] = (unsigned long)(arg1); \
5201 _argvec[2] = (unsigned long)(arg2); \
5203 "subu $29, $29, 8 \n\t" \
5204 "sw $28, 0($29) \n\t" \
5205 "sw $31, 4($29) \n\t" \
5206 "subu $29, $29, 16 \n\t" \
5207 "lw $4, 4(%1) \n\t" \
5208 "lw $5, 8(%1) \n\t" \
5209 "lw $25, 0(%1) \n\t" \
5210 VALGRIND_CALL_NOREDIR_T9 \
5211 "addu $29, $29, 16 \n\t" \
5212 "lw $28, 0($29) \n\t" \
5213 "lw $31, 4($29) \n\t" \
5214 "addu $29, $29, 8 \n\t" \
5217 : "0" (&_argvec[0]) \
5218 : "memory", __CALLER_SAVED_REGS \
5220 lval = (__typeof__(lval)) _res; \
5223 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
5225 volatile OrigFn _orig = (orig); \
5226 volatile unsigned long _argvec[4]; \
5227 volatile unsigned long _res; \
5228 _argvec[0] = (unsigned long)_orig.nraddr; \
5229 _argvec[1] = (unsigned long)(arg1); \
5230 _argvec[2] = (unsigned long)(arg2); \
5231 _argvec[3] = (unsigned long)(arg3); \
5233 "subu $29, $29, 8 \n\t" \
5234 "sw $28, 0($29) \n\t" \
5235 "sw $31, 4($29) \n\t" \
5236 "subu $29, $29, 16 \n\t" \
5237 "lw $4, 4(%1) \n\t" \
5238 "lw $5, 8(%1) \n\t" \
5239 "lw $6, 12(%1) \n\t" \
5240 "lw $25, 0(%1) \n\t" \
5241 VALGRIND_CALL_NOREDIR_T9 \
5242 "addu $29, $29, 16 \n\t" \
5243 "lw $28, 0($29) \n\t" \
5244 "lw $31, 4($29) \n\t" \
5245 "addu $29, $29, 8 \n\t" \
5248 : "0" (&_argvec[0]) \
5249 : "memory", __CALLER_SAVED_REGS \
5251 lval = (__typeof__(lval)) _res; \
5254 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
5256 volatile OrigFn _orig = (orig); \
5257 volatile unsigned long _argvec[5]; \
5258 volatile unsigned long _res; \
5259 _argvec[0] = (unsigned long)_orig.nraddr; \
5260 _argvec[1] = (unsigned long)(arg1); \
5261 _argvec[2] = (unsigned long)(arg2); \
5262 _argvec[3] = (unsigned long)(arg3); \
5263 _argvec[4] = (unsigned long)(arg4); \
5265 "subu $29, $29, 8 \n\t" \
5266 "sw $28, 0($29) \n\t" \
5267 "sw $31, 4($29) \n\t" \
5268 "subu $29, $29, 16 \n\t" \
5269 "lw $4, 4(%1) \n\t" \
5270 "lw $5, 8(%1) \n\t" \
5271 "lw $6, 12(%1) \n\t" \
5272 "lw $7, 16(%1) \n\t" \
5273 "lw $25, 0(%1) \n\t" \
5274 VALGRIND_CALL_NOREDIR_T9 \
5275 "addu $29, $29, 16 \n\t" \
5276 "lw $28, 0($29) \n\t" \
5277 "lw $31, 4($29) \n\t" \
5278 "addu $29, $29, 8 \n\t" \
5281 : "0" (&_argvec[0]) \
5282 : "memory", __CALLER_SAVED_REGS \
5284 lval = (__typeof__(lval)) _res; \
5287 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
5289 volatile OrigFn _orig = (orig); \
5290 volatile unsigned long _argvec[6]; \
5291 volatile unsigned long _res; \
5292 _argvec[0] = (unsigned long)_orig.nraddr; \
5293 _argvec[1] = (unsigned long)(arg1); \
5294 _argvec[2] = (unsigned long)(arg2); \
5295 _argvec[3] = (unsigned long)(arg3); \
5296 _argvec[4] = (unsigned long)(arg4); \
5297 _argvec[5] = (unsigned long)(arg5); \
5299 "subu $29, $29, 8 \n\t" \
5300 "sw $28, 0($29) \n\t" \
5301 "sw $31, 4($29) \n\t" \
5302 "lw $4, 20(%1) \n\t" \
5303 "subu $29, $29, 24\n\t" \
5304 "sw $4, 16($29) \n\t" \
5305 "lw $4, 4(%1) \n\t" \
5306 "lw $5, 8(%1) \n\t" \
5307 "lw $6, 12(%1) \n\t" \
5308 "lw $7, 16(%1) \n\t" \
5309 "lw $25, 0(%1) \n\t" \
5310 VALGRIND_CALL_NOREDIR_T9 \
5311 "addu $29, $29, 24 \n\t" \
5312 "lw $28, 0($29) \n\t" \
5313 "lw $31, 4($29) \n\t" \
5314 "addu $29, $29, 8 \n\t" \
5317 : "0" (&_argvec[0]) \
5318 : "memory", __CALLER_SAVED_REGS \
5320 lval = (__typeof__(lval)) _res; \
5322 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
5324 volatile OrigFn _orig = (orig); \
5325 volatile unsigned long _argvec[7]; \
5326 volatile unsigned long _res; \
5327 _argvec[0] = (unsigned long)_orig.nraddr; \
5328 _argvec[1] = (unsigned long)(arg1); \
5329 _argvec[2] = (unsigned long)(arg2); \
5330 _argvec[3] = (unsigned long)(arg3); \
5331 _argvec[4] = (unsigned long)(arg4); \
5332 _argvec[5] = (unsigned long)(arg5); \
5333 _argvec[6] = (unsigned long)(arg6); \
5335 "subu $29, $29, 8 \n\t" \
5336 "sw $28, 0($29) \n\t" \
5337 "sw $31, 4($29) \n\t" \
5338 "lw $4, 20(%1) \n\t" \
5339 "subu $29, $29, 32\n\t" \
5340 "sw $4, 16($29) \n\t" \
5341 "lw $4, 24(%1) \n\t" \
5343 "sw $4, 20($29) \n\t" \
5344 "lw $4, 4(%1) \n\t" \
5345 "lw $5, 8(%1) \n\t" \
5346 "lw $6, 12(%1) \n\t" \
5347 "lw $7, 16(%1) \n\t" \
5348 "lw $25, 0(%1) \n\t" \
5349 VALGRIND_CALL_NOREDIR_T9 \
5350 "addu $29, $29, 32 \n\t" \
5351 "lw $28, 0($29) \n\t" \
5352 "lw $31, 4($29) \n\t" \
5353 "addu $29, $29, 8 \n\t" \
5356 : "0" (&_argvec[0]) \
5357 : "memory", __CALLER_SAVED_REGS \
5359 lval = (__typeof__(lval)) _res; \
5362 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
5365 volatile OrigFn _orig = (orig); \
5366 volatile unsigned long _argvec[8]; \
5367 volatile unsigned long _res; \
5368 _argvec[0] = (unsigned long)_orig.nraddr; \
5369 _argvec[1] = (unsigned long)(arg1); \
5370 _argvec[2] = (unsigned long)(arg2); \
5371 _argvec[3] = (unsigned long)(arg3); \
5372 _argvec[4] = (unsigned long)(arg4); \
5373 _argvec[5] = (unsigned long)(arg5); \
5374 _argvec[6] = (unsigned long)(arg6); \
5375 _argvec[7] = (unsigned long)(arg7); \
5377 "subu $29, $29, 8 \n\t" \
5378 "sw $28, 0($29) \n\t" \
5379 "sw $31, 4($29) \n\t" \
5380 "lw $4, 20(%1) \n\t" \
5381 "subu $29, $29, 32\n\t" \
5382 "sw $4, 16($29) \n\t" \
5383 "lw $4, 24(%1) \n\t" \
5384 "sw $4, 20($29) \n\t" \
5385 "lw $4, 28(%1) \n\t" \
5386 "sw $4, 24($29) \n\t" \
5387 "lw $4, 4(%1) \n\t" \
5388 "lw $5, 8(%1) \n\t" \
5389 "lw $6, 12(%1) \n\t" \
5390 "lw $7, 16(%1) \n\t" \
5391 "lw $25, 0(%1) \n\t" \
5392 VALGRIND_CALL_NOREDIR_T9 \
5393 "addu $29, $29, 32 \n\t" \
5394 "lw $28, 0($29) \n\t" \
5395 "lw $31, 4($29) \n\t" \
5396 "addu $29, $29, 8 \n\t" \
5399 : "0" (&_argvec[0]) \
5400 : "memory", __CALLER_SAVED_REGS \
5402 lval = (__typeof__(lval)) _res; \
5405 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
5408 volatile OrigFn _orig = (orig); \
5409 volatile unsigned long _argvec[9]; \
5410 volatile unsigned long _res; \
5411 _argvec[0] = (unsigned long)_orig.nraddr; \
5412 _argvec[1] = (unsigned long)(arg1); \
5413 _argvec[2] = (unsigned long)(arg2); \
5414 _argvec[3] = (unsigned long)(arg3); \
5415 _argvec[4] = (unsigned long)(arg4); \
5416 _argvec[5] = (unsigned long)(arg5); \
5417 _argvec[6] = (unsigned long)(arg6); \
5418 _argvec[7] = (unsigned long)(arg7); \
5419 _argvec[8] = (unsigned long)(arg8); \
5421 "subu $29, $29, 8 \n\t" \
5422 "sw $28, 0($29) \n\t" \
5423 "sw $31, 4($29) \n\t" \
5424 "lw $4, 20(%1) \n\t" \
5425 "subu $29, $29, 40\n\t" \
5426 "sw $4, 16($29) \n\t" \
5427 "lw $4, 24(%1) \n\t" \
5428 "sw $4, 20($29) \n\t" \
5429 "lw $4, 28(%1) \n\t" \
5430 "sw $4, 24($29) \n\t" \
5431 "lw $4, 32(%1) \n\t" \
5432 "sw $4, 28($29) \n\t" \
5433 "lw $4, 4(%1) \n\t" \
5434 "lw $5, 8(%1) \n\t" \
5435 "lw $6, 12(%1) \n\t" \
5436 "lw $7, 16(%1) \n\t" \
5437 "lw $25, 0(%1) \n\t" \
5438 VALGRIND_CALL_NOREDIR_T9 \
5439 "addu $29, $29, 40 \n\t" \
5440 "lw $28, 0($29) \n\t" \
5441 "lw $31, 4($29) \n\t" \
5442 "addu $29, $29, 8 \n\t" \
5445 : "0" (&_argvec[0]) \
5446 : "memory", __CALLER_SAVED_REGS \
5448 lval = (__typeof__(lval)) _res; \
5451 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
5454 volatile OrigFn _orig = (orig); \
5455 volatile unsigned long _argvec[10]; \
5456 volatile unsigned long _res; \
5457 _argvec[0] = (unsigned long)_orig.nraddr; \
5458 _argvec[1] = (unsigned long)(arg1); \
5459 _argvec[2] = (unsigned long)(arg2); \
5460 _argvec[3] = (unsigned long)(arg3); \
5461 _argvec[4] = (unsigned long)(arg4); \
5462 _argvec[5] = (unsigned long)(arg5); \
5463 _argvec[6] = (unsigned long)(arg6); \
5464 _argvec[7] = (unsigned long)(arg7); \
5465 _argvec[8] = (unsigned long)(arg8); \
5466 _argvec[9] = (unsigned long)(arg9); \
5468 "subu $29, $29, 8 \n\t" \
5469 "sw $28, 0($29) \n\t" \
5470 "sw $31, 4($29) \n\t" \
5471 "lw $4, 20(%1) \n\t" \
5472 "subu $29, $29, 40\n\t" \
5473 "sw $4, 16($29) \n\t" \
5474 "lw $4, 24(%1) \n\t" \
5475 "sw $4, 20($29) \n\t" \
5476 "lw $4, 28(%1) \n\t" \
5477 "sw $4, 24($29) \n\t" \
5478 "lw $4, 32(%1) \n\t" \
5479 "sw $4, 28($29) \n\t" \
5480 "lw $4, 36(%1) \n\t" \
5481 "sw $4, 32($29) \n\t" \
5482 "lw $4, 4(%1) \n\t" \
5483 "lw $5, 8(%1) \n\t" \
5484 "lw $6, 12(%1) \n\t" \
5485 "lw $7, 16(%1) \n\t" \
5486 "lw $25, 0(%1) \n\t" \
5487 VALGRIND_CALL_NOREDIR_T9 \
5488 "addu $29, $29, 40 \n\t" \
5489 "lw $28, 0($29) \n\t" \
5490 "lw $31, 4($29) \n\t" \
5491 "addu $29, $29, 8 \n\t" \
5494 : "0" (&_argvec[0]) \
5495 : "memory", __CALLER_SAVED_REGS \
5497 lval = (__typeof__(lval)) _res; \
5500 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
5501 arg7,arg8,arg9,arg10) \
5503 volatile OrigFn _orig = (orig); \
5504 volatile unsigned long _argvec[11]; \
5505 volatile unsigned long _res; \
5506 _argvec[0] = (unsigned long)_orig.nraddr; \
5507 _argvec[1] = (unsigned long)(arg1); \
5508 _argvec[2] = (unsigned long)(arg2); \
5509 _argvec[3] = (unsigned long)(arg3); \
5510 _argvec[4] = (unsigned long)(arg4); \
5511 _argvec[5] = (unsigned long)(arg5); \
5512 _argvec[6] = (unsigned long)(arg6); \
5513 _argvec[7] = (unsigned long)(arg7); \
5514 _argvec[8] = (unsigned long)(arg8); \
5515 _argvec[9] = (unsigned long)(arg9); \
5516 _argvec[10] = (unsigned long)(arg10); \
5518 "subu $29, $29, 8 \n\t" \
5519 "sw $28, 0($29) \n\t" \
5520 "sw $31, 4($29) \n\t" \
5521 "lw $4, 20(%1) \n\t" \
5522 "subu $29, $29, 48\n\t" \
5523 "sw $4, 16($29) \n\t" \
5524 "lw $4, 24(%1) \n\t" \
5525 "sw $4, 20($29) \n\t" \
5526 "lw $4, 28(%1) \n\t" \
5527 "sw $4, 24($29) \n\t" \
5528 "lw $4, 32(%1) \n\t" \
5529 "sw $4, 28($29) \n\t" \
5530 "lw $4, 36(%1) \n\t" \
5531 "sw $4, 32($29) \n\t" \
5532 "lw $4, 40(%1) \n\t" \
5533 "sw $4, 36($29) \n\t" \
5534 "lw $4, 4(%1) \n\t" \
5535 "lw $5, 8(%1) \n\t" \
5536 "lw $6, 12(%1) \n\t" \
5537 "lw $7, 16(%1) \n\t" \
5538 "lw $25, 0(%1) \n\t" \
5539 VALGRIND_CALL_NOREDIR_T9 \
5540 "addu $29, $29, 48 \n\t" \
5541 "lw $28, 0($29) \n\t" \
5542 "lw $31, 4($29) \n\t" \
5543 "addu $29, $29, 8 \n\t" \
5546 : "0" (&_argvec[0]) \
5547 : "memory", __CALLER_SAVED_REGS \
5549 lval = (__typeof__(lval)) _res; \
5552 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
5553 arg6,arg7,arg8,arg9,arg10, \
5556 volatile OrigFn _orig = (orig); \
5557 volatile unsigned long _argvec[12]; \
5558 volatile unsigned long _res; \
5559 _argvec[0] = (unsigned long)_orig.nraddr; \
5560 _argvec[1] = (unsigned long)(arg1); \
5561 _argvec[2] = (unsigned long)(arg2); \
5562 _argvec[3] = (unsigned long)(arg3); \
5563 _argvec[4] = (unsigned long)(arg4); \
5564 _argvec[5] = (unsigned long)(arg5); \
5565 _argvec[6] = (unsigned long)(arg6); \
5566 _argvec[7] = (unsigned long)(arg7); \
5567 _argvec[8] = (unsigned long)(arg8); \
5568 _argvec[9] = (unsigned long)(arg9); \
5569 _argvec[10] = (unsigned long)(arg10); \
5570 _argvec[11] = (unsigned long)(arg11); \
5572 "subu $29, $29, 8 \n\t" \
5573 "sw $28, 0($29) \n\t" \
5574 "sw $31, 4($29) \n\t" \
5575 "lw $4, 20(%1) \n\t" \
5576 "subu $29, $29, 48\n\t" \
5577 "sw $4, 16($29) \n\t" \
5578 "lw $4, 24(%1) \n\t" \
5579 "sw $4, 20($29) \n\t" \
5580 "lw $4, 28(%1) \n\t" \
5581 "sw $4, 24($29) \n\t" \
5582 "lw $4, 32(%1) \n\t" \
5583 "sw $4, 28($29) \n\t" \
5584 "lw $4, 36(%1) \n\t" \
5585 "sw $4, 32($29) \n\t" \
5586 "lw $4, 40(%1) \n\t" \
5587 "sw $4, 36($29) \n\t" \
5588 "lw $4, 44(%1) \n\t" \
5589 "sw $4, 40($29) \n\t" \
5590 "lw $4, 4(%1) \n\t" \
5591 "lw $5, 8(%1) \n\t" \
5592 "lw $6, 12(%1) \n\t" \
5593 "lw $7, 16(%1) \n\t" \
5594 "lw $25, 0(%1) \n\t" \
5595 VALGRIND_CALL_NOREDIR_T9 \
5596 "addu $29, $29, 48 \n\t" \
5597 "lw $28, 0($29) \n\t" \
5598 "lw $31, 4($29) \n\t" \
5599 "addu $29, $29, 8 \n\t" \
5602 : "0" (&_argvec[0]) \
5603 : "memory", __CALLER_SAVED_REGS \
5605 lval = (__typeof__(lval)) _res; \
5608 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
5609 arg6,arg7,arg8,arg9,arg10, \
5612 volatile OrigFn _orig = (orig); \
5613 volatile unsigned long _argvec[13]; \
5614 volatile unsigned long _res; \
5615 _argvec[0] = (unsigned long)_orig.nraddr; \
5616 _argvec[1] = (unsigned long)(arg1); \
5617 _argvec[2] = (unsigned long)(arg2); \
5618 _argvec[3] = (unsigned long)(arg3); \
5619 _argvec[4] = (unsigned long)(arg4); \
5620 _argvec[5] = (unsigned long)(arg5); \
5621 _argvec[6] = (unsigned long)(arg6); \
5622 _argvec[7] = (unsigned long)(arg7); \
5623 _argvec[8] = (unsigned long)(arg8); \
5624 _argvec[9] = (unsigned long)(arg9); \
5625 _argvec[10] = (unsigned long)(arg10); \
5626 _argvec[11] = (unsigned long)(arg11); \
5627 _argvec[12] = (unsigned long)(arg12); \
5629 "subu $29, $29, 8 \n\t" \
5630 "sw $28, 0($29) \n\t" \
5631 "sw $31, 4($29) \n\t" \
5632 "lw $4, 20(%1) \n\t" \
5633 "subu $29, $29, 56\n\t" \
5634 "sw $4, 16($29) \n\t" \
5635 "lw $4, 24(%1) \n\t" \
5636 "sw $4, 20($29) \n\t" \
5637 "lw $4, 28(%1) \n\t" \
5638 "sw $4, 24($29) \n\t" \
5639 "lw $4, 32(%1) \n\t" \
5640 "sw $4, 28($29) \n\t" \
5641 "lw $4, 36(%1) \n\t" \
5642 "sw $4, 32($29) \n\t" \
5643 "lw $4, 40(%1) \n\t" \
5644 "sw $4, 36($29) \n\t" \
5645 "lw $4, 44(%1) \n\t" \
5646 "sw $4, 40($29) \n\t" \
5647 "lw $4, 48(%1) \n\t" \
5648 "sw $4, 44($29) \n\t" \
5649 "lw $4, 4(%1) \n\t" \
5650 "lw $5, 8(%1) \n\t" \
5651 "lw $6, 12(%1) \n\t" \
5652 "lw $7, 16(%1) \n\t" \
5653 "lw $25, 0(%1) \n\t" \
5654 VALGRIND_CALL_NOREDIR_T9 \
5655 "addu $29, $29, 56 \n\t" \
5656 "lw $28, 0($29) \n\t" \
5657 "lw $31, 4($29) \n\t" \
5658 "addu $29, $29, 8 \n\t" \
5661 : "r" (&_argvec[0]) \
5662 : "memory", __CALLER_SAVED_REGS \
5664 lval = (__typeof__(lval)) _res; \
5671 #if defined(PLAT_mips64_linux)
5674 #define __CALLER_SAVED_REGS "$2", "$3", "$4", "$5", "$6", \
5675 "$7", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \
5681 #define CALL_FN_W_v(lval, orig) \
5683 volatile OrigFn _orig = (orig); \
5684 volatile unsigned long _argvec[1]; \
5685 volatile unsigned long _res; \
5686 _argvec[0] = (unsigned long)_orig.nraddr; \
5688 "ld $25, 0(%1)\n\t" \
5689 VALGRIND_CALL_NOREDIR_T9 \
5692 : "0" (&_argvec[0]) \
5693 : "memory", __CALLER_SAVED_REGS \
5695 lval = (__typeof__(lval)) _res; \
5698 #define CALL_FN_W_W(lval, orig, arg1) \
5700 volatile OrigFn _orig = (orig); \
5701 volatile unsigned long _argvec[2]; \
5702 volatile unsigned long _res; \
5703 _argvec[0] = (unsigned long)_orig.nraddr; \
5704 _argvec[1] = (unsigned long)(arg1); \
5706 "ld $4, 8(%1)\n\t" \
5707 "ld $25, 0(%1)\n\t" \
5708 VALGRIND_CALL_NOREDIR_T9 \
5711 : "r" (&_argvec[0]) \
5712 : "memory", __CALLER_SAVED_REGS \
5714 lval = (__typeof__(lval)) _res; \
5717 #define CALL_FN_W_WW(lval, orig, arg1,arg2) \
5719 volatile OrigFn _orig = (orig); \
5720 volatile unsigned long _argvec[3]; \
5721 volatile unsigned long _res; \
5722 _argvec[0] = (unsigned long)_orig.nraddr; \
5723 _argvec[1] = (unsigned long)(arg1); \
5724 _argvec[2] = (unsigned long)(arg2); \
5726 "ld $4, 8(%1)\n\t" \
5727 "ld $5, 16(%1)\n\t" \
5728 "ld $25, 0(%1)\n\t" \
5729 VALGRIND_CALL_NOREDIR_T9 \
5732 : "r" (&_argvec[0]) \
5733 : "memory", __CALLER_SAVED_REGS \
5735 lval = (__typeof__(lval)) _res; \
5738 #define CALL_FN_W_WWW(lval, orig, arg1,arg2,arg3) \
5740 volatile OrigFn _orig = (orig); \
5741 volatile unsigned long _argvec[4]; \
5742 volatile unsigned long _res; \
5743 _argvec[0] = (unsigned long)_orig.nraddr; \
5744 _argvec[1] = (unsigned long)(arg1); \
5745 _argvec[2] = (unsigned long)(arg2); \
5746 _argvec[3] = (unsigned long)(arg3); \
5748 "ld $4, 8(%1)\n\t" \
5749 "ld $5, 16(%1)\n\t" \
5750 "ld $6, 24(%1)\n\t" \
5751 "ld $25, 0(%1)\n\t" \
5752 VALGRIND_CALL_NOREDIR_T9 \
5755 : "r" (&_argvec[0]) \
5756 : "memory", __CALLER_SAVED_REGS \
5758 lval = (__typeof__(lval)) _res; \
5761 #define CALL_FN_W_WWWW(lval, orig, arg1,arg2,arg3,arg4) \
5763 volatile OrigFn _orig = (orig); \
5764 volatile unsigned long _argvec[5]; \
5765 volatile unsigned long _res; \
5766 _argvec[0] = (unsigned long)_orig.nraddr; \
5767 _argvec[1] = (unsigned long)(arg1); \
5768 _argvec[2] = (unsigned long)(arg2); \
5769 _argvec[3] = (unsigned long)(arg3); \
5770 _argvec[4] = (unsigned long)(arg4); \
5772 "ld $4, 8(%1)\n\t" \
5773 "ld $5, 16(%1)\n\t" \
5774 "ld $6, 24(%1)\n\t" \
5775 "ld $7, 32(%1)\n\t" \
5776 "ld $25, 0(%1)\n\t" \
5777 VALGRIND_CALL_NOREDIR_T9 \
5780 : "r" (&_argvec[0]) \
5781 : "memory", __CALLER_SAVED_REGS \
5783 lval = (__typeof__(lval)) _res; \
5786 #define CALL_FN_W_5W(lval, orig, arg1,arg2,arg3,arg4,arg5) \
5788 volatile OrigFn _orig = (orig); \
5789 volatile unsigned long _argvec[6]; \
5790 volatile unsigned long _res; \
5791 _argvec[0] = (unsigned long)_orig.nraddr; \
5792 _argvec[1] = (unsigned long)(arg1); \
5793 _argvec[2] = (unsigned long)(arg2); \
5794 _argvec[3] = (unsigned long)(arg3); \
5795 _argvec[4] = (unsigned long)(arg4); \
5796 _argvec[5] = (unsigned long)(arg5); \
5798 "ld $4, 8(%1)\n\t" \
5799 "ld $5, 16(%1)\n\t" \
5800 "ld $6, 24(%1)\n\t" \
5801 "ld $7, 32(%1)\n\t" \
5802 "ld $8, 40(%1)\n\t" \
5803 "ld $25, 0(%1)\n\t" \
5804 VALGRIND_CALL_NOREDIR_T9 \
5807 : "r" (&_argvec[0]) \
5808 : "memory", __CALLER_SAVED_REGS \
5810 lval = (__typeof__(lval)) _res; \
5813 #define CALL_FN_W_6W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6) \
5815 volatile OrigFn _orig = (orig); \
5816 volatile unsigned long _argvec[7]; \
5817 volatile unsigned long _res; \
5818 _argvec[0] = (unsigned long)_orig.nraddr; \
5819 _argvec[1] = (unsigned long)(arg1); \
5820 _argvec[2] = (unsigned long)(arg2); \
5821 _argvec[3] = (unsigned long)(arg3); \
5822 _argvec[4] = (unsigned long)(arg4); \
5823 _argvec[5] = (unsigned long)(arg5); \
5824 _argvec[6] = (unsigned long)(arg6); \
5826 "ld $4, 8(%1)\n\t" \
5827 "ld $5, 16(%1)\n\t" \
5828 "ld $6, 24(%1)\n\t" \
5829 "ld $7, 32(%1)\n\t" \
5830 "ld $8, 40(%1)\n\t" \
5831 "ld $9, 48(%1)\n\t" \
5832 "ld $25, 0(%1)\n\t" \
5833 VALGRIND_CALL_NOREDIR_T9 \
5836 : "r" (&_argvec[0]) \
5837 : "memory", __CALLER_SAVED_REGS \
5839 lval = (__typeof__(lval)) _res; \
5842 #define CALL_FN_W_7W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
5845 volatile OrigFn _orig = (orig); \
5846 volatile unsigned long _argvec[8]; \
5847 volatile unsigned long _res; \
5848 _argvec[0] = (unsigned long)_orig.nraddr; \
5849 _argvec[1] = (unsigned long)(arg1); \
5850 _argvec[2] = (unsigned long)(arg2); \
5851 _argvec[3] = (unsigned long)(arg3); \
5852 _argvec[4] = (unsigned long)(arg4); \
5853 _argvec[5] = (unsigned long)(arg5); \
5854 _argvec[6] = (unsigned long)(arg6); \
5855 _argvec[7] = (unsigned long)(arg7); \
5857 "ld $4, 8(%1)\n\t" \
5858 "ld $5, 16(%1)\n\t" \
5859 "ld $6, 24(%1)\n\t" \
5860 "ld $7, 32(%1)\n\t" \
5861 "ld $8, 40(%1)\n\t" \
5862 "ld $9, 48(%1)\n\t" \
5863 "ld $10, 56(%1)\n\t" \
5864 "ld $25, 0(%1) \n\t" \
5865 VALGRIND_CALL_NOREDIR_T9 \
5868 : "r" (&_argvec[0]) \
5869 : "memory", __CALLER_SAVED_REGS \
5871 lval = (__typeof__(lval)) _res; \
5874 #define CALL_FN_W_8W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
5877 volatile OrigFn _orig = (orig); \
5878 volatile unsigned long _argvec[9]; \
5879 volatile unsigned long _res; \
5880 _argvec[0] = (unsigned long)_orig.nraddr; \
5881 _argvec[1] = (unsigned long)(arg1); \
5882 _argvec[2] = (unsigned long)(arg2); \
5883 _argvec[3] = (unsigned long)(arg3); \
5884 _argvec[4] = (unsigned long)(arg4); \
5885 _argvec[5] = (unsigned long)(arg5); \
5886 _argvec[6] = (unsigned long)(arg6); \
5887 _argvec[7] = (unsigned long)(arg7); \
5888 _argvec[8] = (unsigned long)(arg8); \
5890 "ld $4, 8(%1)\n\t" \
5891 "ld $5, 16(%1)\n\t" \
5892 "ld $6, 24(%1)\n\t" \
5893 "ld $7, 32(%1)\n\t" \
5894 "ld $8, 40(%1)\n\t" \
5895 "ld $9, 48(%1)\n\t" \
5896 "ld $10, 56(%1)\n\t" \
5897 "ld $11, 64(%1)\n\t" \
5898 "ld $25, 0(%1) \n\t" \
5899 VALGRIND_CALL_NOREDIR_T9 \
5902 : "r" (&_argvec[0]) \
5903 : "memory", __CALLER_SAVED_REGS \
5905 lval = (__typeof__(lval)) _res; \
5908 #define CALL_FN_W_9W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
5911 volatile OrigFn _orig = (orig); \
5912 volatile unsigned long _argvec[10]; \
5913 volatile unsigned long _res; \
5914 _argvec[0] = (unsigned long)_orig.nraddr; \
5915 _argvec[1] = (unsigned long)(arg1); \
5916 _argvec[2] = (unsigned long)(arg2); \
5917 _argvec[3] = (unsigned long)(arg3); \
5918 _argvec[4] = (unsigned long)(arg4); \
5919 _argvec[5] = (unsigned long)(arg5); \
5920 _argvec[6] = (unsigned long)(arg6); \
5921 _argvec[7] = (unsigned long)(arg7); \
5922 _argvec[8] = (unsigned long)(arg8); \
5923 _argvec[9] = (unsigned long)(arg9); \
5925 "dsubu $29, $29, 8\n\t" \
5926 "ld $4, 72(%1)\n\t" \
5927 "sd $4, 0($29)\n\t" \
5928 "ld $4, 8(%1)\n\t" \
5929 "ld $5, 16(%1)\n\t" \
5930 "ld $6, 24(%1)\n\t" \
5931 "ld $7, 32(%1)\n\t" \
5932 "ld $8, 40(%1)\n\t" \
5933 "ld $9, 48(%1)\n\t" \
5934 "ld $10, 56(%1)\n\t" \
5935 "ld $11, 64(%1)\n\t" \
5936 "ld $25, 0(%1)\n\t" \
5937 VALGRIND_CALL_NOREDIR_T9 \
5938 "daddu $29, $29, 8\n\t" \
5941 : "r" (&_argvec[0]) \
5942 : "memory", __CALLER_SAVED_REGS \
5944 lval = (__typeof__(lval)) _res; \
5947 #define CALL_FN_W_10W(lval, orig, arg1,arg2,arg3,arg4,arg5,arg6, \
5948 arg7,arg8,arg9,arg10) \
5950 volatile OrigFn _orig = (orig); \
5951 volatile unsigned long _argvec[11]; \
5952 volatile unsigned long _res; \
5953 _argvec[0] = (unsigned long)_orig.nraddr; \
5954 _argvec[1] = (unsigned long)(arg1); \
5955 _argvec[2] = (unsigned long)(arg2); \
5956 _argvec[3] = (unsigned long)(arg3); \
5957 _argvec[4] = (unsigned long)(arg4); \
5958 _argvec[5] = (unsigned long)(arg5); \
5959 _argvec[6] = (unsigned long)(arg6); \
5960 _argvec[7] = (unsigned long)(arg7); \
5961 _argvec[8] = (unsigned long)(arg8); \
5962 _argvec[9] = (unsigned long)(arg9); \
5963 _argvec[10] = (unsigned long)(arg10); \
5965 "dsubu $29, $29, 16\n\t" \
5966 "ld $4, 72(%1)\n\t" \
5967 "sd $4, 0($29)\n\t" \
5968 "ld $4, 80(%1)\n\t" \
5969 "sd $4, 8($29)\n\t" \
5970 "ld $4, 8(%1)\n\t" \
5971 "ld $5, 16(%1)\n\t" \
5972 "ld $6, 24(%1)\n\t" \
5973 "ld $7, 32(%1)\n\t" \
5974 "ld $8, 40(%1)\n\t" \
5975 "ld $9, 48(%1)\n\t" \
5976 "ld $10, 56(%1)\n\t" \
5977 "ld $11, 64(%1)\n\t" \
5978 "ld $25, 0(%1)\n\t" \
5979 VALGRIND_CALL_NOREDIR_T9 \
5980 "daddu $29, $29, 16\n\t" \
5983 : "r" (&_argvec[0]) \
5984 : "memory", __CALLER_SAVED_REGS \
5986 lval = (__typeof__(lval)) _res; \
5989 #define CALL_FN_W_11W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
5990 arg6,arg7,arg8,arg9,arg10, \
5993 volatile OrigFn _orig = (orig); \
5994 volatile unsigned long _argvec[12]; \
5995 volatile unsigned long _res; \
5996 _argvec[0] = (unsigned long)_orig.nraddr; \
5997 _argvec[1] = (unsigned long)(arg1); \
5998 _argvec[2] = (unsigned long)(arg2); \
5999 _argvec[3] = (unsigned long)(arg3); \
6000 _argvec[4] = (unsigned long)(arg4); \
6001 _argvec[5] = (unsigned long)(arg5); \
6002 _argvec[6] = (unsigned long)(arg6); \
6003 _argvec[7] = (unsigned long)(arg7); \
6004 _argvec[8] = (unsigned long)(arg8); \
6005 _argvec[9] = (unsigned long)(arg9); \
6006 _argvec[10] = (unsigned long)(arg10); \
6007 _argvec[11] = (unsigned long)(arg11); \
6009 "dsubu $29, $29, 24\n\t" \
6010 "ld $4, 72(%1)\n\t" \
6011 "sd $4, 0($29)\n\t" \
6012 "ld $4, 80(%1)\n\t" \
6013 "sd $4, 8($29)\n\t" \
6014 "ld $4, 88(%1)\n\t" \
6015 "sd $4, 16($29)\n\t" \
6016 "ld $4, 8(%1)\n\t" \
6017 "ld $5, 16(%1)\n\t" \
6018 "ld $6, 24(%1)\n\t" \
6019 "ld $7, 32(%1)\n\t" \
6020 "ld $8, 40(%1)\n\t" \
6021 "ld $9, 48(%1)\n\t" \
6022 "ld $10, 56(%1)\n\t" \
6023 "ld $11, 64(%1)\n\t" \
6024 "ld $25, 0(%1)\n\t" \
6025 VALGRIND_CALL_NOREDIR_T9 \
6026 "daddu $29, $29, 24\n\t" \
6029 : "r" (&_argvec[0]) \
6030 : "memory", __CALLER_SAVED_REGS \
6032 lval = (__typeof__(lval)) _res; \
6035 #define CALL_FN_W_12W(lval, orig, arg1,arg2,arg3,arg4,arg5, \
6036 arg6,arg7,arg8,arg9,arg10, \
6039 volatile OrigFn _orig = (orig); \
6040 volatile unsigned long _argvec[13]; \
6041 volatile unsigned long _res; \
6042 _argvec[0] = (unsigned long)_orig.nraddr; \
6043 _argvec[1] = (unsigned long)(arg1); \
6044 _argvec[2] = (unsigned long)(arg2); \
6045 _argvec[3] = (unsigned long)(arg3); \
6046 _argvec[4] = (unsigned long)(arg4); \
6047 _argvec[5] = (unsigned long)(arg5); \
6048 _argvec[6] = (unsigned long)(arg6); \
6049 _argvec[7] = (unsigned long)(arg7); \
6050 _argvec[8] = (unsigned long)(arg8); \
6051 _argvec[9] = (unsigned long)(arg9); \
6052 _argvec[10] = (unsigned long)(arg10); \
6053 _argvec[11] = (unsigned long)(arg11); \
6054 _argvec[12] = (unsigned long)(arg12); \
6056 "dsubu $29, $29, 32\n\t" \
6057 "ld $4, 72(%1)\n\t" \
6058 "sd $4, 0($29)\n\t" \
6059 "ld $4, 80(%1)\n\t" \
6060 "sd $4, 8($29)\n\t" \
6061 "ld $4, 88(%1)\n\t" \
6062 "sd $4, 16($29)\n\t" \
6063 "ld $4, 96(%1)\n\t" \
6064 "sd $4, 24($29)\n\t" \
6065 "ld $4, 8(%1)\n\t" \
6066 "ld $5, 16(%1)\n\t" \
6067 "ld $6, 24(%1)\n\t" \
6068 "ld $7, 32(%1)\n\t" \
6069 "ld $8, 40(%1)\n\t" \
6070 "ld $9, 48(%1)\n\t" \
6071 "ld $10, 56(%1)\n\t" \
6072 "ld $11, 64(%1)\n\t" \
6073 "ld $25, 0(%1)\n\t" \
6074 VALGRIND_CALL_NOREDIR_T9 \
6075 "daddu $29, $29, 32\n\t" \
6078 : "r" (&_argvec[0]) \
6079 : "memory", __CALLER_SAVED_REGS \
6081 lval = (__typeof__(lval)) _res; \
6102 #define VG_USERREQ_TOOL_BASE(a,b) \
6103 ((unsigned int)(((a)&0xff) << 24 | ((b)&0xff) << 16))
6104 #define VG_IS_TOOL_USERREQ(a, b, v) \
6105 (VG_USERREQ_TOOL_BASE(a,b) == ((v) & 0xffff0000))
6112 enum { VG_USERREQ__RUNNING_ON_VALGRIND = 0x1001,
6113 VG_USERREQ__DISCARD_TRANSLATIONS = 0x1002,
6120 VG_USERREQ__CLIENT_CALL0 = 0x1101,
6121 VG_USERREQ__CLIENT_CALL1 = 0x1102,
6122 VG_USERREQ__CLIENT_CALL2 = 0x1103,
6123 VG_USERREQ__CLIENT_CALL3 = 0x1104,
6128 VG_USERREQ__COUNT_ERRORS = 0x1201,
6132 VG_USERREQ__GDB_MONITOR_COMMAND = 0x1202,
6136 VG_USERREQ__MALLOCLIKE_BLOCK = 0x1301,
6137 VG_USERREQ__RESIZEINPLACE_BLOCK = 0x130b,
6138 VG_USERREQ__FREELIKE_BLOCK = 0x1302,
6140 VG_USERREQ__CREATE_MEMPOOL = 0x1303,
6141 VG_USERREQ__DESTROY_MEMPOOL = 0x1304,
6142 VG_USERREQ__MEMPOOL_ALLOC = 0x1305,
6143 VG_USERREQ__MEMPOOL_FREE = 0x1306,
6144 VG_USERREQ__MEMPOOL_TRIM = 0x1307,
6145 VG_USERREQ__MOVE_MEMPOOL = 0x1308,
6146 VG_USERREQ__MEMPOOL_CHANGE = 0x1309,
6147 VG_USERREQ__MEMPOOL_EXISTS = 0x130a,
6156 VG_USERREQ__PRINTF = 0x1401,
6157 VG_USERREQ__PRINTF_BACKTRACE = 0x1402,
6159 VG_USERREQ__PRINTF_VALIST_BY_REF = 0x1403,
6160 VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF = 0x1404,
6163 VG_USERREQ__STACK_REGISTER = 0x1501,
6164 VG_USERREQ__STACK_DEREGISTER = 0x1502,
6165 VG_USERREQ__STACK_CHANGE = 0x1503,
6168 VG_USERREQ__LOAD_PDB_DEBUGINFO = 0x1601,
6171 VG_USERREQ__MAP_IP_TO_SRCLOC = 0x1701,
6178 VG_USERREQ__CHANGE_ERR_DISABLEMENT = 0x1801,
6181 VG_USERREQ__VEX_INIT_FOR_IRI = 0x1901
6184 #if !defined(__GNUC__)
6185 # define __extension__
6193 #define RUNNING_ON_VALGRIND \
6194 (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0 , \
6195 VG_USERREQ__RUNNING_ON_VALGRIND, \
6203 #define VALGRIND_DISCARD_TRANSLATIONS(_qzz_addr,_qzz_len) \
6204 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DISCARD_TRANSLATIONS, \
6205 _qzz_addr, _qzz_len, 0, 0, 0)
6213 #if defined(__GNUC__) || defined(__INTEL_COMPILER) && !defined(_MSC_VER)
6216 static int VALGRIND_PRINTF(
const char *format, ...)
6217 __attribute__((format(__printf__, 1, 2), __unused__));
6220 #if defined(_MSC_VER)
6223 VALGRIND_PRINTF(
const char *format, ...)
6225 #if defined(NVALGRIND)
6228 #if defined(_MSC_VER) || defined(__MINGW64__)
6231 unsigned long _qzz_res;
6234 va_start(vargs, format);
6235 #if defined(_MSC_VER) || defined(__MINGW64__)
6236 _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0,
6237 VG_USERREQ__PRINTF_VALIST_BY_REF,
6242 _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0,
6243 VG_USERREQ__PRINTF_VALIST_BY_REF,
6244 (
unsigned long)format,
6245 (
unsigned long)&vargs,
6249 return (
int)_qzz_res;
6253 #if defined(__GNUC__) || defined(__INTEL_COMPILER) && !defined(_MSC_VER)
6254 static int VALGRIND_PRINTF_BACKTRACE(
const char *format, ...)
6255 __attribute__((format(__printf__, 1, 2), __unused__));
6258 #if defined(_MSC_VER)
6261 VALGRIND_PRINTF_BACKTRACE(
const char *format, ...)
6263 #if defined(NVALGRIND)
6266 #if defined(_MSC_VER) || defined(__MINGW64__)
6269 unsigned long _qzz_res;
6272 va_start(vargs, format);
6273 #if defined(_MSC_VER) || defined(__MINGW64__)
6274 _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0,
6275 VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF,
6280 _qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0,
6281 VG_USERREQ__PRINTF_BACKTRACE_VALIST_BY_REF,
6282 (
unsigned long)format,
6283 (
unsigned long)&vargs,
6287 return (
int)_qzz_res;
6315 #define VALGRIND_NON_SIMD_CALL0(_qyy_fn) \
6316 VALGRIND_DO_CLIENT_REQUEST_EXPR(0 , \
6317 VG_USERREQ__CLIENT_CALL0, \
6321 #define VALGRIND_NON_SIMD_CALL1(_qyy_fn, _qyy_arg1) \
6322 VALGRIND_DO_CLIENT_REQUEST_EXPR(0 , \
6323 VG_USERREQ__CLIENT_CALL1, \
6327 #define VALGRIND_NON_SIMD_CALL2(_qyy_fn, _qyy_arg1, _qyy_arg2) \
6328 VALGRIND_DO_CLIENT_REQUEST_EXPR(0 , \
6329 VG_USERREQ__CLIENT_CALL2, \
6331 _qyy_arg1, _qyy_arg2, 0, 0)
6333 #define VALGRIND_NON_SIMD_CALL3(_qyy_fn, _qyy_arg1, _qyy_arg2, _qyy_arg3) \
6334 VALGRIND_DO_CLIENT_REQUEST_EXPR(0 , \
6335 VG_USERREQ__CLIENT_CALL3, \
6337 _qyy_arg1, _qyy_arg2, \
6344 #define VALGRIND_COUNT_ERRORS \
6345 (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR( \
6347 VG_USERREQ__COUNT_ERRORS, \
6451 #define VALGRIND_MALLOCLIKE_BLOCK(addr, sizeB, rzB, is_zeroed) \
6452 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MALLOCLIKE_BLOCK, \
6453 addr, sizeB, rzB, is_zeroed, 0)
6458 #define VALGRIND_RESIZEINPLACE_BLOCK(addr, oldSizeB, newSizeB, rzB) \
6459 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__RESIZEINPLACE_BLOCK, \
6460 addr, oldSizeB, newSizeB, rzB, 0)
6465 #define VALGRIND_FREELIKE_BLOCK(addr, rzB) \
6466 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__FREELIKE_BLOCK, \
6470 #define VALGRIND_CREATE_MEMPOOL(pool, rzB, is_zeroed) \
6471 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CREATE_MEMPOOL, \
6472 pool, rzB, is_zeroed, 0, 0)
6475 #define VALGRIND_DESTROY_MEMPOOL(pool) \
6476 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DESTROY_MEMPOOL, \
6480 #define VALGRIND_MEMPOOL_ALLOC(pool, addr, size) \
6481 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_ALLOC, \
6482 pool, addr, size, 0, 0)
6485 #define VALGRIND_MEMPOOL_FREE(pool, addr) \
6486 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_FREE, \
6487 pool, addr, 0, 0, 0)
6490 #define VALGRIND_MEMPOOL_TRIM(pool, addr, size) \
6491 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_TRIM, \
6492 pool, addr, size, 0, 0)
6495 #define VALGRIND_MOVE_MEMPOOL(poolA, poolB) \
6496 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MOVE_MEMPOOL, \
6497 poolA, poolB, 0, 0, 0)
6500 #define VALGRIND_MEMPOOL_CHANGE(pool, addrA, addrB, size) \
6501 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__MEMPOOL_CHANGE, \
6502 pool, addrA, addrB, size, 0)
6505 #define VALGRIND_MEMPOOL_EXISTS(pool) \
6506 (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
6507 VG_USERREQ__MEMPOOL_EXISTS, \
6513 #define VALGRIND_STACK_REGISTER(start, end) \
6514 (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
6515 VG_USERREQ__STACK_REGISTER, \
6516 start, end, 0, 0, 0)
6520 #define VALGRIND_STACK_DEREGISTER(id) \
6521 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__STACK_DEREGISTER, \
6527 #define VALGRIND_STACK_CHANGE(id, start, end) \
6528 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__STACK_CHANGE, \
6529 id, start, end, 0, 0)
6532 #define VALGRIND_LOAD_PDB_DEBUGINFO(fd, ptr, total_size, delta) \
6533 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__LOAD_PDB_DEBUGINFO, \
6534 fd, ptr, total_size, delta, 0)
6540 #define VALGRIND_MAP_IP_TO_SRCLOC(addr, buf64) \
6541 (unsigned)VALGRIND_DO_CLIENT_REQUEST_EXPR(0, \
6542 VG_USERREQ__MAP_IP_TO_SRCLOC, \
6543 addr, buf64, 0, 0, 0)
6553 #define VALGRIND_DISABLE_ERROR_REPORTING \
6554 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CHANGE_ERR_DISABLEMENT, \
6559 #define VALGRIND_ENABLE_ERROR_REPORTING \
6560 VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__CHANGE_ERR_DISABLEMENT, \
6568 #define VALGRIND_MONITOR_COMMAND(command) \
6569 VALGRIND_DO_CLIENT_REQUEST_EXPR(0, VG_USERREQ__GDB_MONITOR_COMMAND, \
6570 command, 0, 0, 0, 0)
6573 #undef PLAT_x86_darwin
6574 #undef PLAT_amd64_darwin
6575 #undef PLAT_x86_win32
6576 #undef PLAT_amd64_win64
6577 #undef PLAT_x86_linux
6578 #undef PLAT_amd64_linux
6579 #undef PLAT_ppc32_linux
6580 #undef PLAT_ppc64be_linux
6581 #undef PLAT_ppc64le_linux
6582 #undef PLAT_arm_linux
6583 #undef PLAT_s390x_linux
6584 #undef PLAT_mips32_linux
6585 #undef PLAT_mips64_linux