From 443ffdf0121a4890929ee2ab0d45704f1d90a49a Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Tue, 3 Dec 2013 15:29:05 +0100 Subject: [PATCH] replaced PAGE_ALIGN macro by PAGE_CEIL, PAGE_FLOOR pair --- arch/x86/include/asm/page.h | 5 ++++- arch/x86/mm/page64.c | 4 ++-- mm/malloc.c | 4 ++-- mm/memory.c | 20 ++++++++++---------- 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/arch/x86/include/asm/page.h b/arch/x86/include/asm/page.h index 197c441f..3018675f 100644 --- a/arch/x86/include/asm/page.h +++ b/arch/x86/include/asm/page.h @@ -64,6 +64,10 @@ /// Mask the entry in a page table #define PAGE_ENTRY_MASK (-1L << (PAGE_SHIFT-PAGE_MAP_SHIFT)) +/// Align to next page +#define PAGE_FLOOR(addr) (((addr) + PAGE_SIZE - 1) & PAGE_MASK) +/// Align to page +#define PAGE_CEIL(addr) ( (addr) & PAGE_MASK) /// Sign extension to get a valid canonical address (hack: by using aritmethic shifts) #define VIRT_SEXT(addr) ((ssize_t) addr << (BITS-VIRT_BITS) >> (BITS-VIRT_BITS)) @@ -78,7 +82,6 @@ #define PAGE_MAP_PGT 0xFFFFFF8000000000 #endif -#define PAGE_ALIGN(addr) (((addr) + PAGE_SIZE - 1) & PAGE_MASK) /// Page is present #define PG_PRESENT (1 << 0) /// Page is read- and writable diff --git a/arch/x86/mm/page64.c b/arch/x86/mm/page64.c index 9a74b898..b2178823 100644 --- a/arch/x86/mm/page64.c +++ b/arch/x86/mm/page64.c @@ -562,13 +562,13 @@ int arch_paging_init(void) */ if (mb_info && (mb_info->flags & MULTIBOOT_INFO_MODS)) { multiboot_module_t* mmodule = (multiboot_module_t*) ((size_t) mb_info->mods_addr); - npages = PAGE_ALIGN(mb_info->mods_count*sizeof(multiboot_module_t)) >> PAGE_SHIFT; + npages = PAGE_FLOOR(mb_info->mods_count*sizeof(multiboot_module_t)) >> PAGE_SHIFT; map_region((size_t) mmodule, (size_t) mmodule, npages, MAP_REMAP|MAP_KERNEL_SPACE); for(i=0; imods_count; i++, mmodule++) { // map physical address to the same virtual address - npages = PAGE_ALIGN(mmodule->mod_end - mmodule->mod_start) >> PAGE_SHIFT; + npages = PAGE_FLOOR(mmodule->mod_end - mmodule->mod_start) >> PAGE_SHIFT; kprintf("Map module %s at 0x%x (%u pages)\n", (char*)(size_t) mmodule->cmdline, mmodule->mod_start, npages); map_region((size_t) (mmodule->mod_start), (size_t) (mmodule->mod_start), npages, MAP_REMAP|MAP_KERNEL_SPACE); } diff --git a/mm/malloc.c b/mm/malloc.c index 110f38ba..ebaec847 100644 --- a/mm/malloc.c +++ b/mm/malloc.c @@ -117,7 +117,7 @@ void buddy_dump() void* palloc(size_t sz, uint32_t flags) { size_t phyaddr, viraddr; - uint32_t npages = PAGE_ALIGN(sz) >> PAGE_SHIFT; + uint32_t npages = PAGE_FLOOR(sz) >> PAGE_SHIFT; kprintf("palloc(%lu) (%lu pages)\n", sz, npages); // TODO: remove @@ -152,7 +152,7 @@ void pfree(void* addr, size_t sz) size_t i; size_t phyaddr; size_t viraddr = (size_t) addr & PAGE_MASK; - uint32_t npages = PAGE_ALIGN(sz) >> PAGE_SHIFT; + uint32_t npages = PAGE_FLOOR(sz) >> PAGE_SHIFT; // memory is propably not continously mapped! for (i=0; i 1 // reserve page for SMP boot code - vma_add(SMP_SETUP_ADDR & PAGE_MASK, - PAGE_ALIGN(SMP_SETUP_ADDR + PAGE_SIZE), + vma_add(PAGE_CEIL(SMP_SETUP_ADDR), + PAGE_FLOOR(SMP_SETUP_ADDR + PAGE_SIZE), VMA_READ|VMA_WRITE|VMA_EXECUTE|VMA_CACHEABLE); #endif @@ -295,20 +295,20 @@ int mmu_init(void) * Therefore, we set these pages as used. */ if (mb_info) { - vma_add((size_t) mb_info & PAGE_MASK, - PAGE_ALIGN((size_t) mb_info + sizeof(multiboot_info_t)), + vma_add(PAGE_CEIL((size_t) mb_info), + PAGE_FLOOR((size_t) mb_info + sizeof(multiboot_info_t)), VMA_READ|VMA_CACHEABLE); if (mb_info->flags & MULTIBOOT_INFO_MODS) { multiboot_module_t* mmodule = (multiboot_module_t*) ((size_t) mb_info->mods_addr); - vma_add((size_t) mb_info->mods_addr & PAGE_MASK, - PAGE_ALIGN((size_t) mb_info->mods_addr + mb_info->mods_count*sizeof(multiboot_module_t)), + vma_add(PAGE_CEIL((size_t) mb_info->mods_addr), + PAGE_FLOOR((size_t) mb_info->mods_addr + mb_info->mods_count*sizeof(multiboot_module_t)), VMA_READ|VMA_CACHEABLE); for(i=0; imods_count; i++) { - vma_add(PAGE_ALIGN(mmodule[i].mod_start), - PAGE_ALIGN(mmodule[i].mod_end), + vma_add(PAGE_CEIL(mmodule[i].mod_start), + PAGE_FLOOR(mmodule[i].mod_end), VMA_READ|VMA_WRITE|VMA_CACHEABLE); for(addr=mmodule[i].mod_start; addr