Rev 3844 | Rev 3908 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3844 | Rev 3875 | ||
---|---|---|---|
Line 614... | Line 614... | ||
614 | /** Call function with zero parameters */ |
614 | /** Call function with zero parameters */ |
615 | int cmd_call0(cmd_arg_t *argv) |
615 | int cmd_call0(cmd_arg_t *argv) |
616 | { |
616 | { |
617 | uintptr_t symaddr; |
617 | uintptr_t symaddr; |
618 | char *symbol; |
618 | char *symbol; |
619 | unative_t (*f)(void); |
619 | unative_t (*fnc)(void); |
620 | #ifdef ia64 |
- | |
621 | struct { |
- | |
622 | unative_t f; |
- | |
623 | unative_t gp; |
620 | fncptr_t fptr; |
624 | } fptr; |
- | |
625 | #endif |
- | |
626 | 621 | ||
627 | symaddr = get_symbol_addr((char *) argv->buffer); |
622 | symaddr = get_symbol_addr((char *) argv->buffer); |
628 | if (!symaddr) |
623 | if (!symaddr) |
629 | printf("Symbol %s not found.\n", argv->buffer); |
624 | printf("Symbol %s not found.\n", argv->buffer); |
630 | else if (symaddr == (uintptr_t) -1) { |
625 | else if (symaddr == (uintptr_t) -1) { |
631 | symtab_print_search((char *) argv->buffer); |
626 | symtab_print_search((char *) argv->buffer); |
632 | printf("Duplicate symbol, be more specific.\n"); |
627 | printf("Duplicate symbol, be more specific.\n"); |
633 | } else { |
628 | } else { |
634 | symbol = get_symtab_entry(symaddr); |
629 | symbol = get_symtab_entry(symaddr); |
- | 630 | fnc = (unative_t (*)(void)) arch_construct_function(&fptr, (void *) symaddr, (void *) cmd_call0); |
|
635 | printf("Calling %s() (%p)\n", symbol, symaddr); |
631 | printf("Calling %s() (%p)\n", symbol, symaddr); |
636 | #ifdef ia64 |
- | |
637 | fptr.f = symaddr; |
- | |
638 | fptr.gp = ((unative_t *)cmd_call2)[1]; |
- | |
639 | f = (unative_t (*)(void)) &fptr; |
- | |
640 | #else |
- | |
641 | f = (unative_t (*)(void)) symaddr; |
- | |
642 | #endif |
- | |
643 | printf("Result: %#" PRIxn "\n", f()); |
632 | printf("Result: %#" PRIxn "\n", fnc()); |
644 | } |
633 | } |
645 | 634 | ||
646 | return 1; |
635 | return 1; |
647 | } |
636 | } |
648 | 637 | ||
Line 678... | Line 667... | ||
678 | /** Call function with one parameter */ |
667 | /** Call function with one parameter */ |
679 | int cmd_call1(cmd_arg_t *argv) |
668 | int cmd_call1(cmd_arg_t *argv) |
680 | { |
669 | { |
681 | uintptr_t symaddr; |
670 | uintptr_t symaddr; |
682 | char *symbol; |
671 | char *symbol; |
683 | unative_t (*f)(unative_t,...); |
672 | unative_t (*fnc)(unative_t, ...); |
684 | unative_t arg1 = argv[1].intval; |
673 | unative_t arg1 = argv[1].intval; |
685 | #ifdef ia64 |
- | |
686 | struct { |
- | |
687 | unative_t f; |
- | |
688 | unative_t gp; |
674 | fncptr_t fptr; |
689 | } fptr; |
- | |
690 | #endif |
- | |
691 | 675 | ||
692 | symaddr = get_symbol_addr((char *) argv->buffer); |
676 | symaddr = get_symbol_addr((char *) argv->buffer); |
693 | if (!symaddr) |
677 | if (!symaddr) |
694 | printf("Symbol %s not found.\n", argv->buffer); |
678 | printf("Symbol %s not found.\n", argv->buffer); |
695 | else if (symaddr == (uintptr_t) -1) { |
679 | else if (symaddr == (uintptr_t) -1) { |
696 | symtab_print_search((char *) argv->buffer); |
680 | symtab_print_search((char *) argv->buffer); |
697 | printf("Duplicate symbol, be more specific.\n"); |
681 | printf("Duplicate symbol, be more specific.\n"); |
698 | } else { |
682 | } else { |
699 | symbol = get_symtab_entry(symaddr); |
683 | symbol = get_symtab_entry(symaddr); |
700 | - | ||
- | 684 | fnc = (unative_t (*)(unative_t, ...)) arch_construct_function(&fptr, (void *) symaddr, (void *) cmd_call1); |
|
701 | printf("Calling f(%#" PRIxn "): %p: %s\n", arg1, symaddr, symbol); |
685 | printf("Calling f(%#" PRIxn "): %p: %s\n", arg1, symaddr, symbol); |
702 | #ifdef ia64 |
- | |
703 | fptr.f = symaddr; |
- | |
704 | fptr.gp = ((unative_t *)cmd_call2)[1]; |
- | |
705 | f = (unative_t (*)(unative_t,...)) &fptr; |
- | |
706 | #else |
- | |
707 | f = (unative_t (*)(unative_t,...)) symaddr; |
- | |
708 | #endif |
- | |
709 | printf("Result: %#" PRIxn "\n", f(arg1)); |
686 | printf("Result: %#" PRIxn "\n", fnc(arg1)); |
710 | } |
687 | } |
711 | 688 | ||
712 | return 1; |
689 | return 1; |
713 | } |
690 | } |
714 | 691 | ||
715 | /** Call function with two parameters */ |
692 | /** Call function with two parameters */ |
716 | int cmd_call2(cmd_arg_t *argv) |
693 | int cmd_call2(cmd_arg_t *argv) |
717 | { |
694 | { |
718 | uintptr_t symaddr; |
695 | uintptr_t symaddr; |
719 | char *symbol; |
696 | char *symbol; |
720 | unative_t (*f)(unative_t,unative_t,...); |
697 | unative_t (*fnc)(unative_t, unative_t, ...); |
721 | unative_t arg1 = argv[1].intval; |
698 | unative_t arg1 = argv[1].intval; |
722 | unative_t arg2 = argv[2].intval; |
699 | unative_t arg2 = argv[2].intval; |
723 | #ifdef ia64 |
- | |
724 | struct { |
- | |
725 | unative_t f; |
- | |
726 | unative_t gp; |
700 | fncptr_t fptr; |
727 | }fptr; |
- | |
728 | #endif |
- | |
729 | 701 | ||
730 | symaddr = get_symbol_addr((char *) argv->buffer); |
702 | symaddr = get_symbol_addr((char *) argv->buffer); |
731 | if (!symaddr) |
703 | if (!symaddr) |
732 | printf("Symbol %s not found.\n", argv->buffer); |
704 | printf("Symbol %s not found.\n", argv->buffer); |
733 | else if (symaddr == (uintptr_t) -1) { |
705 | else if (symaddr == (uintptr_t) -1) { |
734 | symtab_print_search((char *) argv->buffer); |
706 | symtab_print_search((char *) argv->buffer); |
735 | printf("Duplicate symbol, be more specific.\n"); |
707 | printf("Duplicate symbol, be more specific.\n"); |
736 | } else { |
708 | } else { |
737 | symbol = get_symtab_entry(symaddr); |
709 | symbol = get_symtab_entry(symaddr); |
- | 710 | fnc = (unative_t (*)(unative_t, unative_t, ...)) arch_construct_function(&fptr, (void *) symaddr, (void *) cmd_call2); |
|
738 | printf("Calling f(%#" PRIxn ", %#" PRIxn "): %p: %s\n", |
711 | printf("Calling f(%#" PRIxn ", %#" PRIxn "): %p: %s\n", |
739 | arg1, arg2, symaddr, symbol); |
712 | arg1, arg2, symaddr, symbol); |
740 | #ifdef ia64 |
- | |
741 | fptr.f = symaddr; |
- | |
742 | fptr.gp = ((unative_t *)cmd_call2)[1]; |
- | |
743 | f = (unative_t (*)(unative_t,unative_t,...)) &fptr; |
- | |
744 | #else |
- | |
745 | f = (unative_t (*)(unative_t,unative_t,...)) symaddr; |
- | |
746 | #endif |
- | |
747 | printf("Result: %#" PRIxn "\n", f(arg1, arg2)); |
713 | printf("Result: %#" PRIxn "\n", fnc(arg1, arg2)); |
748 | } |
714 | } |
749 | 715 | ||
750 | return 1; |
716 | return 1; |
751 | } |
717 | } |
752 | 718 | ||
753 | /** Call function with three parameters */ |
719 | /** Call function with three parameters */ |
754 | int cmd_call3(cmd_arg_t *argv) |
720 | int cmd_call3(cmd_arg_t *argv) |
755 | { |
721 | { |
756 | uintptr_t symaddr; |
722 | uintptr_t symaddr; |
757 | char *symbol; |
723 | char *symbol; |
758 | unative_t (*f)(unative_t,unative_t,unative_t,...); |
724 | unative_t (*fnc)(unative_t, unative_t, unative_t, ...); |
759 | unative_t arg1 = argv[1].intval; |
725 | unative_t arg1 = argv[1].intval; |
760 | unative_t arg2 = argv[2].intval; |
726 | unative_t arg2 = argv[2].intval; |
761 | unative_t arg3 = argv[3].intval; |
727 | unative_t arg3 = argv[3].intval; |
762 | #ifdef ia64 |
- | |
763 | struct { |
- | |
764 | unative_t f; |
- | |
765 | unative_t gp; |
728 | fncptr_t fptr; |
766 | }fptr; |
- | |
767 | #endif |
- | |
768 | 729 | ||
769 | symaddr = get_symbol_addr((char *) argv->buffer); |
730 | symaddr = get_symbol_addr((char *) argv->buffer); |
770 | if (!symaddr) |
731 | if (!symaddr) |
771 | printf("Symbol %s not found.\n", argv->buffer); |
732 | printf("Symbol %s not found.\n", argv->buffer); |
772 | else if (symaddr == (uintptr_t) -1) { |
733 | else if (symaddr == (uintptr_t) -1) { |
773 | symtab_print_search((char *) argv->buffer); |
734 | symtab_print_search((char *) argv->buffer); |
774 | printf("Duplicate symbol, be more specific.\n"); |
735 | printf("Duplicate symbol, be more specific.\n"); |
775 | } else { |
736 | } else { |
776 | symbol = get_symtab_entry(symaddr); |
737 | symbol = get_symtab_entry(symaddr); |
- | 738 | fnc = (unative_t (*)(unative_t, unative_t, unative_t, ...)) arch_construct_function(&fptr, (void *) symaddr, (void *) cmd_call3); |
|
777 | printf("Calling f(%#" PRIxn ",%#" PRIxn ", %#" PRIxn "): %p: %s\n", |
739 | printf("Calling f(%#" PRIxn ",%#" PRIxn ", %#" PRIxn "): %p: %s\n", |
778 | arg1, arg2, arg3, symaddr, symbol); |
740 | arg1, arg2, arg3, symaddr, symbol); |
779 | #ifdef ia64 |
- | |
780 | fptr.f = symaddr; |
- | |
781 | fptr.gp = ((unative_t *)cmd_call2)[1]; |
- | |
782 | f = (unative_t (*)(unative_t,unative_t,unative_t,...)) &fptr; |
- | |
783 | #else |
- | |
784 | f = (unative_t (*)(unative_t,unative_t,unative_t,...)) symaddr; |
- | |
785 | #endif |
- | |
786 | printf("Result: %#" PRIxn "\n", f(arg1, arg2, arg3)); |
741 | printf("Result: %#" PRIxn "\n", fnc(arg1, arg2, arg3)); |
787 | } |
742 | } |
788 | 743 | ||
789 | return 1; |
744 | return 1; |
790 | } |
745 | } |
791 | 746 | ||
Line 994... | Line 949... | ||
994 | int cmd_tests(cmd_arg_t *argv) |
949 | int cmd_tests(cmd_arg_t *argv) |
995 | { |
950 | { |
996 | test_t *test; |
951 | test_t *test; |
997 | 952 | ||
998 | for (test = tests; test->name != NULL; test++) |
953 | for (test = tests; test->name != NULL; test++) |
999 | printf("%s\t\t%s%s\n", test->name, test->desc, (test->safe ? "" : " (unsafe)")); |
954 | printf("%-10s %s%s\n", test->name, test->desc, (test->safe ? "" : " (unsafe)")); |
1000 | 955 | ||
1001 | printf("*\t\tRun all safe tests\n"); |
956 | printf("%-10s Run all safe tests\n", "*"); |
1002 | return 1; |
957 | return 1; |
1003 | } |
958 | } |
1004 | 959 | ||
1005 | static bool run_test(const test_t *test) |
960 | static bool run_test(const test_t *test) |
1006 | { |
961 | { |