diff --git a/src/kernel/logging/klog.c b/src/kernel/logging/klog.c index 2a5d7096..2d7f5012 100644 --- a/src/kernel/logging/klog.c +++ b/src/kernel/logging/klog.c @@ -1,5 +1,7 @@ #include "klog.h" +#include +#include #include #include @@ -7,35 +9,115 @@ // Right now I will leave it as is, will change once the basic kernel at least runs. #include "debug/debug_stdio.h" -static u32 g_indent_level = 0; +// static u32 g_indent_level = 0; static const char* g_prefixes[] = {"[ERROR]", "[WARNING]", "[ ]", "[~]"}; +static const char* overwrite_warning = "[WARNING]Some of the logs were lost due to too small size of buffer"; -void klog_indent_increase() { - ++g_indent_level; +#ifdef __DEBUG__ +#define RING_BUF_SIZE 1<<20 +#else +#define RING_BUF_SIZE 1<<16 +#endif // !__DEBUG__ + +#define TEMP_BUF_SIZE 1<<12 + +typedef struct { + char ring[RING_BUF_SIZE]; + i32 read; + i32 write; + bool full; +} ring_buffer; + +static ring_buffer buffer; + +size_t available_space(const ring_buffer* buf) { + if (buf->full) return 0; + if (buf->write >= buf->read) + return RING_BUF_SIZE - (buf->write - buf->read); + else + return buf->read - buf->write; +} + +void put_char(ring_buffer* buf, char c){ + buf->ring[buf->write++] = c; + buf->write %= RING_BUF_SIZE; + if(buf->full){ + buf->read = (buf->read + 1) % RING_BUF_SIZE; + } + buf->full = buf->read == buf->write; +} + +void put_string(ring_buffer* buf, const char* str){ + size_t it = 0; + while(str[it]){ + put_char(buf, str[it++]); + } } -void klog_indent_decrease() { - if (g_indent_level != 0) - --g_indent_level; +void put_msg(ring_buffer* buf, const char* msg, int msg_len){ + if ((size_t)msg_len > available_space(buf)) + put_string(buf, overwrite_warning); + put_string(buf, msg); } +char get_char(ring_buffer* buf){ + if(buf->read == buf->write && !buf->full) + return 0; + char ret = buf->ring[buf->read++]; + buf->read %= RING_BUF_SIZE; + buf->full = false; + return ret; +} + +// void klog_indent_increase() { +// ++g_indent_level; +// } + +// void klog_indent_decrease() { +// if (g_indent_level != 0) +// --g_indent_level; +// } + static void klogv(klog_severity_level_t loglvl, const char* fmt, va_list va) { - (void)fmt; - (void)va; + static char temp_buffer[TEMP_BUF_SIZE]; if (loglvl > KLSL_TRACE) { KLOGLN_ERROR("Invalid loglvl passed to klog"); loglvl = KLSL_ERROR; } - DEBUG_PUTGAP(g_indent_level); - DEBUG_PRINTF("%s ", g_prefixes[loglvl]); - DEBUG_VPRINTF(fmt, va); + const char* prefix = g_prefixes[loglvl]; + size_t prefix_len = 0; + while (prefix[prefix_len]) ++prefix_len; + + for (size_t i=0;i= sizeof(temp_buffer)) { + // Truncated + written = sizeof(temp_buffer) - 1; + } + + put_msg(&buffer, &temp_buffer, written); + + // DEBUG_PUTGAP(g_indent_level); + // DEBUG_PRINTF("%s ", g_prefixes[loglvl]); + // DEBUG_VPRINTF(fmt, va); } static void kloglnv(klog_severity_level_t loglvl, const char* fmt, va_list va) { klogv(loglvl, fmt, va); - DEBUG_PUTC('\n'); + put_msg(&buffer, "\n", 1); + // DEBUG_PUTC('\n'); } void klog(klog_severity_level_t loglvl, const char* fmt, ...) { diff --git a/src/kernel/logging/klog.h b/src/kernel/logging/klog.h index 91000474..63f6c8ee 100644 --- a/src/kernel/logging/klog.h +++ b/src/kernel/logging/klog.h @@ -10,8 +10,8 @@ typedef enum { KLSL_TRACE = 3, } klog_severity_level_t; -void klog_indent_increase(); -void klog_indent_decrease(); +// void klog_indent_increase(); +// void klog_indent_decrease(); [[gnu::format(printf, 2, 3)]] void klog(klog_severity_level_t loglvl, const char* fmt, ...);