Implement APIC, RTC, basic ACPI parser and timer support
[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 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", "INFO", 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     default:
36         snprintf(expanded_fmt, MAX_XFMT_SIZE, "[%s] (%s) %s", "LOG", component, fmt);
37         break;
38     }
39
40     __sprintf_internal(buf, expanded_fmt, MAX_KPRINTF_BUF_SIZE, args);
41     tty_put_str(buf);
42     tty_set_theme(current_theme >> 8, current_theme >> 12);
43 }
44
45 void
46 kprint_panic(const char* fmt, ...) {
47     va_list args;
48     va_start(args, fmt);
49     
50     tty_set_theme(VGA_COLOR_WHITE, VGA_COLOR_RED);
51     tty_clear_line(10);
52     tty_clear_line(11);
53     tty_clear_line(12);
54     tty_set_cpos(0, 11);
55
56     __sprintf_internal(buf, fmt, MAX_KPRINTF_BUF_SIZE, args);
57     tty_put_str(buf);
58
59     va_end(args);
60 }