From a267b8c076793cf59c2f6c80a31d7d094a215aab Mon Sep 17 00:00:00 2001 From: Danny Holman Date: Fri, 16 Feb 2024 12:32:40 -0600 Subject: kernel: make kprintf print to a ring buffer The function kprintf should print to an internal ringbuffer instead of directly to the framebuffer. This reduces dependence on the existence of a framebuffer in the first place. Signed-off-by: Danny Holman --- kernel/io.c | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) (limited to 'kernel') diff --git a/kernel/io.c b/kernel/io.c index 71b01bd..0a4ba6d 100644 --- a/kernel/io.c +++ b/kernel/io.c @@ -1,6 +1,10 @@ #include +#include +#include #include -#include + +static int ringbuf_init = 0; +static struct ringbuf rb; char* convert(unsigned int num, int base) { static char rep[] = "0123456789ABCDEF"; @@ -19,12 +23,18 @@ char* convert(unsigned int num, int base) { } int vkprintf(const char *fmt, va_list args) { + if (ringbuf_init == 0) { + rb_init(&rb, 1024, 4096); + ringbuf_init = 1; + } + char *s; int i; + char buffer[4096]; for (size_t n = 0; n < strlen(fmt); n++) { if (fmt[n] != '%') { - tty_putchar(fmt[n]); + buffer[strlen(buffer)] = fmt[n]; continue; } else { n++; @@ -33,30 +43,32 @@ int vkprintf(const char *fmt, va_list args) { switch (fmt[n]) { case 'c': i = va_arg(args, int); - tty_putchar(i); + buffer[strlen(buffer)] = i; + break; + case 's': + s = va_arg(args, char*); + strcat(buffer, s); break; case 'd': i = va_arg(args, int); if (i < 0) { i = -i; - tty_putchar('-'); + strcat(buffer, "-"); } - tty_writestring(convert(i, 10)); + strcat(buffer, convert(i, 10)); break; case 'o': i = va_arg(args, unsigned int); - tty_writestring(convert(i, 8)); - break; - case 's': - s = va_arg(args, char*); - tty_writestring(s); + strcat(buffer, convert(i, 10)); break; case 'x': i = va_arg(args, unsigned int); - tty_writestring(convert(i, 16)); + strcat(buffer, convert(i, 16)); break; } } + rb_push_back(&rb, buffer, strlen(buffer)); + memset(buffer, 0, 4096); return 0; } -- cgit v1.2.3