From a8b2282eb88f24c3c5f461e1557fa2cf76ebc251 Mon Sep 17 00:00:00 2001 From: turret Date: Sun, 19 Nov 2023 18:57:55 -0600 Subject: Initial commit - create subsystem system using clone syscall, shared memory, shared file descriptors - printk-like logging facility (TODO: console loglevel) - initcall system (like linux kernel) TODO: determine license factors: linker.ld, linux kernel licensing (some ideas are more liberally taken rather than paraphrased) --- init/log.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 init/log.c (limited to 'init/log.c') diff --git a/init/log.c b/init/log.c new file mode 100644 index 0000000..3cdaa06 --- /dev/null +++ b/init/log.c @@ -0,0 +1,69 @@ +#include +#include +#include +#include +#include + +#include +#include + +static const char *colors[] = { + [0] = ANSI_BLINK ANSI_REVERSE ANSI_BOLD ANSI_RED, + [1] = ANSI_REVERSE ANSI_BOLD ANSI_RED, + [2] = ANSI_BOLD ANSI_RED, + [3] = ANSI_RED, + [4] = ANSI_BOLD, + [5] = ANSI_BRIGHT_WHITE, + [6] = ANSI_RESET, + [7] = ANSI_ITALIC ANSI_BRIGHT_BLUE, +}; + +int console_lock = 0; + +int print(const char *fmt, ...) +{ + int loglevel = 5; + if(fmt[0] == LOG_SOH_ASCII) { + loglevel = (fmt[1] - 0x30) % 10; + fmt += 2; + } + + char buf[512]; + + va_list ap; + va_start(ap, fmt); + vsnprintf(buf, 512, fmt, ap); + va_end(ap); + buf[512 - 1] = '\0'; + + size_t colon = 0; + for(; colon < strlen(buf); ++colon) { + if(buf[colon] == ':') + break; + } + + /* spin lock, at the cost of architecture portability */ + __asm__(".spin_lock:"); + __asm__("mov rax, 1"); + __asm__("xchg rax, [console_lock]"); + __asm__("test rax, rax"); + __asm__("jnz .spin_lock"); + + if(buf[colon] == ':') { + writeputs(ANSI_RESET); + writeputs(colors[loglevel]); + writeputs(ANSI_YELLOW); + write(STDOUT_FILENO, buf, colon); + writeputs(ANSI_RESET); + } + writeputs(colors[loglevel]); + if(colon && *(buf + colon)) { + writeputs(buf + colon); + } else { + writeputs(buf); + } + writeputs(ANSI_RESET); + + console_lock = 0; + return 0; +} -- cgit v1.2.3