fix: (blkio) enforce disk io buffer size alignment (to block size)
[lunaix-os.git] / lunaix-os / kernel / kprintf.c
1 #include <klibc/stdio.h>
2 #include <lunaix/lxconsole.h>
3 #include <lunaix/syslog.h>
4 #include <lunaix/tty/tty.h>
5
6 #define MAX_KPRINTF_BUF_SIZE 512
7 #define MAX_XFMT_SIZE 512
8
9 void
10 __kprintf(const char* component, const char* fmt, va_list args)
11 {
12     char buf[MAX_KPRINTF_BUF_SIZE];
13     if (!fmt)
14         return;
15     char log_level = '0';
16     char expanded_fmt[MAX_XFMT_SIZE];
17
18     if (*fmt == '\x1b') {
19         log_level = *(++fmt);
20         fmt++;
21     }
22
23     switch (log_level) {
24         case '1':
25             // tty_set_theme(VGA_COLOR_BROWN, current_theme >> 12);
26             ksnprintf(expanded_fmt,
27                       MAX_XFMT_SIZE,
28                       "\033[6;0mW %s: %s\033[39;49m",
29                       component,
30                       fmt);
31             break;
32         case '2':
33             // tty_set_theme(VGA_COLOR_LIGHT_RED, current_theme >> 12);
34             ksnprintf(expanded_fmt,
35                       MAX_XFMT_SIZE,
36                       "\033[12;0mE %s: %s\033[39;49m",
37                       component,
38                       fmt);
39             break;
40         case '3':
41             // tty_set_theme(VGA_COLOR_LIGHT_BLUE, current_theme >> 12);
42             ksnprintf(expanded_fmt,
43                       MAX_XFMT_SIZE,
44                       "\033[9;0mD %s: %s\033[39;49m",
45                       component,
46                       fmt);
47             break;
48         default:
49             ksnprintf(expanded_fmt, MAX_XFMT_SIZE, "- %s: %s", component, fmt);
50             break;
51     }
52
53     __ksprintf_internal(buf, expanded_fmt, MAX_KPRINTF_BUF_SIZE, args);
54     console_write_str(buf);
55 }
56
57 void
58 kprint_panic(const char* fmt, ...)
59 {
60     char buf[MAX_KPRINTF_BUF_SIZE];
61     va_list args;
62     va_start(args, fmt);
63
64     tty_set_theme(VGA_COLOR_WHITE, VGA_COLOR_RED);
65     tty_clear_line(24);
66
67     __ksprintf_internal(buf, fmt, MAX_KPRINTF_BUF_SIZE, args);
68     tty_put_str_at(buf, 0, 24);
69
70     va_end(args);
71 }
72
73 void
74 kprint_dbg(const char* fmt, ...)
75 {
76     char buf[MAX_KPRINTF_BUF_SIZE];
77     va_list args;
78     va_start(args, fmt);
79
80     tty_set_theme(VGA_COLOR_WHITE, VGA_COLOR_MAGENTA);
81     tty_clear_line(24);
82
83     __ksprintf_internal(buf, fmt, MAX_KPRINTF_BUF_SIZE, args);
84     tty_put_str_at(buf, 0, 24);
85
86     va_end(args);
87
88     tty_set_theme(VGA_COLOR_WHITE, VGA_COLOR_BLACK);
89 }
90
91 void
92 kprint_hex(const void* buffer, unsigned int size)
93 {
94     unsigned char* data = (unsigned char*)buffer;
95     char buf[16];
96     char ch_cache[16];
97     unsigned int ptr = 0;
98     int i;
99
100     ch_cache[0] = '|';
101     ch_cache[1] = ' ';
102     while (size) {
103         ksnprintf(buf, 64, " %.4p: ", ptr);
104         console_write_str(buf);
105         for (i = 0; i < 8 && size; i++, size--, ptr++) {
106             unsigned char c = *(data + ptr) & 0xff;
107             ch_cache[2 + i] = (32 <= c && c < 127) ? c : '.';
108             ksnprintf(buf, 64, "%.2x  ", c);
109             console_write_str(buf);
110         }
111         ch_cache[2 + i] = '\0';
112         console_write_str(ch_cache);
113         console_write_char('\n');
114     }
115 }