aboutsummaryrefslogtreecommitdiff
path: root/kernel/vm/pagefault.c
diff options
context:
space:
mode:
authorsotech117 <michael_foiani@brown.edu>2024-05-13 12:10:55 +0000
committersotech117 <michael_foiani@brown.edu>2024-05-13 12:10:55 +0000
commit7585cb5ad84babe9db8c6595de464e33fb878f0c (patch)
tree3acdd29920420ca341ea7e3f90d60b16c384ce51 /kernel/vm/pagefault.c
parentf09878f6327426631d9419d825a4e8396e3b9dc4 (diff)
s5 fixes and issues with weenix
Diffstat (limited to 'kernel/vm/pagefault.c')
-rw-r--r--kernel/vm/pagefault.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/kernel/vm/pagefault.c b/kernel/vm/pagefault.c
index 2e0c92d..b289537 100644
--- a/kernel/vm/pagefault.c
+++ b/kernel/vm/pagefault.c
@@ -91,7 +91,7 @@ void handle_pagefault(uintptr_t vaddr, uintptr_t cause)
mobj_lock(vma->vma_obj);
int ret = mobj_get_pframe(
vma->vma_obj,
- vma->vma_off + (ADDR_TO_PN(vaddr) - vma->vma_start),
+ vma->vma_off + ADDR_TO_PN(vaddr) - vma->vma_start,
cause & FAULT_WRITE ? 1 : 0,
&pf
);
@@ -102,6 +102,8 @@ void handle_pagefault(uintptr_t vaddr, uintptr_t cause)
}
// 4) Finally, set up a call to pt_map to insert a new mapping into the appropriate pagetable
+ uintptr_t paddr = pt_virt_to_phys(pf->pf_addr);
+ pframe_release(&pf);
int pdflags = PT_PRESENT | PT_WRITE | PT_USER;
int ptflags = PT_PRESENT | PT_USER;
if (cause & FAULT_WRITE)
@@ -111,7 +113,7 @@ void handle_pagefault(uintptr_t vaddr, uintptr_t cause)
int err = pt_map(
curproc->p_pml4,
- pt_virt_to_phys((uintptr_t) pf->pf_addr),
+ paddr,
(uintptr_t) PAGE_ALIGN_DOWN(vaddr),
pdflags,
ptflags