diff options
| author | Jon Santmyer <jon@jonsantmyer.com> | 2026-10-03 21:32:29 -0400 |
|---|---|---|
| committer | Jon Santmyer <jon@jonsantmyer.com> | 2026-10-03 21:32:29 -0400 |
| commit | 465cba0c00bfc5d89bf10ce353b0adf40bdc098d (patch) | |
| tree | 914fd856946800199e2191dda1659ba9ccd55978 /arch/x86_64/hal/paging.c | |
| parent | 153ac5fa0b8c4d178bf7590f0344612c6c3eaa70 (diff) | |
| download | jove-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/paging.c')
| -rw-r--r-- | arch/x86_64/hal/paging.c | 36 |
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; } } |
