diff --git a/Kernel/Devices/DebugLogDevice.cpp b/Kernel/Devices/DebugLogDevice.cpp new file mode 100644 index 00000000000000..321cd97d35aca3 --- /dev/null +++ b/Kernel/Devices/DebugLogDevice.cpp @@ -0,0 +1,28 @@ +#include +#include + +static DebugLogDevice* s_the; + +DebugLogDevice& DebugLogDevice::the() +{ + ASSERT(s_the); + return *s_the; +} + +DebugLogDevice::DebugLogDevice() + : CharacterDevice(1, 18) +{ + s_the = this; +} + +DebugLogDevice::~DebugLogDevice() +{ +} + +ssize_t DebugLogDevice::write(Process&, const byte* data, ssize_t data_size) +{ + for (int i = 0; i < data_size; ++i) + IO::out8(0xe9, data[i]); + return data_size; +} + diff --git a/Kernel/Devices/DebugLogDevice.h b/Kernel/Devices/DebugLogDevice.h new file mode 100644 index 00000000000000..dd6db9f4d22620 --- /dev/null +++ b/Kernel/Devices/DebugLogDevice.h @@ -0,0 +1,17 @@ +#include + +class DebugLogDevice final : public CharacterDevice { +public: + DebugLogDevice(); + virtual ~DebugLogDevice() override; + + static DebugLogDevice& the(); + +private: + // ^CharacterDevice + virtual ssize_t read(Process&, byte*, ssize_t) override { return 0; } + virtual ssize_t write(Process&, const byte*, ssize_t) override; + virtual bool can_write(Process&) const override { return true; } + virtual bool can_read(Process&) const override { return true; } + virtual const char* class_name() const override { return "DebugLogDevice"; } +}; diff --git a/Kernel/Makefile b/Kernel/Makefile index a771e4f068ab58..ebd182da68aa1f 100644 --- a/Kernel/Makefile +++ b/Kernel/Makefile @@ -57,6 +57,7 @@ VFS_OBJS = \ Devices/FullDevice.o \ Devices/ZeroDevice.o \ Devices/RandomDevice.o \ + Devices/DebugLogDevice.o \ FileSystem/FileSystem.o \ FileSystem/DiskBackedFileSystem.o \ FileSystem/Ext2FileSystem.o \ diff --git a/Kernel/init.cpp b/Kernel/init.cpp index 440aac263afd07..0081b88ece71ea 100644 --- a/Kernel/init.cpp +++ b/Kernel/init.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #define SPAWN_TERMINAL //#define SPAWN_LAUNCHER @@ -42,6 +43,7 @@ VirtualConsole* tty2; VirtualConsole* tty3; KeyboardDevice* keyboard; PS2MouseDevice* ps2mouse; +DebugLogDevice* dev_debuglog; NullDevice* dev_null; VFS* vfs; @@ -151,6 +153,7 @@ extern "C" [[noreturn]] void init() init_ksyms(); vfs = new VFS; + dev_debuglog = new DebugLogDevice; auto console = make(); diff --git a/Kernel/sync.sh b/Kernel/sync.sh index 3c7dced87890e4..d9c57a0bf7d75f 100755 --- a/Kernel/sync.sh +++ b/Kernel/sync.sh @@ -25,6 +25,7 @@ mknod mnt/dev/random c 1 8 mknod mnt/dev/null c 1 3 mknod mnt/dev/zero c 1 5 mknod mnt/dev/full c 1 7 +mknod -m 666 mnt/dev/debuglog c 1 18 mknod mnt/dev/keyboard c 85 1 mknod mnt/dev/psaux c 10 1 mknod -m 666 mnt/dev/ptmx c 5 2 diff --git a/LibC/stdio.cpp b/LibC/stdio.cpp index 1e0530750852aa..feb51df771da42 100644 --- a/LibC/stdio.cpp +++ b/LibC/stdio.cpp @@ -13,10 +13,11 @@ extern "C" { -static FILE __default_streams[3]; +static FILE __default_streams[4]; FILE* stdin; FILE* stdout; FILE* stderr; +FILE* stddbg; void init_FILE(FILE& fp, int fd, int mode) { @@ -39,9 +40,16 @@ void __stdio_init() stdin = &__default_streams[0]; stdout = &__default_streams[1]; stderr = &__default_streams[2]; + stddbg = &__default_streams[3]; init_FILE(*stdin, 0, isatty(0) ? _IOLBF : _IOFBF); init_FILE(*stdout, 1, isatty(1) ? _IOLBF : _IOFBF); init_FILE(*stderr, 2, _IONBF); + int fd = open("/dev/debuglog", O_WRONLY); + if (fd < 0) { + perror("open /dev/debuglog"); + ASSERT_NOT_REACHED(); + } + init_FILE(*stddbg, fd, _IOLBF); } int setvbuf(FILE* stream, char* buf, int mode, size_t size) @@ -263,16 +271,11 @@ void rewind(FILE* stream) fseek(stream, 0, SEEK_SET); } -static void sys_putch(char*&, char ch) -{ - syscall(SC_putch, ch); -} - int dbgprintf(const char* fmt, ...) { va_list ap; va_start(ap, fmt); - int ret = printf_internal(sys_putch, nullptr, fmt, ap); + int ret = vfprintf(stddbg, fmt, ap); va_end(ap); return ret; } diff --git a/LibC/stdio.h b/LibC/stdio.h index 2413f236ba3611..8f41e74636645a 100644 --- a/LibC/stdio.h +++ b/LibC/stdio.h @@ -40,6 +40,7 @@ typedef struct __STDIO_FILE FILE; extern FILE* stdin; extern FILE* stdout; extern FILE* stderr; +extern FILE* stddbg; typedef size_t fpos_t;