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;