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 disable_smp();
void early_init();
void finish_kernel_boot();
}

View File

@ -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

View File

@ -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();
}

View File

@ -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();
}

View File

@ -5,60 +5,79 @@
#include <stdarg.h>
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);
}

View File

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

View File

@ -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