1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 06:07:34 +00:00

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.
This commit is contained in:
Conrad Pankoff 2019-08-11 14:43:38 +10:00 committed by Andreas Kling
parent ee83b1bcf4
commit 3026c37d5d
4 changed files with 89 additions and 8 deletions

View file

@ -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, ...)