summaryrefslogtreecommitdiff
path: root/Kernel/kprintf.cpp
diff options
context:
space:
mode:
authorConrad Pankoff <deoxxa@fknsrs.biz>2019-08-11 14:43:38 +1000
committerAndreas Kling <awesomekling@gmail.com>2019-08-11 08:22:42 +0200
commit3026c37d5d155efe38b5137ca34a34cd4b0c9cab (patch)
tree951c428dc07f7da87ee2e2fe2fe2a94a404837c4 /Kernel/kprintf.cpp
parentee83b1bcf41a1a04ad9d7283fb6ed23fffb46675 (diff)
downloadserenity-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.cpp63
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, ...)