aboutsummaryrefslogtreecommitdiff
path: root/libc
diff options
context:
space:
mode:
authorMarvin Borner2021-03-26 21:55:50 +0100
committerMarvin Borner2021-03-26 22:02:20 +0100
commit05498860e8f7b1e8bb27880bc7526de026694804 (patch)
tree3bddf16e9439a950a3810d45e42a5cefdbcb7663 /libc
parenta96e9c4c858d47f61b89d879aa0ce6a02bdacb38 (diff)
Renamed libs
Cleaner and more flexible.
Diffstat (limited to 'libc')
-rw-r--r--libc/Makefile42
-rw-r--r--libc/alloc.c425
-rw-r--r--libc/conv.c145
-rw-r--r--libc/cpu.c182
-rw-r--r--libc/crt/crt0.asm15
-rw-r--r--libc/crypto.c166
-rw-r--r--libc/errno.c14
-rw-r--r--libc/inc/arg.h11
-rw-r--r--libc/inc/assert.h28
-rw-r--r--libc/inc/conv.h15
-rw-r--r--libc/inc/cpu.h110
-rw-r--r--libc/inc/crypto.h11
-rw-r--r--libc/inc/def.h59
-rw-r--r--libc/inc/errno.h52
-rw-r--r--libc/inc/input.h279
-rw-r--r--libc/inc/ioctl.h11
-rw-r--r--libc/inc/list.h29
-rw-r--r--libc/inc/math.h8
-rw-r--r--libc/inc/mem.h29
-rw-r--r--libc/inc/print.h27
-rw-r--r--libc/inc/random.h14
-rw-r--r--libc/inc/socket.h38
-rw-r--r--libc/inc/stack.h28
-rw-r--r--libc/inc/str.h22
-rw-r--r--libc/inc/sys.h130
-rw-r--r--libc/inc/vec.h36
-rw-r--r--libc/list.c138
-rw-r--r--libc/math.c17
-rw-r--r--libc/mem.c121
-rw-r--r--libc/print.c257
-rw-r--r--libc/random.c71
-rw-r--r--libc/sanitize.c228
-rw-r--r--libc/stack.c126
-rw-r--r--libc/str.c207
-rw-r--r--libc/sys.c203
35 files changed, 0 insertions, 3294 deletions
diff --git a/libc/Makefile b/libc/Makefile
deleted file mode 100644
index 9ebf838..0000000
--- a/libc/Makefile
+++ /dev/null
@@ -1,42 +0,0 @@
-# MIT License, Copyright (c) 2020 Marvin Borner
-
-# TODO: Remove cpu from libc?
-COBJS = sanitize.o \
- errno.o \
- str.o \
- alloc.o \
- mem.o \
- math.o \
- crypto.o \
- conv.o \
- print.o \
- cpu.o \
- sys.o \
- list.o \
- stack.o \
- random.o
-CC = ccache ../cross/opt/bin/i686-elf-gcc
-LD = ccache ../cross/opt/bin/i686-elf-ld
-AR = ccache ../cross/opt/bin/i686-elf-ar
-AS = ccache nasm
-
-CFLAGS = $(CFLAGS_DEFAULT) -Iinc/
-
-ASFLAGS = -f elf32
-
-%.o: %.c
- @$(CC) -c $(CFLAGS) $< -o $@
-
-libc: CFLAGS += -Duserspace -fPIE
-libc: $(COBJS)
- @$(AS) $(ASFLAGS) crt/crt0.asm -o crt0.o
- @mkdir -p ../build/
- @$(AR) rcs ../build/libc.a crt0.o $+
-
-libk: CFLAGS += -Dkernel -ffreestanding -I../kernel/inc/ $(CFLAGS_EXTRA)
-libk: $(COBJS)
- @mkdir -p ../build/
- @$(AR) rcs ../build/libk.a $+
-
-clean:
- @find . -name "*.o" -type f -delete
diff --git a/libc/alloc.c b/libc/alloc.c
deleted file mode 100644
index b8139d0..0000000
--- a/libc/alloc.c
+++ /dev/null
@@ -1,425 +0,0 @@
-// MIT License, Copyright (c) 2021 Marvin Borner
-// Mostly by Durand Miller, released into public domain
-
-#include <assert.h>
-#include <cpu.h>
-#include <mem.h>
-
-#ifdef kernel
-
-#include <mm.h>
-
-static void *liballoc_alloc(u32 p)
-{
- return memory_alloc(virtual_kernel_dir(), p, MEMORY_CLEAR);
-}
-
-static int liballoc_free(void *ptr, u32 p)
-{
- memory_free(virtual_kernel_dir(), memory_range((u32)ptr, (u32)p));
- return 0;
-}
-
-#else
-
-#include <sys.h>
-
-static void *liballoc_alloc(u32 p)
-{
- u32 addr;
- assert(sys_alloc(p, &addr) == EOK);
- return (void *)addr;
-}
-
-static int liballoc_free(void *ptr, u32 p)
-{
- UNUSED(p);
- assert(sys_free(ptr) == EOK);
- return 0;
-}
-
-#endif
-
-static int locked = 0;
-
-static int liballoc_lock(void)
-{
- spinlock(&locked);
- return 0;
-}
-
-static int liballoc_unlock(void)
-{
- locked = 0;
- return 0;
-}
-
-#define ALIGNMENT 16
-#define ALIGN_UP(__addr, __align) (((__addr) + (__align)-1) & ~((__align)-1))
-#define ALIGN_DOWN(__addr, __align) ((__addr) & ~((__align)-1))
-
-#define USE_CASE1
-#define USE_CASE2
-#define USE_CASE3
-#define USE_CASE4
-#define USE_CASE5
-#define LIBALLOC_MAGIC 0x900df00d
-#define LIBALLOC_DEAD 0xbaadf00d
-
-struct liballoc_major {
- struct liballoc_major *prev;
- struct liballoc_major *next;
- u32 pages;
- u32 size;
- u32 usage;
- struct liballoc_minor *first;
-};
-
-struct liballoc_minor {
- struct liballoc_minor *prev;
- struct liballoc_minor *next;
- struct liballoc_major *block;
- u32 magic;
- u32 size;
- u32 req_size;
-};
-
-#define MAJOR_SIZE (ALIGN_UP(sizeof(struct liballoc_major), 16))
-#define MINOR_SIZE (ALIGN_UP(sizeof(struct liballoc_minor), 16))
-
-static struct liballoc_major *l_mem_root = NULL;
-static struct liballoc_major *l_best_bet = NULL;
-
-static u32 l_page_size = 4096;
-static u32 l_page_count = 16;
-
-static struct liballoc_major *allocate_new_page(u32 size)
-{
- u32 st = size + MAJOR_SIZE + MINOR_SIZE;
-
- if ((st % l_page_size) == 0)
- st = st / (l_page_size);
- else
- st = st / (l_page_size) + 1;
-
- st = MAX(st, l_page_count);
-
- struct liballoc_major *maj = (struct liballoc_major *)liballoc_alloc(st * l_page_size);
-
- if (maj == NULL)
- return NULL;
-
- maj->prev = NULL;
- maj->next = NULL;
- maj->pages = st;
- maj->size = st * l_page_size;
- maj->usage = MAJOR_SIZE;
- maj->first = NULL;
-
- return maj;
-}
-
-static void *_malloc(u32 req_size)
-{
- req_size = ALIGN_UP(req_size, 16);
-
- u32 best_size = 0;
- u32 size = req_size;
-
- liballoc_lock();
-
- if (size == 0) {
- liballoc_unlock();
- return malloc(1);
- }
-
- if (l_mem_root == NULL) {
- l_mem_root = allocate_new_page(size);
- if (l_mem_root == NULL) {
- liballoc_unlock();
- panic("Malloc failed!\n");
- }
- }
-
- struct liballoc_major *maj = l_mem_root;
- u8 started_bet = 0;
-
- if (l_best_bet != NULL) {
- best_size = l_best_bet->size - l_best_bet->usage;
-
- if (best_size > (size + MINOR_SIZE)) {
- maj = l_best_bet;
- started_bet = 1;
- }
- }
-
- while (maj != NULL) {
- u32 diff = maj->size - maj->usage;
- if (best_size < diff) {
- l_best_bet = maj;
- best_size = diff;
- }
-
-#ifdef USE_CASE1
- if (diff < (size + MINOR_SIZE)) {
- if (maj->next != NULL) {
- maj = maj->next;
- continue;
- }
-
- if (started_bet == 1) {
- maj = l_mem_root;
- started_bet = 0;
- continue;
- }
-
- maj->next = allocate_new_page(size);
- if (maj->next == NULL)
- break;
- maj->next->prev = maj;
- maj = maj->next;
- }
-#endif
-
-#ifdef USE_CASE2
- if (maj->first == NULL) {
- maj->first = (struct liballoc_minor *)((u32)maj + MAJOR_SIZE);
-
- maj->first->magic = LIBALLOC_MAGIC;
- maj->first->prev = NULL;
- maj->first->next = NULL;
- maj->first->block = maj;
- maj->first->size = size;
- maj->first->req_size = req_size;
- maj->usage += size + MINOR_SIZE;
- void *p = (void *)((u32)(maj->first) + MINOR_SIZE);
- liballoc_unlock();
- return p;
- }
-#endif
-
-#ifdef USE_CASE3
- diff = (u32)(maj->first);
- diff -= (u32)maj;
- diff -= MAJOR_SIZE;
-
- if (diff >= (size + MINOR_SIZE)) {
- maj->first->prev = (struct liballoc_minor *)((u32)maj + MAJOR_SIZE);
- maj->first->prev->next = maj->first;
- maj->first = maj->first->prev;
- maj->first->magic = LIBALLOC_MAGIC;
- maj->first->prev = NULL;
- maj->first->block = maj;
- maj->first->size = size;
- maj->first->req_size = req_size;
- maj->usage += size + MINOR_SIZE;
- void *p = (void *)((u32)(maj->first) + MINOR_SIZE);
- liballoc_unlock();
- return p;
- }
-#endif
-
-#ifdef USE_CASE4
- struct liballoc_minor *min = maj->first;
-
- while (min != NULL) {
- if (min->next == NULL) {
- diff = (u32)(maj) + maj->size;
- diff -= (u32)min;
- diff -= MINOR_SIZE;
- diff -= min->size;
- if (diff >= (size + MINOR_SIZE)) {
- min->next =
- (struct liballoc_minor *)((u32)min + MINOR_SIZE +
- min->size);
- min->next->prev = min;
- min = min->next;
- min->next = NULL;
- min->magic = LIBALLOC_MAGIC;
- min->block = maj;
- min->size = size;
- min->req_size = req_size;
- maj->usage += size + MINOR_SIZE;
- void *p = (void *)((u32)min + MINOR_SIZE);
- liballoc_unlock();
- return p;
- }
- }
-
- if (min->next != NULL) {
- diff = (u32)(min->next);
- diff -= (u32)min;
- diff -= MINOR_SIZE;
- diff -= min->size;
-
- if (diff >= (size + MINOR_SIZE)) {
- struct liballoc_minor *new_min =
- (struct liballoc_minor *)((u32)min + MINOR_SIZE +
- min->size);
- new_min->magic = LIBALLOC_MAGIC;
- new_min->next = min->next;
- new_min->prev = min;
- new_min->size = size;
- new_min->req_size = req_size;
- new_min->block = maj;
- min->next->prev = new_min;
- min->next = new_min;
- maj->usage += size + MINOR_SIZE;
- void *p = (void *)((u32)new_min + MINOR_SIZE);
- liballoc_unlock();
- return p;
- }
- }
-
- min = min->next;
- }
-#endif
-
-#ifdef USE_CASE5
- if (maj->next == NULL) {
- if (started_bet == 1) {
- maj = l_mem_root;
- started_bet = 0;
- continue;
- }
- maj->next = allocate_new_page(size);
- if (maj->next == NULL)
- break;
- maj->next->prev = maj;
- }
-#endif
- maj = maj->next;
- }
-
- liballoc_unlock();
-
- panic("Malloc failed!\n");
- return NULL;
-}
-
-static void _free(void *ptr)
-{
- if (ptr == NULL) {
- return;
- }
-
- liballoc_lock();
-
- struct liballoc_minor *min = (struct liballoc_minor *)((u32)ptr - MINOR_SIZE);
-
- if (min->magic != LIBALLOC_MAGIC) {
- liballoc_unlock();
- return;
- }
-
- struct liballoc_major *maj = min->block;
- maj->usage -= (min->size + MINOR_SIZE);
- min->magic = LIBALLOC_DEAD;
-
- if (min->next != NULL)
- min->next->prev = min->prev;
- if (min->prev != NULL)
- min->prev->next = min->next;
- if (min->prev == NULL)
- maj->first = min->next;
- if (maj->first == NULL) {
- if (l_mem_root == maj)
- l_mem_root = maj->next;
- if (l_best_bet == maj)
- l_best_bet = NULL;
- if (maj->prev != NULL)
- maj->prev->next = maj->next;
- if (maj->next != NULL)
- maj->next->prev = maj->prev;
- liballoc_free(maj, maj->pages * l_page_size);
- } else {
- if (l_best_bet != NULL) {
- int best_size = l_best_bet->size - l_best_bet->usage;
- int maj_size = maj->size - maj->usage;
- if (maj_size > best_size)
- l_best_bet = maj;
- }
- }
- liballoc_unlock();
-}
-
-static void *_realloc(void *ptr, u32 size)
-{
- size = ALIGN_UP(size, 16);
-
- if (size == 0) {
- free(ptr);
- return NULL;
- }
-
- if (ptr == NULL)
- return malloc(size);
-
- liballoc_lock();
- struct liballoc_minor *min = (struct liballoc_minor *)((u32)ptr - MINOR_SIZE);
-
- if (min->magic != LIBALLOC_MAGIC) {
- liballoc_unlock();
- panic("Malloc failed!\n");
- return NULL;
- }
-
- if (min->size >= size) {
- min->req_size = size;
- liballoc_unlock();
- return ptr;
- }
-
- liballoc_unlock();
-
- void *new_ptr = malloc(size);
- memcpy(new_ptr, ptr, min->req_size);
- free(ptr);
-
- return new_ptr;
-}
-
-#ifdef kernel
-#define PREFIX "K"
-#define FUNC printf
-#else
-#define PREFIX "U"
-#define FUNC log
-#endif
-
-void *zalloc(u32 size)
-{
- void *ret = malloc(size);
- memset(ret, 0, size);
- return ret;
-}
-
-void *realloc(void *ptr, u32 size)
-{
- return _realloc(ptr, size);
-}
-
-void *malloc_debug(u32 size, const char *file, int line, const char *func, const char *inp)
-{
- assert(size < (100 << 20)); // Don't brag with memory pls
- void *ret = _malloc(size);
-
- (void)file;
- (void)line;
- (void)func;
- (void)inp;
- /* FUNC(PREFIX "MALLOC\t%s:%d: %s: 0x%x %dB (%s)\n", file, line, func, ret, size, inp); */
- return ret;
-}
-
-void free_debug(void *ptr, const char *file, int line, const char *func, const char *inp)
-{
- if (ptr)
- _free(ptr);
-
- (void)file;
- (void)line;
- (void)func;
- (void)inp;
- /* FUNC(PREFIX "FREE\t%s:%d: %s: 0x%x (%s)\n", file, line, func, ptr, inp); */
-}
diff --git a/libc/conv.c b/libc/conv.c
deleted file mode 100644
index 670fdb3..0000000
--- a/libc/conv.c
+++ /dev/null
@@ -1,145 +0,0 @@
-// MIT License, Copyright (c) 2020 Marvin Borner
-
-#include <conv.h>
-#include <def.h>
-#include <math.h>
-#include <mem.h>
-#include <str.h>
-
-static const char HTOA_TABLE[] = "0123456789ABCDEF";
-static const char ITOA_TABLE[] = "0123456789";
-
-int atoi(const char *str)
-{
- u32 s_str = strlen(str);
- if (!s_str)
- return 0;
-
- u8 negative = 0;
- if (str[0] == '-')
- negative = 1;
-
- u32 i = 0;
- if (negative)
- i++;
-
- int ret = 0;
- for (; i < s_str; i++) {
- ret += (str[i] - '0') * pow(10, (int)((s_str - i) - 1));
- }
-
- if (negative)
- ret *= -1;
- return ret;
-}
-
-char *htoa(u32 n)
-{
- char *ret = (char *)malloc(10);
-
- int i = 0;
- while (n) {
- ret[i++] = HTOA_TABLE[n & 0xF];
- n >>= 4;
- }
-
- if (!i) {
- ret[0] = '0';
- i++;
- }
-
- for (; i <= 9; i++)
- ret[i] = 0;
-
- char *aux = strdup(ret);
- free(ret);
- ret = aux;
-
- strinv(ret);
- return ret;
-}
-
-int htoi(const char *str)
-{
- u32 s_str = strlen(str);
-
- u32 i = 0;
- int ret = 0;
- for (; i < s_str; i++) {
- char c = str[i];
- int aux = 0;
- if (c >= '0' && c <= '9')
- aux = c - '0';
- else if (c >= 'A' && c <= 'F')
- aux = (c - 'A') + 10;
-
- ret += aux * pow(16, (int)((s_str - i) - 1));
- }
-
- return ret;
-}
-
-char *itoa(int n)
-{
- if (!n) {
- char *ret = (char *)malloc(2);
- ret[0] = '0';
- ret[1] = 0;
- return ret;
- }
- u8 negative = (u8)(n < 0);
- if (negative)
- n *= -1;
-
- int sz;
- for (sz = 0; n % pow(10, sz) != n; sz++) {
- }
-
- char *ret = (char *)malloc((u32)(sz + 1));
-
- for (int i = 0; i < sz; i++) {
- int digit = (n % pow(10, i + 1)) / pow(10, i);
- ret[i] = ITOA_TABLE[digit];
- }
- ret[sz] = 0;
-
- if (negative) {
- char *aux = (char *)malloc((u32)(sz + 2));
- strcpy(aux, ret);
- aux[sz] = '-';
- aux[sz + 1] = 0;
- free(ret);
- ret = aux;
- }
-
- strinv(ret);
- return ret;
-}
-
-char *conv_base(int value, char *result, int base, int is_signed)
-{
- if (base < 2 || base > 36) {
- *result = '\0';
- return result;
- }
-
- char *ptr = result, *ptr1 = result, tmp_char;
- int tmp_value;
-
- do {
- tmp_value = value;
- value /= base;
- *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz"
- [35 + (tmp_value - value * base)];
- } while (value);
-
- if (is_signed && tmp_value < 0)
- *ptr++ = '-';
- *ptr-- = '\0';
- while (ptr1 < ptr) {
- tmp_char = *ptr;
- *ptr-- = *ptr1;
- *ptr1++ = tmp_char;
- }
- return result;
-}
diff --git a/libc/cpu.c b/libc/cpu.c
deleted file mode 100644
index 8ca4d27..0000000
--- a/libc/cpu.c
+++ /dev/null
@@ -1,182 +0,0 @@
-// MIT License, Copyright (c) 2020 Marvin Borner
-// This file is a wrapper around some CPU asm calls
-
-#include <cpu.h>
-#include <def.h>
-#include <print.h>
-
-u8 inb(u16 port)
-{
- u8 value;
- __asm__ volatile("inb %1, %0" : "=a"(value) : "Nd"(port));
- return value;
-}
-
-u16 inw(u16 port)
-{
- u16 value;
- __asm__ volatile("inw %1, %0" : "=a"(value) : "Nd"(port));
- return value;
-}
-
-u32 inl(u16 port)
-{
- u32 value;
- __asm__ volatile("inl %1, %0" : "=a"(value) : "Nd"(port));
- return value;
-}
-
-void insl(u16 port, void *addr, int n)
-{
- __asm__ volatile("rep insl" ::"c"(n), // Count
- "d"(port), // Port #
- "D"(addr)); // Buffer
-}
-
-void outb(u16 port, u8 data)
-{
- __asm__ volatile("outb %0, %1" ::"a"(data), "Nd"(port));
-}
-
-void outw(u16 port, u16 data)
-{
- __asm__ volatile("outw %0, %1" ::"a"(data), "Nd"(port));
-}
-
-void outl(u16 port, u32 data)
-{
- __asm__ volatile("outl %0, %1" ::"a"(data), "Nd"(port));
-}
-
-#ifdef kernel
-
-static void cpuid(int code, u32 *a, u32 *b, u32 *c, u32 *d)
-{
- __asm__ volatile("cpuid" : "=a"(*a), "=b"(*b), "=c"(*c), "=d"(*d) : "a"(code));
-}
-
-static char *cpu_string(char buf[16])
-{
- // wtf
- cpuid(CPUID_VENDOR_STRING, (u32 *)(buf + 12), (u32 *)(buf), (u32 *)(buf + 8),
- (u32 *)(buf + 4));
-
- return buf;
-}
-
-void cpu_print(void)
-{
- char buf[16] = { 0 };
- printf("CPU vendor: %s\n", cpu_string(buf));
-}
-
-u32 cr0_get(void)
-{
- u32 cr0;
- __asm__ volatile("movl %%cr0, %%eax" : "=a"(cr0));
- return cr0;
-}
-
-void cr0_set(u32 cr0)
-{
- __asm__ volatile("movl %%eax, %%cr0" ::"a"(cr0));
-}
-
-u32 cr3_get(void)
-{
- u32 cr3;
- __asm__ volatile("movl %%cr0, %%eax" : "=a"(cr3));
- return cr3;
-}
-
-void cr3_set(u32 cr3)
-{
- __asm__ volatile("movl %%eax, %%cr3" ::"a"(cr3));
-}
-
-u32 cr4_get(void)
-{
- u32 cr4;
- __asm__ volatile("movl %%cr4, %%eax" : "=a"(cr4));
- return cr4;
-}
-
-void cr4_set(u32 cr4)
-{
- __asm__ volatile("movl %%eax, %%cr4" ::"a"(cr4));
-}
-
-static u32 cpu_cfeatures = 0;
-u8 cpu_has_cfeature(enum cpuid_features feature)
-{
- return (cpu_cfeatures & feature) != 0;
-}
-
-static u32 cpu_dfeatures = 0;
-u8 cpu_has_dfeature(enum cpuid_features feature)
-{
- return (cpu_dfeatures & feature) != 0;
-}
-
-static void fpu_handler(struct regs *r)
-{
- UNUSED(r);
- __asm__ volatile("clts");
-}
-
-static u8 fpu_state[512] __attribute__((aligned(16)));
-void fpu_restore(void)
-{
- __asm__ volatile("fxrstor (%0)" ::"r"(fpu_state));
-}
-
-void cpu_enable_features(void)
-{
- u32 a, b, c, d;
- cpuid(CPUID_FEATURES, &a, &b, &c, &d);
- cpu_cfeatures = c;
- cpu_dfeatures = d;
- if (cpu_has_dfeature(CPUID_FEAT_EDX_SSE)) {
- cr0_set(cr0_get() & ~(1 << 2));
- cr0_set(cr0_get() | (1 << 1));
- cr4_set(cr4_get() | (3 << 9));
- } else {
- panic("No SSE support!\n");
- }
-
- if (cpu_has_dfeature(CPUID_FEAT_EDX_FPU)) {
- __asm__ volatile("fninit");
- __asm__ volatile("fxsave %0" : "=m"(fpu_state));
- irq_install_handler(7, fpu_handler);
- } else {
- panic("No FPU support!\n");
- }
-}
-
-void cli(void)
-{
- __asm__ volatile("cli");
-}
-
-void sti(void)
-{
- __asm__ volatile("sti");
-}
-
-void hlt(void)
-{
- __asm__ volatile("hlt");
-}
-
-void idle(void)
-{
- while (1)
- hlt();
-}
-
-void loop(void)
-{
- cli();
- idle();
-}
-#endif
diff --git a/libc/crt/crt0.asm b/libc/crt/crt0.asm
deleted file mode 100644
index e002952..0000000
--- a/libc/crt/crt0.asm
+++ /dev/null
@@ -1,15 +0,0 @@
-; MIT License, Copyright (c) 2020 Marvin Borner
-
-section .text
-
-extern main
-extern exit
-extern atexit_trigger
-
-global _start
-_start:
- call main
-
- push eax
- call exit
- jmp $
diff --git a/libc/crypto.c b/libc/crypto.c
deleted file mode 100644
index 310931d..0000000
--- a/libc/crypto.c
+++ /dev/null
@@ -1,166 +0,0 @@
-// MIT License, Copyright (c) 2021 Marvin Borner
-
-#include <crypto.h>
-#include <def.h>
-#include <mem.h>
-
-/**
- * MD5
- */
-
-#define MD5_LEFTROTATE(x, c) (((x) << (c)) | ((x) >> (32 - (c))))
-
-static const u32 md5_tab[64] = {
- 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, 0xf57c0faf, 0x4787c62a, 0xa8304613,
- 0xfd469501, 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, 0x6b901122, 0xfd987193,
- 0xa679438e, 0x49b40821, 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, 0xd62f105d,
- 0x02441453, 0xd8a1e681, 0xe7d3fbc8, 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed,
- 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, 0xfffa3942, 0x8771f681, 0x6d9d6122,
- 0xfde5380c, 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, 0x289b7ec6, 0xeaa127fa,
- 0xd4ef3085, 0x04881d05, 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, 0xf4292244,
- 0x432aff97, 0xab9423a7, 0xfc93a039, 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,
- 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, 0xf7537e82, 0xbd3af235, 0x2ad7d2bb,
- 0xeb86d391,
-};
-
-static const u32 md5_rounds[] = {
- 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9,
- 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,
- 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21,
-};
-
-static void md5_u32_to_bytes(u32 val, u8 *bytes)
-{
- bytes[0] = (u8)val;
- bytes[1] = (u8)(val >> 8);
- bytes[2] = (u8)(val >> 16);
- bytes[3] = (u8)(val >> 24);
-}
-
-static u32 md5_bytes_to_u32(u8 *bytes)
-{
- return (u32)bytes[0] | ((u32)bytes[1] << 8) | ((u32)bytes[2] << 16) | ((u32)bytes[3] << 24);
-}
-
-void md5(const void *initial_msg, u32 initial_len, u8 digest[16])
-{
- u32 w[16] = { 0 };
-
- u32 h0 = 0x67452301;
- u32 h1 = 0xefcdab89;
- u32 h2 = 0x98badcfe;
- u32 h3 = 0x10325476;
-
- u32 new_len;
- for (new_len = initial_len + 1; new_len % (512 / 8) != 448 / 8; new_len++)
- ;
-
- u8 *msg = malloc(new_len + 8);
- memcpy(msg, initial_msg, initial_len);
- msg[initial_len] = 0x80;
- for (u32 offset = initial_len + 1; offset < new_len; offset++)
- msg[offset] = 0;
-
- md5_u32_to_bytes(initial_len * 8, msg + new_len);
- md5_u32_to_bytes(initial_len >> 29, msg + new_len + 4);
-
- for (u32 offset = 0; offset < new_len; offset += (512 / 8)) {
- for (u32 i = 0; i < 16; i++)
- w[i] = md5_bytes_to_u32(msg + offset + i * 4);
-
- u32 a = h0;
- u32 b = h1;
- u32 c = h2;
- u32 d = h3;
-
- u32 f, g;
- for (u32 i = 0; i < 64; i++) {
- if (i < 16) {
- f = (b & c) | ((~b) & d);
- g = i;
- } else if (i < 32) {
- f = (d & b) | ((~d) & c);
- g = (5 * i + 1) % 16;
- } else if (i < 48) {
- f = b ^ c ^ d;
- g = (3 * i + 5) % 16;
- } else {
- f = c ^ (b | (~d));
- g = (7 * i) % 16;
- }
-
- u32 temp = d;
- d = c;
- c = b;
- b = b + MD5_LEFTROTATE((a + f + md5_tab[i] + w[g]), md5_rounds[i]);
- a = temp;
- }
-
- h0 += a;
- h1 += b;
- h2 += c;
- h3 += d;
- }
-
- free(msg);
-
- md5_u32_to_bytes(h0, digest);
- md5_u32_to_bytes(h1, digest + 4);
- md5_u32_to_bytes(h2, digest + 8);
- md5_u32_to_bytes(h3, digest + 12);
-}
-
-/**
- * CRC32
- */
-
-static const u32 crc32_tab[] = {
- 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535,
- 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd,
- 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d,
- 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
- 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
- 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
- 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac,
- 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
- 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab,
- 0xb6662d3d, 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
- 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb,
- 0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
- 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea,
- 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce,
- 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
- 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
- 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409,
- 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
- 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739,
- 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
- 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2, 0x1e01f268,
- 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0,
- 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8,
- 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
- 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
- 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703,
- 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7,
- 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
- 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae,
- 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
- 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6,
- 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
- 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d,
- 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5,
- 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
- 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
- 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d,
-};
-
-u32 crc32(u32 crc, const void *buf, u32 size)
-{
- const u8 *p = buf;
- crc = crc ^ ~0UL;
-
- while (size--)
- crc = crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8);
-
- return crc ^ ~0UL;
-}
diff --git a/libc/errno.c b/libc/errno.c
deleted file mode 100644
index 7204f5b..0000000
--- a/libc/errno.c
+++ /dev/null
@@ -1,14 +0,0 @@
-// MIT License, Copyright (c) 2021 Marvin Borner
-
-#include <def.h>
-#include <errno.h>
-#ifdef userspace
-
-static u32 error = 0;
-
-u32 *__errno(void)
-{
- return &error;
-}
-
-#endif
diff --git a/libc/inc/arg.h b/libc/inc/arg.h
deleted file mode 100644
index 73e592d..0000000
--- a/libc/inc/arg.h
+++ /dev/null
@@ -1,11 +0,0 @@
-// MIT License, Copyright (c) 2020 Marvin Borner
-
-#ifndef ARG_H
-#define ARG_H
-
-typedef __builtin_va_list va_list;
-#define va_start __builtin_va_start
-#define va_end __builtin_va_end
-#define va_arg __builtin_va_arg
-
-#endif
diff --git a/libc/inc/assert.h b/libc/inc/assert.h
deleted file mode 100644
index 3656c33..0000000
--- a/libc/inc/assert.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// MIT License, Copyright (c) 2020 Marvin Borner
-
-#ifndef ASSERT_H
-#define ASSERT_H
-
-#include <print.h>
-
-#ifdef kernel
-#include <proc.h>
-#define assert(exp) \
- if (!(exp)) { \
- printf("%s:%d: %s: Kernel assertion '%s' failed\n", __FILE__, __LINE__, __func__, \
- #exp); \
- struct proc *assert_proc = proc_current(); \
- if (assert_proc) \
- proc_exit(assert_proc, 1); \
- else \
- __asm__ volatile("cli\nhlt"); \
- }
-#elif defined(userspace)
-#define assert(exp) \
- if (!(exp)) \
- err(1, "%s:%d: %s: Assertion '%s' failed\n", __FILE__, __LINE__, __func__, #exp);
-#else
-#error "No lib target specified. Please use -Dkernel or -Duserspace"
-#endif
-
-#endif
diff --git a/libc/inc/conv.h b/libc/inc/conv.h
deleted file mode 100644
index adf9003..0000000
--- a/libc/inc/conv.h
+++ /dev/null
@@ -1,15 +0,0 @@
-// MIT License, Copyright (c) 2020 Marvin Borner
-
-#ifndef CONV_H
-#define CONV_H
-
-#include <def.h>
-
-int atoi(const char *str);
-char *htoa(u32 n);
-int htoi(const char *str);
-char *itoa(int n);
-
-char *conv_base(int value, char *result, int base, int is_signed);
-
-#endif
diff --git a/libc/inc/cpu.h b/libc/inc/cpu.h
deleted file mode 100644
index d709d86..0000000
--- a/libc/inc/cpu.h
+++ /dev/null
@@ -1,110 +0,0 @@
-// MIT License, Copyright (c) 2020 Marvin Borner
-
-#ifndef CPU_H
-#define CPU_H
-
-#include <def.h>
-
-u8 inb(u16 port);
-u16 inw(u16 port);
-u32 inl(u16 port);
-void insl(u16 port, void *addr, int n);
-
-void outb(u16 port, u8 data);
-void outw(u16 port, u16 data);
-void outl(u16 port, u32 data);
-
-static inline void spinlock(int *ptr)
-{
- int prev;
- do
- __asm__ volatile("lock xchgl %0,%1" : "=a"(prev) : "m"(*ptr), "a"(1));
- while (prev);
-}
-
-#ifdef kernel
-void cpu_print(void);
-void cpu_enable_features(void);
-void fpu_restore(void);
-
-u32 cr0_get(void);
-void cr0_set(u32 cr0);
-u32 cr3_get(void);
-void cr3_set(u32 cr3);
-u32 cr4_get(void);
-void cr4_set(u32 cr4);
-
-void cli(void);
-void sti(void);
-void hlt(void);
-void idle(void);
-void loop(void);
-
-enum cpuid_requests { CPUID_VENDOR_STRING, CPUID_FEATURES, CPUID_TLB, CPUID_SERIAL };
-enum cpuid_features {
- CPUID_FEAT_ECX_SSE3 = 1u << 0,
- CPUID_FEAT_ECX_PCLMUL = 1u << 1,
- CPUID_FEAT_ECX_DTES64 = 1u << 2,
- CPUID_FEAT_ECX_MONITOR = 1u << 3,
- CPUID_FEAT_ECX_DS_CPL = 1u << 4,
- CPUID_FEAT_ECX_VMX = 1u << 5,
- CPUID_FEAT_ECX_SMX = 1u << 6,
- CPUID_FEAT_ECX_EST = 1u << 7,
- CPUID_FEAT_ECX_TM2 = 1u << 8,
- CPUID_FEAT_ECX_SSSE3 = 1u << 9,
- CPUID_FEAT_ECX_CID = 1u << 10,
- CPUID_FEAT_ECX_FMA = 1u << 12,
- CPUID_FEAT_ECX_CX16 = 1u << 13,
- CPUID_FEAT_ECX_ETPRD = 1u << 14,
- CPUID_FEAT_ECX_PDCM = 1u << 15,
- CPUID_FEAT_ECX_PCIDE = 1u << 17,
- CPUID_FEAT_ECX_DCA = 1u << 18,
- CPUID_FEAT_ECX_SSE4_1 = 1u << 19,
- CPUID_FEAT_ECX_SSE4_2 = 1u << 20,
- CPUID_FEAT_ECX_x2APIC = 1u << 21,
- CPUID_FEAT_ECX_MOVBE = 1u << 22,
- CPUID_FEAT_ECX_POPCNT = 1u << 23,
- CPUID_FEAT_ECX_AES = 1u << 25,
- CPUID_FEAT_ECX_XSAVE = 1u << 26,
- CPUID_FEAT_ECX_OSXSAVE = 1u << 27,
- CPUID_FEAT_ECX_AVX = 1u << 28,
- CPUID_FEAT_ECX_F16C = 1u << 29,
- CPUID_FEAT_ECX_RDRND = 1u << 30,
-
- CPUID_FEAT_EDX_FPU = 1u << 0,
- CPUID_FEAT_EDX_VME = 1u << 1,
- CPUID_FEAT_EDX_DE = 1u << 2,
- CPUID_FEAT_EDX_PSE = 1u << 3,
- CPUID_FEAT_EDX_TSC = 1u << 4,
- CPUID_FEAT_EDX_MSR = 1u << 5,
- CPUID_FEAT_EDX_PAE = 1u << 6,
- CPUID_FEAT_EDX_MCE = 1u << 7,
- CPUID_FEAT_EDX_CX8 = 1u << 8,
- CPUID_FEAT_EDX_APIC = 1u << 9,
- CPUID_FEAT_EDX_SEP = 1u << 11,
- CPUID_FEAT_EDX_MTRR = 1u << 12,
- CPUID_FEAT_EDX_PGE = 1u << 13,
- CPUID_FEAT_EDX_MCA = 1u << 14,
- CPUID_FEAT_EDX_CMOV = 1u << 15,
- CPUID_FEAT_EDX_PAT = 1u << 16,
- CPUID_FEAT_EDX_PSE36 = 1u << 17,
- CPUID_FEAT_EDX_PSN = 1u << 18,
- CPUID_FEAT_EDX_CLF = 1u << 19,
- CPUID_FEAT_EDX_DTES = 1u << 21,
- CPUID_FEAT_EDX_ACPI = 1u << 22,
- CPUID_FEAT_EDX_MMX = 1u << 23,
- CPUID_FEAT_EDX_FXSR = 1u << 24,
- CPUID_FEAT_EDX_SSE = 1u << 25,
- CPUID_FEAT_EDX_SSE2 = 1u << 26,
- CPUID_FEAT_EDX_SS = 1u << 27,
- CPUID_FEAT_EDX_HTT = 1u << 28,
- CPUID_FEAT_EDX_TM1 = 1u << 29,
- CPUID_FEAT_EDX_IA64 = 1u << 30,
-};
-
-u8 cpu_has_cfeature(enum cpuid_features feature);
-u8 cpu_has_dfeature(enum cpuid_features feature);
-
-#endif
-
-#endif
diff --git a/libc/inc/crypto.h b/libc/inc/crypto.h
deleted file mode 100644
index bbe8d7e..0000000
--- a/libc/inc/crypto.h
+++ /dev/null
@@ -1,11 +0,0 @@
-// MIT License, Copyright (c) 2021 Marvin Borner
-
-#ifndef CRYPTO_H
-#define CRYPTO_H
-
-#include <def.h>
-
-void md5(const void *initial_msg, u32 initial_len, u8 digest[16]);
-u32 crc32(u32 crc, const void *buf, u32 size);
-
-#endif
diff --git a/libc/inc/def.h b/libc/inc/def.h
deleted file mode 100644
index 708ffee..0000000
--- a/libc/inc/def.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// MIT License, Copyright (c) 2020 Marvin Borner
-
-#ifndef DEF_H
-#define DEF_H
-
-/**
- * Types
- */
-
-typedef signed char s8;
-typedef unsigned char u8;
-
-typedef signed short s16;
-typedef unsigned short u16;
-
-typedef signed long s32;
-typedef unsigned long u32;
-
-typedef signed long long s64;
-typedef unsigned long long u64;
-
-/**
- * Macros
- */
-
-#define UNUSED(a) ((void)(a))
-
-#define MIN(a, b) (((a) < (b)) ? (a) : (b))
-#define MAX(a, b) (((a) > (b)) ? (a) : (b))
-
-#define ABS(a) (((a) < 0) ? (-a) : (a))
-
-#define NORETURN __attribute__((noreturn))
-#define NO_SANITIZE __attribute__((no_sanitize("undefined")))
-#define PACKED __attribute__((packed))
-#define ALIGNED(align) __attribute__((aligned(align)))
-
-#define EOF (-1)
-#define NULL ((void *)0)
-
-#define U8_MAX 255
-#define S8_MAX 127
-#define S8_MIN -128
-#define U16_MAX 65535
-#define S16_MAX 32767
-#define S16_MIN -32768
-#define U32_MAX 4294967295
-#define S32_MAX 2147483647
-#define S32_MIN -2147483648
-
-#define LONG_MAX S32_MAX
-#define LONG_MIN S32_MIN
-
-#define MILLION 1000000
-#define BILLION 1000000000
-#define TRILLION 1000000000000
-#define QUADRILLION 1000000000000000
-
-#endif
diff --git a/libc/inc/errno.h b/libc/inc/errno.h
deleted file mode 100644
index e226aba..0000000
--- a/libc/inc/errno.h
+++ /dev/null
@@ -1,52 +0,0 @@
-// MIT License, Copyright (c) 2021 Marvin Borner
-
-#ifndef ERRNO_H
-#define ERRNO_H
-
-#include <def.h>
-
-typedef s32 res;
-
-#define EOK 0 /* Success */
-#define EPERM 1 /* Operation not permitted */
-#define ENOENT 2 /* No such file or directory */
-#define ESRCH 3 /* No such process */
-#define EINTR 4 /* Interrupted system call */
-#define EIO 5 /* I/O error */
-#define ENXIO 6 /* No such device or address */
-#define E2BIG 7 /* Argument list too long */
-#define ENOEXEC 8 /* Exec format error */
-#define EBADF 9 /* Bad file number */
-#define ECHILD 10 /* No child processes */
-#define EAGAIN 11 /* Try again */
-#define ENOMEM 12 /* Out of memory */
-#define EACCES 13 /* Permission denied */
-#define EFAULT 14 /* Bad address */
-#define ENOTBLK 15 /* Block device required */
-#define EBUSY 16 /* Device or resource busy */
-#define EEXIST 17 /* File exists */
-#define EXDEV 18 /* Cross-device link */
-#define ENODEV 19 /* No such device */
-#define ENOTDIR 20 /* Not a directory */
-#define EISDIR 21 /* Is a directory */
-#define EINVAL 22 /* Invalid argument */
-#define ENFILE 23 /* File table overflow */
-#define EMFILE 24 /* Too many open files */
-#define ENOTTY 25 /* Not a typewriter */
-#define ETXTBSY 26 /* Text file busy */
-#define EFBIG 27 /* File too large */
-#define ENOSPC 28 /* No space left on device */
-#define ESPIPE 29 /* Illegal seek */
-#define EROFS 30 /* Read-only file system */
-#define EMLINK 31 /* Too many links */
-#define EPIPE 32 /* Broken pipe */
-#define EDOM 33 /* Math argument out of domain of func */
-#define ERANGE 34 /* Math result not representable */
-#define EMAX 35 /* Max errno */
-
-#ifdef userspace
-#define errno (*__errno())
-extern u32 *__errno(void);
-#endif
-
-#endif
diff --git a/libc/inc/input.h b/libc/inc/input.h
deleted file mode 100644
index 5fc7ed1..0000000
--- a/libc/inc/input.h
+++ /dev/null
@@ -1,279 +0,0 @@
-// GPL-2.0 WITH Linux-syscall-note License
-// Copyright (c) 1999-2002 Vojtech Pavlik
-// Copyright (c) 2015 Hans de Goede <hdegoede@redhat.com>
-// This file is from the linux source and was modified by Marvin Borner
-
-#ifndef SCANCODE_H
-#define SCANCODE_H
-
-#define KEY_RESERVED 0
-#define KEY_ESC 1
-#define KEY_1 2
-#define KEY_2 3
-#define KEY_3 4
-#define KEY_4 5
-#define KEY_5 6
-#define KEY_6 7
-#define KEY_7 8
-#define KEY_8 9
-#define KEY_9 10
-#define KEY_0 11
-#define KEY_MINUS 12
-#define KEY_EQUAL 13
-#define KEY_BACKSPACE 14
-#define KEY_TAB 15
-#define KEY_Q 16
-#define KEY_W 17
-#define KEY_E 18
-#define KEY_R 19
-#define KEY_T 20
-#define KEY_Y 21
-#define KEY_U 22
-#define KEY_I 23
-#define KEY_O 24
-#define KEY_P 25
-#define KEY_LEFTBRACE 26
-#define KEY_RIGHTBRACE 27
-#define KEY_ENTER 28
-#define KEY_LEFTCTRL 29
-#define KEY_A 30
-#define KEY_S 31
-#define KEY_D 32
-#define KEY_F 33
-#define KEY_G 34
-#define KEY_H 35
-#define KEY_J 36
-#define KEY_K 37
-#define KEY_L 38
-#define KEY_SEMICOLON 39
-#define KEY_APOSTROPHE 40
-#define KEY_GRAVE 41
-#define KEY_LEFTSHIFT 42
-#define KEY_BACKSLASH 43
-#define KEY_Z 44
-#define KEY_X 45
-#define KEY_C 46
-#define KEY_V 47
-#define KEY_B 48
-#define KEY_N 49
-#define KEY_M 50
-#define KEY_COMMA 51
-#define KEY_DOT 52
-#define KEY_SLASH 53
-#define KEY_RIGHTSHIFT 54
-#define KEY_KPASTERISK 55
-#define KEY_LEFTALT 56
-#define KEY_SPACE 57
-#define KEY_CAPSLOCK 58
-#define KEY_F1 59
-#define KEY_F2 60
-#define KEY_F3 61
-#define KEY_F4 62
-#define KEY_F5 63
-#define KEY_F6 64
-#define KEY_F7 65
-#define KEY_F8 66
-#define KEY_F9 67
-#define KEY_F10 68
-#define KEY_NUMLOCK 69
-#define KEY_SCROLLLOCK 70
-#define KEY_KP7 71
-#define KEY_KP8 72
-#define KEY_KP9 73
-#define KEY_KPMINUS 74
-#define KEY_KP4 75
-#define KEY_KP5 76
-#define KEY_KP6 77
-#define KEY_KPPLUS 78
-#define KEY_KP1 79
-#define KEY_KP2 80
-#define KEY_KP3 81
-#define KEY_KP0 82
-#define KEY_KPDOT 83
-
-#define KEY_ZENKAKUHANKAKU 85
-#define KEY_102ND 86
-#define KEY_F11 87
-#define KEY_F12 88
-#define KEY_RO 89
-#define KEY_KATAKANA 90
-#define KEY_HIRAGANA 91
-#define KEY_HENKAN 92
-#define KEY_KATAKANAHIRAGANA 93
-#define KEY_MUHENKAN 94
-#define KEY_KPJPCOMMA 95
-#define KEY_KPENTER 96
-#define KEY_RIGHTCTRL 97
-#define KEY_KPSLASH 98
-#define KEY_SYSRQ 99
-#define KEY_RIGHTALT 100
-#define KEY_LINEFEED 101
-#define KEY_HOME 102
-#define KEY_UP 103
-#define KEY_PAGEUP 104
-#define KEY_LEFT 105
-#define KEY_RIGHT 106
-#define KEY_END 107
-#define KEY_DOWN 108
-#define KEY_PAGEDOWN 109
-#define KEY_INSERT 110
-#define KEY_DELETE 111
-#define KEY_MACRO 112
-#define KEY_MUTE 113
-#define KEY_VOLUMEDOWN 114
-#define KEY_VOLUMEUP 115
-#define KEY_POWER 116
-#define KEY_KPEQUAL 117
-#define KEY_KPPLUSMINUS 118
-#define KEY_PAUSE 119
-#define KEY_SCALE 120
-
-#define KEY_KPCOMMA 121
-#define KEY_HANGEUL 122
-#define KEY_HANGUEL KEY_HANGEUL
-#define KEY_HANJA 123
-#define KEY_YEN 124
-#define KEY_LEFTMETA 125
-#define KEY_RIGHTMETA 126
-#define KEY_COMPOSE 127
-
-#define KEY_STOP 128
-#define KEY_AGAIN 129
-#define KEY_PROPS 130
-#define KEY_UNDO 131
-#define KEY_FRONT 132
-#define KEY_COPY 133
-#define KEY_OPEN 134
-#define KEY_PASTE 135
-#define KEY_FIND 136
-#define KEY_CUT 137
-#define KEY_HELP 138
-#define KEY_MENU 139
-#define KEY_CALC 140
-#define KEY_SETUP 141
-#define KEY_SLEEP 142
-#define KEY_WAKEUP 143
-#define KEY_FILE 144
-#define KEY_SENDFILE 145
-#define KEY_DELETEFILE 146
-#define KEY_XFER 147
-#define KEY_PROG1 148
-#define KEY_PROG2 149
-#define KEY_WWW 150
-#define KEY_MSDOS 151
-#define KEY_COFFEE 152
-#define KEY_SCREENLOCK KEY_COFFEE
-#define KEY_ROTATE_DISPLAY 153
-#define KEY_DIRECTION KEY_ROTATE_DISPLAY
-#define KEY_CYCLEWINDOWS 154
-#define KEY_MAIL 155
-#define KEY_BOOKMARKS 156
-#define KEY_COMPUTER 157
-#define KEY_BACK 158
-#define KEY_FORWARD 159
-#define KEY_CLOSECD 160
-#define KEY_EJECTCD 161
-#define KEY_EJECTCLOSECD 162
-#define KEY_NEXTSONG 163
-#define KEY_PLAYPAUSE 164
-#define KEY_PREVIOUSSONG 165
-#define KEY_STOPCD 166
-#define KEY_RECORD 167
-#define KEY_REWIND 168
-#define KEY_PHONE 169
-#define KEY_ISO 170
-#define KEY_CONFIG 171
-#define KEY_HOMEPAGE 172
-#define KEY_REFRESH 173
-#define KEY_EXIT 174
-#define KEY_MOVE 175
-#define KEY_EDIT 176
-#define KEY_SCROLLUP 177
-#define KEY_SCROLLDOWN 178
-#define KEY_KPLEFTPAREN 179
-#define KEY_KPRIGHTPAREN 180
-#define KEY_NEW 181
-#define KEY_REDO 182
-
-#define KEY_F13 183
-#define KEY_F14 184
-#define KEY_F15 185
-#define KEY_F16 186
-#define KEY_F17 187
-#define KEY_F18 188
-#define KEY_F19 189
-#define KEY_F20 190
-#define KEY_F21 191
-#define KEY_F22 192
-#define KEY_F23 193
-#define KEY_F24 194
-
-#define KEY_PLAYCD 200
-#define KEY_PAUSECD 201
-#define KEY_PROG3 202
-#define KEY_PROG4 203
-#define KEY_DASHBOARD 204
-#define KEY_SUSPEND 205
-#define KEY_CLOSE 206
-#define KEY_PLAY 207
-#define KEY_FASTFORWARD 208
-#define KEY_BASSBOOST 209
-#define KEY_PRINT 210
-#define KEY_HP 211
-#define KEY_CAMERA 212
-#define KEY_SOUND 213
-#define KEY_QUESTION 214
-#define KEY_EMAIL 215
-#define KEY_CHAT 216
-#define KEY_SEARCH 217
-#define KEY_CONNECT 218
-#define KEY_FINANCE 219
-#define KEY_SPORT 220
-#define KEY_SHOP 221
-#define KEY_ALTERASE 222
-#define KEY_CANCEL 223
-#define KEY_BRIGHTNESSDOWN 224
-#define KEY_BRIGHTNESSUP 225
-#define KEY_MEDIA 226
-
-#define KEY_SWITCHVIDEOMODE 227
-#define KEY_KBDILLUMTOGGLE 228
-#define KEY_KBDILLUMDOWN 229
-#define KEY_KBDILLUMUP 230
-
-#define KEY_SEND 231
-#define KEY_REPLY 232
-#define KEY_FORWARDMAIL 233
-#define KEY_SAVE 234
-#define KEY_DOCUMENTS 235
-
-#define KEY_BATTERY 236
-
-#define KEY_BLUETOOTH 237
-#define KEY_WLAN 238
-#define KEY_UWB 239
-
-#define KEY_UNKNOWN 240
-
-#define KEY_VIDEO_NEXT 241
-#define KEY_VIDEO_PREV 242
-#define KEY_BRIGHTNESS_CYCLE 243
-#define KEY_BRIGHTNESS_AUTO 244
-#define KEY_BRIGHTNESS_ZERO KEY_BRIGHTNESS_AUTO
-#define KEY_DISPLAY_OFF 245
-
-#define KEY_WWAN 246
-#define KEY_WIMAX KEY_WWAN
-#define KEY_RFKILL 247
-
-#define KEY_MICMUTE 248
-
-#define KEY_NUMERIC(code) ((code) >= KEY_1 && (code) <= KEY_0)
-#define KEY_ALPHABETIC(code) \
- (((code) >= KEY_Q && (code) <= KEY_P) || ((code) >= KEY_A && (code) <= KEY_L) || \
- ((code) >= KEY_Z && (code) <= KEY_M))
-#define KEY_ALPHANUMERIC(code) (KEY_NUMERIC((code)) || KEY_ALPHABETIC((code)))
-
-typedef int fortytwo;
-
-#endif
diff --git a/libc/inc/ioctl.h b/libc/inc/ioctl.h
deleted file mode 100644
index c3eec56..0000000
--- a/libc/inc/ioctl.h
+++ /dev/null
@@ -1,11 +0,0 @@
-// MIT License, Copyright (c) 2021 Marvin Borner
-
-#ifndef IOCTL
-#define IOCTL
-
-// FB interface
-#define IO_FB_GET 0
-
-int ioctl_is_awesome; // GCC is not
-
-#endif
diff --git a/libc/inc/list.h b/libc/inc/list.h
deleted file mode 100644
index 0b82b48..0000000
--- a/libc/inc/list.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// MIT License, Copyright (c) 2020 Marvin Borner
-
-#ifndef LIST_H
-#define LIST_H
-
-#include <def.h>
-
-struct list {
- struct node *head;
-};
-
-struct node {
- void *data;
- int nonce;
- struct node *next;
- struct node *prev;
-};
-
-struct list *list_new(void);
-void list_destroy(struct list *list);
-/* struct node *list_new_node(); */ // TODO: Make node-specific things static/private?
-/* void list_add_node(struct list *list, struct node *node); */
-struct node *list_add(struct list *list, void *data);
-struct list *list_remove(struct list *list, struct node *node);
-struct node *list_last(struct list *list);
-struct list *list_swap(struct list *list, struct node *a, struct node *b);
-struct node *list_first_data(struct list *list, void *data);
-
-#endif
diff --git a/libc/inc/math.h b/libc/inc/math.h
deleted file mode 100644
index 82f431f..0000000
--- a/libc/inc/math.h
+++ /dev/null
@@ -1,8 +0,0 @@
-// MIT License, Copyright (c) 2020 Marvin Borner
-
-#ifndef MATH_H
-#define MATH_H
-
-int pow(int base, int exp);
-
-#endif
diff --git a/libc/inc/mem.h b/libc/inc/mem.h
deleted file mode 100644
index ec00628..0000000
--- a/libc/inc/mem.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// MIT License, Copyright (c) 2020 Marvin Borner
-
-#ifndef MEM_H
-#define MEM_H
-
-#include <def.h>
-
-void *malloc_debug(u32 size, const char *file, int line, const char *func, const char *inp);
-void free_debug(void *ptr, const char *file, int line, const char *func, const char *inp);
-#define malloc(size) malloc_debug((u32)(size), __FILE__, __LINE__, __func__, #size)
-#define free(ptr) free_debug((void *)(ptr), __FILE__, __LINE__, __func__, #ptr)
-void *realloc(void *ptr, u32 size);
-void *zalloc(u32 size);
-
-#ifdef kernel
-#define STACK_START 0x00500000 // Defined it bootloader
-#define STACK_SIZE 0x1000 // idk
-#elif defined(userspace)
-#else
-#error "No lib target specified. Please use -Dkernel or -Duserspace"
-#endif
-
-void *memcpy(void *dest, const void *src, u32 n);
-void *memset(void *dest, int val, u32 n);
-void *memchr(void *src, int c, u32 n);
-int memcmp(const void *s1, const void *s2, u32 n);
-int mememp(const u8 *buf, u32 n);
-
-#endif
diff --git a/libc/inc/print.h b/libc/inc/print.h
deleted file mode 100644
index 58b5dc6..0000000
--- a/libc/inc/print.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// MIT License, Copyright (c) 2020 Marvin Borner
-
-#ifndef PRINT_H
-#define PRINT_H
-
-#include "arg.h"
-#include <def.h>
-
-int printf(const char *format, ...);
-int vprintf(const char *format, va_list ap);
-int sprintf(char *str, const char *format, ...);
-int vsprintf(char *str, const char *format, va_list ap);
-int print(const char *str);
-NORETURN void panic(const char *format, ...);
-
-#ifdef userspace
-int vfprintf(const char *path, const char *format, va_list ap);
-int fprintf(const char *path, const char *format, ...);
-int log(const char *format, ...);
-int err(int code, const char *format, ...);
-#else
-#include <proc.h>
-int print_app(enum stream_defaults id, const char *proc_name, const char *str);
-void print_trace(u32 count);
-#endif
-
-#endif
diff --git a/libc/inc/random.h b/libc/inc/random.h
deleted file mode 100644
index a82524c..0000000
--- a/libc/inc/random.h
+++ /dev/null
@@ -1,14 +0,0 @@
-// MIT License, Copyright (c) 2020 Marvin Borner
-
-#ifndef RANDOM_H
-#define RANDOM_H
-
-#include <def.h>
-
-void srand(u32 seed);
-u32 rdrand(void);
-u32 rdseed(void);
-u32 rand(void);
-char *randstr(u32 size);
-
-#endif
diff --git a/libc/inc/socket.h b/libc/inc/socket.h
deleted file mode 100644
index 18bc316..0000000
--- a/libc/inc/socket.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// MIT License, Copyright (c) 2020 Marvin Borner
-
-#ifndef SOCKET_H
-#define SOCKET_H
-
-#include <def.h>
-#include <list.h>
-
-// TODO: Use actual socket types (stream etc)
-enum socket_type { S_TCP, S_UDP };
-enum socket_state { S_CONNECTING, S_CONNECTED, S_OPEN, S_CLOSING, S_CLOSED, S_FAILED };
-
-struct tcp_socket {
- u32 seq_no;
- u32 ack_no;
- u32 state;
-};
-
-struct socket_data {
- u8 *data;
- u32 length;
-};
-
-struct socket {
- u32 pid;
- u32 ip_addr;
- u32 dst_port;
- u32 src_port;
- enum socket_state state;
- enum socket_type type;
- struct list *packets;
- union {
- struct tcp_socket tcp;
- /* struct udp_socket udp; */
- } prot;
-};
-
-#endif
diff --git a/libc/inc/stack.h b/libc/inc/stack.h
deleted file mode 100644
index f5ad52b..0000000
--- a/libc/inc/stack.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// MIT License, Copyright (c) 2020 Marvin Borner
-
-#ifndef STACK_H
-#define STACK_H
-
-#include <def.h>
-
-struct stack_node {
- void *data;
- int nonce;
- struct stack_node *next;
- struct stack_node *prev;
-};
-
-struct stack {
- struct stack_node *tail;
-};
-
-struct stack *stack_new(void);
-void stack_destroy(struct stack *stack);
-u32 stack_empty(struct stack *stack);
-u32 stack_push_bot(struct stack *stack, void *data);
-u32 stack_push(struct stack *stack, void *data);
-void *stack_pop(struct stack *stack);
-void *stack_peek(struct stack *stack);
-void stack_clear(struct stack *stack);
-
-#endif
diff --git a/libc/inc/str.h b/libc/inc/str.h
deleted file mode 100644
index d0a521f..0000000
--- a/libc/inc/str.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// MIT License, Copyright (c) 2020 Marvin Borner
-
-#ifndef STR_H
-#define STR_H
-
-#include <def.h>
-
-u32 strlen(const char *s);
-char *strcpy(char *dst, const char *src);
-char *strncpy(char *dst, const char *src, u32 n);
-char *strchr(char *s, int c);
-char *strrchr(char *s, int c);
-char *strcat(char *dst, const char *src);
-char *strncat(char *dst, const char *src, u32 n);
-int strcmp(const char *s1, const char *s2);
-int strncmp(const char *s1, const char *s2, u32 n);
-char *strinv(char *s);
-char *strdup(const char *s);
-
-const char *strerror(u32 err);
-
-#endif
diff --git a/libc/inc/sys.h b/libc/inc/sys.h
deleted file mode 100644
index 19fb3ee..0000000
--- a/libc/inc/sys.h
+++ /dev/null
@@ -1,130 +0,0 @@
-// MIT License, Copyright (c) 2020 Marvin Borner
-// Syscall implementation
-
-#ifndef SYS_H
-#define SYS_H
-
-#include <def.h>
-#include <errno.h>
-
-#define KEYBOARD_MAGIC 0x555555
-#define MOUSE_MAGIC 0xaaaaaa
-
-#define SYS_BOOT_MAGIC 0x18122002
-#define SYS_BOOT_REBOOT 0xeeb007
-#define SYS_BOOT_SHUTDOWN 0xdead
-
-enum sys {
- SYS_LOOP, // To infinity and beyond (debug)!
- SYS_ALLOC, // Allocate memory
- SYS_SHACCESS, // Access shared memory
- SYS_FREE, // Free memory
- SYS_STAT, // Get file information
- SYS_READ, // Read file
- SYS_WRITE, // Write to file
- SYS_IOCTL, // Interact with a file/device
- SYS_POLL, // Wait for multiple files
- SYS_EXEC, // Execute path
- SYS_EXIT, // Exit current process
- SYS_BOOT, // Boot functions (e.g. reboot/shutdown)
- SYS_YIELD, // Switch to next process
- SYS_TIME, // Get kernel time
- /* SYS_NET_OPEN, // Open network socket */
- /* SYS_NET_CLOSE, // Close network socket */
- /* SYS_NET_CONNECT, // Connect to destination */
- /* SYS_NET_SEND, // Send to socket */
- /* SYS_NET_RECEIVE, // Receive data from socket */
-};
-
-struct event_keyboard {
- u32 magic;
- u32 scancode;
- u8 press;
-};
-
-struct event_mouse {
- u32 magic;
- s32 diff_x;
- s32 diff_y;
- u8 but1;
- u8 but2;
- u8 but3;
-};
-
-struct stat {
- u32 dev_id;
- u32 mode;
- u32 uid;
- u32 gid;
- u32 size;
-};
-
-#if defined(userspace)
-
-/**
- * Syscall wrappers
- */
-
-void loop(void);
-void exit(s32 status);
-res read(const char *path, void *buf, u32 offset, u32 count);
-res write(const char *path, const void *buf, u32 offset, u32 count);
-res ioctl(const char *path, ...);
-res stat(const char *path, struct stat *buf);
-res poll(const char **files);
-res exec(const char *path, ...);
-res yield(void);
-res boot(u32 cmd);
-u32 time(void);
-
-res sys_alloc(u32 size, u32 *addr);
-res sys_free(void *ptr);
-res shalloc(u32 size, u32 *addr, u32 *id);
-res shaccess(u32 id, u32 *addr, u32 *size);
-
-static inline u32 getpid(void)
-{
- static u32 buf = 0;
- if (buf)
- return buf;
- read("/proc/self/pid", &buf, 0, sizeof(buf));
- return buf;
-}
-
-#include <print.h>
-#include <str.h>
-static inline u32 pidof(const char *name)
-{
- u32 curr = 1;
- char buf[32] = { 0 }, path[32] = { 0 };
- while (curr < 1000) { // Max pid??
- if (sprintf(path, "/proc/%d/name", curr) > 0 && read(path, buf, 0, 32) > 0)
- if (!strcmp(name, buf))
- return curr;
-
- curr++;
- }
-
- return -1;
-}
-
-// Simple read wrapper
-#include <mem.h>
-static inline void *sread(const char *path)
-{
- struct stat s = { 0 };
- if (stat(path, &s) != 0 || !s.size)
- return NULL;
- void *buf = malloc(s.size);
- read(path, buf, 0, s.size);
- return buf;
-}
-
-/**
- * At exit
- */
-
-void atexit(void (*func)(void));
-
-#endif
-#endif
diff --git a/libc/inc/vec.h b/libc/inc/vec.h
deleted file mode 100644
index a036931..0000000
--- a/libc/inc/vec.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// MIT License, Copyright (c) 2021 Marvin Borner
-
-#ifndef VEC_H
-#define VEC_H
-
-#include <def.h>
-
-typedef struct vec2 {
- u32 x, y;
-} vec2;
-
-typedef struct vec3 {
- u32 x, y, z;
-} vec3;
-
-#define vec2(x, y) ((vec2){ (x), (y) })
-#define vec2to3(a, z) ((vec3){ a.x, a.y, (z) })
-#define vec2_add(a, b) ((vec2){ a.x + b.x, a.y + b.y })
-#define vec2_sub(a, b) ((vec2){ a.x - b.x, a.y - b.y })
-#define vec2_mul(a, b) ((vec2){ a.x * (b), a.y * (b) })
-#define vec2_div(a, b) ((vec2){ a.x / (b), a.y / (b) })
-#define vec2_dot(a, b) ((u32)(a.x * b.x + a.y * b.y))
-#define vec2_eq(a, b) (a.x == b.x && a.y == b.y)
-
-#define vec3(x, y, z) ((vec3){ (x), (y), (z) })
-#define vec3to2(a) ((vec2){ a.x, a.y })
-#define vec3_add(a, b) ((vec3){ a.x + b.x, a.y + b.y, a.z + b.z })
-#define vec3_sub(a, b) ((vec3){ a.x - b.x, a.y - b.y, a.z - b.z })
-#define vec3_mul(a, b) ((vec3){ a.x * (b), a.y * (b), a.z * (b) })
-#define vec3_div(a, b) ((vec3){ a.x / (b), a.y / (b), a.z / (b) })
-#define vec3_dot(a, b) ((u32)(a.x * b.x + a.y * b.y + a.z * b.z))
-#define vec3_eq(a, b) (a.x == b.x && a.y == b.y && a.z == c.z)
-#define vec3_cross(a, b) \
- ((vec3){ a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x })
-
-#endif
diff --git a/libc/list.c b/libc/list.c
deleted file mode 100644
index c86b23d..0000000
--- a/libc/list.c
+++ /dev/null
@@ -1,138 +0,0 @@
-// MIT License, Copyright (c) 2020 Marvin Borner
-
-#include <def.h>
-#include <list.h>
-#include <mem.h>
-
-static int nonce = 0;
-
-struct list *list_new(void)
-{
- struct list *list = malloc(sizeof(*list));
- list->head = NULL;
- return list;
-}
-
-void list_destroy(struct list *list)
-{
- if (!list)
- return;
- struct node *iterator = list->head;
- while (iterator != NULL) {
- if (iterator->next == NULL) {
- free(iterator);
- break;
- }
- iterator = iterator->next;
- free(iterator->prev);
- }
- list->head = NULL;
- free(list);
- list = NULL;
-}
-
-static struct node *list_new_node(void)
-{
- struct node *node = malloc(sizeof(*node));
- node->data = NULL;
- node->prev = NULL;
- node->next = NULL;
- node->nonce = nonce++;
- return node;
-}
-
-static struct node *list_add_node(struct list *list, struct node *node)
-{
- if (!list || !node)
- return NULL;
-
- if (list->head == NULL) {
- list->head = node;
- return list->head;
- }
-
- struct node *iterator = list->head;
- while (iterator != NULL) {
- if (iterator->next == NULL) {
- iterator->next = node;
- node->prev = iterator;
- break;
- }
- iterator = iterator->next;
- }
- return node;
-}
-
-struct node *list_last(struct list *list)
-{
- if (!list || !list->head)
- return NULL;
-
- struct node *iterator = list->head;
- while (iterator != NULL) {
- if (iterator->next == NULL)
- return iterator;
- iterator = iterator->next;
- }
-
- return NULL;
-}
-
-struct node *list_first_data(struct list *list, void *data)
-{
- if (!list || !list->head || !data)
- return NULL;
-
- struct node *iterator = list->head;
- while (iterator != NULL) {
- if (iterator->data == data)
- return iterator;
- iterator = iterator->next;
- }
-
- return NULL;
-}
-
-// TODO: Actually swap the nodes, not the data
-struct list *list_swap(struct list *list, struct node *a, struct node *b)
-{
- if (!list || !list->head || !a || !b)
- return NULL;
-
- void *tmp = a->data;
- a->data = b->data;
- b->data = tmp;
-
- return list;
-}
-
-struct node *list_add(struct list *list, void *data)
-{
- struct node *node = list_new_node();
- node->data = data;
- return list_add_node(list, node);
-}
-
-// Maybe list_remove_node?
-struct list *list_remove(struct list *list, struct node *node)
-{
- if (!list || !list->head || !node)
- return NULL;
-
- if (list->head == node) {
- list->head = list->head->next;
- return list;
- }
-
- struct node *iterator = list->head->next;
- while (iterator != node) {
- iterator = iterator->next;
- if (iterator == NULL)
- return NULL;
- }
-
- iterator->prev->next = iterator->next;
- if (iterator->next)
- iterator->next->prev = iterator->prev;
- return list;
-}
diff --git a/libc/math.c b/libc/math.c
deleted file mode 100644
index c8142b5..0000000
--- a/libc/math.c
+++ /dev/null
@@ -1,17 +0,0 @@
-// MIT License, Copyright (c) 2020 Marvin Borner
-
-#include <math.h>
-
-int pow(int base, int exp)
-{
- if (exp < 0)
- return 0;
-
- if (!exp)
- return 1;
-
- int ret = base;
- for (int i = 1; i < exp; i++)
- ret *= base;
- return ret;
-}
diff --git a/libc/mem.c b/libc/mem.c
deleted file mode 100644
index 95242e4..0000000
--- a/libc/mem.c
+++ /dev/null
@@ -1,121 +0,0 @@
-// MIT License, Copyright (c) 2020 Marvin Borner
-
-#include <assert.h>
-#include <def.h>
-#include <mem.h>
-#include <sys.h>
-
-void *memcpy(void *dest, const void *src, u32 n)
-{
-#ifdef userspace
- // Inspired by Jeko at osdev
- u8 *dest_byte = dest;
- const u8 *src_byte = src;
- for (u32 i = 0; i < n / 16; i++) {
- __asm__ volatile("movups (%0), %%xmm0\n"
- "movntdq %%xmm0, (%1)\n" ::"r"(src_byte),
- "r"(dest_byte)
- : "memory");
-
- src_byte += 16;
- dest_byte += 16;
- }
-
- if (n & 7) {
- n = n & 7;
-
- int d0, d1, d2;
- __asm__ volatile("rep ; movsl\n\t"
- "testb $2,%b4\n\t"
- "je 1f\n\t"
- "movsw\n"
- "1:\ttestb $1,%b4\n\t"
- "je 2f\n\t"
- "movsb\n"
- "2:"
- : "=&c"(d0), "=&D"(d1), "=&S"(d2)
- : "0"(n / 4), "q"(n), "1"((long)dest_byte), "2"((long)src_byte)
- : "memory");
- }
- return dest_byte;
-#else
- // Inspired by jgraef at osdev
- u32 num_dwords = n / 4;
- u32 num_bytes = n % 4;
- u32 *dest32 = (u32 *)dest;
- const u32 *src32 = (const u32 *)src;
- u8 *dest8 = ((u8 *)dest) + num_dwords * 4;
- const u8 *src8 = ((const u8 *)src) + num_dwords * 4;
-
- // TODO: What's faster?
- __asm__ volatile("rep movsl\n"
- : "=S"(src32), "=D"(dest32), "=c"(num_dwords)
- : "S"(src32), "D"(dest32), "c"(num_dwords)
- : "memory");
-
- /* for (u32 i = 0; i < num_dwords; i++) { */
- /* dest32[i] = src32[i]; */
- /* } */
-
- for (u32 i = 0; i < num_bytes; i++) {
- dest8[i] = src8[i];
- }
- return dest;
-#endif
-}
-
-void *memset(void *dest, int val, u32 n)
-{
- u32 uval = val;
- u32 num_dwords = n / 4;
- u32 num_bytes = n % 4;
- u32 *dest32 = (u32 *)dest;
- u8 *dest8 = ((u8 *)dest) + num_dwords * 4;
- u8 val8 = (u8)val;
- u32 val32 = uval | (uval << 8) | (uval << 16) | (uval << 24);
-
- // TODO: What's faster?
- __asm__ volatile("rep stosl\n"
- : "=D"(dest32), "=c"(num_dwords)
- : "D"(dest32), "c"(num_dwords), "a"(val32)
- : "memory");
-
- /* for (u32 i = 0; i < num_dwords; i++) { */
- /* dest32[i] = val32; */
- /* } */
-
- for (u32 i = 0; i < num_bytes; i++) {
- dest8[i] = val8;
- }
- return dest;
-}
-
-void *memchr(void *src, int c, u32 n)
-{
- u8 *s = (u8 *)src;
-
- while (n-- > 0) {
- if (*s == c)
- return s;
- s++;
- }
- return NULL;
-}
-
-int memcmp(const void *s1, const void *s2, u32 n)
-{
- const u8 *a = (const u8 *)s1;
- const u8 *b = (const u8 *)s2;
- for (u32 i = 0; i < n; i++) {
- if (a[i] < b[i])
- return -1;
- else if (b[i] < a[i])
- return 1;
- }
- return 0;
-}
-
-int mememp(const u8 *buf, u32 n)
-{
- return buf[0] == 0 && !memcmp(buf, buf + 1, n - 1);
-}
diff --git a/libc/print.c b/libc/print.c
deleted file mode 100644
index 2422fed..0000000
--- a/libc/print.c
+++ /dev/null
@@ -1,257 +0,0 @@
-// MIT License, Copyright (c) 2020 Marvin Borner
-
-#include <arg.h>
-#include <assert.h>
-#include <conv.h>
-#include <cpu.h>
-#include <def.h>
-#include <mem.h>
-#include <str.h>
-
-static void append(char *dest, char *src, int index)
-{
- for (u32 i = index; i < strlen(src) + index; i++)
- dest[i] = src[i - index];
- dest[index + strlen(src)] = 0;
-}
-
-int vsprintf(char *str, const char *format, va_list ap)
-{
- u8 ready_to_format = 0;
-
- int i = 0;
- char buf = 0;
- char format_buffer[20] = { '\0' };
-
- for (; *format; format++) {
- if (ready_to_format) {
- ready_to_format = 0;
-
- if (*format == '%') {
- str[i] = '%';
- continue;
- }
-
- buf = *format;
-
- // TODO: Improve this repetitive code
- if (buf == 's') {
- char *string = va_arg(ap, char *);
- assert(string);
- append(str, string, i);
- i = strlen(str);
- } else if (buf == 'x') {
- conv_base(va_arg(ap, u32), format_buffer, 16, 0);
- append(str, format_buffer, i);
- i = strlen(str);
- } else if (buf == 'd' || buf == 'i') {
- conv_base(va_arg(ap, s32), format_buffer, 10, 1);
- append(str, format_buffer, i);
- i = strlen(str);
- } else if (buf == 'u') {
- conv_base(va_arg(ap, u32), format_buffer, 10, 0);
- append(str, format_buffer, i);
- i = strlen(str);
- } else if (buf == 'o') {
- conv_base(va_arg(ap, u32), format_buffer, 8, 0);
- append(str, format_buffer, i);
- i = strlen(str);
- } else if (buf == 'b') {
- conv_base(va_arg(ap, u32), format_buffer, 2, 0);
- append(str, format_buffer, i);
- i = strlen(str);
- } else if (buf == 'c') {
- str[i] = (char)va_arg(ap, int);
- i++;
- } else {
- assert(0);
- }
- } else {
- if (*format == '%')
- ready_to_format = 1;
- else {
- str[i] = *format;
- i++;
- }
- }
-
- format_buffer[0] = '\0';
- }
-
- return strlen(str);
-}
-
-int sprintf(char *str, const char *format, ...)
-{
- va_list ap;
- va_start(ap, format);
- int len = vsprintf(str, format, ap);
- va_end(ap);
-
- return len;
-}
-
-#ifdef userspace
-
-#include <sys.h>
-#define PATH_OUT "/proc/self/io/out"
-#define PATH_LOG "/proc/self/io/log"
-#define PATH_ERR "/proc/self/io/err"
-
-int vprintf(const char *format, va_list ap)
-{
- return vfprintf(PATH_OUT, format, ap);
-}
-
-int vfprintf(const char *path, const char *format, va_list ap)
-{
- char buf[1024] = { 0 };
- int len = vsprintf(buf, format, ap);
- return write(path, buf, 0, len);
-}
-
-int fprintf(const char *path, const char *format, ...)
-{
- va_list ap;
- va_start(ap, format);
- int len = vfprintf(path, format, ap);
- va_end(ap);
-
- return len;
-}
-
-int printf(const char *format, ...)
-{
- va_list ap;
- va_start(ap, format);
- int len = vprintf(format, ap);
- va_end(ap);
-
- return len;
-}
-
-int log(const char *format, ...)
-{
- va_list ap;
- va_start(ap, format);
- int len = vfprintf(PATH_LOG, format, ap);
- va_end(ap);
-
- return len;
-}
-
-int err(int code, const char *format, ...)
-{
- if (errno != EOK)
- log("ERRNO: %d (%s)\n", errno, strerror(errno));
- va_list ap;
- va_start(ap, format);
- vfprintf(PATH_ERR, format, ap);
- va_end(ap);
- exit(code);
- return -1;
-}
-
-int print(const char *str)
-{
- return write(PATH_OUT, str, 0, strlen(str));
-}
-
-#else
-
-// The kernel prints everything into the serial console
-
-#include <mm.h>
-#include <proc.h>
-#include <serial.h>
-
-#define RED "\x1B[1;31m"
-#define GRN "\x1B[1;32m"
-#define YEL "\x1B[1;33m"
-#define BLU "\x1B[1;34m"
-#define MAG "\x1B[1;35m"
-#define CYN "\x1B[1;36m"
-#define WHT "\x1B[1;37m"
-#define RES "\x1B[0m"
-
-static void print_kernel(const char *str)
-{
- serial_print(RED);
- serial_print("[KER] ");
- serial_print(str);
- serial_print(RES);
-}
-
-int vprintf(const char *format, va_list ap)
-{
- char buf[1024] = { 0 };
- int len = vsprintf(buf, format, ap);
- print_kernel(buf);
- return len;
-}
-
-int printf(const char *format, ...)
-{
- va_list ap;
- va_start(ap, format);
- int len = vprintf(format, ap);
- va_end(ap);
-
- return len;
-}
-
-int print_app(enum stream_defaults id, const char *proc_name, const char *str)
-{
- if (id == STREAM_LOG)
- serial_print(CYN "[LOG] to ");
- else if (id == STREAM_ERR)
- serial_print(YEL "[ERR] to ");
- serial_print(proc_name);
- serial_print(": ");
- serial_print(str);
- serial_print(RES);
- return 1;
-}
-
-int print(const char *str)
-{
- print_kernel(str);
- return strlen(str);
-}
-
-void print_trace(u32 count)
-{
- struct frame {
- struct frame *ebp;
- u32 eip;
- } * stk;
- __asm__ volatile("movl %%ebp, %0;" : "=r"(stk));
- print("EBP\tEIP\n");
- for (u32 i = 0; stk && i < count; i++) {
- /* u32 eip = memory_valid((void *)stk->eip) ? stk->eip : stk->eip + 64; */
- /* printf("0x%x\t0x%x\n", stk->ebp, eip); */
- printf("0x%x\t0x%x\n", stk->ebp, stk->eip);
- stk = stk->ebp;
- }
-}
-
-#endif
-
-NORETURN void panic(const char *format, ...)
-{
- char buf[1024] = { 0 };
- va_list ap;
- va_start(ap, format);
- vsprintf(buf, format, ap);
- va_end(ap);
-#ifdef kernel
- print("--- DON'T PANIC! ---\n");
- print(buf);
- print_trace(5);
- loop();
-#else
- err(1, buf);
-#endif
- while (1)
- ;
-}
diff --git a/libc/random.c b/libc/random.c
deleted file mode 100644
index 2801029..0000000
--- a/libc/random.c
+++ /dev/null
@@ -1,71 +0,0 @@
-// MIT License, Copyright (c) 2020 Marvin Borner
-
-#include <cpu.h>
-#include <def.h>
-#include <mem.h>
-#include <random.h>
-
-static u32 g_seed = 1;
-
-void srand(u32 seed)
-{
- g_seed = seed;
-}
-
-u32 rdrand(void)
-{
-#ifdef kernel
- if (!cpu_has_cfeature(CPUID_FEAT_ECX_RDRND))
- return rand();
-
- u32 rd;
- __asm__ volatile("1:\n"
- "rdrand %0\n"
- "jnc 1b\n"
- : "=r"(rd));
- return rd;
-#else
- return rand();
-#endif
-}
-
-u32 rdseed(void)
-{
-#ifdef kernel
- if (!cpu_has_cfeature(CPUID_FEAT_ECX_RDRND))
- return rand();
-
- u32 rd;
- __asm__ volatile("1:\n"
- "rdseed %0\n"
- "jnc 1b\n"
- : "=r"(rd));
- return rd;
-#else
- return rand();
-#endif
-}
-
-u32 rand(void)
-{
- g_seed = g_seed * 1103515245 + 12345;
- return (g_seed >> 16) & 0x7FFF;
-}
-
-char *randstr(u32 size)
-{
- if (!size)
- return NULL;
-
- char *buf = malloc(size + 1);
- const char charset[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
-
- size--;
- for (u32 i = 0; i < size; i++) {
- int key = rand() % (sizeof(charset) - 1);
- buf[i] = charset[key];
- }
- buf[size] = '\0';
-
- return buf;
-}
diff --git a/libc/sanitize.c b/libc/sanitize.c
deleted file mode 100644
index 02eef84..0000000
--- a/libc/sanitize.c
+++ /dev/null
@@ -1,228 +0,0 @@
-// MIT License, Copyright (c) 2021 Marvin Borner
-// Detect stack overflows and other bugs
-
-#include <def.h>
-#include <print.h>
-
-/**
- * Stack protector
- */
-
-#define STACK_CHK_GUARD 0xdeadbeef
-
-u32 __stack_chk_guard = STACK_CHK_GUARD;
-
-void __stack_chk_fail(void);
-NORETURN void __stack_chk_fail(void)
-{
- panic("FATAL: Stack smashing detected\n");
-}
-
-void __stack_chk_fail_local(void);
-NORETURN void __stack_chk_fail_local(void)
-{
- panic("FATAL: Local stack smashing detected\n");
-}
-
-/**
- * UBSan
- * TODO: Fix san-paths for userspace (maybe due to -fPIE?)
- */
-
-#define is_aligned(value, alignment) !(value & (alignment - 1))
-
-struct source_location {
- const char *file;
- u32 line;
- u32 column;
-};
-
-struct type_descriptor {
- u16 kind;
- u16 info;
- char name[];
-};
-
-struct type_mismatch {
- struct source_location location;
- struct type_descriptor *type;
- u8 alignment;
- u8 type_check_kind;
-};
-
-struct overflow {
- struct source_location location;
- struct type_descriptor *type;
-};
-
-struct out_of_bounds {
- struct source_location location;
- struct type_descriptor *left_type;
- struct type_descriptor *right_type;
-};
-
-void __ubsan_handle_load_invalid_value(void);
-void __ubsan_handle_load_invalid_value(void)
-{
- panic("UBSAN: load-invalid-value\n");
-}
-
-void __ubsan_handle_nonnull_arg(void);
-void __ubsan_handle_nonnull_arg(void)
-{
- panic("UBSAN: nonnull-arg\n");
-}
-
-void __ubsan_handle_nullability_arg(void);
-void __ubsan_handle_nullability_arg(void)
-{
- panic("UBSAN: nullability-arg\n");
-}
-
-void __ubsan_handle_nonnull_return_v1(void);
-void __ubsan_handle_nonnull_return_v1(void)
-{
- panic("UBSAN: nonnull-return-v1\n");
-}
-
-void __ubsan_handle_nullability_return_v1(void);
-void __ubsan_handle_nullability_return_v1(void)
-{
- panic("UBSAN: nullability-return-v1\n");
-}
-
-void __ubsan_handle_vla_bound_not_positive(void);
-void __ubsan_handle_vla_bound_not_positive(void)
-{
- panic("UBSAN: vla-bound-not-positive\n");
-}
-
-void __ubsan_handle_add_overflow(struct overflow *data, void *left, void *right);
-void __ubsan_handle_add_overflow(struct overflow *data, void *left, void *right)
-{
- UNUSED(left);
- UNUSED(right);
- struct source_location *loc = &data->location;
- panic("%s:%d: UBSAN: add-overflow [type: %s]\n", loc->file, loc->line, data->type->name);
-}
-
-void __ubsan_handle_sub_overflow(struct overflow *data, void *left, void *right);
-void __ubsan_handle_sub_overflow(struct overflow *data, void *left, void *right)
-{
- UNUSED(left);
- UNUSED(right);
- struct source_location *loc = &data->location;
- panic("%s:%d: UBSAN: sub-overflow [type: %s]\n", loc->file, loc->line, data->type->name);
-}
-
-void __ubsan_handle_negate_overflow(struct overflow *data, void *left, void *right);
-void __ubsan_handle_negate_overflow(struct overflow *data, void *left, void *right)
-{
- UNUSED(left);
- UNUSED(right);
- struct source_location *loc = &data->location;
- panic("%s:%d: UBSAN: negate-overflow [type: %s]\n", loc->file, loc->line, data->type->name);
-}
-
-void __ubsan_handle_mul_overflow(struct overflow *data, void *left, void *right);
-void __ubsan_handle_mul_overflow(struct overflow *data, void *left, void *right)
-{
- UNUSED(left);
- UNUSED(right);
- struct source_location *loc = &data->location;
- panic("%s:%d: UBSAN: mul-overflow [type: %s]\n", loc->file, loc->line, data->type->name);
-}
-
-void __ubsan_handle_shift_out_of_bounds(struct overflow *data, void *left, void *right);
-void __ubsan_handle_shift_out_of_bounds(struct overflow *data, void *left, void *right)
-{
- UNUSED(left);
- UNUSED(right);
- struct source_location *loc = &data->location;
- panic("%s:%d: UBSAN: shift-out-of-bounds [type: %s]\n", loc->file, loc->line,
- data->type->name);
-}
-
-void __ubsan_handle_divrem_overflow(struct overflow *data, void *left, void *right);
-void __ubsan_handle_divrem_overflow(struct overflow *data, void *left, void *right)
-{
- UNUSED(left);
- UNUSED(right);
- struct source_location *loc = &data->location;
- panic("%s:%d: UBSAN: divrem-overflow (probably div-by-zero) [type: %s]\n", loc->file,
- loc->line, data->type->name);
-}
-
-void __ubsan_handle_out_of_bounds(struct out_of_bounds *data, void *value);
-void __ubsan_handle_out_of_bounds(struct out_of_bounds *data, void *value)
-{
- UNUSED(value);
- struct source_location *loc = &data->location;
- panic("%s:%d: UBSAN: out-of-bounds\n", loc->file, loc->line);
-}
-
-void __ubsan_handle_type_mismatch_v1(struct type_mismatch *data, u32 ptr);
-void __ubsan_handle_type_mismatch_v1(struct type_mismatch *data, u32 ptr)
-{
- static const char *kinds[] = {
- "Load of",
- "Store to",
- "Reference binding to",
- "Member access within",
- "Member call on",
- "Constructor call on",
- "Downcast of",
- "Downcast of",
- "Upcast of",
- "Cast to virtual base of",
- "Nonnull binding to",
- "Dynamic operation on",
- };
-
- struct source_location *loc = &data->location;
- const char *msg = "";
- if (ptr == 0) {
- msg = "null pointer";
- } else if (data->alignment != 0 && is_aligned(ptr, data->alignment))
- msg = "misaligned memory address";
- else
- msg = "address with insufficient space";
- panic("%s:%d: UBSAN: %s %s [type: %s; addr: 0x%x; align: %d]\n", loc->file, loc->line,
- kinds[data->type_check_kind], msg, data->type->name, ptr, data->alignment);
-}
-
-void __ubsan_handle_alignment_assumption(void);
-void __ubsan_handle_alignment_assumption(void)
-{
- panic("UBSAN: alignment-assumption\n");
-}
-
-void __ubsan_handle_builtin_unreachable(void);
-void __ubsan_handle_builtin_unreachable(void)
-{
- panic("UBSAN: builtin-unreachable\n");
-}
-
-void __ubsan_handle_missing_return(void);
-void __ubsan_handle_missing_return(void)
-{
- panic("UBSAN: missing-return\n");
-}
-
-void __ubsan_handle_implicit_conversion(void);
-void __ubsan_handle_implicit_conversion(void)
-{
- panic("UBSAN: implicit-conversion\n");
-}
-
-void __ubsan_handle_invalid_builtin(void);
-void __ubsan_handle_invalid_builtin(void)
-{
- panic("UBSAN: invalid-builtin\n");
-}
-
-void __ubsan_handle_pointer_overflow(void);
-void __ubsan_handle_pointer_overflow(void)
-{
- panic("UBSAN: pointer-overflow\n");
-}
diff --git a/libc/stack.c b/libc/stack.c
deleted file mode 100644
index 0cbb69d..0000000
--- a/libc/stack.c
+++ /dev/null
@@ -1,126 +0,0 @@
-// MIT License, Copyright (c) 2020 Marvin Borner
-
-#include <def.h>
-#include <mem.h>
-#include <stack.h>
-
-static int nonce = 0;
-
-struct stack *stack_new(void)
-{
- struct stack *stack = malloc(sizeof(*stack));
- stack->tail = NULL;
- return stack;
-}
-
-void stack_destroy(struct stack *stack)
-{
- struct stack_node *iterator = stack->tail;
- while (iterator) {
- if (!iterator->prev) {
- free(iterator);
- break;
- }
- iterator = iterator->prev;
- free(iterator->next);
- }
- stack->tail = NULL;
- free(stack);
- stack = NULL;
-}
-
-static struct stack_node *stack_new_node(void)
-{
- struct stack_node *node = malloc(sizeof(*node));
- node->data = NULL;
- node->prev = NULL;
- node->next = NULL;
- node->nonce = nonce++;
- return node;
-}
-
-static u32 stack_push_bot_node(struct stack *stack, struct stack_node *node)
-{
- if (!stack || !node)
- return 0;
-
- if (stack->tail) {
- struct stack_node *iterator = stack->tail;
- while (iterator) {
- if (!iterator->prev)
- break;
- iterator = iterator->prev;
- }
- iterator->prev = node;
- node->next = iterator;
- } else {
- stack->tail = node;
- }
-
- return 1;
-}
-
-static u32 stack_push_node(struct stack *stack, struct stack_node *node)
-{
- if (!stack || !node)
- return 0;
-
- if (stack->tail) {
- stack->tail->next = node;
- node->prev = stack->tail;
- stack->tail = node;
- } else {
- stack->tail = node;
- }
-
- return 1;
-}
-
-u32 stack_empty(struct stack *stack)
-{
- return !stack->tail;
-}
-
-u32 stack_push_bot(struct stack *stack, void *data)
-{
- struct stack_node *node = stack_new_node();
- node->data = data;
- return stack_push_bot_node(stack, node);
-}
-
-u32 stack_push(struct stack *stack, void *data)
-{
- struct stack_node *node = stack_new_node();
- node->data = data;
- return stack_push_node(stack, node);
-}
-
-void *stack_pop(struct stack *stack)
-{
- if (!stack || !stack->tail)
- return NULL;
-
- struct stack_node *prev = stack->tail;
-
- if (stack->tail->prev)
- stack->tail->prev->next = NULL;
- stack->tail = stack->tail->prev;
-
- void *data = prev->data;
- free(prev);
- return data;
-}
-
-void *stack_peek(struct stack *stack)
-{
- if (!stack || !stack->tail)
- return NULL;
-
- return stack->tail->data;
-}
-
-void stack_clear(struct stack *stack)
-{
- while (stack_pop(stack))
- ;
-}
diff --git a/libc/str.c b/libc/str.c
deleted file mode 100644
index ba16920..0000000
--- a/libc/str.c
+++ /dev/null
@@ -1,207 +0,0 @@
-// MIT License, Copyright (c) 2020 Marvin Borner
-
-#include <def.h>
-#include <errno.h>
-#include <mem.h>
-#include <str.h>
-
-u32 strlen(const char *s)
-{
- const char *ss = s;
- while (*ss)
- ss++;
- return ss - s;
-}
-
-char *strcpy(char *dst, const char *src)
-{
- char *q = dst;
- const char *p = src;
- char ch;
-
- do {
- *q++ = ch = *p++;
- } while (ch);
-
- return dst;
-}
-
-char *strncpy(char *dst, const char *src, u32 n)
-{
- char *q = dst;
-
- while (n-- && (*dst++ = *src++))
- ;
-
- return q;
-}
-
-int strcmp(const char *s1, const char *s2)
-{
- const u8 *c1 = (const u8 *)s1;
- const u8 *c2 = (const u8 *)s2;
- u8 ch;
- int d = 0;
-
- while (1) {
- d = (int)(ch = *c1++) - (int)*c2++;
- if (d || !ch)
- break;
- }
-
- return d;
-}
-
-int strncmp(const char *s1, const char *s2, u32 n)
-{
- const u8 *c1 = (const u8 *)s1;
- const u8 *c2 = (const u8 *)s2;
- u8 ch;
- int d = 0;
-
- while (n--) {
- d = (int)(ch = *c1++) - (int)*c2++;
- if (d || !ch)
- break;
- }
-
- return d;
-}
-
-char *strchr(char *s, int c)
-{
- while (*s != (char)c) {
- if (!*s)
- return NULL;
- s++;
- }
-
- return s;
-}
-
-char *strrchr(char *s, int c)
-{
- char *ret = 0;
-
- do {
- if (*s == c)
- ret = s;
- } while (*s++);
-
- return ret;
-}
-
-char *strcat(char *dst, const char *src)
-{
- strcpy(strchr(dst, '\0'), src);
- return dst;
-}
-
-char *strncat(char *dst, const char *src, u32 n)
-{
- strncpy(strchr(dst, '\0'), src, n);
- return dst;
-}
-
-char *strinv(char *s)
-{
- u32 s_str = strlen(s);
-
- int iterations = (int)s_str / 2;
- for (int i = 0; i < iterations; i++) {
- char aux = s[i];
- s[i] = s[(s_str - i) - 1];
- s[(s_str - i) - 1] = aux;
- }
- return s;
-}
-
-char *strdup(const char *s)
-{
- int l = strlen(s) + 1;
- char *d = malloc(l);
-
- memcpy(d, s, l);
-
- return d;
-}
-
-const char *strerror(u32 error)
-{
- switch (error) {
- case 0:
- return "Success";
- case EPERM:
- return "Operation not permitted";
- case ENOENT:
- return "No such file or directory";
- case ESRCH:
- return "No such process";
- case EINTR:
- return "Interrupted system call";
- case EIO:
- return "I/O error";
- case ENXIO:
- return "No such device or address";
- case E2BIG:
- return "Argument list too long";
- case ENOEXEC:
- return "Exec format error";
- case EBADF:
- return "Bad file number";
- case ECHILD:
- return "No child processes";
- case EAGAIN:
- return "Try again";
- case ENOMEM:
- return "Out of memory";
- case EACCES:
- return "Permission denied";
- case EFAULT:
- return "Bad address";
- case ENOTBLK:
- return "Block device required";
- case EBUSY:
- return "Device or resource busy";
- case EEXIST:
- return "File exists";
- case EXDEV:
- return "Cross-device link";
- case ENODEV:
- return "No such device";
- case ENOTDIR:
- return "Not a directory";
- case EISDIR:
- return "Is a directory";
- case EINVAL:
- return "Invalid argument";
- case ENFILE:
- return "File table overflow";
- case EMFILE:
- return "Too many open files";
- case ENOTTY:
- return "Not a typewriter";
- case ETXTBSY:
- return "Text file busy";
- case EFBIG:
- return "File too large";
- case ENOSPC:
- return "No space left on device";
- case ESPIPE:
- return "Illegal seek";
- case EROFS:
- return "Read-only file system";
- case EMLINK:
- return "Too many links";
- case EPIPE:
- return "Broken pipe";
- case EDOM:
- return "Math argument out of domain of func";
- case ERANGE:
- return "Math result not representable";
- case EMAX:
- return "Max errno";
- default:
- return "Unknown error";
- }
-}
diff --git a/libc/sys.c b/libc/sys.c
deleted file mode 100644
index 491c37c..0000000
--- a/libc/sys.c
+++ /dev/null
@@ -1,203 +0,0 @@
-// MIT License, Copyright (c) 2020 Marvin Borner
-// Syscall implementation
-
-#include <arg.h>
-#include <assert.h>
-#include <errno.h>
-#include <sys.h>
-
-#if defined(userspace)
-
-/**
- * Definitions
- */
-
-#define ERRIFY(ret) \
- if (ret < 0) { \
- errno = -ret; \
- return -1; \
- } \
- errno = 0; \
- return ret
-
-res sys0(enum sys num);
-res sys0(enum sys num)
-{
- int a;
- __asm__ volatile("int $0x80" : "=a"(a) : "0"(num));
- ERRIFY(a);
-}
-
-res sys1(enum sys num, int d1);
-res sys1(enum sys num, int d1)
-{
- int a;
- __asm__ volatile("int $0x80" : "=a"(a) : "0"(num), "b"((int)d1));
- ERRIFY(a);
-}
-
-res sys2(enum sys num, int d1, int d2);
-res sys2(enum sys num, int d1, int d2)
-{
- int a;
- __asm__ volatile("int $0x80" : "=a"(a) : "0"(num), "b"((int)d1), "c"((int)d2));
- ERRIFY(a);
-}
-
-res sys3(enum sys num, int d1, int d2, int d3);
-res sys3(enum sys num, int d1, int d2, int d3)
-{
- int a;
- __asm__ volatile("int $0x80"
- : "=a"(a)
- : "0"(num), "b"((int)d1), "c"((int)d2), "d"((int)d3));
- ERRIFY(a);
-}
-
-res sys4(enum sys num, int d1, int d2, int d3, int d4);
-res sys4(enum sys num, int d1, int d2, int d3, int d4)
-{
- int a;
- __asm__ volatile("int $0x80"
- : "=a"(a)
- : "0"(num), "b"((int)d1), "c"((int)d2), "d"((int)d3), "S"((int)d4));
- ERRIFY(a);
-}
-
-res sys5(enum sys num, int d1, int d2, int d3, int d4, int d5);
-res sys5(enum sys num, int d1, int d2, int d3, int d4, int d5)
-{
- int a;
- __asm__ volatile("int $0x80"
- : "=a"(a)
- : "0"(num), "b"((int)d1), "c"((int)d2), "d"((int)d3), "S"((int)d4),
- "D"((int)d5));
- ERRIFY(a);
-}
-
-/**
- * Syscalls
- */
-
-res sys_alloc(u32 size, u32 *addr)
-{
- u32 id = 0;
- return sys4(SYS_ALLOC, (int)size, (int)addr, (int)&id, 0);
-}
-
-res sys_free(void *ptr)
-{
- return sys1(SYS_FREE, (int)ptr);
-}
-
-res shalloc(u32 size, u32 *addr, u32 *id)
-{
- return sys4(SYS_ALLOC, (int)size, (int)addr, (int)id, 1);
-}
-
-res shaccess(u32 id, u32 *addr, u32 *size)
-{
- return sys3(SYS_SHACCESS, (int)id, (int)addr, (int)size);
-}
-
-void loop(void)
-{
- sys0(SYS_LOOP);
-}
-
-res read(const char *path, void *buf, u32 offset, u32 count)
-{
- return sys4(SYS_READ, (int)path, (int)buf, (int)offset, (int)count);
-}
-
-res write(const char *path, const void *buf, u32 offset, u32 count)
-{
- return sys4(SYS_WRITE, (int)path, (int)buf, (int)offset, (int)count);
-}
-
-res ioctl(const char *path, ...)
-{
- va_list ap;
- int args[4] = { 0 };
-
- va_start(ap, path);
- for (int i = 0; i < 4; i++)
- args[i] = va_arg(ap, int);
- va_end(ap);
-
- return sys5(SYS_IOCTL, (int)path, args[0], args[1], args[2], args[3]);
-}
-
-res stat(const char *path, struct stat *buf)
-{
- return sys2(SYS_STAT, (int)path, (int)buf);
-}
-
-res poll(const char **files)
-{
- return sys1(SYS_POLL, (int)files);
-}
-
-res exec(const char *path, ...)
-{
- va_list ap;
- int args[4] = { 0 };
-
- va_start(ap, path);
- for (int i = 0; i < 4; i++)
- args[i] = va_arg(ap, int);
- va_end(ap);
-
- return sys5(SYS_EXEC, (int)path, args[0], args[1], args[2], args[3]);
-}
-
-res yield(void)
-{
- return sys0(SYS_YIELD);
-}
-
-static void atexit_trigger(void);
-void exit(s32 status)
-{
- atexit_trigger();
- sys1(SYS_EXIT, (int)status);
- while (1)
- yield();
-}
-
-res boot(u32 cmd)
-{
- return sys2(SYS_BOOT, SYS_BOOT_MAGIC, cmd);
-}
-
-u32 time(void)
-{
- return (u32)sys0(SYS_TIME);
-}
-
-/**
- * At exit
- */
-
-#define ATEXIT_MAX 32
-
-static u32 slot = 0;
-static void (*funcs[ATEXIT_MAX])(void) = { 0 };
-
-static void atexit_trigger(void)
-{
- while (slot-- > 0) {
- if (funcs[slot]) {
- funcs[slot]();
- funcs[slot] = NULL;
- }
- }
-}
-
-void atexit(void (*func)(void))
-{
- if (slot < ATEXIT_MAX)
- funcs[slot++] = func;
-}
-
-#endif