summaryrefslogtreecommitdiff
path: root/include/kernel/data
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 /include/kernel/data
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 'include/kernel/data')
-rw-r--r--include/kernel/data/ringbuf.h50
1 files changed, 50 insertions, 0 deletions
diff --git a/include/kernel/data/ringbuf.h b/include/kernel/data/ringbuf.h
new file mode 100644
index 0000000..4f30874
--- /dev/null
+++ b/include/kernel/data/ringbuf.h
@@ -0,0 +1,50 @@
+#ifndef KERNEL_RINGBUF_H
+#define KERNEL_RINGBUF_H
+
+#include <kernel/mem.h>
+#include <kernel/string.h>
+#include <stdint.h>
+
+struct ringbuf {
+ void *buffer;
+ void *buf_end;
+ uint32_t capacity;
+ uint32_t count;
+ uint32_t size;
+ void *head;
+ void *tail;
+};
+
+static inline void rb_init(struct ringbuf *rb, uint32_t capacity, uint32_t size) {
+ rb->buffer = kmalloc(capacity * size);
+ rb->buf_end = (char*)rb->buffer + (capacity * size);
+ rb->capacity = capacity;
+ rb->size = size;
+ rb->head = rb->buffer;
+ rb->tail = rb->buffer;
+}
+
+static inline int rb_push_back(struct ringbuf *rb, const void *item, size_t size) {
+ if (rb->count == rb->capacity)
+ return -1;
+ if (size > rb->size)
+ return -1;
+
+ void *tmp = rb->tail + rb->size;
+ if (tmp > rb->head + rb->capacity * rb->size)
+ rb->tail = rb->head;
+ memcpy(rb->tail, item, size);
+ rb->tail += rb->size;
+ rb->count++;
+ return 0;
+}
+
+static inline void rb_pop_front(struct ringbuf *rb, void *item) {
+ memcpy(item, rb->tail, rb->size);
+ rb->tail = (char*)rb->tail + rb->size;
+ if (rb->tail == rb->buf_end)
+ rb->tail = rb->buffer;
+ rb->count--;
+}
+
+#endif