diff --git a/kernel/include/init/Init.h b/kernel/include/init/Init.h index 3047d2c3..0870c600 100644 --- a/kernel/include/init/Init.h +++ b/kernel/include/init/Init.h @@ -5,4 +5,5 @@ namespace Init void check_magic(); void disable_smp(); void early_init(); + void finish_kernel_boot(); } \ No newline at end of file diff --git a/kernel/include/log/Log.h b/kernel/include/log/Log.h index 22c39595..7f37ea7e 100644 --- a/kernel/include/log/Log.h +++ b/kernel/include/log/Log.h @@ -8,6 +8,12 @@ enum class LogLevel ERROR }; +enum class Backend +{ + Serial, + Console +}; + #define PRINTF_LIKE(n, m) __attribute__((format(printf, n, m))) namespace KernelLog @@ -15,6 +21,7 @@ namespace KernelLog void log(const char* function, LogLevel level, const char* message, ...) PRINTF_LIKE(3, 4); void logln(const char* function, LogLevel level, const char* message, ...) PRINTF_LIKE(3, 4); void toggle_log_level(LogLevel level); + void toggle_log_backend(Backend backend); } #ifndef MODULE diff --git a/kernel/include/render/TextRenderer.h b/kernel/include/render/TextRenderer.h index 00e2b480..cc7db7d0 100644 --- a/kernel/include/render/TextRenderer.h +++ b/kernel/include/render/TextRenderer.h @@ -6,8 +6,5 @@ namespace TextRenderer { void putchar(char chr); void write(const char* str, size_t size); - void set_text_color(Color& col); - void set_bg_color(Color& col); - bool try_initialize(); - bool is_initialized(); + void reset(); } \ No newline at end of file diff --git a/kernel/src/init/Init.cpp b/kernel/src/init/Init.cpp index 51b39305..fe84bdb4 100644 --- a/kernel/src/init/Init.cpp +++ b/kernel/src/init/Init.cpp @@ -42,10 +42,6 @@ void Init::early_init() MemoryManager::init(); - InitRD::init(); - - ASSERT(TextRenderer::try_initialize()); - if (strstr(environment, "quiet=1")) { KernelLog::toggle_log_level(LogLevel::DEBUG); @@ -53,7 +49,16 @@ void Init::early_init() } else if (!strstr(environment, "verbose=1")) { KernelLog::toggle_log_level(LogLevel::DEBUG); } + InitRD::init(); + Mersenne::init(); __stack_chk_guard = Mersenne::get(); +} + +void Init::finish_kernel_boot() +{ + KernelLog::toggle_log_backend(Backend::Console); + framebuffer0.clear(Color::Black); + TextRenderer::reset(); } \ No newline at end of file diff --git a/kernel/src/log/Log.cpp b/kernel/src/log/Log.cpp index b5337752..25c9cf7f 100644 --- a/kernel/src/log/Log.cpp +++ b/kernel/src/log/Log.cpp @@ -5,60 +5,79 @@ #include static int level_mask = 15; +static int backend_mask = 3; -void KernelLog::log(const char* function, LogLevel level, const char* message, ...) +static bool log_level_enabled(LogLevel level) +{ + return level_mask & (1 << (int)level); +} + +static bool log_backend_enabled(Backend backend) +{ + return backend_mask & (1 << (int)backend); +} + +static void log_backend_serial(const char* function, LogLevel level, const char* message, va_list origin) { - if (!(level_mask & (1 << (int)level))) return; va_list ap; - va_start(ap, message); + va_copy(ap, origin); Serial::reset_color(); - printf("[%ld.%ld] ", PIT::ms_since_boot / 1000, PIT::ms_since_boot % 1000); - Serial::print(function); - Serial::print(": "); - kprintf("%s: ", function); + printf("[%ld.%ld] %s: ", PIT::ms_since_boot / 1000, PIT::ms_since_boot % 1000, function); switch (level) { case LogLevel::WARN: Serial::set_color(Color::Yellow); break; case LogLevel::ERROR: Serial::set_color(Color::Red); break; default: break; } - va_list graphical; - va_copy(graphical, ap); vprintf(message, ap); - vkprintf(message, ap); Serial::reset_color(); va_end(ap); - va_end(graphical); +} + +static void log_backend_console(const char* function, [[maybe_unused]] LogLevel level, const char* message, + va_list origin) +{ + va_list ap; + va_copy(ap, origin); + kprintf("%s: ", function); + vkprintf(message, ap); + va_end(ap); +} + +void KernelLog::log(const char* function, LogLevel level, const char* message, ...) +{ + if (!log_level_enabled(level)) return; + va_list ap; + va_start(ap, message); + if (log_backend_enabled(Backend::Serial)) log_backend_serial(function, level, message, ap); + if (log_backend_enabled(Backend::Console)) log_backend_console(function, level, message, ap); + va_end(ap); } void KernelLog::logln(const char* function, LogLevel level, const char* message, ...) { - if (!(level_mask & (1 << (int)level))) return; + if (!log_level_enabled(level)) return; va_list ap; va_start(ap, message); - Serial::reset_color(); - printf("[%ld.%ld] ", PIT::ms_since_boot / 1000, PIT::ms_since_boot % 1000); - Serial::print(function); - Serial::print(": "); - kprintf("%s: ", function); - switch (level) + if (log_backend_enabled(Backend::Serial)) { - case LogLevel::WARN: Serial::set_color(Color::Yellow); break; - case LogLevel::ERROR: Serial::set_color(Color::Red); break; - default: break; + log_backend_serial(function, level, message, ap); + printf("\n"); + } + if (log_backend_enabled(Backend::Console)) + { + log_backend_console(function, level, message, ap); + kprintf("\n"); } - va_list graphical; - va_copy(graphical, ap); - vprintf(message, ap); - vkprintf(message, graphical); - Serial::reset_color(); - Serial::print("\n"); - kprintf("\n"); va_end(ap); - va_end(graphical); } void KernelLog::toggle_log_level(LogLevel level) { level_mask ^= (1 << (int)level); +} + +void KernelLog::toggle_log_backend(Backend backend) +{ + backend_mask ^= (1 << (int)backend); } \ No newline at end of file diff --git a/kernel/src/main.cpp b/kernel/src/main.cpp index 62b6fdd9..10393bef 100644 --- a/kernel/src/main.cpp +++ b/kernel/src/main.cpp @@ -128,6 +128,8 @@ extern "C" void _start() kinfoln("Prepared scheduler tasks"); + Init::finish_kernel_boot(); + Interrupts::enable(); kinfoln("Interrupts enabled"); diff --git a/kernel/src/render/TextRenderer.cpp b/kernel/src/render/TextRenderer.cpp index 3492046d..6b212273 100644 --- a/kernel/src/render/TextRenderer.cpp +++ b/kernel/src/render/TextRenderer.cpp @@ -20,14 +20,10 @@ static uint32_t ypos = 0; #define FONT_HEIGHT 16 #define FONT_WIDTH 8 -bool TextRenderer::try_initialize() +void TextRenderer::reset() { - return true; -} - -bool TextRenderer::is_initialized() -{ - return true; + xpos = 0; + ypos = 0; } #pragma GCC push_options