summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/kernel.c9
-rw-r--r--kernel/mem.c31
2 files changed, 35 insertions, 5 deletions
diff --git a/kernel/kernel.c b/kernel/kernel.c
index 568d8a3..3952f8f 100644
--- a/kernel/kernel.c
+++ b/kernel/kernel.c
@@ -20,11 +20,12 @@ void kernel_main(size_t hart, void *fdt) {
struct dt_node *head = dt_parse(fdt);
struct mem_info *info = km_find_memory(head);
- if (info) {
- print_string("found memory!\n");
- } else {
- print_string("could not find memory!\n");
+ if (!info) {
+ print_string("failed to get memory!\n");
+ while (1);
}
+ km_init(info);
+
while(1);
}
diff --git a/kernel/mem.c b/kernel/mem.c
index 3a0b19b..840a3b7 100644
--- a/kernel/mem.c
+++ b/kernel/mem.c
@@ -3,10 +3,31 @@
#include <dtb.h>
#include <common.h>
+static struct page *free_list;
+
void* kmalloc(size_t size) {
- return (void*)size;
+ struct page *page = free_list;
+ while (page != NULL && page->size < size && page->status != MEMPAGE_FREE) {
+ page = page->next;
+ }
+ if (page == NULL)
+ return NULL;
+
+ size_t combined_size = size + sizeof(struct page);
+ struct page *next = (struct page *)((void *)page + combined_size);
+ next->next = page->next;
+ next->size = page->size - combined_size;
+ next->status = MEMPAGE_FREE;
+
+ page->status = MEMPAGE_USED;
+ next->size = combined_size;
+ next->next = NULL;
+
+ return (void *)page + sizeof(struct page);
}
+
+
void* memcpy(void *to, const void *from, size_t size) {
char *dest = (char *)to;
const char *src = (const char *)from;
@@ -18,3 +39,11 @@ void* memcpy(void *to, const void *from, size_t size) {
return dest;
}
+void km_init(struct mem_info *info) {
+ struct page *base = (struct page *)info->start;
+ base->next = NULL;
+ base->size = info->size - sizeof(struct page);
+ base->status = MEMPAGE_FREE;
+
+ free_list = base;
+}