summaryrefslogtreecommitdiffstats
path: root/arch/x86_64/hal
diff options
context:
space:
mode:
authorJon Santmyer <jon@jonsantmyer.com>2026-10-03 21:32:29 -0400
committerJon Santmyer <jon@jonsantmyer.com>2026-10-03 21:32:29 -0400
commit465cba0c00bfc5d89bf10ce353b0adf40bdc098d (patch)
tree914fd856946800199e2191dda1659ba9ccd55978 /arch/x86_64/hal
parent153ac5fa0b8c4d178bf7590f0344612c6c3eaa70 (diff)
downloadjove-kernel-465cba0c00bfc5d89bf10ce353b0adf40bdc098d.tar.gz
jove-kernel-465cba0c00bfc5d89bf10ce353b0adf40bdc098d.tar.bz2
jove-kernel-465cba0c00bfc5d89bf10ce353b0adf40bdc098d.zip
unmap message object used for syscalls
Diffstat (limited to 'arch/x86_64/hal')
-rw-r--r--arch/x86_64/hal/obj.c2
-rw-r--r--arch/x86_64/hal/paging.c36
2 files changed, 33 insertions, 5 deletions
diff --git a/arch/x86_64/hal/obj.c b/arch/x86_64/hal/obj.c
index 103b53d..75cb0c0 100644
--- a/arch/x86_64/hal/obj.c
+++ b/arch/x86_64/hal/obj.c
@@ -41,7 +41,7 @@ obj_release(jove_owned_obj_t *obj)
void*
obj_deref(jove_owned_obj_t *obj)
{
- return (void*)(((uintptr_t)obj_getvalue(obj)) | 0xFFFF800000000000ULL);
+ return (void*)(((uintptr_t)obj_getvalue(obj)) | IDENT_VIRT_BASE);
}
uint8_t
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;
}
}