Subversion Repositories HelenOS

Rev

Rev 4347 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4347 Rev 4348
Line 29... Line 29...
29
/** @addtogroup genericconsole
29
/** @addtogroup genericconsole
30
 * @{
30
 * @{
31
 */
31
 */
32
 
32
 
33
/**
33
/**
34
 * @file    cmd.c
34
 * @file  cmd.c
35
 * @brief   Kernel console command wrappers.
35
 * @brief Kernel console command wrappers.
36
 *
36
 *
37
 * This file is meant to contain all wrapper functions for
37
 * This file is meant to contain all wrapper functions for
38
 * all kconsole commands. The point is in separating
38
 * all kconsole commands. The point is in separating
39
 * kconsole specific wrappers from kconsole-unaware functions
39
 * kconsole specific wrappers from kconsole-unaware functions
40
 * from other subsystems.
40
 * from other subsystems.
Line 62... Line 62...
62
#include <proc/scheduler.h>
62
#include <proc/scheduler.h>
63
#include <proc/thread.h>
63
#include <proc/thread.h>
64
#include <proc/task.h>
64
#include <proc/task.h>
65
#include <ipc/ipc.h>
65
#include <ipc/ipc.h>
66
#include <ipc/irq.h>
66
#include <ipc/irq.h>
67
#include <event/event.h>
67
#include <ipc/event.h>
68
#include <symtab.h>
68
#include <symtab.h>
69
#include <errno.h>
69
#include <errno.h>
70
 
70
 
71
#ifdef CONFIG_TEST
71
#ifdef CONFIG_TEST
72
#include <test.h>
72
#include <test.h>
Line 511... Line 511...
511
int cmd_help(cmd_arg_t *argv)
511
int cmd_help(cmd_arg_t *argv)
512
{
512
{
513
    spinlock_lock(&cmd_lock);
513
    spinlock_lock(&cmd_lock);
514
   
514
   
515
    link_t *cur;
515
    link_t *cur;
516
    size_t len = 0;
516
    count_t len = 0;
517
    for (cur = cmd_head.next; cur != &cmd_head; cur = cur->next) {
517
    for (cur = cmd_head.next; cur != &cmd_head; cur = cur->next) {
518
        cmd_info_t *hlp;
518
        cmd_info_t *hlp;
519
        hlp = list_get_instance(cur, cmd_info_t, link);
519
        hlp = list_get_instance(cur, cmd_info_t, link);
520
       
520
       
521
        spinlock_lock(&hlp->lock);
521
        spinlock_lock(&hlp->lock);
522
        if (strlen(hlp->name) > len)
522
        if (str_length(hlp->name) > len)
523
            len = strlen(hlp->name);
523
            len = str_length(hlp->name);
524
        spinlock_unlock(&hlp->lock);
524
        spinlock_unlock(&hlp->lock);
525
    }
525
    }
526
   
526
   
527
    for (cur = cmd_head.next; cur != &cmd_head; cur = cur->next) {
527
    for (cur = cmd_head.next; cur != &cmd_head; cur = cur->next) {
528
        cmd_info_t *hlp;
528
        cmd_info_t *hlp;
Line 580... Line 580...
580
 * @return 0 on failure, 1 on success.
580
 * @return 0 on failure, 1 on success.
581
 */
581
 */
