Rev 3022 | Rev 4156 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3022 | Rev 4055 | ||
---|---|---|---|
Line 48... | Line 48... | ||
48 | #include <arch/types.h> |
48 | #include <arch/types.h> |
49 | #include <adt/list.h> |
49 | #include <adt/list.h> |
50 | #include <arch.h> |
50 | #include <arch.h> |
51 | #include <config.h> |
51 | #include <config.h> |
52 | #include <func.h> |
52 | #include <func.h> |
- | 53 | #include <string.h> |
|
53 | #include <macros.h> |
54 | #include <macros.h> |
54 | #include <debug.h> |
55 | #include <debug.h> |
55 | #include <symtab.h> |
56 | #include <symtab.h> |
56 | #include <cpu.h> |
57 | #include <cpu.h> |
57 | #include <mm/tlb.h> |
58 | #include <mm/tlb.h> |
Line 396... | Line 397... | ||
396 | .description = "List of memory zones.", |
397 | .description = "List of memory zones.", |
397 | .func = cmd_zones, |
398 | .func = cmd_zones, |
398 | .argc = 0 |
399 | .argc = 0 |
399 | }; |
400 | }; |
400 | 401 | ||
401 | /* Data and methods for 'ipc_task' command */ |
402 | /* Data and methods for 'ipc' command */ |
402 | static int cmd_ipc_task(cmd_arg_t *argv); |
403 | static int cmd_ipc(cmd_arg_t *argv); |
403 | static cmd_arg_t ipc_task_argv = { |
404 | static cmd_arg_t ipc_argv = { |
404 | .type = ARG_TYPE_INT, |
405 | .type = ARG_TYPE_INT, |
405 | }; |
406 | }; |
406 | static cmd_info_t ipc_task_info = { |
407 | static cmd_info_t ipc_info = { |
407 | .name = "ipc_task", |
408 | .name = "ipc", |
408 | .description = "ipc_task <taskid> Show IPC information of given task.", |
409 | .description = "ipc <taskid> Show IPC information of given task.", |
409 | .func = cmd_ipc_task, |
410 | .func = cmd_ipc, |
410 | .argc = 1, |
411 | .argc = 1, |
411 | .argv = &ipc_task_argv |
412 | .argv = &ipc_argv |
412 | }; |
413 | }; |
413 | 414 | ||
414 | /* Data and methods for 'zone' command */ |
415 | /* Data and methods for 'zone' command */ |
415 | static int cmd_zone(cmd_arg_t *argv); |
416 | static int cmd_zone(cmd_arg_t *argv); |
416 | static cmd_arg_t zone_argv = { |
417 | static cmd_arg_t zone_argv = { |
Line 459... | Line 460... | ||
459 | &exit_info, |
460 | &exit_info, |
460 | &reboot_info, |
461 | &reboot_info, |
461 | &uptime_info, |
462 | &uptime_info, |
462 | &halt_info, |
463 | &halt_info, |
463 | &help_info, |
464 | &help_info, |
464 | &ipc_task_info, |
465 | &ipc_info, |
465 | &set4_info, |
466 | &set4_info, |
466 | &slabs_info, |
467 | &slabs_info, |
467 | &symaddr_info, |
468 | &symaddr_info, |
468 | &sched_info, |
469 | &sched_info, |
469 | &threads_info, |
470 | &threads_info, |
Line 499... | Line 500... | ||
499 | unsigned int i; |
500 | unsigned int i; |
500 | 501 | ||
501 | for (i = 0; basic_commands[i]; i++) { |
502 | for (i = 0; basic_commands[i]; i++) { |
502 | cmd_initialize(basic_commands[i]); |
503 | cmd_initialize(basic_commands[i]); |
503 | if (!cmd_register(basic_commands[i])) |
504 | if (!cmd_register(basic_commands[i])) |
504 | panic("could not register command %s\n", basic_commands[i]->name); |
505 | printf("Cannot register command %s\n", basic_commands[i]->name); |
505 | } |
506 | } |
506 | } |
507 | } |
507 | 508 | ||
508 | 509 | ||
509 | /** List supported commands. |
510 | /** List supported commands. |
Line 512... | Line 513... | ||
512 | * |
513 | * |
513 | * @return 0 on failure, 1 on success. |
514 | * @return 0 on failure, 1 on success. |
514 | */ |
515 | */ |
515 | int cmd_help(cmd_arg_t *argv) |
516 | int cmd_help(cmd_arg_t *argv) |
516 | { |
517 | { |
517 | link_t *cur; |
- | |
518 | - | ||
519 | spinlock_lock(&cmd_lock); |
518 | spinlock_lock(&cmd_lock); |
520 | 519 | ||
- | 520 | link_t *cur; |
|
- | 521 | size_t len = 0; |
|
521 | for (cur = cmd_head.next; cur != &cmd_head; cur = cur->next) { |
522 | for (cur = cmd_head.next; cur != &cmd_head; cur = cur->next) { |
522 | cmd_info_t *hlp; |
523 | cmd_info_t *hlp; |
523 | - | ||
524 | hlp = list_get_instance(cur, cmd_info_t, link); |
524 | hlp = list_get_instance(cur, cmd_info_t, link); |
- | 525 | ||
525 | spinlock_lock(&hlp->lock); |
526 | spinlock_lock(&hlp->lock); |
- | 527 | if (strlen(hlp->name) > len) |
|
- | 528 | len = strlen(hlp->name); |
|
- | 529 | spinlock_unlock(&hlp->lock); |
|
- | 530 | } |
|
- | 531 | ||
- | 532 | for (cur = cmd_head.next; cur != &cmd_head; cur = cur->next) { |
|
- | 533 | cmd_info_t *hlp; |
|
- | 534 | hlp = list_get_instance(cur, cmd_info_t, link); |
|
526 | 535 | ||
- | 536 | spinlock_lock(&hlp->lock); |
|
527 | printf("%s - %s\n", hlp->name, hlp->description); |
537 | printf("%-*s %s\n", len, hlp->name, hlp->description); |
528 | - | ||
529 | spinlock_unlock(&hlp->lock); |
538 | spinlock_unlock(&hlp->lock); |
530 | } |
539 | } |
531 | 540 | ||
532 | spinlock_unlock(&cmd_lock); |
541 | spinlock_unlock(&cmd_lock); |
533 | 542 | ||
534 | return 1; |
543 | return 1; |
535 | } |
544 | } |
536 | 545 | ||
537 | 546 | ||
538 | /** Reboot the system. |
547 | /** Reboot the system. |
Line 561... | Line 570... | ||
561 | ASSERT(uptime); |
570 | ASSERT(uptime); |
562 | 571 | ||
563 | /* This doesn't have to be very accurate */ |
572 | /* This doesn't have to be very accurate */ |
564 | unative_t sec = uptime->seconds1; |
573 | unative_t sec = uptime->seconds1; |
565 | 574 | ||
566 | printf("Up %u days, %u hours, %u minutes, %u seconds\n", |
575 | printf("Up %" PRIun " days, %" PRIun " hours, %" PRIun " minutes, %" PRIun " seconds\n", |
567 | sec / 86400, (sec % 86400) / 3600, (sec % 3600) / 60, sec % 60); |
576 | sec / 86400, (sec % 86400) / 3600, (sec % 3600) / 60, sec % 60); |
568 | 577 | ||
569 | return 1; |
578 | return 1; |
570 | } |
579 | } |
571 | 580 | ||
Line 614... | Line 623... | ||
614 | /** Call function with zero parameters */ |
623 | /** Call function with zero parameters */ |
615 | int cmd_call0(cmd_arg_t *argv) |
624 | int cmd_call0(cmd_arg_t *argv) |
616 | { |
625 | { |
617 | uintptr_t symaddr; |
626 | uintptr_t symaddr; |
618 | char *symbol; |
627 | char *symbol; |
619 | unative_t (*f)(void); |
628 | unative_t (*fnc)(void); |
620 | #ifdef ia64 |
- | |
621 | struct { |
- | |
622 | unative_t f; |
- | |
623 | unative_t gp; |
629 | fncptr_t fptr; |
624 | } fptr; |
- | |
625 | #endif |
- | |
626 | 630 | ||
627 | symaddr = get_symbol_addr((char *) argv->buffer); |
631 | symaddr = get_symbol_addr((char *) argv->buffer); |
628 | if (!symaddr) |
632 | if (!symaddr) |
629 | printf("Symbol %s not found.\n", argv->buffer); |
633 | printf("Symbol %s not found.\n", argv->buffer); |
630 | else if (symaddr == (uintptr_t) -1) { |
634 | else if (symaddr == (uintptr_t) -1) { |
631 | symtab_print_search((char *) argv->buffer); |
635 | symtab_print_search((char *) argv->buffer); |
632 | printf("Duplicate symbol, be more specific.\n"); |
636 | printf("Duplicate symbol, be more specific.\n"); |
633 | } else { |
637 | } else { |
634 | symbol = get_symtab_entry(symaddr); |
638 | symbol = get_symtab_entry(symaddr); |
635 | printf("Calling %s() (%.*p)\n", symbol, sizeof(uintptr_t) * 2, symaddr); |
639 | fnc = (unative_t (*)(void)) arch_construct_function(&fptr, (void *) symaddr, (void *) cmd_call0); |
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; |
640 | printf("Calling %s() (%p)\n", symbol, symaddr); |
642 | #endif |
- | |
643 | printf("Result: %#zx\n", f()); |
641 | printf("Result: %#" PRIxn "\n", fnc()); |
644 | } |
642 | } |
645 | 643 | ||
646 | return 1; |
644 | return 1; |
647 | } |
645 | } |
648 | 646 | ||
Line 678... | Line 676... | ||
678 | /** Call function with one parameter */ |
676 | /** Call function with one parameter */ |
679 | int cmd_call1(cmd_arg_t *argv) |
677 | int cmd_call1(cmd_arg_t *argv) |
680 | { |
678 | { |
681 | uintptr_t symaddr; |
679 | uintptr_t symaddr; |
682 | char *symbol; |
680 | char *symbol; |
683 | unative_t (*f)(unative_t,...); |
681 | unative_t (*fnc)(unative_t, ...); |
684 | unative_t arg1 = argv[1].intval; |
682 | unative_t arg1 = argv[1].intval; |
685 | #ifdef ia64 |
- | |
686 | struct { |
- | |
687 | unative_t f; |
- | |
688 | unative_t gp; |
683 | fncptr_t fptr; |
689 | }fptr; |
- | |
690 | #endif |
- | |
691 | 684 | ||
692 | symaddr = get_symbol_addr((char *) argv->buffer); |
685 | symaddr = get_symbol_addr((char *) argv->buffer); |
693 | if (!symaddr) |
686 | if (!symaddr) |
694 | printf("Symbol %s not found.\n", argv->buffer); |
687 | printf("Symbol %s not found.\n", argv->buffer); |
695 | else if (symaddr == (uintptr_t) -1) { |
688 | else if (symaddr == (uintptr_t) -1) { |
696 | symtab_print_search((char *) argv->buffer); |
689 | symtab_print_search((char *) argv->buffer); |
697 | printf("Duplicate symbol, be more specific.\n"); |
690 | printf("Duplicate symbol, be more specific.\n"); |
698 | } else { |
691 | } else { |
699 | symbol = get_symtab_entry(symaddr); |
692 | symbol = get_symtab_entry(symaddr); |
700 | - | ||
701 | printf("Calling f(%#zx): %.*p: %s\n", arg1, sizeof(uintptr_t) * 2, symaddr, symbol); |
693 | fnc = (unative_t (*)(unative_t, ...)) arch_construct_function(&fptr, (void *) symaddr, (void *) cmd_call1); |
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; |
694 | printf("Calling f(%#" PRIxn "): %p: %s\n", arg1, symaddr, symbol); |
708 | #endif |
- | |
709 | printf("Result: %#zx\n", f(arg1)); |
695 | printf("Result: %#" PRIxn "\n", fnc(arg1)); |
710 | } |
696 | } |
711 | 697 | ||
712 | return 1; |
698 | return 1; |
713 | } |
699 | } |
714 | 700 | ||
715 | /** Call function with two parameters */ |
701 | /** Call function with two parameters */ |
716 | int cmd_call2(cmd_arg_t *argv) |
702 | int cmd_call2(cmd_arg_t *argv) |
717 | { |
703 | { |
718 | uintptr_t symaddr; |
704 | uintptr_t symaddr; |
719 | char *symbol; |
705 | char *symbol; |
720 | unative_t (*f)(unative_t,unative_t,...); |
706 | unative_t (*fnc)(unative_t, unative_t, ...); |
721 | unative_t arg1 = argv[1].intval; |
707 | unative_t arg1 = argv[1].intval; |
722 | unative_t arg2 = argv[2].intval; |
708 | unative_t arg2 = argv[2].intval; |
723 | #ifdef ia64 |
- | |
724 | struct { |
- | |
725 | unative_t f; |
- | |
726 | unative_t gp; |
709 | fncptr_t fptr; |
727 | }fptr; |
- | |
728 | #endif |
- | |
729 | 710 | ||
730 | symaddr = get_symbol_addr((char *) argv->buffer); |
711 | symaddr = get_symbol_addr((char *) argv->buffer); |
731 | if (!symaddr) |
712 | if (!symaddr) |
732 | printf("Symbol %s not found.\n", argv->buffer); |
713 | printf("Symbol %s not found.\n", argv->buffer); |
733 | else if (symaddr == (uintptr_t) -1) { |
714 | else if (symaddr == (uintptr_t) -1) { |
734 | symtab_print_search((char *) argv->buffer); |
715 | symtab_print_search((char *) argv->buffer); |
735 | printf("Duplicate symbol, be more specific.\n"); |
716 | printf("Duplicate symbol, be more specific.\n"); |
736 | } else { |
717 | } else { |
737 | symbol = get_symtab_entry(symaddr); |
718 | symbol = get_symtab_entry(symaddr); |
- | 719 | fnc = (unative_t (*)(unative_t, unative_t, ...)) arch_construct_function(&fptr, (void *) symaddr, (void *) cmd_call2); |
|
738 | printf("Calling f(0x%zx,0x%zx): %.*p: %s\n", |
720 | printf("Calling f(%#" PRIxn ", %#" PRIxn "): %p: %s\n", |
739 | arg1, arg2, sizeof(uintptr_t) * 2, symaddr, symbol); |
721 | 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: %#zx\n", f(arg1, arg2)); |
722 | printf("Result: %#" PRIxn "\n", fnc(arg1, arg2)); |
748 | } |
723 | } |
749 | 724 | ||
750 | return 1; |
725 | return 1; |
751 | } |
726 | } |
752 | 727 | ||
753 | /** Call function with three parameters */ |
728 | /** Call function with three parameters */ |
754 | int cmd_call3(cmd_arg_t *argv) |
729 | int cmd_call3(cmd_arg_t *argv) |
755 | { |
730 | { |
756 | uintptr_t symaddr; |
731 | uintptr_t symaddr; |
757 | char *symbol; |
732 | char *symbol; |
758 | unative_t (*f)(unative_t,unative_t,unative_t,...); |
733 | unative_t (*fnc)(unative_t, unative_t, unative_t, ...); |
759 | unative_t arg1 = argv[1].intval; |
734 | unative_t arg1 = argv[1].intval; |
760 | unative_t arg2 = argv[2].intval; |
735 | unative_t arg2 = argv[2].intval; |
761 | unative_t arg3 = argv[3].intval; |
736 | unative_t arg3 = argv[3].intval; |
762 | #ifdef ia64 |
- | |
763 | struct { |
- | |
764 | unative_t f; |
- | |
765 | unative_t gp; |
737 | fncptr_t fptr; |
766 | }fptr; |
- | |
767 | #endif |
- | |
768 | 738 | ||
769 | symaddr = get_symbol_addr((char *) argv->buffer); |
739 | symaddr = get_symbol_addr((char *) argv->buffer); |
770 | if (!symaddr) |
740 | if (!symaddr) |
771 | printf("Symbol %s not found.\n", argv->buffer); |
741 | printf("Symbol %s not found.\n", argv->buffer); |
772 | else if (symaddr == (uintptr_t) -1) { |
742 | else if (symaddr == (uintptr_t) -1) { |
773 | symtab_print_search((char *) argv->buffer); |
743 | symtab_print_search((char *) argv->buffer); |
774 | printf("Duplicate symbol, be more specific.\n"); |
744 | printf("Duplicate symbol, be more specific.\n"); |
775 | } else { |
745 | } else { |
776 | symbol = get_symtab_entry(symaddr); |
746 | symbol = get_symtab_entry(symaddr); |
- | 747 | fnc = (unative_t (*)(unative_t, unative_t, unative_t, ...)) arch_construct_function(&fptr, (void *) symaddr, (void *) cmd_call3); |
|
777 | printf("Calling f(0x%zx,0x%zx, 0x%zx): %.*p: %s\n", |
748 | printf("Calling f(%#" PRIxn ",%#" PRIxn ", %#" PRIxn "): %p: %s\n", |
778 | arg1, arg2, arg3, sizeof(uintptr_t) * 2, symaddr, symbol); |
749 | 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: %#zx\n", f(arg1, arg2, arg3)); |
750 | printf("Result: %#" PRIxn "\n", fnc(arg1, arg2, arg3)); |
787 | } |
751 | } |
788 | 752 | ||
789 | return 1; |
753 | return 1; |
790 | } |
754 | } |
791 | 755 | ||
Line 854... | Line 818... | ||
854 | symtab_print_search((char *) argv->buffer); |
818 | symtab_print_search((char *) argv->buffer); |
855 | printf("Duplicate symbol, be more specific.\n"); |
819 | printf("Duplicate symbol, be more specific.\n"); |
856 | } else { |
820 | } else { |
857 | if (pointer) |
821 | if (pointer) |
858 | addr = (uint32_t *)(*(unative_t *)addr); |
822 | addr = (uint32_t *)(*(unative_t *)addr); |
859 | printf("Writing 0x%x -> %.*p\n", arg1, sizeof(uintptr_t) * 2, addr); |
823 | printf("Writing %#" PRIx64 " -> %p\n", arg1, addr); |
860 | *addr = arg1; |
824 | *addr = arg1; |
861 | 825 | ||
862 | } |
826 | } |
863 | 827 | ||
864 | return 1; |
828 | return 1; |
Line 935... | Line 899... | ||
935 | * |
899 | * |
936 | * @param argv Integer argument from cmdline expected |
900 | * @param argv Integer argument from cmdline expected |
937 | * |
901 | * |
938 | * return Always 1 |
902 | * return Always 1 |
939 | */ |
903 | */ |
940 | int cmd_ipc_task(cmd_arg_t * argv) { |
904 | int cmd_ipc(cmd_arg_t * argv) { |
941 | ipc_print_task(argv[0].intval); |
905 | ipc_print_task(argv[0].intval); |
942 | return 1; |
906 | return 1; |
943 | } |
907 | } |
944 | 908 | ||
945 | 909 | ||
Line 974... | Line 938... | ||
974 | * return Always 1. |
938 | * return Always 1. |
975 | */ |
939 | */ |
976 | int cmd_continue(cmd_arg_t *argv) |
940 | int cmd_continue(cmd_arg_t *argv) |
977 | { |
941 | { |
978 | printf("The kernel will now relinquish the console.\n"); |
942 | printf("The kernel will now relinquish the console.\n"); |
- | 943 | release_console(); |
|
- | 944 | ||
979 | printf("Use userspace controls to redraw the screen.\n"); |
945 | if ((kconsole_notify) && (kconsole_irq.notif_cfg.notify)) |
980 | arch_release_console(); |
946 | ipc_irq_send_msg_0(&kconsole_irq); |
- | 947 | ||
981 | return 1; |
948 | return 1; |
982 | } |
949 | } |
983 | 950 | ||
984 | #ifdef CONFIG_TEST |
951 | #ifdef CONFIG_TEST |
985 | /** Command for printing kernel tests list. |
952 | /** Command for printing kernel tests list. |
Line 988... | Line 955... | ||
988 | * |
955 | * |
989 | * return Always 1. |
956 | * return Always 1. |
990 | */ |
957 | */ |
991 | int cmd_tests(cmd_arg_t *argv) |
958 | int cmd_tests(cmd_arg_t *argv) |
992 | { |
959 | { |
- | 960 | size_t len = 0; |
|
993 | test_t *test; |
961 | test_t *test; |
- | 962 | for (test = tests; test->name != NULL; test++) { |
|
- | 963 | if (strlen(test->name) > len) |
|
- | 964 | len = strlen(test->name); |
|
- | 965 | } |
|
994 | 966 | ||
995 | for (test = tests; test->name != NULL; test++) |
967 | for (test = tests; test->name != NULL; test++) |
996 | printf("%s\t\t%s%s\n", test->name, test->desc, (test->safe ? "" : " (unsafe)")); |
968 | printf("%-*s %s%s\n", len, test->name, test->desc, (test->safe ? "" : " (unsafe)")); |
997 | 969 | ||
998 | printf("*\t\tRun all safe tests\n"); |
970 | printf("%-*s Run all safe tests\n", len, "*"); |
999 | return 1; |
971 | return 1; |
1000 | } |
972 | } |
1001 | 973 | ||
1002 | static bool run_test(const test_t *test) |
974 | static bool run_test(const test_t *test) |
1003 | { |
975 | { |
1004 | printf("%s\t\t%s\n", test->name, test->desc); |
976 | printf("%s (%s)\n", test->name, test->desc); |
1005 | 977 | ||
1006 | /* Update and read thread accounting |
978 | /* Update and read thread accounting |
1007 | for benchmarking */ |
979 | for benchmarking */ |
1008 | ipl_t ipl = interrupts_disable(); |
980 | ipl_t ipl = interrupts_disable(); |
1009 | spinlock_lock(&TASK->lock); |
981 | spinlock_lock(&TASK->lock); |
Line 1023... | Line 995... | ||
1023 | 995 | ||
1024 | uint64_t cycles; |
996 | uint64_t cycles; |
1025 | char suffix; |
997 | char suffix; |
1026 | order(dt, &cycles, &suffix); |
998 | order(dt, &cycles, &suffix); |
1027 | 999 | ||
1028 | printf("Time: %llu%c cycles\n", cycles, suffix); |
1000 | printf("Time: %" PRIu64 "%c cycles\n", cycles, suffix); |
1029 | 1001 | ||
1030 | if (ret == NULL) { |
1002 | if (ret == NULL) { |
1031 | printf("Test passed\n"); |
1003 | printf("Test passed\n"); |
1032 | return true; |
1004 | return true; |
1033 | } |
1005 | } |
Line 1051... | Line 1023... | ||
1051 | printf("Error allocating memory for statistics\n"); |
1023 | printf("Error allocating memory for statistics\n"); |
1052 | return false; |
1024 | return false; |
1053 | } |
1025 | } |
1054 | 1026 | ||
1055 | for (i = 0; i < cnt; i++) { |
1027 | for (i = 0; i < cnt; i++) { |
1056 | printf("%s (%d/%d) ... ", test->name, i + 1, cnt); |
1028 | printf("%s (%u/%u) ... ", test->name, i + 1, cnt); |
1057 | 1029 | ||
1058 | /* Update and read thread accounting |
1030 | /* Update and read thread accounting |
1059 | for benchmarking */ |
1031 | for benchmarking */ |
1060 | ipl_t ipl = interrupts_disable(); |
1032 | ipl_t ipl = interrupts_disable(); |
1061 | spinlock_lock(&TASK->lock); |
1033 | spinlock_lock(&TASK->lock); |
Line 1079... | Line 1051... | ||
1079 | break; |
1051 | break; |
1080 | } |
1052 | } |
1081 | 1053 | ||
1082 | data[i] = dt; |
1054 | data[i] = dt; |
1083 | order(dt, &cycles, &suffix); |
1055 | order(dt, &cycles, &suffix); |
1084 | printf("OK (%llu%c cycles)\n", cycles, suffix); |
1056 | printf("OK (%" PRIu64 "%c cycles)\n", cycles, suffix); |
1085 | } |
1057 | } |
1086 | 1058 | ||
1087 | if (ret) { |
1059 | if (ret) { |
1088 | printf("\n"); |
1060 | printf("\n"); |
1089 | 1061 | ||
Line 1092... | Line 1064... | ||
1092 | for (i = 0; i < cnt; i++) { |
1064 | for (i = 0; i < cnt; i++) { |
1093 | sum += data[i]; |
1065 | sum += data[i]; |
1094 | } |
1066 | } |
1095 | 1067 | ||
1096 | order(sum / (uint64_t) cnt, &cycles, &suffix); |
1068 | order(sum / (uint64_t) cnt, &cycles, &suffix); |
1097 | printf("Average\t\t%llu%c\n", cycles, suffix); |
1069 | printf("Average\t\t%" PRIu64 "%c\n", cycles, suffix); |
1098 | } |
1070 | } |
1099 | 1071 | ||
1100 | free(data); |
1072 | free(data); |
1101 | 1073 | ||
1102 | return ret; |
1074 | return ret; |