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 check_magic();
|
||||||
void disable_smp();
|
void disable_smp();
|
||||||
void early_init();
|
void early_init();
|
||||||
|
void finish_kernel_boot();
|
||||||
}
|
}
|
@ -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
|
||||||
|
@ -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();
|
|
||||||
}
|
}
|
@ -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();
|
||||||
}
|
}
|
@ -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);
|
||||||
}
|
}
|
@ -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");
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user