Separate the logging stack into toggleable backends, to disable console logging once boot finishes.
This commit is contained in:
parent
0e46ea8ada
commit
87cb41e549
@ -5,4 +5,5 @@ namespace Init
|
||||
void check_magic();
|
||||
void disable_smp();
|
||||
void early_init();
|
||||
void finish_kernel_boot();
|
||||
}
|
@ -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
|
||||
|
@ -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();
|
||||
}
|
@ -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();
|
||||
}
|
@ -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);
|
||||
}
|
@ -128,6 +128,8 @@ extern "C" void _start()
|
||||
|
||||
kinfoln("Prepared scheduler tasks");
|
||||
|
||||
Init::finish_kernel_boot();
|
||||
|
||||
Interrupts::enable();
|
||||
|
||||
kinfoln("Interrupts enabled");
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user