Changeset a35b458 in mainline for kernel/generic/src/console/cmd.c
- Timestamp:
- 2018-03-02T20:10:49Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f1380b7
- Parents:
- 3061bc1
- git-author:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-02-28 17:38:31)
- git-committer:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-03-02 20:10:49)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/console/cmd.c
r3061bc1 ra35b458 686 686 { 687 687 spinlock_lock(&cmd_lock); 688 688 689 689 size_t len = 0; 690 690 list_foreach(cmd_list, link, cmd_info_t, hlp) { … … 694 694 spinlock_unlock(&hlp->lock); 695 695 } 696 696 697 697 unsigned int _len = (unsigned int) len; 698 698 if ((_len != len) || (((int) _len) < 0)) { … … 700 700 return 1; 701 701 } 702 702 703 703 list_foreach(cmd_list, link, cmd_info_t, hlp) { 704 704 spinlock_lock(&hlp->lock); … … 706 706 spinlock_unlock(&hlp->lock); 707 707 } 708 708 709 709 spinlock_unlock(&cmd_lock); 710 710 711 711 return 1; 712 712 } … … 721 721 { 722 722 uint8_t *ptr = NULL; 723 723 724 724 #ifdef IO_SPACE_BOUNDARY 725 725 if ((void *) argv->intval < IO_SPACE_BOUNDARY) … … 729 729 ptr = (uint8_t *) km_map(argv[0].intval, sizeof(uint8_t), 730 730 PAGE_NOT_CACHEABLE); 731 731 732 732 const uint8_t val = pio_read_8(ptr); 733 733 printf("read %" PRIxn ": %" PRIx8 "\n", argv[0].intval, val); 734 734 735 735 #ifdef IO_SPACE_BOUNDARY 736 736 if ((void *) argv->intval < IO_SPACE_BOUNDARY) 737 737 return 1; 738 738 #endif 739 739 740 740 km_unmap((uintptr_t) ptr, sizeof(uint8_t)); 741 741 return 1; … … 751 751 { 752 752 uint16_t *ptr = NULL; 753 753 754 754 #ifdef IO_SPACE_BOUNDARY 755 755 if ((void *) argv->intval < IO_SPACE_BOUNDARY) … … 759 759 ptr = (uint16_t *) km_map(argv[0].intval, sizeof(uint16_t), 760 760 PAGE_NOT_CACHEABLE); 761 761 762 762 const uint16_t val = pio_read_16(ptr); 763 763 printf("read %" PRIxn ": %" PRIx16 "\n", argv[0].intval, val); 764 764 765 765 #ifdef IO_SPACE_BOUNDARY 766 766 if ((void *) argv->intval < IO_SPACE_BOUNDARY) 767 767 return 1; 768 768 #endif 769 769 770 770 km_unmap((uintptr_t) ptr, sizeof(uint16_t)); 771 771 return 1; … … 781 781 { 782 782 uint32_t *ptr = NULL; 783 783 784 784 #ifdef IO_SPACE_BOUNDARY 785 785 if ((void *) argv->intval < IO_SPACE_BOUNDARY) … … 789 789 ptr = (uint32_t *) km_map(argv[0].intval, sizeof(uint32_t), 790 790 PAGE_NOT_CACHEABLE); 791 791 792 792 const uint32_t val = pio_read_32(ptr); 793 793 printf("read %" PRIxn ": %" PRIx32 "\n", argv[0].intval, val); 794 794 795 795 #ifdef IO_SPACE_BOUNDARY 796 796 if ((void *) argv->intval < IO_SPACE_BOUNDARY) 797 797 return 1; 798 798 #endif 799 799 800 800 km_unmap((uintptr_t) ptr, sizeof(uint32_t)); 801 801 return 1; … … 811 811 { 812 812 uint8_t *ptr = NULL; 813 813 814 814 #ifdef IO_SPACE_BOUNDARY 815 815 if ((void *) argv->intval < IO_SPACE_BOUNDARY) … … 819 819 ptr = (uint8_t *) km_map(argv[0].intval, sizeof(uint8_t), 820 820 PAGE_NOT_CACHEABLE); 821 821 822 822 printf("write %" PRIxn ": %" PRIx8 "\n", argv[0].intval, 823 823 (uint8_t) argv[1].intval); 824 824 pio_write_8(ptr, (uint8_t) argv[1].intval); 825 825 826 826 #ifdef IO_SPACE_BOUNDARY 827 827 if ((void *) argv->intval < IO_SPACE_BOUNDARY) 828 828 return 1; 829 829 #endif 830 830 831 831 km_unmap((uintptr_t) ptr, sizeof(uint8_t)); 832 832 return 1; … … 842 842 { 843 843 uint16_t *ptr = NULL; 844 844 845 845 #ifdef IO_SPACE_BOUNDARY 846 846 if ((void *) argv->intval < IO_SPACE_BOUNDARY) … … 850 850 ptr = (uint16_t *) km_map(argv[0].intval, sizeof(uint16_t), 851 851 PAGE_NOT_CACHEABLE); 852 852 853 853 printf("write %" PRIxn ": %" PRIx16 "\n", argv[0].intval, 854 854 (uint16_t) argv[1].intval); 855 855 pio_write_16(ptr, (uint16_t) argv[1].intval); 856 856 857 857 #ifdef IO_SPACE_BOUNDARY 858 858 if ((void *) argv->intval < IO_SPACE_BOUNDARY) 859 859 return 1; 860 860 #endif 861 861 862 862 km_unmap((uintptr_t) ptr, sizeof(uint16_t)); 863 863 return 1; … … 873 873 { 874 874 uint32_t *ptr = NULL; 875 875 876 876 #ifdef IO_SPACE_BOUNDARY 877 877 if ((void *) argv->intval < IO_SPACE_BOUNDARY) … … 881 881 ptr = (uint32_t *) km_map(argv[0].intval, sizeof(uint32_t), 882 882 PAGE_NOT_CACHEABLE); 883 883 884 884 printf("write %" PRIxn ": %" PRIx32 "\n", argv[0].intval, 885 885 (uint32_t) argv[1].intval); 886 886 pio_write_32(ptr, (uint32_t) argv[1].intval); 887 887 888 888 #ifdef IO_SPACE_BOUNDARY 889 889 if ((void *) argv->intval < IO_SPACE_BOUNDARY) 890 890 return 1; 891 891 #endif 892 892 893 893 km_unmap((uintptr_t) ptr, sizeof(uint32_t)); 894 894 return 1; … … 904 904 { 905 905 reboot(); 906 906 907 907 /* Not reached */ 908 908 return 1; … … 918 918 { 919 919 assert(uptime); 920 920 921 921 /* This doesn't have to be very accurate */ 922 922 sysarg_t sec = uptime->seconds1; 923 923 924 924 printf("Up %" PRIun " days, %" PRIun " hours, %" PRIun " minutes, %" PRIun " seconds\n", 925 925 sec / 86400, (sec % 86400) / 3600, (sec % 3600) / 60, sec % 60); 926 926 927 927 return 1; 928 928 } … … 937 937 { 938 938 spinlock_lock(&cmd_lock); 939 939 940 940 list_foreach(cmd_list, link, cmd_info_t, hlp) { 941 941 spinlock_lock(&hlp->lock); 942 942 943 943 if (str_lcmp(hlp->name, (const char *) argv->buffer, str_length(hlp->name)) == 0) { 944 944 printf("%s - %s\n", hlp->name, hlp->description); … … 948 948 break; 949 949 } 950 950 951 951 spinlock_unlock(&hlp->lock); 952 952 } 953 953 954 954 spinlock_unlock(&cmd_lock); 955 955 956 956 return 1; 957 957 } … … 961 961 { 962 962 symtab_print_search((char *) argv->buffer); 963 963 964 964 return 1; 965 965 } … … 1004 1004 * call the function. 1005 1005 */ 1006 1006 1007 1007 unsigned int i; 1008 1008 for (i = 0; i < config.cpu_count; i++) { 1009 1009 if (!cpus[i].active) 1010 1010 continue; 1011 1011 1012 1012 thread_t *thread; 1013 1013 if ((thread = thread_create((void (*)(void *)) cmd_call0, … … 1021 1021 printf("Unable to create thread for cpu%u\n", i); 1022 1022 } 1023 1023 1024 1024 return 1; 1025 1025 } … … 1108 1108 fncptr_t fptr; 1109 1109 errno_t rc; 1110 1110 1111 1111 symbol = (char *) argv->buffer; 1112 1112 rc = symtab_addr_lookup(symbol, &symaddr); … … 1183 1183 bool pointer = false; 1184 1184 errno_t rc; 1185 1185 1186 1186 if (((char *) argv->buffer)[0] == '*') { 1187 1187 rc = symtab_addr_lookup((char *) argv->buffer + 1, &addr); … … 1195 1195 } else 1196 1196 rc = symtab_addr_lookup((char *) argv->buffer, &addr); 1197 1197 1198 1198 if (rc == ENOENT) 1199 1199 printf("Symbol %s not found.\n", (char *) argv->buffer); … … 1210 1210 } else 1211 1211 printf("No symbol information available.\n"); 1212 1212 1213 1213 return 1; 1214 1214 } … … 1252 1252 else 1253 1253 printf("Unknown argument \"%s\".\n", flag_buf); 1254 1254 1255 1255 return 1; 1256 1256 } … … 1270 1270 else 1271 1271 printf("Unknown argument \"%s\".\n", flag_buf); 1272 1272 1273 1273 return 1; 1274 1274 } … … 1412 1412 release_console(); 1413 1413 indev_pop_character(stdin); 1414 1414 1415 1415 return 1; 1416 1416 } … … 1420 1420 { 1421 1421 printf("%s (%s)\n", test->name, test->desc); 1422 1422 1423 1423 /* Update and read thread accounting 1424 1424 for benchmarking */ … … 1427 1427 task_get_accounting(TASK, &ucycles0, &kcycles0); 1428 1428 irq_spinlock_unlock(&TASK->lock, true); 1429 1429 1430 1430 /* Execute the test */ 1431 1431 test_quiet = false; 1432 1432 const char *ret = test->entry(); 1433 1433 1434 1434 /* Update and read thread accounting */ 1435 1435 uint64_t ucycles1, kcycles1; … … 1437 1437 task_get_accounting(TASK, &ucycles1, &kcycles1); 1438 1438 irq_spinlock_unlock(&TASK->lock, true); 1439 1439 1440 1440 uint64_t ucycles, kcycles; 1441 1441 char usuffix, ksuffix; 1442 1442 order_suffix(ucycles1 - ucycles0, &ucycles, &usuffix); 1443 1443 order_suffix(kcycles1 - kcycles0, &kcycles, &ksuffix); 1444 1444 1445 1445 printf("Time: %" PRIu64 "%c user cycles, %" PRIu64 "%c kernel cycles\n", 1446 1446 ucycles, usuffix, kcycles, ksuffix); 1447 1447 1448 1448 if (ret == NULL) { 1449 1449 printf("Test passed\n"); 1450 1450 return true; 1451 1451 } 1452 1452 1453 1453 printf("%s\n", ret); 1454 1454 return false; … … 1461 1461 uint64_t ucycles, kcycles; 1462 1462 char usuffix, ksuffix; 1463 1463 1464 1464 if (cnt < 1) 1465 1465 return true; 1466 1466 1467 1467 uint64_t *data = (uint64_t *) malloc(sizeof(uint64_t) * cnt, 0); 1468 1468 if (data == NULL) { … … 1470 1470 return false; 1471 1471 } 1472 1472 1473 1473 for (i = 0; i < cnt; i++) { 1474 1474 printf("%s (%u/%u) ... ", test->name, i + 1, cnt); 1475 1475 1476 1476 /* Update and read thread accounting 1477 1477 for benchmarking */ … … 1480 1480 task_get_accounting(TASK, &ucycles0, &kcycles0); 1481 1481 irq_spinlock_unlock(&TASK->lock, true); 1482 1482 1483 1483 /* Execute the test */ 1484 1484 test_quiet = true; 1485 1485 const char *test_ret = test->entry(); 1486 1486 1487 1487 /* Update and read thread accounting */ 1488 1488 irq_spinlock_lock(&TASK->lock, true); … … 1490 1490 task_get_accounting(TASK, &ucycles1, &kcycles1); 1491 1491 irq_spinlock_unlock(&TASK->lock, true); 1492 1492 1493 1493 if (test_ret != NULL) { 1494 1494 printf("%s\n", test_ret); … … 1496 1496 break; 1497 1497 } 1498 1498 1499 1499 data[i] = ucycles1 - ucycles0 + kcycles1 - kcycles0; 1500 1500 order_suffix(ucycles1 - ucycles0, &ucycles, &usuffix); … … 1503 1503 ucycles, usuffix, kcycles, ksuffix); 1504 1504 } 1505 1505 1506 1506 if (ret) { 1507 1507 printf("\n"); 1508 1508 1509 1509 uint64_t sum = 0; 1510 1510 1511 1511 for (i = 0; i < cnt; i++) { 1512 1512 sum += data[i]; 1513 1513 } 1514 1514 1515 1515 order_suffix(sum / (uint64_t) cnt, &ucycles, &usuffix); 1516 1516 printf("Average\t\t%" PRIu64 "%c\n", ucycles, usuffix); 1517 1517 } 1518 1518 1519 1519 free(data); 1520 1520 1521 1521 return ret; 1522 1522 } … … 1526 1526 size_t len = 0; 1527 1527 test_t *test; 1528 1528 1529 1529 for (test = tests; test->name != NULL; test++) { 1530 1530 if (str_length(test->name) > len) 1531 1531 len = str_length(test->name); 1532 1532 } 1533 1533 1534 1534 unsigned int _len = (unsigned int) len; 1535 1535 if ((_len != len) || (((int) _len) < 0)) { … … 1537 1537 return; 1538 1538 } 1539 1539 1540 1540 for (test = tests; test->name != NULL; test++) 1541 1541 printf("%-*s %s%s\n", _len, test->name, test->desc, 1542 1542 (test->safe ? "" : " (unsafe)")); 1543 1543 1544 1544 printf("%-*s Run all safe tests\n", _len, "*"); 1545 1545 } … … 1555 1555 { 1556 1556 test_t *test; 1557 1557 1558 1558 if (str_cmp((char *) argv->buffer, "*") == 0) { 1559 1559 for (test = tests; test->name != NULL; test++) { … … 1566 1566 } else if (str_cmp((char *) argv->buffer, "") != 0) { 1567 1567 bool fnd = false; 1568 1568 1569 1569 for (test = tests; test->name != NULL; test++) { 1570 1570 if (str_cmp(test->name, (char *) argv->buffer) == 0) { … … 1574 1574 } 1575 1575 } 1576 1576 1577 1577 if (!fnd) 1578 1578 printf("Unknown test\n"); 1579 1579 } else 1580 1580 list_tests(); 1581 1581 1582 1582 return 1; 1583 1583 } … … 1593 1593 test_t *test; 1594 1594 uint32_t cnt = argv[1].intval; 1595 1595 1596 1596 if (str_cmp((char *) argv->buffer, "*") == 0) { 1597 1597 for (test = tests; test->name != NULL; test++) { … … 1603 1603 } else { 1604 1604 bool fnd = false; 1605 1605 1606 1606 for (test = tests; test->name != NULL; test++) { 1607 1607 if (str_cmp(test->name, (char *) argv->buffer) == 0) { 1608 1608 fnd = true; 1609 1609 1610 1610 if (test->safe) 1611 1611 run_bench(test, cnt); 1612 1612 else 1613 1613 printf("Unsafe test\n"); 1614 1614 1615 1615 break; 1616 1616 } 1617 1617 } 1618 1618 1619 1619 if (!fnd) 1620 1620 printf("Unknown test\n"); 1621 1621 } 1622 1622 1623 1623 return 1; 1624 1624 }
Note:
See TracChangeset
for help on using the changeset viewer.