From 465cba0c00bfc5d89bf10ce353b0adf40bdc098d Mon Sep 17 00:00:00 2001 From: Jon Santmyer Date: Sat, 3 Oct 2026 21:32:29 -0400 Subject: unmap message object used for syscalls --- arch/x86_64/hal/obj.c | 2 +- arch/x86_64/hal/paging.c | 36 ++++++++++++++++++++++++++++++++---- 2 files changed, 33 insertions(+), 5 deletions(-) (limited to 'arch/x86_64/hal') 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; } } -- cgit v1.2.3