summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorDanny Holman <dholman@gymli.org>2024-02-16 12:32:40 -0600
committerDanny Holman <dholman@gymli.org>2024-02-16 12:32:40 -0600
commita267b8c076793cf59c2f6c80a31d7d094a215aab (patch)
tree2f73f36ebfd69a8e8709a9ee8434b9bcf57c386c /kernel
parent1d40d14e09c8c22ffbdf5a5cad95ae552587ce53 (diff)
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 <dholman@gymli.org>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/io.c34
1 files changed, 23 insertions, 11 deletions
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 <kernel/io.h>
+#include <kernel/framebuffer.h>
+#include <kernel/data/ringbuf.h>
#include <kernel/string.h>
-#include <kernel/tty.h>
+
+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;
}