#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 ) { 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; }