Changes in kernel/generic/src/console/cmd.c [6eef3c4:593e023] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/console/cmd.c
r6eef3c4 r593e023 45 45 #include <console/kconsole.h> 46 46 #include <print.h> 47 #include <log.h> 47 48 #include <panic.h> 48 49 #include <typedefs.h> … … 56 57 #include <cpu.h> 57 58 #include <mm/tlb.h> 59 #include <mm/km.h> 58 60 #include <arch/mm/tlb.h> 59 61 #include <mm/frame.h> … … 81 83 .func = cmd_help, 82 84 .argc = 0 85 }; 86 87 /* Data and methods for pio_read_8 command */ 88 static int cmd_pio_read_8(cmd_arg_t *argv); 89 static cmd_arg_t pio_read_8_argv[] = { { .type = ARG_TYPE_INT } }; 90 static cmd_info_t pio_read_8_info = { 91 .name = "pio_read_8", 92 .description = "pio_read_8 <address> Read 1 byte from memory (or port).", 93 .func = cmd_pio_read_8, 94 .argc = 1, 95 .argv = pio_read_8_argv 96 }; 97 98 /* Data and methods for pio_read_16 command */ 99 static int cmd_pio_read_16(cmd_arg_t *argv); 100 static cmd_arg_t pio_read_16_argv[] = { { .type = ARG_TYPE_INT } }; 101 static cmd_info_t pio_read_16_info = { 102 .name = "pio_read_16", 103 .description = "pio_read_16 <address> Read 2 bytes from memory (or port).", 104 .func = cmd_pio_read_16, 105 .argc = 1, 106 .argv = pio_read_16_argv 107 }; 108 109 /* Data and methods for pio_read_32 command */ 110 static int cmd_pio_read_32(cmd_arg_t *argv); 111 static cmd_arg_t pio_read_32_argv[] = { { .type = ARG_TYPE_INT } }; 112 static cmd_info_t pio_read_32_info = { 113 .name = "pio_read_32", 114 .description = "pio_read_32 <address> Read 4 bytes from memory (or port).", 115 .func = cmd_pio_read_32, 116 .argc = 1, 117 .argv = pio_read_32_argv 118 }; 119 120 /* Data and methods for pio_write_8 command */ 121 static int cmd_pio_write_8(cmd_arg_t *argv); 122 static cmd_arg_t pio_write_8_argv[] = { 123 { .type = ARG_TYPE_INT }, 124 { .type = ARG_TYPE_INT } 125 }; 126 static cmd_info_t pio_write_8_info = { 127 .name = "pio_write_8", 128 .description = "pio_write_8 <address> <value> Write 1 byte to memory (or port).", 129 .func = cmd_pio_write_8, 130 .argc = 2, 131 .argv = pio_write_8_argv 132 }; 133 134 /* Data and methods for pio_write_16 command */ 135 static int cmd_pio_write_16(cmd_arg_t *argv); 136 static cmd_arg_t pio_write_16_argv[] = { 137 { .type = ARG_TYPE_INT }, 138 { .type = ARG_TYPE_INT } 139 }; 140 static cmd_info_t pio_write_16_info = { 141 .name = "pio_write_16", 142 .description = "pio_write_16 <address> <value> Write 2 bytes to memory (or port).", 143 .func = cmd_pio_write_16, 144 .argc = 2, 145 .argv = pio_write_16_argv 146 }; 147 148 /* Data and methods for pio_write_32 command */ 149 static int cmd_pio_write_32(cmd_arg_t *argv); 150 static cmd_arg_t pio_write_32_argv[] = { 151 { .type = ARG_TYPE_INT }, 152 { .type = ARG_TYPE_INT } 153 }; 154 static cmd_info_t pio_write_32_info = { 155 .name = "pio_write_32", 156 .description = "pio_write_32 <address> <value> Write 4 bytes to memory (or port).", 157 .func = cmd_pio_write_32, 158 .argc = 2, 159 .argv = pio_write_32_argv 83 160 }; 84 161 … … 531 608 &btrace_info, 532 609 #endif 610 &pio_read_8_info, 611 &pio_read_16_info, 612 &pio_read_32_info, 613 &pio_write_8_info, 614 &pio_write_16_info, 615 &pio_write_32_info, 533 616 NULL 534 617 }; … … 557 640 for (i = 0; basic_commands[i]; i++) { 558 641 if (!cmd_register(basic_commands[i])) { 559 printf("Cannot register command %s\n", 642 log(LF_OTHER, LVL_ERROR, 643 "Cannot register command %s", 560 644 basic_commands[i]->name); 561 645 } … … 574 658 575 659 size_t len = 0; 576 list_foreach(cmd_list, cur) { 577 cmd_info_t *hlp; 578 hlp = list_get_instance(cur, cmd_info_t, link); 579 660 list_foreach(cmd_list, link, cmd_info_t, hlp) { 580 661 spinlock_lock(&hlp->lock); 581 662 if (str_length(hlp->name) > len) … … 586 667 unsigned int _len = (unsigned int) len; 587 668 if ((_len != len) || (((int) _len) < 0)) { 588 printf("Command length overflow\n");669 log(LF_OTHER, LVL_ERROR, "Command length overflow"); 589 670 return 1; 590 671 } 591 672 592 list_foreach(cmd_list, cur) { 593 cmd_info_t *hlp; 594 hlp = list_get_instance(cur, cmd_info_t, link); 595 673 list_foreach(cmd_list, link, cmd_info_t, hlp) { 596 674 spinlock_lock(&hlp->lock); 597 675 printf("%-*s %s\n", _len, hlp->name, hlp->description); … … 604 682 } 605 683 684 /** Read 1 byte from phys memory or io port. 685 * 686 * @param argv Argument vector. 687 * 688 * @return 0 on failure, 1 on success. 689 */ 690 static int cmd_pio_read_8(cmd_arg_t *argv) 691 { 692 uint8_t *ptr = NULL; 693 694 #ifdef IO_SPACE_BOUNDARY 695 if ((void *) argv->intval < IO_SPACE_BOUNDARY) 696 ptr = (void *) argv[0].intval; 697 else 698 #endif 699 ptr = (uint8_t *) km_map(argv[0].intval, sizeof(uint8_t), 700 PAGE_NOT_CACHEABLE); 701 702 const uint8_t val = pio_read_8(ptr); 703 printf("read %" PRIxn ": %" PRIx8 "\n", argv[0].intval, val); 704 705 #ifdef IO_SPACE_BOUNDARY 706 if ((void *) argv->intval < IO_SPACE_BOUNDARY) 707 return 1; 708 #endif 709 710 km_unmap((uintptr_t) ptr, sizeof(uint8_t)); 711 return 1; 712 } 713 714 /** Read 2 bytes from phys memory or io port. 715 * 716 * @param argv Argument vector. 717 * 718 * @return 0 on failure, 1 on success. 719 */ 720 static int cmd_pio_read_16(cmd_arg_t *argv) 721 { 722 uint16_t *ptr = NULL; 723 724 #ifdef IO_SPACE_BOUNDARY 725 if ((void *) argv->intval < IO_SPACE_BOUNDARY) 726 ptr = (void *) argv[0].intval; 727 else 728 #endif 729 ptr = (uint16_t *) km_map(argv[0].intval, sizeof(uint16_t), 730 PAGE_NOT_CACHEABLE); 731 732 const uint16_t val = pio_read_16(ptr); 733 printf("read %" PRIxn ": %" PRIx16 "\n", argv[0].intval, val); 734 735 #ifdef IO_SPACE_BOUNDARY 736 if ((void *) argv->intval < IO_SPACE_BOUNDARY) 737 return 1; 738 #endif 739 740 km_unmap((uintptr_t) ptr, sizeof(uint16_t)); 741 return 1; 742 } 743 744 /** Read 4 bytes from phys memory or io port. 745 * 746 * @param argv Argument vector. 747 * 748 * @return 0 on failure, 1 on success. 749 */ 750 static int cmd_pio_read_32(cmd_arg_t *argv) 751 { 752 uint32_t *ptr = NULL; 753 754 #ifdef IO_SPACE_BOUNDARY 755 if ((void *) argv->intval < IO_SPACE_BOUNDARY) 756 ptr = (void *) argv[0].intval; 757 else 758 #endif 759 ptr = (uint32_t *) km_map(argv[0].intval, sizeof(uint32_t), 760 PAGE_NOT_CACHEABLE); 761 762 const uint32_t val = pio_read_32(ptr); 763 printf("read %" PRIxn ": %" PRIx32 "\n", argv[0].intval, val); 764 765 #ifdef IO_SPACE_BOUNDARY 766 if ((void *) argv->intval < IO_SPACE_BOUNDARY) 767 return 1; 768 #endif 769 770 km_unmap((uintptr_t) ptr, sizeof(uint32_t)); 771 return 1; 772 } 773 774 /** Write 1 byte to phys memory or io port. 775 * 776 * @param argv Argument vector. 777 * 778 * @return 0 on failure, 1 on success. 779 */ 780 static int cmd_pio_write_8(cmd_arg_t *argv) 781 { 782 uint8_t *ptr = NULL; 783 784 #ifdef IO_SPACE_BOUNDARY 785 if ((void *) argv->intval < IO_SPACE_BOUNDARY) 786 ptr = (void *) argv[0].intval; 787 else 788 #endif 789 ptr = (uint8_t *) km_map(argv[0].intval, sizeof(uint8_t), 790 PAGE_NOT_CACHEABLE); 791 792 printf("write %" PRIxn ": %" PRIx8 "\n", argv[0].intval, 793 (uint8_t) argv[1].intval); 794 pio_write_8(ptr, (uint8_t) argv[1].intval); 795 796 #ifdef IO_SPACE_BOUNDARY 797 if ((void *) argv->intval < IO_SPACE_BOUNDARY) 798 return 1; 799 #endif 800 801 km_unmap((uintptr_t) ptr, sizeof(uint8_t)); 802 return 1; 803 } 804 805 /** Write 2 bytes to phys memory or io port. 806 * 807 * @param argv Argument vector. 808 * 809 * @return 0 on failure, 1 on success. 810 */ 811 static int cmd_pio_write_16(cmd_arg_t *argv) 812 { 813 uint16_t *ptr = NULL; 814 815 #ifdef IO_SPACE_BOUNDARY 816 if ((void *) argv->intval < IO_SPACE_BOUNDARY) 817 ptr = (void *) argv[0].intval; 818 else 819 #endif 820 ptr = (uint16_t *) km_map(argv[0].intval, sizeof(uint16_t), 821 PAGE_NOT_CACHEABLE); 822 823 printf("write %" PRIxn ": %" PRIx16 "\n", argv[0].intval, 824 (uint16_t) argv[1].intval); 825 pio_write_16(ptr, (uint16_t) argv[1].intval); 826 827 #ifdef IO_SPACE_BOUNDARY 828 if ((void *) argv->intval < IO_SPACE_BOUNDARY) 829 return 1; 830 #endif 831 832 km_unmap((uintptr_t) ptr, sizeof(uint16_t)); 833 return 1; 834 } 835 836 /** Write 4 bytes to phys memory or io port. 837 * 838 * @param argv Argument vector. 839 * 840 * @return 0 on failure, 1 on success. 841 */ 842 static int cmd_pio_write_32(cmd_arg_t *argv) 843 { 844 uint32_t *ptr = NULL; 845 846 #ifdef IO_SPACE_BOUNDARY 847 if ((void *) argv->intval < IO_SPACE_BOUNDARY) 848 ptr = (void *) argv[0].intval; 849 else 850 #endif 851 ptr = (uint32_t *) km_map(argv[0].intval, sizeof(uint32_t), 852 PAGE_NOT_CACHEABLE); 853 854 printf("write %" PRIxn ": %" PRIx32 "\n", argv[0].intval, 855 (uint32_t) argv[1].intval); 856 pio_write_32(ptr, (uint32_t) argv[1].intval); 857 858 #ifdef IO_SPACE_BOUNDARY 859 if ((void *) argv->intval < IO_SPACE_BOUNDARY) 860 return 1; 861 #endif 862 863 km_unmap((uintptr_t) ptr, sizeof(uint32_t)); 864 return 1; 865 } 866 606 867 /** Reboot the system. 607 868 * … … 647 908 spinlock_lock(&cmd_lock); 648 909 649 list_foreach(cmd_list, cur) { 650 cmd_info_t *hlp; 651 652 hlp = list_get_instance(cur, cmd_info_t, link); 910 list_foreach(cmd_list, link, cmd_info_t, hlp) { 653 911 spinlock_lock(&hlp->lock); 654 912 … … 891 1149 int cmd_set4(cmd_arg_t *argv) 892 1150 { 893 uintptr_t addr ;1151 uintptr_t addr = 0; // Prevent -Werror=maybe-uninitialized 894 1152 uint32_t arg1 = argv[1].intval; 895 1153 bool pointer = false; … … 1099 1357 printf("The kernel will now relinquish the console.\n"); 1100 1358 release_console(); 1101 1102 event_notify_0(EVENT_KCONSOLE, false);1103 1359 indev_pop_character(stdin); 1104 1360
Note:
See TracChangeset
for help on using the changeset viewer.