diff options
author | Tyler Murphy <=> | 2023-07-16 02:54:32 -0400 |
---|---|---|
committer | Tyler Murphy <=> | 2023-07-16 02:54:32 -0400 |
commit | fbf131b5c043b27e0b1543374bb144e3e426f723 (patch) | |
tree | 07f0ab2fc107b36621d5ae95480e6a91e332548b /kernel/src/print | |
download | finix-fbf131b5c043b27e0b1543374bb144e3e426f723.tar.gz finix-fbf131b5c043b27e0b1543374bb144e3e426f723.tar.bz2 finix-fbf131b5c043b27e0b1543374bb144e3e426f723.zip |
initial
Diffstat (limited to 'kernel/src/print')
-rw-r--r-- | kernel/src/print/panic.c | 27 | ||||
-rw-r--r-- | kernel/src/print/print.c | 128 |
2 files changed, 155 insertions, 0 deletions
diff --git a/kernel/src/print/panic.c b/kernel/src/print/panic.c new file mode 100644 index 0000000..5e686e1 --- /dev/null +++ b/kernel/src/print/panic.c @@ -0,0 +1,27 @@ +#include <sys.h> +#include <stdarg.h> +#include <stdlib.h> +#include <panic.h> +#include <print.h> + +#include "tty/color.h" +#include "tty/term.h" + +__attribute__((noreturn)) +void _panic_impl(char* msg, int line, char* file, ...) { + int_disable(); + va_list args; + va_start(args, file); + term_clear(); + term_setpos(0, 0); + term_setfg(VGA_LIGHT_RED); + puts("!!!PANIC!!!\n"); + term_setfg(VGA_WHITE); + vprintk(msg, args); + if (!term_newline()) putchar('\n'); + printk("\nin %s at line %d\n", file, line); + + while(1) { + halt(); + } +} diff --git a/kernel/src/print/print.c b/kernel/src/print/print.c new file mode 100644 index 0000000..46ec047 --- /dev/null +++ b/kernel/src/print/print.c @@ -0,0 +1,128 @@ +#include "tty/color.h" +#include "tty/term.h" +#include <stdbool.h> +#include <stdint.h> +#include <stdlib.h> +#include <string.h> +#include <print.h> + +void printk(const char *restrict format, ...) { + va_list args; + va_start(args, format); + vprintk(format, args); + va_end(args); +} + +void vprintk(const char *restrict format, va_list args) { + char buf[80]; + for (; *format; format++) { + if (*format == '%') { + bool l = false; + char c = *++format; + if (c == 'l') { + l = true; + c = *++format; + } + switch(c) { + case '%': + putchar('%'); + break; + case 's': + puts(va_arg(args, char*)); + break; + case 'c': + putchar(va_arg(args, int)); + break; + case 'd': + if (l) ltoa(va_arg(args, long long), buf, 10); + else itoa(va_arg(args, int), buf, 10); + puts(buf); + break; + case 'u': + if (l) ultoa(va_arg(args, unsigned long long), buf, 10); + else utoa(va_arg(args, unsigned int), buf, 10); + puts(buf); + break; + case 'f': + case 'F': + ftoa(va_arg(args, double), buf); + puts(buf); + break; + case 'x': + case 'X': + utoa(va_arg(args, unsigned int), buf, 16); + puts(buf); + break; + case 'b': + va_arg(args, int) ? puts("true") : puts("false"); + break; + case 'k': { + static char disp[] = {'B', 'K', 'M', 'G'}; + uint32_t size = va_arg(args, unsigned int); + size_t i = 0; + while (size / 1024 > 0) { + size /= 1024; + i++; + } + utoa(size, buf, 10); + puts(buf); + putchar(disp[i]); + if (i > 0) putchar('B'); + break; + } + default: + break; + } + } else { + putchar(*format); + } + } +} + +void puts(const char *s) { + for(; *s; s++) putchar(*s); +} + +void printl(enum VGAColor color, const char* msg) { + term_setbg(VGA_BLACK); + term_setfg(VGA_WHITE); + putchar('['); + term_setfg(color); + printk("%s", msg); + term_setfg(VGA_WHITE); + putchar(']'); + putchar(' '); +} + +void _debugk_impl(char *format, ...) { + uint16_t color = term_save_col(); + printl(VGA_LIGHT_CYAN, "LOG"); + va_list args; + va_start(args, format); + vprintk(format, args); + va_end(args); + if (!term_newline()) putchar('\n'); + term_load_col(color); +} + +void _succek_impl(char *format, ...) { + uint16_t color = term_save_col(); + printl(VGA_LIGHT_GREEN, "OK"); + va_list args; + va_start(args, format); + vprintk(format, args); + va_end(args); + if (!term_newline()) putchar('\n'); + term_load_col(color); +} + +void _errork_impl(char *format, ...) { + uint16_t color = term_save_col(); + printl(VGA_LIGHT_RED, "ERR"); + va_list args; + va_start(args, format); + vprintk(format, args); + va_end(args); + if (!term_newline()) putchar('\n'); + term_load_col(color); +} |