Rev 2131 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2131 | Rev 2307 | ||
---|---|---|---|
Line 46... | Line 46... | ||
46 | #include <print.h> |
46 | #include <print.h> |
47 | #include <panic.h> |
47 | #include <panic.h> |
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 <func.h> |
52 | #include <func.h> |
52 | #include <macros.h> |
53 | #include <macros.h> |
53 | #include <debug.h> |
54 | #include <debug.h> |
54 | #include <symtab.h> |
55 | #include <symtab.h> |
55 | #include <cpu.h> |
56 | #include <cpu.h> |
Line 77... | Line 78... | ||
77 | .argc = 0 |
78 | .argc = 0 |
78 | }; |
79 | }; |
79 | 80 | ||
80 | static cmd_info_t exit_info = { |
81 | static cmd_info_t exit_info = { |
81 | .name = "exit", |
82 | .name = "exit", |
82 | .description = "Exit kconsole", |
83 | .description = "Exit kconsole.", |
- | 84 | .argc = 0 |
|
- | 85 | }; |
|
- | 86 | ||
- | 87 | static int cmd_reboot(cmd_arg_t *argv); |
|
- | 88 | static cmd_info_t reboot_info = { |
|
- | 89 | .name = "reboot", |
|
- | 90 | .description = "Reboot.", |
|
- | 91 | .func = cmd_reboot, |
|
- | 92 | .argc = 0 |
|
- | 93 | }; |
|
- | 94 | ||
- | 95 | static int cmd_uptime(cmd_arg_t *argv); |
|
- | 96 | static cmd_info_t uptime_info = { |
|
- | 97 | .name = "uptime", |
|
- | 98 | .description = "Print uptime information.", |
|
- | 99 | .func = cmd_uptime, |
|
83 | .argc = 0 |
100 | .argc = 0 |
84 | }; |
101 | }; |
85 | 102 | ||
86 | static int cmd_continue(cmd_arg_t *argv); |
103 | static int cmd_continue(cmd_arg_t *argv); |
87 | static cmd_info_t continue_info = { |
104 | static cmd_info_t continue_info = { |
Line 190... | Line 207... | ||
190 | .argc = 2, |
207 | .argc = 2, |
191 | .argv = set4_argv |
208 | .argv = set4_argv |
192 | }; |
209 | }; |
193 | 210 | ||
194 | /* Data and methods for 'call0' command. */ |
211 | /* Data and methods for 'call0' command. */ |
195 | static char call0_buf[MAX_CMDLINE+1]; |
212 | static char call0_buf[MAX_CMDLINE + 1]; |
196 | static char carg1_buf[MAX_CMDLINE+1]; |
213 | static char carg1_buf[MAX_CMDLINE + 1]; |
197 | static char carg2_buf[MAX_CMDLINE+1]; |
214 | static char carg2_buf[MAX_CMDLINE + 1]; |
198 | static char carg3_buf[MAX_CMDLINE+1]; |
215 | static char carg3_buf[MAX_CMDLINE + 1]; |
199 | 216 | ||
200 | static int cmd_call0(cmd_arg_t *argv); |
217 | static int cmd_call0(cmd_arg_t *argv); |
201 | static cmd_arg_t call0_argv = { |
218 | static cmd_arg_t call0_argv = { |
202 | .type = ARG_TYPE_STRING, |
219 | .type = ARG_TYPE_STRING, |
203 | .buffer = call0_buf, |
220 | .buffer = call0_buf, |
Line 209... | Line 226... | ||
209 | .func = cmd_call0, |
226 | .func = cmd_call0, |
210 | .argc = 1, |
227 | .argc = 1, |
211 | .argv = &call0_argv |
228 | .argv = &call0_argv |
212 | }; |
229 | }; |
213 | 230 | ||
- | 231 | /* Data and methods for 'mcall0' command. */ |
|
- | 232 | static int cmd_mcall0(cmd_arg_t *argv); |
|
- | 233 | static cmd_arg_t mcall0_argv = { |
|
- | 234 | .type = ARG_TYPE_STRING, |
|
- | 235 | .buffer = call0_buf, |
|
- | 236 | .len = sizeof(call0_buf) |
|
- | 237 | }; |
|
- | 238 | static cmd_info_t mcall0_info = { |
|
- | 239 | .name = "mcall0", |
|
- | 240 | .description = "mcall0 <function> -> call function() on each CPU.", |
|
- | 241 | .func = cmd_mcall0, |
|
- | 242 | .argc = 1, |
|
- | 243 | .argv = &mcall0_argv |
|
- | 244 | }; |
|
- | 245 | ||
214 | /* Data and methods for 'call1' command. */ |
246 | /* Data and methods for 'call1' command. */ |
215 | static int cmd_call1(cmd_arg_t *argv); |
247 | static int cmd_call1(cmd_arg_t *argv); |
216 | static cmd_arg_t call1_argv[] = { |
248 | static cmd_arg_t call1_argv[] = { |
217 | { |
249 | { |
218 | .type = ARG_TYPE_STRING, |
250 | .type = ARG_TYPE_STRING, |
Line 404... | Line 436... | ||
404 | .argv = NULL |
436 | .argv = NULL |
405 | }; |
437 | }; |
406 | 438 | ||
407 | static cmd_info_t *basic_commands[] = { |
439 | static cmd_info_t *basic_commands[] = { |
408 | &call0_info, |
440 | &call0_info, |
- | 441 | &mcall0_info, |
|
409 | &call1_info, |
442 | &call1_info, |
410 | &call2_info, |
443 | &call2_info, |
411 | &call3_info, |
444 | &call3_info, |
412 | &continue_info, |
445 | &continue_info, |
413 | &cpus_info, |
446 | &cpus_info, |
414 | &desc_info, |
447 | &desc_info, |
415 | &exit_info, |
448 | &exit_info, |
- | 449 | &reboot_info, |
|
- | 450 | &uptime_info, |
|
416 | &halt_info, |
451 | &halt_info, |
417 | &help_info, |
452 | &help_info, |
418 | &ipc_task_info, |
453 | &ipc_task_info, |
419 | &set4_info, |
454 | &set4_info, |
420 | &slabs_info, |
455 | &slabs_info, |
Line 486... | Line 521... | ||
486 | spinlock_unlock(&cmd_lock); |
521 | spinlock_unlock(&cmd_lock); |
487 | 522 | ||
488 | return 1; |
523 | return 1; |
489 | } |
524 | } |
490 | 525 | ||
- | 526 | ||
- | 527 | /** Reboot the system. |
|
- | 528 | * |
|
- | 529 | * @param argv Argument vector. |
|
- | 530 | * |
|
- | 531 | * @return 0 on failure, 1 on success. |
|
- | 532 | */ |
|
- | 533 | int cmd_reboot(cmd_arg_t *argv) |
|
- | 534 | { |
|
- | 535 | reboot(); |
|
- | 536 | ||
- | 537 | /* Not reached */ |
|
- | 538 | return 1; |
|
- | 539 | } |
|
- | 540 | ||
- | 541 | ||
- | 542 | /** Print system uptime information. |
|
- | 543 | * |
|
- | 544 | * @param argv Argument vector. |
|
- | 545 | * |
|
- | 546 | * @return 0 on failure, 1 on success. |
|
- | 547 | */ |
|
- | 548 | int cmd_uptime(cmd_arg_t *argv) |
|
- | 549 | { |
|
- | 550 | ASSERT(uptime); |
|
- | 551 | ||
- | 552 | /* This doesn't have to be very accurate */ |
|
- | 553 | unative_t sec = uptime->seconds1; |
|
- | 554 | ||
- | 555 | printf("Up %u days, %u hours, %u minutes, %u seconds\n", |
|
- | 556 | sec / 86400, (sec % 86400) / 3600, (sec % 3600) / 60, sec % 60); |
|
- | 557 | ||
- | 558 | return 1; |
|
- | 559 | } |
|
- | 560 | ||
491 | /** Describe specified command. |
561 | /** Describe specified command. |
492 | * |
562 | * |
493 | * @param argv Argument vector. |
563 | * @param argv Argument vector. |
494 | * |
564 | * |
495 | * @return 0 on failure, 1 on success. |
565 | * @return 0 on failure, 1 on success. |
Line 538... | Line 608... | ||
538 | unative_t (*f)(void); |
608 | unative_t (*f)(void); |
539 | #ifdef ia64 |
609 | #ifdef ia64 |
540 | struct { |
610 | struct { |
541 | unative_t f; |
611 | unative_t f; |
542 | unative_t gp; |
612 | unative_t gp; |
543 | }fptr; |
613 | } fptr; |
544 | #endif |
614 | #endif |
545 | 615 | ||
546 | symaddr = get_symbol_addr((char *) argv->buffer); |
616 | symaddr = get_symbol_addr((char *) argv->buffer); |
547 | if (!symaddr) |
617 | if (!symaddr) |
548 | printf("Symbol %s not found.\n", argv->buffer); |
618 | printf("Symbol %s not found.\n", argv->buffer); |
549 | else if (symaddr == (uintptr_t) -1) { |
619 | else if (symaddr == (uintptr_t) -1) { |
550 | symtab_print_search((char *) argv->buffer); |
620 | symtab_print_search((char *) argv->buffer); |
551 | printf("Duplicate symbol, be more specific.\n"); |
621 | printf("Duplicate symbol, be more specific.\n"); |
552 | } else { |
622 | } else { |
553 | symbol = get_symtab_entry(symaddr); |
623 | symbol = get_symtab_entry(symaddr); |
554 | printf("Calling f(): %.*p: %s\n", sizeof(uintptr_t) * 2, symaddr, symbol); |
624 | printf("Calling %s() (%.*p)\n", symbol, sizeof(uintptr_t) * 2, symaddr); |
555 | #ifdef ia64 |
625 | #ifdef ia64 |
556 | fptr.f = symaddr; |
626 | fptr.f = symaddr; |
557 | fptr.gp = ((unative_t *)cmd_call2)[1]; |
627 | fptr.gp = ((unative_t *)cmd_call2)[1]; |
558 | f = (unative_t (*)(void)) &fptr; |
628 | f = (unative_t (*)(void)) &fptr; |
559 | #else |
629 | #else |
Line 563... | Line 633... | ||
563 | } |
633 | } |
564 | 634 | ||
565 | return 1; |
635 | return 1; |
566 | } |
636 | } |
567 | 637 | ||
- | 638 | /** Call function with zero parameters on each CPU */ |
|
- | 639 | int cmd_mcall0(cmd_arg_t *argv) |
|
- | 640 | { |
|
- | 641 | /* |
|
- | 642 | * For each CPU, create a thread which will |
|
- | 643 | * call the function. |
|
- | 644 | */ |
|
- | 645 | ||
- | 646 | count_t i; |
|
- | 647 | for (i = 0; i < config.cpu_count; i++) { |
|
- | 648 | thread_t *t; |
|
- | 649 | if ((t = thread_create((void (*)(void *)) cmd_call0, (void *) argv, TASK, THREAD_FLAG_WIRED, "call0", false))) { |
|
- | 650 | spinlock_lock(&t->lock); |
|
- | 651 | t->cpu = &cpus[i]; |
|
- | 652 | spinlock_unlock(&t->lock); |
|
- | 653 | printf("cpu%u: ", i); |
|
- | 654 | thread_ready(t); |
|
- | 655 | thread_join(t); |
|
- | 656 | thread_detach(t); |
|
- | 657 | } else |
|
- | 658 | printf("Unable to create thread for cpu%u\n", i); |
|
- | 659 | } |
|
- | 660 | ||
- | 661 | return 1; |
|
- | 662 | } |
|
- | 663 | ||
568 | /** Call function with one parameter */ |
664 | /** Call function with one parameter */ |
569 | int cmd_call1(cmd_arg_t *argv) |
665 | int cmd_call1(cmd_arg_t *argv) |
570 | { |
666 | { |
571 | uintptr_t symaddr; |
667 | uintptr_t symaddr; |
572 | char *symbol; |
668 | char *symbol; |
Line 711... | Line 807... | ||
711 | } |
807 | } |
712 | 808 | ||
713 | /** Write 4 byte value to address */ |
809 | /** Write 4 byte value to address */ |
714 | int cmd_set4(cmd_arg_t *argv) |
810 | int cmd_set4(cmd_arg_t *argv) |
715 | { |
811 | { |
716 | uint32_t *addr ; |
812 | uint32_t *addr; |
717 | uint32_t arg1 = argv[1].intval; |
813 | uint32_t arg1 = argv[1].intval; |
718 | bool pointer = false; |
814 | bool pointer = false; |
719 | 815 | ||
720 | if (((char *)argv->buffer)[0] == '*') { |
816 | if (((char *)argv->buffer)[0] == '*') { |
721 | addr = (uint32_t *) get_symbol_addr((char *) argv->buffer + 1); |
817 | addr = (uint32_t *) get_symbol_addr((char *) argv->buffer + 1); |