Kernel address space isolation and make the kernel heap global to all processes.
[lunaix-os.git] / lunaix-os / kernel / kprintf.c
1 #include <lunaix/syslog.h>
2 #include <lunaix/tty/tty.h>
3 #include <klibc/stdio.h>
4
5 #define MAX_KPRINTF_BUF_SIZE 1024
6 #define MAX_XFMT_SIZE 1024
7
8 static char buf[MAX_KPRINTF_BUF_SIZE];
9
10 void
11 __kprintf(const char* component, const char* fmt, va_list args) {
12     if (!fmt) return;
13     char log_level = '0';
14     char expanded_fmt[MAX_XFMT_SIZE];
15     vga_attribute current_theme = tty_get_theme();
16
17     if (*fmt == '\x1b') {
18         log_level = *(++fmt);
19         fmt++;
20     }
21
22     switch (log_level)
23     {
24     case '0':
25         snprintf(expanded_fmt, MAX_XFMT_SIZE, "[%s] (%s) %s", "INFO", component, fmt);
26         break;
27     case '1':
28         tty_set_theme(VGA_COLOR_BROWN, current_theme >> 12);
29         snprintf(expanded_fmt, MAX_XFMT_SIZE, "[%s] (%s) %s", "WARN", component, fmt);
30         break;
31     case '2':
32         tty_set_theme(VGA_COLOR_LIGHT_RED, current_theme >> 12);
33         snprintf(expanded_fmt, MAX_XFMT_SIZE, "[%s] (%s) %s", "EROR", component, fmt);
34         break;
35     case '3':
36         tty_set_theme(VGA_COLOR_LIGHT_BLUE, current_theme >> 12);
37         snprintf(expanded_fmt, MAX_XFMT_SIZE, "[%s] (%s) %s", "DEBG", component, fmt);
38         break;
39     default:
40         snprintf(expanded_fmt, MAX_XFMT_SIZE, "[%s] (%s) %s", "LOG", component, fmt);
41         break;
42     }
43
44     __sprintf_internal(buf, expanded_fmt, MAX_KPRINTF_BUF_SIZE, args);
45     tty_put_str(buf);
46     tty_set_theme(current_theme >> 8, current_theme >> 12);
47 }
48
49 void
50 kprint_panic(const char* fmt, ...) {
51     va_list args;
52     va_start(args, fmt);
53     
54     tty_set_theme(VGA_COLOR_WHITE, VGA_COLOR_RED);
55     tty_clear_line(10);
56     tty_clear_line(11);
57     tty_clear_line(12);
58     tty_set_cpos(0, 11);
59
60     __sprintf_internal(buf, fmt, MAX_KPRINTF_BUF_SIZE, args);
61     tty_put_str(buf);
62
63     va_end(args);
64 }