summaryrefslogtreecommitdiff
path: root/src/kernel/mem.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/mem.c')
-rw-r--r--src/kernel/mem.c15
1 files changed, 12 insertions, 3 deletions
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) {