From 3f1668290da19734dcbfed633b6f415d1fa21a1a Mon Sep 17 00:00:00 2001 From: Marvin Borner Date: Wed, 26 Aug 2020 18:01:03 +0200 Subject: Started stack allocator. This will replace the current linear allocator so we can free and realloc memory correctly. This is especially important for the window resizing due to a fixed LFB size. --- libc/inc/mem.h | 14 ++++++++------ libc/mem.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 59 insertions(+), 8 deletions(-) (limited to 'libc') diff --git a/libc/inc/mem.h b/libc/inc/mem.h index cb64ce8..9aeeee9 100644 --- a/libc/inc/mem.h +++ b/libc/inc/mem.h @@ -7,8 +7,13 @@ // Huh #ifdef kernel -#define malloc(n) (void *)((HEAP += n) - n) // TODO: Implement real/better malloc/free -#define free(ptr) +#define HEAP_SIZE 0x10000 +#define HEAP_MAGIC 0x42 +void heap_init(u32 start); +void *malloc(u32 size); +void free(void *ptr); +/* #define malloc(n) (void *)((HEAP += n) - n) // TODO: Implement real/better malloc/free */ +/* #define free(ptr) */ #elif defined(userspace) #include #define malloc(n) (void *)sys1(SYS_MALLOC, n) @@ -17,11 +22,8 @@ #error "No lib target specified. Please use -Dkernel or -Duserspace" #endif -u32 HEAP; -u32 HEAP_START; - void *memcpy(void *dest, const void *src, u32 n); -void *memset(void *dest, int c, u32 n); +void *memset(void *dest, int val, u32 n); int memcmp(const void *s1, const void *s2, u32 n); #endif diff --git a/libc/mem.c b/libc/mem.c index 4b7981f..4744a8b 100644 --- a/libc/mem.c +++ b/libc/mem.c @@ -1,7 +1,7 @@ // MIT License, Copyright (c) 2020 Marvin Borner #include -#include +#include #include // Taken from jgraef at osdev @@ -24,7 +24,7 @@ void *memcpy(void *dest, const void *src, u32 n) return dest; } -void *memset(void *dest, char val, u32 n) +void *memset(void *dest, int val, u32 n) { u32 num_dwords = n / 4; u32 num_bytes = n % 4; @@ -55,3 +55,52 @@ int memcmp(const void *s1, const void *s2, u32 n) } return 0; } + +#ifdef kernel + +static u32 *heap; +static u32 index; + +void heap_init(u32 start) +{ + heap = (u32 *)start; + for (int i = 0; i < HEAP_SIZE; i++) + heap[i] = 0; + heap[0] = HEAP_MAGIC; + index = 1; +} + +int count() +{ + int i = 0; + u32 *iterator = heap + 1; + do { + iterator += iterator[0] + 1; + i++; + } while (iterator[0] != 0); + return i; +} + +void *malloc(u32 size) +{ + if (size < 1) + return NULL; + + heap[index] = size; + index += size + 1; + return (void *)(heap + index - size); +} + +// TODO: Implement free, realloc and find_smallest_hole +void free(void *ptr) +{ + (void)ptr; +} + +void *realloc(void *ptr, u32 size) +{ + (void)size; + return ptr; +} + +#endif -- cgit v1.2.3