diff options
author | Conrad Pankoff <deoxxa@fknsrs.biz> | 2019-08-11 14:43:38 +1000 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2019-08-11 08:22:42 +0200 |
commit | 3026c37d5d155efe38b5137ca34a34cd4b0c9cab (patch) | |
tree | 951c428dc07f7da87ee2e2fe2fe2a94a404837c4 /Kernel/kprintf.cpp | |
parent | ee83b1bcf41a1a04ad9d7283fb6ed23fffb46675 (diff) | |
download | serenity-3026c37d5d155efe38b5137ca34a34cd4b0c9cab.zip |
Kernel: Add serial_debug cmdline parameter
serial_debug will output all the kprintf and dbgprintf data to COM1 at
8-N-1 57600 baud. this is particularly useful for debugging the boot
process on live hardware.
Note: it must be the first parameter in the boot cmdline.
Diffstat (limited to 'Kernel/kprintf.cpp')
-rw-r--r-- | Kernel/kprintf.cpp | 63 |
1 files changed, 58 insertions, 5 deletions
diff --git a/Kernel/kprintf.cpp b/Kernel/kprintf.cpp index 468ce55ab7..0cf012ed40 100644 --- a/Kernel/kprintf.cpp +++ b/Kernel/kprintf.cpp @@ -6,6 +6,18 @@ #include <Kernel/kstdio.h> #include <LibC/stdarg.h> +static bool serial_debug; + +void set_serial_debug(bool on_or_off) +{ + serial_debug = on_or_off; +} + +int get_serial_debug() +{ + return serial_debug; +} + static void color_on() { IO::out8(0xe9, 0x1b); @@ -22,8 +34,42 @@ static void color_off() IO::out8(0xe9, '0'); IO::out8(0xe9, 'm'); } + +static void serial_putch(char ch) +{ + static bool serial_ready = false; + static bool was_cr = false; + + if (!serial_ready) { + IO::out8(0x3F8 + 1, 0x00); + IO::out8(0x3F8 + 3, 0x80); + IO::out8(0x3F8 + 0, 0x02); + IO::out8(0x3F8 + 1, 0x00); + IO::out8(0x3F8 + 3, 0x03); + IO::out8(0x3F8 + 2, 0xC7); + IO::out8(0x3F8 + 4, 0x0B); + + serial_ready = true; + } + + while ((IO::in8(0x3F8 + 5) & 0x20) == 0) + ; + + if (ch == '\n' && !was_cr) + IO::out8(0x3F8, '\r'); + + IO::out8(0x3F8, ch); + + if (ch == '\r') + was_cr = true; + else + was_cr = false; +} + static void console_putch(char*&, char ch) { + if (serial_debug) + serial_putch(ch); if (!current) { IO::out8(0xe9, ch); return; @@ -57,16 +103,23 @@ int ksprintf(char* buffer, const char* fmt, ...) return ret; } -extern "C" int dbgputstr(const char* characters, int length) +static void debugger_out(char ch) { - for (int i = 0; i < length; ++i) - IO::out8(0xe9, characters[i]); - return 0; + if (serial_debug) + serial_putch(ch); + IO::out8(0xe9, ch); } static void debugger_putch(char*&, char ch) { - IO::out8(0xe9, ch); + debugger_out(ch); +} + +extern "C" int dbgputstr(const char* characters, int length) +{ + for (int i = 0; i < length; ++i) + debugger_out(characters[i]); + return 0; } extern "C" int dbgprintf(const char* fmt, ...) |