582
int cmd_desc(cmd_arg_t *argv)
582
int cmd_desc(cmd_arg_t *argv)
583
{
583
{
584
    link_t *cur;
584
    link_t *cur;
585
 
585
   
586
    spinlock_lock(&cmd_lock);
586
    spinlock_lock(&cmd_lock);
587
   
587
   
588
    for (cur = cmd_head.next; cur != &cmd_head; cur = cur->next) {
588
    for (cur = cmd_head.next; cur != &cmd_head; cur = cur->next) {
589
        cmd_info_t *hlp;
589
        cmd_info_t *hlp;
590
       
590
       
591
        hlp = list_get_instance(cur, cmd_info_t, link);
591
        hlp = list_get_instance(cur, cmd_info_t, link);
592
        spinlock_lock(&hlp->lock);
592
        spinlock_lock(&hlp->lock);
593
 
593
       
594
        if (strncmp(hlp->name, (const char *) argv->buffer, strlen(hlp->name)) == 0) {
594
        if (str_lcmp(hlp->name, (const char *) argv->buffer, str_length(hlp->name)) == 0) {
595
            printf("%s - %s\n", hlp->name, hlp->description);
595
            printf("%s - %s\n", hlp->name, hlp->description);
596
            if (hlp->help)
596
            if (hlp->help)
597
                hlp->help();
597
                hlp->help();
598
            spinlock_unlock(&hlp->lock);
598
            spinlock_unlock(&hlp->lock);
599
            break;
599
            break;
600
        }
600
        }
601
 
601
       
602
        spinlock_unlock(&hlp->lock);
602
        spinlock_unlock(&hlp->lock);
603
    }
603
    }
604
   
604
   
605
    spinlock_unlock(&cmd_lock);
605
    spinlock_unlock(&cmd_lock);
606
 
606
   
607
    return 1;
607
    return 1;
608
}
608
}
609
 
609
 
610
/** Search symbol table */
610
/** Search symbol table */
611
int cmd_symaddr(cmd_arg_t *argv)
611
int cmd_symaddr(cmd_arg_t *argv)
Line 954... Line 954...
954
{
954
{
955
    printf("The kernel will now relinquish the console.\n");
955
    printf("The kernel will now relinquish the console.\n");
956
    release_console();
956
    release_console();
957
   
957
   
958
    event_notify_0(EVENT_KCONSOLE);
958
    event_notify_0(EVENT_KCONSOLE);
-
 
959
    indev_pop_character(stdin);
959
   
960
   
960
    return 1;
961
    return 1;
961
}
962
}
962
 
963
 
963
#ifdef CONFIG_TEST
964
#ifdef CONFIG_TEST
Line 967... Line 968...
967
 *
968
 *
968
 * return Always 1.
969
 * return Always 1.
969
 */
970
 */
