diff options
Diffstat (limited to 'hal/memory.h')
| -rw-r--r-- | hal/memory.h | 55 |
1 files changed, 44 insertions, 11 deletions
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 <stdbool.h> +#include <stdatomic.h> + +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); |
