diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/debug/kdb/kdb_io.c | 33 |
1 files changed, 28 insertions, 5 deletions
diff --git a/kernel/debug/kdb/kdb_io.c b/kernel/debug/kdb/kdb_io.c index 0a69d2adc4f3..14ff4849262c 100644 --- a/kernel/debug/kdb/kdb_io.c +++ b/kernel/debug/kdb/kdb_io.c | |||
| @@ -552,6 +552,7 @@ int vkdb_printf(const char *fmt, va_list ap) | |||
| 552 | { | 552 | { |
| 553 | int diag; | 553 | int diag; |
| 554 | int linecount; | 554 | int linecount; |
| 555 | int colcount; | ||
| 555 | int logging, saved_loglevel = 0; | 556 | int logging, saved_loglevel = 0; |
| 556 | int saved_trap_printk; | 557 | int saved_trap_printk; |
| 557 | int got_printf_lock = 0; | 558 | int got_printf_lock = 0; |
| @@ -584,6 +585,10 @@ int vkdb_printf(const char *fmt, va_list ap) | |||
| 584 | if (diag || linecount <= 1) | 585 | if (diag || linecount <= 1) |
| 585 | linecount = 24; | 586 | linecount = 24; |
| 586 | 587 | ||
| 588 | diag = kdbgetintenv("COLUMNS", &colcount); | ||
| 589 | if (diag || colcount <= 1) | ||
| 590 | colcount = 80; | ||
| 591 | |||
| 587 | diag = kdbgetintenv("LOGGING", &logging); | 592 | diag = kdbgetintenv("LOGGING", &logging); |
| 588 | if (diag) | 593 | if (diag) |
| 589 | logging = 0; | 594 | logging = 0; |
| @@ -690,7 +695,7 @@ kdb_printit: | |||
| 690 | gdbstub_msg_write(kdb_buffer, retlen); | 695 | gdbstub_msg_write(kdb_buffer, retlen); |
| 691 | } else { | 696 | } else { |
| 692 | if (dbg_io_ops && !dbg_io_ops->is_console) { | 697 | if (dbg_io_ops && !dbg_io_ops->is_console) { |
| 693 | len = strlen(kdb_buffer); | 698 | len = retlen; |
| 694 | cp = kdb_buffer; | 699 | cp = kdb_buffer; |
| 695 | while (len--) { | 700 | while (len--) { |
| 696 | dbg_io_ops->write_char(*cp); | 701 | dbg_io_ops->write_char(*cp); |
| @@ -709,11 +714,29 @@ kdb_printit: | |||
| 709 | printk(KERN_INFO "%s", kdb_buffer); | 714 | printk(KERN_INFO "%s", kdb_buffer); |
| 710 | } | 715 | } |
| 711 | 716 | ||
| 712 | if (KDB_STATE(PAGER) && strchr(kdb_buffer, '\n')) | 717 | if (KDB_STATE(PAGER)) { |
| 713 | kdb_nextline++; | 718 | /* |
| 719 | * Check printed string to decide how to bump the | ||
| 720 | * kdb_nextline to control when the more prompt should | ||
| 721 | * show up. | ||
| 722 | */ | ||
| 723 | int got = 0; | ||
| 724 | len = retlen; | ||
| 725 | while (len--) { | ||
| 726 | if (kdb_buffer[len] == '\n') { | ||
| 727 | kdb_nextline++; | ||
| 728 | got = 0; | ||
| 729 | } else if (kdb_buffer[len] == '\r') { | ||
| 730 | got = 0; | ||
| 731 | } else { | ||
| 732 | got++; | ||
| 733 | } | ||
| 734 | } | ||
| 735 | kdb_nextline += got / (colcount + 1); | ||
| 736 | } | ||
| 714 | 737 | ||
| 715 | /* check for having reached the LINES number of printed lines */ | 738 | /* check for having reached the LINES number of printed lines */ |
| 716 | if (kdb_nextline == linecount) { | 739 | if (kdb_nextline >= linecount) { |
| 717 | char buf1[16] = ""; | 740 | char buf1[16] = ""; |
| 718 | 741 | ||
| 719 | /* Watch out for recursion here. Any routine that calls | 742 | /* Watch out for recursion here. Any routine that calls |
| @@ -765,7 +788,7 @@ kdb_printit: | |||
| 765 | kdb_grepping_flag = 0; | 788 | kdb_grepping_flag = 0; |
| 766 | kdb_printf("\n"); | 789 | kdb_printf("\n"); |
| 767 | } else if (buf1[0] == ' ') { | 790 | } else if (buf1[0] == ' ') { |
| 768 | kdb_printf("\n"); | 791 | kdb_printf("\r"); |
| 769 | suspend_grep = 1; /* for this recursion */ | 792 | suspend_grep = 1; /* for this recursion */ |
| 770 | } else if (buf1[0] == '\n') { | 793 | } else if (buf1[0] == '\n') { |
| 771 | kdb_nextline = linecount - 1; | 794 | kdb_nextline = linecount - 1; |