970
int cmd_tests(cmd_arg_t *argv)
971
int cmd_tests(cmd_arg_t *argv)
971
{
972
{
972
    size_t len = 0;
973
    count_t len = 0;
973
    test_t *test;
974
    test_t *test;
974
    for (test = tests; test->name != NULL; test++) {
975
    for (test = tests; test->name != NULL; test++) {
975
        if (strlen(test->name) > len)
976
        if (str_length(test->name) > len)
976
            len = strlen(test->name);
977
            len = str_length(test->name);
977
    }
978
    }
978
   
979
   
979
    for (test = tests; test->name != NULL; test++)
980
    for (test = tests; test->name != NULL; test++)
980
        printf("%-*s %s%s\n", len, test->name, test->desc, (test->safe ? "" : " (unsafe)"));
981
        printf("%-*s %s%s\n", len, test->name, test->desc, (test->safe ? "" : " (unsafe)"));
981
   
982
   
Line 994... Line 995...
994
    uint64_t t0 = task_get_accounting(TASK);
995
    uint64_t t0 = task_get_accounting(TASK);
995
    spinlock_unlock(&TASK->lock);
996
    spinlock_unlock(&TASK->lock);
996
    interrupts_restore(ipl);
997
    interrupts_restore(ipl);
997
   
998
   
998
    /* Execute the test */
999
    /* Execute the test */
-
 
1000
    test_quiet = false;
999
    char * ret = test->entry(false);
1001
    char *ret = test->entry();
1000
   
1002
   
1001
    /* Update and read thread accounting */
1003
    /* Update and read thread accounting */
1002
    ipl = interrupts_disable();
1004
    ipl = interrupts_disable();
1003
    spinlock_lock(&TASK->lock);
1005
    spinlock_lock(&TASK->lock);
1004
    uint64_t dt = task_get_accounting(TASK) - t0;
1006
    uint64_t dt = task_get_accounting(TASK) - t0;
Line 1046... Line 1048...
1046
        uint64_t t0 = task_get_accounting(TASK);
1048
        uint64_t t0 = task_get_accounting(TASK);
1047
        spinlock_unlock(&TASK->lock);
1049
        spinlock_unlock(&TASK->lock);
1048
        interrupts_restore(ipl);
1050
        interrupts_restore(ipl);
1049
       
1051
       
1050
        /* Execute the test */
1052
        /* Execute the test */
-
 
1053
        test_quiet = true;
1051
        char * ret = test->entry(true);
1054
        char * ret = test->entry();
1052
       
1055
       
1053
        /* Update and read thread accounting */
1056
        /* Update and read thread accounting */
1054
        ipl = interrupts_disable();
1057
        ipl = interrupts_disable();
1055
        spinlock_lock(&TASK->lock);
1058
        spinlock_lock(&TASK->lock);
1056
        uint64_t dt = task_get_accounting(TASK) - t0;
1059
        uint64_t dt = task_get_accounting(TASK) - t0;
Line 1094... Line 1097...
1094
 */
1097
 */
1095
int cmd_test(cmd_arg_t *argv)
1098
int cmd_test(cmd_arg_t *argv)
1096
{
1099
{
1097
    test_t *test;
1100
    test_t *test;
1098
   
1101
   
1099
    if (strcmp((char *) argv->buffer, "*") == 0) {
1102
    if (str_cmp((char *) argv->buffer, "*") == 0) {
1100
        for (test = tests; test->name != NULL; test++) {
1103
        for (test = tests; test->name != NULL; test++) {
1101
            if (test->safe) {
1104
            if (test->safe) {
1102
                printf("\n");
1105
                printf("\n");
1103
                if (!run_test(test))
1106
                if (!run_test(test))
1104
                    break;
1107
                    break;
Line 1106... Line 1109...
1106
        }
1109
        }
1107
    } else {
1110
    } else {
1108
        bool fnd = false;
1111
        bool fnd = false;
1109
       
1112
       
1110
        for (test = tests; test->name != NULL; test++) {
1113
        for (test = tests; test->name != NULL; test++) {
1111
            if (strcmp(test->name, (char *) argv->buffer) == 0) {
1114
            if (str_cmp(test->name, (char *) argv->buffer) == 0) {
1112
                fnd = true;
1115
                fnd = true;
1113
                run_test(test);
1116
                run_test(test);
1114
                break;
1117
                break;
1115
            }
1118
            }
1116
        }
1119
        }
Line 1131... Line 1134...
1131
int cmd_bench(cmd_arg_t *argv)
1134
int cmd_bench(cmd_arg_t *argv)
1132
{
1135
{
1133
    test_t *test;
1136
    test_t *test;
1134
    uint32_t cnt = argv[1].intval;
1137
    uint32_t cnt = argv[1].intval;
1135
   
1138
   
1136
    bool fnd = false;
1139
    if (str_cmp((char *) argv->buffer, "*") == 0) {
1137
   
-
 
1138
    for (test = tests; test->name != NULL; test++) {
1140
        for (test = tests; test->name != NULL; test++) {
1139
        if (strcmp(test->name, (char *) argv->buffer) == 0) {
-
 
1140
            fnd = true;
-
 
1141
           
-
 
1142
            if (test->safe)
1141
            if (test->safe) {
1143
                run_bench(test, cnt);
1142
                if (!run_bench(test, cnt))
1144
            else
1143
                    break;
1145
                printf("Unsafe test\n");
-
 
1146
           
1144
            }
1147
            break;
-
 
1148
        }
1145
        }
1149
    }
1146
    } else {
-
 
1147
        bool fnd = false;
1150
       
1148
       
-
 
1149
        for (test = tests; test->name != NULL; test++) {
-
 
1150
            if (str_cmp(test->name, (char *) argv->buffer) == 0) {
-
 
1151
                fnd = true;
-
 
1152
               
-
 
1153
                if (test->safe)
-
 
1154
                    run_bench(test, cnt);
-
 
1155
                else
-
 
1156
                    printf("Unsafe test\n");
-
 
1157
               
-
 
1158
                break;
-
 
1159
            }
-
 
1160
        }
-
 
1161
       
1151
    if (!fnd)
1162
        if (!fnd)
1152
        printf("Unknown test\n");
1163
            printf("Unknown test\n");
-
 
1164
    }
1153
 
1165
   
1154
    return 1;
1166
    return 1;
1155
}
1167
}
1156
 
1168
 
1157
#endif
1169
#endif
1158
 
1170