aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarvin Borner2020-08-26 18:01:03 +0200
committerMarvin Borner2020-08-26 18:01:03 +0200
commit3f1668290da19734dcbfed633b6f415d1fa21a1a (patch)
tree85fa32e14c0db07f98b872f6ba9bf9ac6b4de9ca
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.
-rw-r--r--apps/wm.c1
-rw-r--r--kernel/features/syscall.c2
-rw-r--r--kernel/main.c3
-rw-r--r--libc/inc/mem.h14
-rw-r--r--libc/mem.c53
5 files changed, 61 insertions, 12 deletions
diff --git a/apps/wm.c b/apps/wm.c
index 1c6fa2b..c045914 100644
--- a/apps/wm.c
+++ b/apps/wm.c
@@ -141,7 +141,6 @@ int main(int argc, char **argv)
default:
printf("Unknown WM request %d from pid %d\n", msg->type, msg->src);
}
- yield();
};
return 0;
diff --git a/kernel/features/syscall.c b/kernel/features/syscall.c
index fbbb68b..5915d9d 100644
--- a/kernel/features/syscall.c
+++ b/kernel/features/syscall.c
@@ -33,7 +33,7 @@ void syscall_handler(struct regs *r)
}
case SYS_FREE: {
printf("free\n");
- free(r->ebx);
+ free((void *)r->ebx);
break;
}
case SYS_READ: {
diff --git a/kernel/main.c b/kernel/main.c
index e97dad1..7d87be5 100644
--- a/kernel/main.c
+++ b/kernel/main.c
@@ -13,8 +13,7 @@
void kernel_main(struct vid_info *vid_info)
{
- HEAP = 0x00f00000;
- HEAP_START = HEAP; // For malloc function
+ heap_init(0x00f00000);
boot_passed = vid_info;
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