#ifndef _JOVE_HAL_MEMORY_H #define _JOVE_HAL_MEMORY_H 1 #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 { size_t limit; } jove_untyped_t; #define JOVE_UNTYPED_MINSIZE 0x10 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); 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); void pagedir_invlpg(virtaddr_t vptr); virtaddr_t *pagedir_get_mapping( jove_owned_obj_t *pagedir, virtaddr_t vptr); 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, virtaddr_t vptr, struct syscall_pagedir_flags flg); int pagedir_map_untyped_table( jove_owned_obj_t *tgt, jove_perm_obj_t *untyped_obj, virtaddr_t vptr); int pagedir_map_shmem_frame( jove_owned_obj_t *tgt, jove_perm_obj_t *shmem_obj, uint8_t page_offset, 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); int pagedir_unmap_untyped_table( jove_owned_obj_t *tgt, jove_owned_obj_t *dst, uintptr_t vptr); int pagedir_unmap_shmem_frame( jove_owned_obj_t *tgt, uintptr_t vptr); #endif