From 858a52c06a4615bd58a6a906333f2ad707d41c0a Mon Sep 17 00:00:00 2001 From: Jon Santmyer Date: Tue, 19 Aug 2025 15:04:04 -0400 Subject: usermode pager --- lib/libjove/arch/x86_64/object/directory.c | 15 +++++ lib/libjove/arch/x86_64/object/pagemap.c | 105 +++++++++++++++++++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 lib/libjove/arch/x86_64/object/directory.c create mode 100644 lib/libjove/arch/x86_64/object/pagemap.c (limited to 'lib/libjove/arch/x86_64/object') diff --git a/lib/libjove/arch/x86_64/object/directory.c b/lib/libjove/arch/x86_64/object/directory.c new file mode 100644 index 0000000..01f57c4 --- /dev/null +++ b/lib/libjove/arch/x86_64/object/directory.c @@ -0,0 +1,15 @@ +#include +#include + +JoveError +_jove_objdir_sync_at_arch(KernelObjectDirectory *dir, uint8_t i, obj_type_t type, KernelObjectTyped **memb) +{ + KernelObjectTyped *dirmemb = NULL; + switch(type) { + case KO_MEMORY_MAPPING: + dirmemb = JOVE_OBJECT_TYPED(_jove_alloc_pagemap(dir, i)); + if(memb) *memb = dirmemb; + break; + } + return EJOVE_OK; +} diff --git a/lib/libjove/arch/x86_64/object/pagemap.c b/lib/libjove/arch/x86_64/object/pagemap.c new file mode 100644 index 0000000..c58d7c6 --- /dev/null +++ b/lib/libjove/arch/x86_64/object/pagemap.c @@ -0,0 +1,105 @@ +#include +#include +#include +#include +#include +#include +#include + +KernelObjectPageMap* +jove_object_as_pagemap(KernelObjectTyped *typed) +{ + if(typed->type == KO_MEMORY_MAPPING) return (KernelObjectPageMap*)typed; + jove_errno = EJOVE_BADOBJ; + return NULL; +} + +void +_jove_alloc_pagemap_inplace( + KernelObjectPageMap *pagemap, + KernelObjectDirectory *dir, + uint8_t memb) +{ + *pagemap = (KernelObjectPageMap) { + .typed = (KernelObjectTyped) { + .parent = dir, + .type = KO_MEMORY_MAPPING, + .membi = memb + }, + }; + dir->children[memb] = JOVE_OBJECT_TYPED(pagemap); +} + +KernelObjectPageMap* +_jove_alloc_pagemap( + KernelObjectDirectory *dir, + uint8_t memb) +{ + if(_jove_alloc == NULL) { + jove_errno = EJOVE_NOALLOC; + return NULL; + } + if(dir->children[memb] != NULL) { + jove_errno = EJOVE_FULL; + return NULL; + } + + KernelObjectPageMap *pagemap = _jove_alloc(sizeof(KernelObjectPageMap)); + if(pagemap == NULL) return NULL; + + _jove_alloc_pagemap_inplace(pagemap, dir, memb); + jove_errno = EJOVE_OK; + return pagemap; +} + +int +jove_pagemap_exists( + KernelObjectPageMap *map, + uint8_t depth, + uint16_t *path + ) +{ + if(!_jove_alloc) { + jove_errno = EJOVE_NOALLOC; + return 0; + } + int kerr = _syscall_invoke_mapping_exists(map, depth, path); + if(kerr == KE_DNE) return 0; + + int jerr = jove_error_from_kerror(kerr); + + if(jerr) { + jove_errno = jerr; + return 0; + } + return 1; +} + +JoveError +jove_pagemap_map( + KernelObjectPageMap *map, + uint8_t depth, + uint16_t *path, + KernelObjectUntyped *untyped) +{ + if(jove_untyped_size(untyped) != 0x1000) { + return EJOVE_BADSIZE; + } + + return jove_error_from_kerror(_syscall_invoke_mapping_map(map, depth, path, untyped)); +} + +JoveError +jove_pagemap_unmap( + KernelObjectPageMap *map, + uint8_t depth, + uint16_t *path, + KernelObjectUntyped *untyped) +{ + JoveError err = jove_error_from_kerror(_syscall_invoke_mapping_unmap(map, depth, path, untyped)); + if(err) return err; + + untyped->alignment = 0x1000; + untyped->bytes = 0x1000; + return EJOVE_OK; +} -- cgit v1.2.1