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