summaryrefslogtreecommitdiff
path: root/include/libk
diff options
context:
space:
mode:
authorDanny Holman <dholman@gymli.org>2024-05-27 13:53:52 -0500
committerDanny Holman <dholman@gymli.org>2024-05-27 13:53:52 -0500
commitaaf7355c5ededfcdc877c7f2989fb1ba02dfb848 (patch)
tree0c4588650fe1fc1fa1af2972353a2bc920cf1e68 /include/libk
parent41cff28f5447b5f669db62ce2a73be98bc5bce37 (diff)
libk: create a subset libc for kernel use
Create a subset of the C library for use inside the kernel. Signed-off-by: Danny Holman <dholman@gymli.org>
Diffstat (limited to 'include/libk')
-rw-r--r--include/libk/container_of.h10
-rw-r--r--include/libk/data/list.h32
-rw-r--r--include/libk/data/ringbuf.h50
-rw-r--r--include/libk/io.h10
-rw-r--r--include/libk/kmalloc.h19
-rw-r--r--include/libk/string.h19
6 files changed, 140 insertions, 0 deletions
diff --git a/include/libk/container_of.h b/include/libk/container_of.h
new file mode 100644
index 0000000..fdc400c
--- /dev/null
+++ b/include/libk/container_of.h
@@ -0,0 +1,10 @@
+#ifndef LIBK_CONTAINER_OF_H
+#define LIBK_CONTAINER_OF_H
+
+#ifndef container_of
+#define container_of(ptr, type, member) ({ \
+ const typeof(((type*)0)->member)*__mptr = (ptr); \
+ (type*)((char*)__mptr - offsetof(type, member)); })
+#endif
+
+#endif
diff --git a/include/libk/data/list.h b/include/libk/data/list.h
new file mode 100644
index 0000000..69eee3a
--- /dev/null
+++ b/include/libk/data/list.h
@@ -0,0 +1,32 @@
+#ifndef LIBK_LIST_H
+#define LIBK_LIST_H
+
+#include <stddef.h>
+
+struct list_head {
+ struct list_head *next;
+ struct list_head *prev;
+};
+
+static inline void list_add(struct list_head *new, struct list_head *head) {
+ struct list_head *temp = head;
+ while (temp->next != NULL)
+ temp = temp->next;
+
+ temp->next = new;
+ new->prev = temp;
+ new->next = NULL;
+}
+
+static inline void list_del(struct list_head *item) {
+ struct list_head *next = item->next;
+ struct list_head *prev = item->prev;
+ if (next != NULL)
+ next->prev = prev;
+ if (prev != NULL)
+ prev->next = next;
+ item->next = NULL;
+ item->prev = NULL;
+}
+
+#endif
diff --git a/include/libk/data/ringbuf.h b/include/libk/data/ringbuf.h
new file mode 100644
index 0000000..cc6d77b
--- /dev/null
+++ b/include/libk/data/ringbuf.h
@@ -0,0 +1,50 @@
+#ifndef LIBK_RINGBUF_H
+#define LIBK_RINGBUF_H
+
+#include <kernel/kmalloc.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
diff --git a/include/libk/io.h b/include/libk/io.h
new file mode 100644
index 0000000..72dc5d7
--- /dev/null
+++ b/include/libk/io.h
@@ -0,0 +1,10 @@
+#ifndef LIBK_IO_H
+#define LIBK_IO_H
+
+#include <stdarg.h>
+
+char* convert(unsigned int num, int base);
+int vkprintf(const char *fmt, va_list args);
+int kprintf(const char *fmt, ...);
+
+#endif
diff --git a/include/libk/kmalloc.h b/include/libk/kmalloc.h
new file mode 100644
index 0000000..6573d28
--- /dev/null
+++ b/include/libk/kmalloc.h
@@ -0,0 +1,19 @@
+#ifndef LIBK_KMALLOC_H
+#define LIBK_KMALLOC_H
+
+#include <stdint.h>
+#include <stddef.h>
+
+struct mem_block {
+ void *start;
+ size_t size;
+ int alloc;
+ struct mem_block *next;
+ struct mem_block *prev;
+};
+
+void kmalloc_init(void);
+void* kmalloc(size_t sz);
+void kfree(void *ptr);
+
+#endif
diff --git a/include/libk/string.h b/include/libk/string.h
new file mode 100644
index 0000000..1fb4af1
--- /dev/null
+++ b/include/libk/string.h
@@ -0,0 +1,19 @@
+#ifndef LIBK_STRING_H
+#define LIBK_STRING_H
+
+#include <stddef.h>
+
+int memcmp(const void *str1, const void *str2, size_t n);
+void* memcpy(void* __restrict dest, const void* __restrict src, size_t n);
+void* memmove(void* __restrict dest, const void* __restrict src, size_t n);
+void* memset(void *str, int c, size_t n);
+int strncmp(const char *str1, const char *str2, size_t n);
+int strcmp(const char *str1, const char *str2);
+size_t strlen(const char *str);
+char* strncpy(char* __restrict dest, const char* __restrict src, size_t n);
+char* strcpy(char* __restrict dest, const char* __restrict src);
+char* strncat(char* __restrict dest, const char* __restrict src, size_t n);
+char* strcat(char* __restrict dest, const char* __restrict src);
+char* strtok(char* __restrict str, const char* __restrict delim);
+
+#endif