From 4043eb50f70284f7125dd12e070c0316aa2f2bc6 Mon Sep 17 00:00:00 2001 From: Mathieu Maret Date: Fri, 9 Nov 2018 22:32:21 +0100 Subject: [PATCH] mem: align upper bound on PAGE_SIZE stole some macro from linux kernel --- core/mem.c | 6 +++++- core/types.h | 10 ++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/core/mem.c b/core/mem.c index 685fddd..4338fb5 100644 --- a/core/mem.c +++ b/core/mem.c @@ -1,5 +1,6 @@ #include "mem.h" #include "list.h" +#include "types.h" #include "vga.h" static struct mem_desc *page_desc = (struct mem_desc *)&__ld_kernel_end; @@ -10,7 +11,10 @@ static unsigned long top_mem; int memSetup(unsigned long upper_mem) { - printf("Free Mem from %d to %d\n", &__ld_kernel_end, upper_mem * 1024); + // Align upper mem (in kB) on page size even if it does loose a page + upper_mem = ALIGN_DOWN(upper_mem, PAGE_SIZE / 1024); + + printf("Available Mem from %d to %d \n", &__ld_kernel_end, upper_mem * 1024); // Memory description is stored after the kernel. We need some place to store it unsigned long memdesc_end = (unsigned long)page_desc + diff --git a/core/types.h b/core/types.h index 44b9fca..4ce0150 100644 --- a/core/types.h +++ b/core/types.h @@ -1,5 +1,15 @@ #pragma once +#define __ALIGN_KERNEL(x, a) __ALIGN_KERNEL_MASK(x, (typeof(x))(a)-1) +#define __ALIGN_KERNEL_MASK(x, mask) (((x) + (mask)) & ~(mask)) + +/* @a is a power of 2 value */ +#define ALIGN(x, a) __ALIGN_KERNEL((x), (a)) +#define ALIGN_DOWN(x, a) __ALIGN_KERNEL((x) - ((a)-1), (a)) +#define __ALIGN_MASK(x, mask) __ALIGN_KERNEL_MASK((x), (mask)) +#define PTR_ALIGN(p, a) ((typeof(p))ALIGN((unsigned long)(p), (a))) +#define IS_ALIGNED(x, a) (((x) & ((typeof(x))(a)-1)) == 0) + // Virtual address typedef unsigned long vaddr_t;