summaryrefslogtreecommitdiffstats
path: root/arch/x86_64/hal/paging.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/hal/paging.c')
-rw-r--r--arch/x86_64/hal/paging.c36
1 files changed, 32 insertions, 4 deletions
diff --git a/arch/x86_64/hal/paging.c b/arch/x86_64/hal/paging.c
index 770cdff..408b5d5 100644
--- a/arch/x86_64/hal/paging.c
+++ b/arch/x86_64/hal/paging.c
@@ -42,6 +42,11 @@ paging_pml4_switch(uintptr_t pml4)
__asm__ volatile("movq %0, %%cr3":: "r"(pml4): "memory");
}
+void pagedir_invlpg(uintptr_t vptr)
+{
+ __asm__ volatile("invlpg (%0)":: "r"(vptr));
+}
+
static struct int_stackframe*
s_int_handle_pf_early(struct int_stackframe *frame)
{
@@ -101,6 +106,29 @@ s_pagedir_get_pml1(page_t *pml4, uintptr_t vptr)
return PML_TBL(pml2, pml2i);
}
+uintptr_t *pagedir_get_mapping(jove_owned_obj_t *pagedir, uintptr_t vptr)
+{
+ page_t *pml4 = obj_deref(pagedir);
+ page_t *pml1 = s_pagedir_get_pml1(pml4, vptr);
+ if(!pml1) return 0;
+
+ size_t pml1i = PML1I(vptr);
+ page_t *mapping = &pml1[pml1i];
+ return (uintptr_t*)mapping;
+}
+
+uintptr_t
+pagedir_ident_from_mapping(uintptr_t *mapping)
+{
+ return (((page_t*)mapping)->paddr << 12) | IDENT_VIRT_BASE;
+}
+
+void
+pagedir_mapping_set_present(uintptr_t *mapping, bool present)
+{
+ ((page_t*)mapping)->p = present;
+}
+
int pagedir_map_frame(page_t *pml4,
uintptr_t pptr, uintptr_t vptr,
uintmax_t flg)
@@ -113,7 +141,7 @@ int pagedir_map_frame(page_t *pml4,
if(pml1[pml1i].p) return EEXIST;
pml1[pml1i].value = pptr | PAGE_PRESENT | flg;
- __asm__ volatile("invlpg (%0)":: "r"(vptr): "memory");
+ pagedir_invlpg(vptr);
return 0;
}
@@ -184,7 +212,7 @@ map_table:
PAGE_PRESENT |
(pptr > IDENT_VIRT_BASE ? 0 : PAGE_USER) |
PAGE_WRITEABLE;
- __asm__ volatile("invlpg (%0)":: "r"(vptr): "memory");
+ pagedir_invlpg(vptr);
return 0;
}
@@ -241,7 +269,7 @@ int pagedir_unmap_untyped_frame(
jove_untyped_t *untyped_data = obj_deref(dst);
untyped_data->limit = 0x1000;
- __asm__ volatile("invlpg (%0)":: "r"(vptr): "memory");
+ pagedir_invlpg(vptr);
return 0;
}
@@ -295,7 +323,7 @@ unmap_table:
jove_untyped_t *untyped = obj_deref(dst);
untyped->limit = 0x1000;
- __asm__ volatile("invlpg (%0)":: "r"(vptr): "memory");
+ pagedir_invlpg(vptr);
return 0;
}
}