X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/fef29e9e993e62f025d8cbfeb6b8d51588083b7e..f044ca812256b421e793c4335ce1ffed74710a70:/lunaix-os/kernel/kprintf.c diff --git a/lunaix-os/kernel/kprintf.c b/lunaix-os/kernel/kprintf.c index 3bae867..15c8c14 100644 --- a/lunaix-os/kernel/kprintf.c +++ b/lunaix-os/kernel/kprintf.c @@ -1,60 +1,152 @@ +#include +#include +#include +#include #include #include -#include -#define MAX_KPRINTF_BUF_SIZE 1024 -#define MAX_XFMT_SIZE 1024 +#define MAX_KPRINTF_BUF_SIZE 512 +#define MAX_XFMT_SIZE 512 -static char buf[MAX_KPRINTF_BUF_SIZE]; +static char* log_prefix[] = { "- ", "W ", "E ", "D " }; +static char* color_code[] = { "", "\033[6;0m", "\033[12;0m", "\033[9;0m" }; void -__kprintf(const char* component, const char* fmt, va_list args) { - if (!fmt) return; - char log_level = '0'; +__kprintf_internal(const char* component, + int log_level, + const char* prefix, + const char* fmt, + va_list args) +{ + char buf[MAX_KPRINTF_BUF_SIZE]; char expanded_fmt[MAX_XFMT_SIZE]; - vga_attribute current_theme = tty_get_theme(); + char* color = color_code[log_level]; + + if (component) { + ksnprintf(expanded_fmt, + MAX_XFMT_SIZE, + "%s%s%s: %s\033[39;49m", + color, + prefix, + component, + fmt); + } else { + ksnprintf( + expanded_fmt, MAX_XFMT_SIZE, "%s%s%s\033[39;49m", color, prefix, fmt); + } + + __ksprintf_internal(buf, expanded_fmt, MAX_KPRINTF_BUF_SIZE, args); + console_write_str(buf); +} +char* +__get_loglevel(char* fmt, int* log_level_out) +{ + char l = '0'; if (*fmt == '\x1b') { - log_level = *(++fmt); + l = *(++fmt); fmt++; } + l -= '0'; - switch (log_level) - { - case '0': - snprintf(expanded_fmt, MAX_XFMT_SIZE, "[%s] (%s) %s", "INFO", component, fmt); - break; - case '1': - tty_set_theme(VGA_COLOR_BROWN, current_theme >> 12); - snprintf(expanded_fmt, MAX_XFMT_SIZE, "[%s] (%s) %s", "INFO", component, fmt); - break; - case '2': - tty_set_theme(VGA_COLOR_LIGHT_RED, current_theme >> 12); - snprintf(expanded_fmt, MAX_XFMT_SIZE, "[%s] (%s) %s", "EROR", component, fmt); - break; - default: - snprintf(expanded_fmt, MAX_XFMT_SIZE, "[%s] (%s) %s", "LOG", component, fmt); - break; + if (l > 3) { + l = 0; } - __sprintf_internal(buf, expanded_fmt, MAX_KPRINTF_BUF_SIZE, args); - tty_put_str(buf); - tty_set_theme(current_theme >> 8, current_theme >> 12); + *log_level_out = (int)l; + return fmt; +} + +void +kappendf(const char* fmt, ...) +{ + char buf[MAX_KPRINTF_BUF_SIZE]; + + va_list args; + va_start(args, fmt); + + int log_level; + fmt = __get_loglevel(fmt, &log_level); + + __kprintf_internal(NULL, log_level, "", fmt, args); + + va_end(args); +} + +void +__kprintf(const char* component, const char* fmt, va_list args) +{ + if (!fmt) + return; + + int log_level; + fmt = __get_loglevel(fmt, &log_level); + __kprintf_internal(component, log_level, log_prefix[log_level], fmt, args); } void -kprint_panic(const char* fmt, ...) { +kprint_panic(const char* fmt, ...) +{ + char buf[MAX_KPRINTF_BUF_SIZE]; va_list args; va_start(args, fmt); - + tty_set_theme(VGA_COLOR_WHITE, VGA_COLOR_RED); - tty_clear_line(10); - tty_clear_line(11); - tty_clear_line(12); - tty_set_cpos(0, 11); + tty_clear_line(24); - __sprintf_internal(buf, fmt, MAX_KPRINTF_BUF_SIZE, args); - tty_put_str(buf); + __ksprintf_internal(buf, fmt, MAX_KPRINTF_BUF_SIZE, args); + tty_put_str_at(buf, 0, 24); va_end(args); + + spin(); +} + +void +kprint_dbg(const char* fmt, ...) +{ + char buf[MAX_KPRINTF_BUF_SIZE]; + va_list args; + va_start(args, fmt); + + tty_set_theme(VGA_COLOR_WHITE, VGA_COLOR_MAGENTA); + tty_clear_line(24); + + __ksprintf_internal(buf, fmt, MAX_KPRINTF_BUF_SIZE, args); + tty_put_str_at(buf, 0, 24); + + va_end(args); + + tty_set_theme(VGA_COLOR_WHITE, VGA_COLOR_BLACK); +} + +void +kprint_hex(const void* buffer, unsigned int size) +{ + unsigned char* data = (unsigned char*)buffer; + char buf[16]; + char ch_cache[16]; + unsigned int ptr = 0; + int i; + + ch_cache[0] = '|'; + ch_cache[1] = ' '; + while (size) { + ksnprintf(buf, 64, " %.4p: ", ptr); + console_write_str(buf); + for (i = 0; i < 8 && size; i++, size--, ptr++) { + unsigned char c = *(data + ptr) & 0xff; + ch_cache[2 + i] = (32 <= c && c < 127) ? c : '.'; + ksnprintf(buf, 64, "%.2x ", c); + console_write_str(buf); + } + ch_cache[2 + i] = '\0'; + console_write_str(ch_cache); + console_write_char('\n'); + } +} + +__DEFINE_LXSYSCALL3(void, syslog, int, level, const char*, fmt, va_list, args) +{ + __kprintf_internal("syslog", level, "", fmt, args); } \ No newline at end of file