From 39524b2b9ffe699b334f6e850e2517ae911ed235 Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Sun, 17 Mar 2019 15:03:30 -0700 Subject: [PATCH] Move kernel over to new logger --- src/kernel/log.cpp | 115 ++++++--------------------------------- src/kernel/log.h | 52 +++--------------- src/kernel/log_areas.inc | 8 +++ src/kernel/main.cpp | 11 +--- 4 files changed, 34 insertions(+), 152 deletions(-) create mode 100644 src/kernel/log_areas.inc diff --git a/src/kernel/log.cpp b/src/kernel/log.cpp index 5e24038..69eaafb 100644 --- a/src/kernel/log.cpp +++ b/src/kernel/log.cpp @@ -1,107 +1,26 @@ -#include -#include "kutil/assert.h" +#include "kutil/constexpr_hash.h" #include "kutil/memory.h" -#include "console.h" #include "log.h" +namespace logs { -static const uint64_t default_enabled[] = {0x00, 0xff, 0xff, 0xff}; -static const uint8_t level_colors[] = {0x07, 0x0f, 0x0b, 0x09}; +static uint8_t log_buffer[0x10000]; +static log::logger g_logger(log_buffer, sizeof(log_buffer)); -static const char *levels[] = {"debug", " info", " warn", "error", "fatal"}; -static const char *areas[] = { - "boot ", - "memory", - "apic ", - "device", - "driver", - "file ", - "task ", - "paging", +#define LOG(name, lvl) \ + log::area_t name = #name ## _h; \ + const char * name ## _name = #name; +#include "log_areas.inc" +#undef LOG - nullptr -}; - - -log log::s_log; - -log::log() : m_cons(nullptr) +void init() { - kassert(0, "Invalid log constructor"); + new (&g_logger) log::logger(log_buffer, sizeof(log_buffer)); + +#define LOG(name, lvl) \ + g_logger.register_area(name, name ## _name, log::level ::lvl); +#include "log_areas.inc" +#undef LOG } -log::log(console *cons) : - m_cons(cons) -{ - const int num_levels = static_cast(level::max) - 1; - for (int i = 0; i < num_levels; ++i) - m_enabled[i] = default_enabled[i]; -} - -void -log::init(console *cons) -{ - new (&s_log) log(cons); - log::info(logs::boot, "Logging system initialized."); -} - -static inline uint64_t -bit_mask(logs area) { return 1 << static_cast(area); } - -void -log::enable(logs type, level at_level) -{ - using under_t = std::underlying_type::type; - under_t at = static_cast(at_level); - under_t max = sizeof(m_enabled) / sizeof(m_enabled[0]); - - for (under_t i = 0; i < max; ++i) { - if (i >= at) - s_log.m_enabled[i] |= bit_mask(type); - else - s_log.m_enabled[i] &= ~bit_mask(type); - } -} - -template <> -void -log::trylog(logs area, const char *fmt, ...) -{ - va_list args; - va_start(args, fmt); - s_log.output(level::fatal, area, fmt, args); - va_end(args); - while(1) __asm__ ("hlt"); -} - -template -void -log::trylog(logs area, const char *fmt, ...) -{ - auto i = static_cast::type>(L); - if ((s_log.m_enabled[i] & bit_mask(area)) == 0) return; - - va_list args; - va_start(args, fmt); - s_log.output(L, area, fmt, args); - va_end(args); -} - -void -log::output(level severity, logs area, const char *fmt, va_list args) -{ - m_cons->set_color(level_colors[static_cast(severity)]); - - m_cons->printf("%s %s: ", - areas[static_cast(area)], - levels[static_cast(severity)]); - m_cons->vprintf(fmt, args); - m_cons->set_color(); - m_cons->puts("\n"); -} - -const log::trylog_p log::debug = &trylog; -const log::trylog_p log::info = &trylog; -const log::trylog_p log::warn = &trylog; -const log::trylog_p log::error = &trylog; -const log::trylog_p log::fatal = &trylog; +} // namespace logs diff --git a/src/kernel/log.h b/src/kernel/log.h index 551dc6f..be48901 100644 --- a/src/kernel/log.h +++ b/src/kernel/log.h @@ -1,52 +1,16 @@ #pragma once -#include -#include -class console; +#include "kutil/logger.h" +namespace log = kutil::log; -enum class logs -{ - boot, - memory, - apic, - device, - driver, - fs, - task, - paging, +namespace logs { - max -}; +#define LOG(name, lvl) extern log::area_t name; +#include "log_areas.inc" +#undef LOG +void init(); -class log -{ -public: - enum class level {debug, info, warn, error, fatal, max}; +} // namespace logs - static void init(console *cons); - static void enable(logs type, level at_level); - - template - static void trylog(logs area, const char *fmt, ...); - using trylog_p = void (*)(logs area, const char *fmt, ...); - - static const trylog_p debug; - static const trylog_p info; - static const trylog_p warn; - static const trylog_p error; - static const trylog_p fatal; - -private: - void output(level severity, logs area, const char *fmt, va_list args); - - /// Bitmasks for what categories are enabled. fatal is - /// always enabled, so leave it out. - uint64_t m_enabled[static_cast(level::max) - 1]; - console *m_cons; - - log(); - log(console *cons); - static log s_log; -}; diff --git a/src/kernel/log_areas.inc b/src/kernel/log_areas.inc new file mode 100644 index 0000000..ec3b215 --- /dev/null +++ b/src/kernel/log_areas.inc @@ -0,0 +1,8 @@ +LOG(apic, info); +LOG(device, debug); +LOG(paging, info); +LOG(driver, debug); +LOG(memory, debug); +LOG(fs, debug); +LOG(task, debug); +LOG(boot, debug); diff --git a/src/kernel/main.cpp b/src/kernel/main.cpp index 9524e43..f768b50 100644 --- a/src/kernel/main.cpp +++ b/src/kernel/main.cpp @@ -37,16 +37,7 @@ init_console() cons->set_color(0x08, 0x00); cons->puts(GIT_VERSION " booting...\n"); - log::init(cons); - log::enable(logs::apic, log::level::info); - log::enable(logs::device, log::level::debug); - log::enable(logs::paging, log::level::info); - - log::enable(logs::driver, log::level::debug); - log::enable(logs::memory, log::level::debug); - log::enable(logs::fs, log::level::debug); - log::enable(logs::task, log::level::debug); - log::enable(logs::boot, log::level::debug); + logs::init(); } void