summaryrefslogtreecommitdiff
path: root/src/arch/amd64/paging.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/arch/amd64/paging.c10
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) {