Changeset e16e0d59 in mainline for kernel/generic/src/console/cmd.c
- Timestamp:
- 2009-03-17T20:33:18Z (16 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 5eb90cb
- Parents:
- b1c8dc0
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/console/cmd.c
rb1c8dc0 re16e0d59 65 65 #include <ipc/ipc.h> 66 66 #include <ipc/irq.h> 67 68 #ifdef CONFIG_SYMTAB69 67 #include <symtab.h> 70 # endif68 #include <errno.h> 71 69 72 70 #ifdef CONFIG_TEST … … 171 169 }; 172 170 173 #ifdef CONFIG_SYMTAB174 171 /* Data and methods for 'symaddr' command. */ 175 172 static int cmd_symaddr(cmd_arg_t *argv); … … 187 184 .argv = &symaddr_argv 188 185 }; 189 #endif190 186 191 187 static char set_buf[MAX_CMDLINE+1]; … … 464 460 &set4_info, 465 461 &slabs_info, 466 #ifdef CONFIG_SYMTAB467 462 &symaddr_info, 468 #endif469 463 &sched_info, 470 464 &threads_info, … … 613 607 } 614 608 615 #ifdef CONFIG_SYMTAB616 617 609 /** Search symbol table */ 618 610 int cmd_symaddr(cmd_arg_t *argv) … … 623 615 } 624 616 625 #endif626 627 617 /** Call function with zero parameters */ 628 618 int cmd_call0(cmd_arg_t *argv) 629 619 { 630 #ifdef CONFIG_SYMTAB631 620 uintptr_t symaddr; 621 char *symbol; 632 622 unative_t (*fnc)(void); 633 623 fncptr_t fptr; 634 635 symaddr = get_symbol_addr((char *) argv->buffer); 636 if (!symaddr) 637 printf("Symbol %s not found.\n", argv->buffer); 638 else if (symaddr == (uintptr_t) -1) { 639 symtab_print_search((char *) argv->buffer); 624 int rc; 625 626 symbol = (char *) argv->buffer; 627 rc = symtab_addr_lookup(symbol, &symaddr); 628 629 if (rc == ENOENT) 630 printf("Symbol %s not found.\n", symbol); 631 else if (rc == EOVERFLOW) { 632 symtab_print_search(symbol); 640 633 printf("Duplicate symbol, be more specific.\n"); 634 } else if (rc == EOK) { 635 fnc = (unative_t (*)(void)) arch_construct_function(&fptr, 636 (void *) symaddr, (void *) cmd_call0); 637 printf("Calling %s() (%p)\n", symbol, symaddr); 638 printf("Result: %#" PRIxn "\n", fnc()); 641 639 } else { 642 fnc = (unative_t (*)(void)) arch_construct_function(&fptr, (void *) symaddr, (void *) cmd_call0); 643 printf("Calling %s() (%p)\n", argv->buffer, symaddr); 644 printf("Result: %#" PRIxn "\n", fnc()); 645 } 646 #endif 640 printf("No symbol information available.\n"); 641 } 647 642 return 1; 648 643 } … … 680 675 int cmd_call1(cmd_arg_t *argv) 681 676 { 682 #ifdef CONFIG_SYMTAB683 677 uintptr_t symaddr; 684 678 char *symbol; … … 686 680 unative_t arg1 = argv[1].intval; 687 681 fncptr_t fptr; 688 689 symaddr = get_symbol_addr((char *) argv->buffer); 690 691 if (!symaddr) 692 printf("Symbol %s not found.\n", argv->buffer); 693 else if (symaddr == (uintptr_t) -1) { 694 symtab_print_search((char *) argv->buffer); 682 int rc; 683 684 symbol = (char *) argv->buffer; 685 rc = symtab_addr_lookup(symbol, &symaddr); 686 687 if (rc == ENOENT) { 688 printf("Symbol %s not found.\n", symbol); 689 } else if (rc == EOVERFLOW) { 690 symtab_print_search(symbol); 695 691 printf("Duplicate symbol, be more specific.\n"); 696 } else { 697 symbol = get_symtab_entry(symaddr); 692 } else if (rc == EOK) { 698 693 fnc = (unative_t (*)(unative_t, ...)) arch_construct_function(&fptr, (void *) symaddr, (void *) cmd_call1); 699 694 printf("Calling f(%#" PRIxn "): %p: %s\n", arg1, symaddr, symbol); 700 695 printf("Result: %#" PRIxn "\n", fnc(arg1)); 701 } 702 #endif 696 } else { 697 printf("No symbol information available.\n"); 698 } 699 703 700 return 1; 704 701 } … … 707 704 int cmd_call2(cmd_arg_t *argv) 708 705 { 709 #ifdef CONFIG_SYMTAB710 706 uintptr_t symaddr; 711 707 char *symbol; … … 714 710 unative_t arg2 = argv[2].intval; 715 711 fncptr_t fptr; 716 717 symaddr = get_symbol_addr((char *) argv->buffer); 718 if (!symaddr) 719 printf("Symbol %s not found.\n", argv->buffer); 720 else if (symaddr == (uintptr_t) -1) { 721 symtab_print_search((char *) argv->buffer); 712 int rc; 713 714 symbol = (char *) argv->buffer; 715 rc = symtab_addr_lookup(symbol, &symaddr); 716 717 if (rc == ENOENT) { 718 printf("Symbol %s not found.\n", symbol); 719 } else if (rc == EOVERFLOW) { 720 symtab_print_search(symbol); 722 721 printf("Duplicate symbol, be more specific.\n"); 723 } else { 724 symbol = get_symtab_entry(symaddr); 722 } else if (rc == EOK) { 725 723 fnc = (unative_t (*)(unative_t, unative_t, ...)) arch_construct_function(&fptr, (void *) symaddr, (void *) cmd_call2); 726 724 printf("Calling f(%#" PRIxn ", %#" PRIxn "): %p: %s\n", 727 725 arg1, arg2, symaddr, symbol); 728 726 printf("Result: %#" PRIxn "\n", fnc(arg1, arg2)); 729 } 730 #endif 727 } else { 728 printf("No symbol information available.\n"); 729 } 731 730 return 1; 732 731 } … … 735 734 int cmd_call3(cmd_arg_t *argv) 736 735 { 737 #ifdef CONFIG_SYMTAB738 736 uintptr_t symaddr; 739 737 char *symbol; … … 743 741 unative_t arg3 = argv[3].intval; 744 742 fncptr_t fptr; 745 746 symaddr = get_symbol_addr((char *) argv->buffer); 747 if (!symaddr) 748 printf("Symbol %s not found.\n", argv->buffer); 749 else if (symaddr == (uintptr_t) -1) { 750 symtab_print_search((char *) argv->buffer); 743 int rc; 744 745 symbol = (char *) argv->buffer; 746 rc = symtab_addr_lookup(symbol, &symaddr); 747 748 if (rc == ENOENT) { 749 printf("Symbol %s not found.\n", symbol); 750 } else if (rc == EOVERFLOW) { 751 symtab_print_search(symbol); 751 752 printf("Duplicate symbol, be more specific.\n"); 752 } else { 753 symbol = get_symtab_entry(symaddr); 753 } else if (rc == EOK) { 754 754 fnc = (unative_t (*)(unative_t, unative_t, unative_t, ...)) arch_construct_function(&fptr, (void *) symaddr, (void *) cmd_call3); 755 755 printf("Calling f(%#" PRIxn ",%#" PRIxn ", %#" PRIxn "): %p: %s\n", 756 756 arg1, arg2, arg3, symaddr, symbol); 757 757 printf("Result: %#" PRIxn "\n", fnc(arg1, arg2, arg3)); 758 } 759 #endif 758 } else { 759 printf("No symbol information available.\n"); 760 } 760 761 return 1; 761 762 } … … 807 808 int cmd_set4(cmd_arg_t *argv) 808 809 { 809 uint 32_t *addr;810 uintptr_t addr; 810 811 uint32_t arg1 = argv[1].intval; 811 812 bool pointer = false; 813 int rc; 812 814 813 815 if (((char *)argv->buffer)[0] == '*') { 814 #ifdef CONFIG_SYMTAB 815 addr = (uint32_t *) get_symbol_addr((char *) argv->buffer + 1); 816 #else 817 addr = 0; 818 #endif 816 rc = symtab_addr_lookup((char *) argv->buffer + 1, &addr); 819 817 pointer = true; 820 818 } else if (((char *) argv->buffer)[0] >= '0' && 821 819 ((char *)argv->buffer)[0] <= '9') { 822 addr = (uint32_t *)atoi((char *)argv->buffer); 820 rc = EOK; 821 addr = atoi((char *)argv->buffer); 823 822 } else { 824 #ifdef CONFIG_SYMTAB 825 addr = (uint32_t *)get_symbol_addr((char *) argv->buffer); 826 #else 827 addr = 0; 828 #endif 829 } 830 831 if (!addr) 823 rc = symtab_addr_lookup((char *) argv->buffer, &addr); 824 } 825 826 if (rc == ENOENT) 832 827 printf("Symbol %s not found.\n", argv->buffer); 833 else if (addr == (uint32_t *) -1) { 834 #ifdef CONFIG_SYMTAB 828 else if (rc == EOVERFLOW) { 835 829 symtab_print_search((char *) argv->buffer); 836 #endif837 830 printf("Duplicate symbol, be more specific.\n"); 831 } else if (rc == EOK) { 832 if (pointer) 833 addr = *(uintptr_t *) addr; 834 printf("Writing %#" PRIx64 " -> %p\n", arg1, addr); 835 *(uint32_t *) addr = arg1; 838 836 } else { 839 if (pointer) 840 addr = (uint32_t *)(*(unative_t *)addr); 841 printf("Writing %#" PRIx64 " -> %p\n", arg1, addr); 842 *addr = arg1; 843 837 printf("No symbol information available.\n"); 844 838 } 845 839
Note:
See TracChangeset
for help on using the changeset viewer.