fix: use wait queue for blocking process
[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 '0':
25             ksnprintf(expanded_fmt,
26                       MAX_XFMT_SIZE,
27                       "[%s] (%s) %s",
28                       "INFO",
29                       component,
30                       fmt);
31             break;
32         case '1':
33             // tty_set_theme(VGA_COLOR_BROWN, current_theme >> 12);
34             ksnprintf(expanded_fmt,
35                       MAX_XFMT_SIZE,
36                       "\033[6;0m[%s] (%s) %s\033[39;49m",
37                       "WARN",
38                       component,
39                       fmt);
40             break;
41         case '2':
42             // tty_set_theme(VGA_COLOR_LIGHT_RED, current_theme >> 12);
43             ksnprintf(expanded_fmt,
44                       MAX_XFMT_SIZE,
45                       "\033[12;0m[%s] (%s) %s\033[39;49m",
46                       "EROR",
47                       component,
48                       fmt);
49             break;
50         case '3':
51             // tty_set_theme(VGA_COLOR_LIGHT_BLUE, current_theme >> 12);
52             ksnprintf(expanded_fmt,
53                       MAX_XFMT_SIZE,
54                       "\033[9;0m[%s] (%s) %s\033[39;49m",
55                       "DEBG",
56                       component,
57                       fmt);
58             break;
59         default:
60             ksnprintf(expanded_fmt,
61                       MAX_XFMT_SIZE,
62                       "[%s] (%s) %s",
63                       "LOG",
64                       component,
65                       fmt);
66             break;
67     }
68
69     __ksprintf_internal(buf, expanded_fmt, MAX_KPRINTF_BUF_SIZE, args);
70     console_write_str(buf);
71 }
72
73 void
74 kprint_panic(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_RED);
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
89 void
90 kprint_dbg(const char* fmt, ...)
91 {
92     char buf[MAX_KPRINTF_BUF_SIZE];
93     va_list args;
94     va_start(args, fmt);
95
96     tty_set_theme(VGA_COLOR_WHITE, VGA_COLOR_MAGENTA);
97     tty_clear_line(24);
98
99     __ksprintf_internal(buf, fmt, MAX_KPRINTF_BUF_SIZE, args);
100     tty_put_str_at(buf, 0, 24);
101
102     va_end(args);
103
104     tty_set_theme(VGA_COLOR_WHITE, VGA_COLOR_BLACK);
105 }
106
107 void
108 kprint_hex(const void* buffer, unsigned int size)
109 {
110     unsigned char* data = (unsigned char*)buffer;
111     char buf[16];
112     char ch_cache[16];
113     unsigned int ptr = 0;
114     int i;
115
116     ch_cache[0] = '|';
117     ch_cache[1] = ' ';
118     while (size) {
119         ksnprintf(buf, 64, " %.4p: ", ptr);
120         console_write_str(buf);
121         for (i = 0; i < 8 && size; i++, size--, ptr++) {
122             unsigned char c = *(data + ptr) & 0xff;
123             ch_cache[2 + i] = (32 <= c && c < 127) ? c : '.';
124             ksnprintf(buf, 64, "%.2x  ", c);
125             console_write_str(buf);
126         }
127         ch_cache[2 + i] = '\0';
128         console_write_str(ch_cache);
129         console_write_char('\n');
130     }
131 }