Separate the logging stack into toggleable backends, to disable console logging once boot finishes.

This commit is contained in:
apio 2022-10-01 15:35:11 +02:00
parent 0e46ea8ada
commit 87cb41e549
7 changed files with 71 additions and 44 deletions

View File

@ -5,4 +5,5 @@ namespace Init
void check_magic(); void check_magic();
void disable_smp(); void disable_smp();
void early_init(); void early_init();
void finish_kernel_boot();
} }

View File

@ -8,6 +8,12 @@ enum class LogLevel
ERROR ERROR
}; };
enum class Backend
{
Serial,
Console
};
#define PRINTF_LIKE(n, m) __attribute__((format(printf, n, m))) #define PRINTF_LIKE(n, m) __attribute__((format(printf, n, m)))
namespace KernelLog namespace KernelLog
@ -15,6 +21,7 @@ namespace KernelLog
void log(const char* function, LogLevel level, const char* message, ...) PRINTF_LIKE(3, 4); 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 logln(const char* function, LogLevel level, const char* message, ...) PRINTF_LIKE(3, 4);
void toggle_log_level(LogLevel level); void toggle_log_level(LogLevel level);
void toggle_log_backend(Backend backend);
} }
#ifndef MODULE #ifndef MODULE

View File

@ -6,8 +6,5 @@ namespace TextRenderer
{ {
void putchar(char chr); void putchar(char chr);
void write(const char* str, size_t size); void write(const char* str, size_t size);
void set_text_color(Color& col); void reset();
void set_bg_color(Color& col);
bool try_initialize();
bool is_initialized();
} }

View File

@ -42,10 +42,6 @@ void Init::early_init()
MemoryManager::init(); MemoryManager::init();
InitRD::init();
ASSERT(TextRenderer::try_initialize());
if (strstr(environment, "quiet=1")) if (strstr(environment, "quiet=1"))
{ {
KernelLog::toggle_log_level(LogLevel::DEBUG); 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); } else if (!strstr(environment, "verbose=1")) { KernelLog::toggle_log_level(LogLevel::DEBUG); }
InitRD::init();
Mersenne::init(); Mersenne::init();
__stack_chk_guard = Mersenne::get(); __stack_chk_guard = Mersenne::get();
}
void Init::finish_kernel_boot()
{
KernelLog::toggle_log_backend(Backend::Console);
framebuffer0.clear(Color::Black);
TextRenderer::reset();
} }

View File

@ -5,60 +5,79 @@
#include <stdarg.h> #include <stdarg.h>
static int level_mask = 15; 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_list ap;
va_start(ap, message); va_copy(ap, origin);
Serial::reset_color(); Serial::reset_color();
printf("[%ld.%ld] ", PIT::ms_since_boot / 1000, PIT::ms_since_boot % 1000); printf("[%ld.%ld] %s: ", PIT::ms_since_boot / 1000, PIT::ms_since_boot % 1000, function);
Serial::print(function);
Serial::print(": ");
kprintf("%s: ", function);
switch (level) switch (level)
{ {
case LogLevel::WARN: Serial::set_color(Color::Yellow); break; case LogLevel::WARN: Serial::set_color(Color::Yellow); break;
case LogLevel::ERROR: Serial::set_color(Color::Red); break; case LogLevel::ERROR: Serial::set_color(Color::Red); break;
default: break; default: break;
} }
va_list graphical;
va_copy(graphical, ap);
vprintf(message, ap); vprintf(message, ap);
vkprintf(message, ap);
Serial::reset_color(); Serial::reset_color();
va_end(ap); 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, ...) 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_list ap;
va_start(ap, message); va_start(ap, message);
Serial::reset_color(); if (log_backend_enabled(Backend::Serial))
printf("[%ld.%ld] ", PIT::ms_since_boot / 1000, PIT::ms_since_boot % 1000);
Serial::print(function);
Serial::print(": ");
kprintf("%s: ", function);
switch (level)
{ {
case LogLevel::WARN: Serial::set_color(Color::Yellow); break; log_backend_serial(function, level, message, ap);
case LogLevel::ERROR: Serial::set_color(Color::Red); break; printf("\n");
default: break; }
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(ap);
va_end(graphical);
} }
void KernelLog::toggle_log_level(LogLevel level) void KernelLog::toggle_log_level(LogLevel level)
{ {
level_mask ^= (1 << (int)level); level_mask ^= (1 << (int)level);
}
void KernelLog::toggle_log_backend(Backend backend)
{
backend_mask ^= (1 << (int)backend);
} }

View File

@ -128,6 +128,8 @@ extern "C" void _start()
kinfoln("Prepared scheduler tasks"); kinfoln("Prepared scheduler tasks");
Init::finish_kernel_boot();
Interrupts::enable(); Interrupts::enable();
kinfoln("Interrupts enabled"); kinfoln("Interrupts enabled");

View File

@ -20,14 +20,10 @@ static uint32_t ypos = 0;
#define FONT_HEIGHT 16 #define FONT_HEIGHT 16
#define FONT_WIDTH 8 #define FONT_WIDTH 8
bool TextRenderer::try_initialize() void TextRenderer::reset()
{ {
return true; xpos = 0;
} ypos = 0;
bool TextRenderer::is_initialized()
{
return true;
} }
#pragma GCC push_options #pragma GCC push_options