#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 #define JOVE_SMHEM_MAXPAGES 0xFFF enum { JOVE_MAPPING_TYPE_UNTYPED = 0, JOVE_MAPPING_TYPE_SHMEM, JOVE_MAPPING_TYPE_MESSAGE }; extern virtaddr_t __syscall_stack_guard; extern virtaddr_t __syscall_stack; extern virtaddr_t __interrupt_stack_guard; extern virtaddr_t __interrupt_stack; extern virtaddr_t *__syscall_stack_mapping; extern virtaddr_t *__interrupt_stack_mapping; 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); int pagedir_new(jove_owned_obj_t *untyped_obj); void pagedir_invlpg(virtaddr_t vptr); virtaddr_t *pagedir_get_mapping( jove_owned_obj_t *pagedir, virtaddr_t vptr); size_t pagedir_mapping_get_pfn(virtaddr_t *mapping); virtaddr_t pagedir_ident_from_mapping(virtaddr_t *mapping); bool pagedir_mapping_is_present(virtaddr_t *mapping); void pagedir_mapping_set_pfn(virtaddr_t *mapping, size_t pfn); void pagedir_mapping_set_present(virtaddr_t *mapping, bool present); void pagedir_mapping_set_writeable(virtaddr_t *mapping, bool rw); void pagedir_mapping_set_user(virtaddr_t *mapping, bool user); void pagedir_mapping_set_type(virtaddr_t *mapping, int type); 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); int shmem_new(jove_owned_obj_t *untyped_obj); #endif