From 6200bd2d95ad6ff9a65f8b97b9335353e3a52c5e Mon Sep 17 00:00:00 2001
From: dzwdz
Date: Sat, 17 Jul 2021 19:58:02 +0200
Subject: detect the highest used memory address, and only allocate pages above
 it

---
 src/kernel/main.c |  2 +-
 src/kernel/mem.c  | 15 ++++++++++++---
 src/kernel/mem.h  |  3 ++-
 3 files changed, 15 insertions(+), 5 deletions(-)

(limited to 'src/kernel')

diff --git a/src/kernel/main.c b/src/kernel/main.c
index d2f2e7f..761e499 100644
--- a/src/kernel/main.c
+++ b/src/kernel/main.c
@@ -9,7 +9,7 @@ void r3_test();
 void kmain(struct kmain_info info) {
 	log_write(info.init.at, info.init.size);
 	log_const("mem...");
-	mem_init();
+	mem_init(&info);
 
 	log_const("creating process...");
 	struct process *proc = process_new(r3_test);
diff --git a/src/kernel/mem.c b/src/kernel/mem.c
index d002050..b455b25 100644
--- a/src/kernel/mem.c
+++ b/src/kernel/mem.c
@@ -1,11 +1,20 @@
 #include <arch/generic.h>
 #include <kernel/mem.h>
+#include <stdint.h>
 
-extern void *_bss_end;
 static void *highest_page;
 
-void mem_init() {
-	highest_page = &_bss_end;
+void mem_init(struct kmain_info *info) {
+	// finds the highest used page, and starts allocating pages above it
+	extern char _bss_end;
+	void *highest = &_bss_end;
+	size_t page_mask = PAGE_SIZE - 1;
+
+	if (highest < info->init.at + info->init.size)
+		highest = info->init.at + info->init.size;
+
+	// align up to PAGE_SIZE
+	highest_page = (void*)(((uintptr_t)highest + page_mask) & ~page_mask);
 }
 
 void *page_alloc(size_t pages) {
diff --git a/src/kernel/mem.h b/src/kernel/mem.h
index efa65d6..f608bb8 100644
--- a/src/kernel/mem.h
+++ b/src/kernel/mem.h
@@ -1,7 +1,8 @@
 #pragma once
+#include <kernel/main.h>
 #include <stddef.h>
 
-void mem_init();
+void mem_init(struct kmain_info *);
 
 // allocates `pages` consecutive pages
 void *page_alloc(size_t pages);
-- 
cgit v1.2.3