Rev 3343 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 3343 | Rev 3742 | ||
|---|---|---|---|
| Line 399... | Line 399... | ||
| 399 | } |
399 | } |
| 400 | current[curlen] = '\0'; |
400 | current[curlen] = '\0'; |
| 401 | return current; |
401 | return current; |
| 402 | } |
402 | } |
| 403 | 403 | ||
| 404 | /** Kernel console managing thread. |
404 | /** Kernel console prompt. |
| 405 | * |
405 | * |
| 406 | * @param prompt Kernel console prompt (e.g kconsole/panic). |
406 | * @param prompt Kernel console prompt (e.g kconsole/panic). |
| - | 407 | * @param msg Message to display in the beginning. |
|
| - | 408 | * @param kcon Wait for keypress to show the prompt |
|
| - | 409 | * and never exit. |
|
| - | 410 | * |
|
| 407 | */ |
411 | */ |
| 408 | void kconsole(void *prompt) |
412 | void kconsole(char *prompt, char *msg, bool kcon) |
| 409 | { |
413 | { |
| 410 | cmd_info_t *cmd_info; |
414 | cmd_info_t *cmd_info; |
| 411 | count_t len; |
415 | count_t len; |
| 412 | char *cmdline; |
416 | char *cmdline; |
| 413 | 417 | ||
| 414 | if (!stdin) { |
418 | if (!stdin) { |
| 415 | printf("%s: no stdin\n", __func__); |
419 | LOG("No stdin for kernel console"); |
| 416 | return; |
420 | return; |
| 417 | } |
421 | } |
| 418 | 422 | ||
| - | 423 | if (msg) |
|
| - | 424 | printf("%s", msg); |
|
| - | 425 | ||
| - | 426 | if (kcon) |
|
| - | 427 | _getc(stdin); |
|
| - | 428 | ||
| 419 | while (true) { |
429 | while (true) { |
| 420 | cmdline = clever_readline((char *) prompt, stdin); |
430 | cmdline = clever_readline((char *) prompt, stdin); |
| 421 | len = strlen(cmdline); |
431 | len = strlen(cmdline); |
| 422 | if (!len) |
432 | if (!len) |
| 423 | continue; |
433 | continue; |
| - | 434 | ||
| 424 | cmd_info = parse_cmdline(cmdline, len); |
435 | cmd_info = parse_cmdline(cmdline, len); |
| 425 | if (!cmd_info) |
436 | if (!cmd_info) |
| 426 | continue; |
437 | continue; |
| - | 438 | ||
| 427 | if (strncmp(cmd_info->name, "exit", |
439 | if ((!kcon) |
| 428 | min(strlen(cmd_info->name), 5)) == 0) |
440 | && (strncmp(cmd_info->name, "exit", min(strlen(cmd_info->name), 5)) == 0)) |
| 429 | break; |
441 | break; |
| - | 442 | ||
| 430 | (void) cmd_info->func(cmd_info->argv); |
443 | (void) cmd_info->func(cmd_info->argv); |
| 431 | } |
444 | } |
| 432 | } |
445 | } |
| 433 | 446 | ||
| - | 447 | /** Kernel console managing thread. |
|
| - | 448 | * |
|
| - | 449 | */ |
|
| - | 450 | void kconsole_thread(void *data) |
|
| - | 451 | { |
|
| - | 452 | kconsole("kconsole", "Kernel console ready (press any key to activate)\n", true); |
|
| - | 453 | } |
|
| - | 454 | ||
| 434 | static int parse_int_arg(char *text, size_t len, unative_t *result) |
455 | static int parse_int_arg(char *text, size_t len, unative_t *result) |
| 435 | { |
456 | { |
| 436 | static char symname[MAX_SYMBOL_NAME]; |
457 | static char symname[MAX_SYMBOL_NAME]; |
| 437 | uintptr_t symaddr; |
458 | uintptr_t symaddr; |
| 438 | bool isaddr = false; |
459 | bool isaddr = false; |