diff options
Diffstat (limited to '')
-rw-r--r-- | src/arch/amd64/paging.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/src/arch/amd64/paging.c b/src/arch/amd64/paging.c index a80737c..c857d0b 100644 --- a/src/arch/amd64/paging.c +++ b/src/arch/amd64/paging.c @@ -539,20 +539,20 @@ void paging_init(void) { static inline void *page_align(void *addr) { uintptr_t a = (uintptr_t) addr; - a += PAGE_SIZE - 1; a /= PAGE_SIZE; a *= PAGE_SIZE; return (void *) a; } void *mmap(void *addr, size_t len) { - len += (long)addr % PAGE_SIZE; - long pages = (len + PAGE_SIZE - 1) / PAGE_SIZE; + void *phys = page_align(addr); + ptrdiff_t error = (char*)addr - (char*)phys; + len += error; + long pages = len / PAGE_SIZE + 1; void *virt = virtaddr_alloc(pages); if (virt == NULL) { return NULL; } - void *phys = page_align(addr); if (map_pages( kernel_pml4, virt, @@ -563,7 +563,7 @@ void *mmap(void *addr, size_t len) { virtaddr_free(virt); return NULL; } - return virt; + return (char*)virt + error; } void unmap(void *addr) { |