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 --- include/kernel/data/ringbuf.h | 50 +++++++++++++++++++++++++++++++++++++++++++ include/kernel/io.h | 4 ++-- 2 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 include/kernel/data/ringbuf.h (limited to 'include/kernel') 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 +#include +#include + +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 diff --git a/include/kernel/io.h b/include/kernel/io.h index 8f5fa59..cf8404a 100644 --- a/include/kernel/io.h +++ b/include/kernel/io.h @@ -1,5 +1,5 @@ -#ifndef IO_H -#define IO_H +#ifndef KERNEL_IO_H +#define KERNEL_IO_H #include -- cgit v1.2.3