From 434ddcd907832b1febc7d70e4faa52109c7eb3bd Mon Sep 17 00:00:00 2001 From: Jon Santmyer Date: Wed, 7 Oct 2026 17:37:26 -0400 Subject: add memory region object for better memory managment --- hal/memory.h | 55 ++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 44 insertions(+), 11 deletions(-) (limited to 'hal/memory.h') diff --git a/hal/memory.h b/hal/memory.h index ab5f6ad..84cb7f2 100644 --- a/hal/memory.h +++ b/hal/memory.h @@ -4,7 +4,27 @@ #include "hal/obj.h" #include "api/syscall.h" #include "sys/syscall.h" +#include "lib/bitmap.h" #include +#include + +typedef uintptr_t physaddr_t; +typedef uintptr_t virtaddr_t; +typedef unsigned short shmem_off_t; + +/**Represents a region of alloc-able memory. + * */ +typedef struct jove_memory_region +{ + struct jove_memory_region *next; + struct jove_memory_region *prev; + atomic_flag lock; + bool toplevel; + struct bitmap bitmap; +} jove_region_t; + +#define JOVE_REGION_GRANULARITY BITMAP_BLOCK_BITS +#define JOVE_REGION_OVERHEAD(pages) (sizeof(jove_region_t) + ((pages) + JOVE_REGION_GRANULARITY-1) / JOVE_REGION_GRANULARITY) typedef struct jove_obj_untyped { @@ -13,34 +33,47 @@ typedef struct jove_obj_untyped #define JOVE_UNTYPED_MINSIZE 0x10 -void mem_setup_untyped(void); +void mem_setup_regions(void); + +physaddr_t phys_fromvirt(virtaddr_t virt); +void *phys_tovirt(physaddr_t phys); + +jove_region_t *region_from_addr(physaddr_t addr); +jove_region_t *region_data(jove_owned_obj_t *region_obj); +physaddr_t region_base(jove_owned_obj_t *region_obj); +unsigned int region_pages(jove_owned_obj_t *region_obj); +unsigned int region_freepages(jove_owned_obj_t *region_obj); + +void region_new(jove_owned_obj_t *dest_obj, physaddr_t base, size_t pages); +int region_split(jove_owned_obj_t *source_obj, jove_owned_obj_t *dest_obj, size_t pages); +int region_release(jove_owned_obj_t *region_obj); -void *phys_tovirt(uintptr_t phys); +int region_alloc(jove_owned_obj_t *region_obj, jove_owned_obj_t *dest_obj); +int region_alloc_contig(jove_owned_obj_t *region_obj, jove_owned_obj_t *dest_obj, size_t pages); uintptr_t untyped_address(jove_owned_obj_t *tgt); size_t untyped_size(jove_owned_obj_t *tgt); int untyped_split(jove_owned_obj_t *tgt, jove_owned_obj_t *dst, size_t bytes); int untyped_merge(jove_owned_obj_t *a, jove_owned_obj_t *b); -int untyped_retype(jove_owned_obj_t *tgt, uint8_t newtype); -void pagedir_invlpg(uintptr_t vptr); +void pagedir_invlpg(virtaddr_t vptr); -uintptr_t *pagedir_get_mapping( - jove_owned_obj_t *pagedir, uintptr_t vptr); +virtaddr_t *pagedir_get_mapping( + jove_owned_obj_t *pagedir, virtaddr_t vptr); -uintptr_t pagedir_ident_from_mapping(uintptr_t *mapping); -void pagedir_mapping_set_present(uintptr_t *mapping, bool present); +virtaddr_t pagedir_ident_from_mapping(virtaddr_t *mapping); +void pagedir_mapping_set_present(virtaddr_t *mapping, bool present); int pagedir_map_untyped_frame( jove_owned_obj_t *tgt, jove_perm_obj_t *untyped_obj, - uintptr_t vptr, struct syscall_pagedir_flags flg); + virtaddr_t vptr, struct syscall_pagedir_flags flg); int pagedir_map_untyped_table( jove_owned_obj_t *tgt, jove_perm_obj_t *untyped_obj, - uintptr_t vptr); + virtaddr_t vptr); int pagedir_map_shmem_frame( jove_owned_obj_t *tgt, jove_perm_obj_t *shmem_obj, uint8_t page_offset, - uintptr_t vptr, struct syscall_pagedir_flags flg); + virtaddr_t vptr, struct syscall_pagedir_flags flg); int pagedir_unmap_untyped_frame( jove_owned_obj_t *tgt, jove_owned_obj_t *dst, uintptr_t vptr); -- cgit v1.2.3