From aaf7355c5ededfcdc877c7f2989fb1ba02dfb848 Mon Sep 17 00:00:00 2001 From: Danny Holman Date: Mon, 27 May 2024 13:53:52 -0500 Subject: 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 --- include/kernel/container_of.h | 10 --------- include/kernel/data/list.h | 32 --------------------------- include/kernel/data/ringbuf.h | 50 ------------------------------------------- include/kernel/io.h | 9 -------- include/kernel/kmalloc.h | 18 ---------------- include/kernel/string.h | 18 ---------------- include/libk/container_of.h | 10 +++++++++ include/libk/data/list.h | 32 +++++++++++++++++++++++++++ include/libk/data/ringbuf.h | 50 +++++++++++++++++++++++++++++++++++++++++++ include/libk/io.h | 10 +++++++++ include/libk/kmalloc.h | 19 ++++++++++++++++ include/libk/string.h | 19 ++++++++++++++++ 12 files changed, 140 insertions(+), 137 deletions(-) delete mode 100644 include/kernel/container_of.h delete mode 100644 include/kernel/data/list.h delete mode 100644 include/kernel/data/ringbuf.h delete mode 100644 include/kernel/io.h delete mode 100644 include/kernel/kmalloc.h delete mode 100644 include/kernel/string.h create mode 100644 include/libk/container_of.h create mode 100644 include/libk/data/list.h create mode 100644 include/libk/data/ringbuf.h create mode 100644 include/libk/io.h create mode 100644 include/libk/kmalloc.h create mode 100644 include/libk/string.h (limited to 'include') diff --git a/include/kernel/container_of.h b/include/kernel/container_of.h deleted file mode 100644 index 1b5b444..0000000 --- a/include/kernel/container_of.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef KERNEL_CONTAINER_OF_H -#define KERNEL_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/kernel/data/list.h b/include/kernel/data/list.h deleted file mode 100644 index b61cfaa..0000000 --- a/include/kernel/data/list.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef KERNEL_LIST_H -#define KERNEL_LIST_H - -#include - -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/kernel/data/ringbuf.h b/include/kernel/data/ringbuf.h deleted file mode 100644 index 25a7125..0000000 --- a/include/kernel/data/ringbuf.h +++ /dev/null @@ -1,50 +0,0 @@ -#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 deleted file mode 100644 index cf8404a..0000000 --- a/include/kernel/io.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef KERNEL_IO_H -#define KERNEL_IO_H - -#include - -int vkprintf(const char *fmt, va_list args); -int kprintf(const char *fmt, ...); - -#endif diff --git a/include/kernel/kmalloc.h b/include/kernel/kmalloc.h deleted file mode 100644 index d8debd1..0000000 --- a/include/kernel/kmalloc.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef KERNEL_KMALLOC_H -#define KERNEL_KMALLOC_H - -#include -#include - -struct mem_block { - uintptr_t start; - size_t size; - int alloc; - struct mem_block *next; -}; - -void kmalloc_init(void); -void* kmalloc(size_t sz); -void kfree(void *ptr); - -#endif diff --git a/include/kernel/string.h b/include/kernel/string.h deleted file mode 100644 index 76bf610..0000000 --- a/include/kernel/string.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef STRING_H -#define STRING_H - -#include - -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* strcat(char* __restrict dest, const char* __restrict src); -char* strtok(char* __restrict str, const char* __restrict delim); - -#endif 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 + +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 +#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/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 + +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 +#include + +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 + +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 -- cgit v1.2.3