aboutsummaryrefslogtreecommitdiff
path: root/libc
diff options
context:
space:
mode:
authorMarvin Borner2020-08-26 18:01:03 +0200
committerMarvin Borner2020-08-26 18:01:03 +0200
commit3f1668290da19734dcbfed633b6f415d1fa21a1a (patch)
tree85fa32e14c0db07f98b872f6ba9bf9ac6b4de9ca /libc
parentae31470ce5d666981ab1fe50cb2b4b38ca4b113f (diff)
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.
Diffstat (limited to 'libc')
-rw-r--r--libc/inc/mem.h14
-rw-r--r--libc/mem.c53
2 files changed, 59 insertions, 8 deletions
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 <sys.h>
#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 <def.h>
-#include <print.h>
+#include <mem.h>
#include <sys.h>
// 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