X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Finclude%2Fgeekos%2Fvmm_mem.h;h=75e788cbdde616b91d211c20bcb4726e37524db8;hb=190b2ef9470c23c275754b74745933d973f8c439;hp=f938b3e05d1b4e2f3432aff8a1b22c61fd165490;hpb=b4963a8a43ca9103946f926e062e609e4498c2e2;p=palacios.git diff --git a/palacios/include/geekos/vmm_mem.h b/palacios/include/geekos/vmm_mem.h index f938b3e..75e788c 100644 --- a/palacios/include/geekos/vmm_mem.h +++ b/palacios/include/geekos/vmm_mem.h @@ -5,29 +5,90 @@ #include +typedef unsigned long addr_t; + + typedef struct mem_region { - ullong_t addr; - uint_t numPages; + addr_t addr; + uint_t num_pages; struct mem_region * next; struct mem_region * prev; } mem_region_t; -typedef struct vmm_mem_map { +typedef struct vmm_mem_list { uint_t num_pages; bool long_mode; uint_t num_regions; mem_region_t * head; - mem_region_t * tail; -} vmm_mem_map_t; + // mem_region_t * tail; +} vmm_mem_list_t; + + + +/** Memory layout **/ +/* Describes the layout of memory for the guest */ +/* We use this to build the guest page tables */ + +typedef enum region_type {GUEST, UNMAPPED, SHARED} region_type_t; + + +typedef struct layout_region { + addr_t addr; + uint_t num_pages; + + region_type_t type; + + addr_t host_addr; + + struct layout_region * next; + struct layout_region * prev; +} layout_region_t; + + +typedef struct vmm_mem_layout { + uint_t num_pages; + uint_t num_regions; + + uint_t num_guest_pages; + + layout_region_t * head; +} vmm_mem_layout_t; + + +/*** FOR THE LOVE OF GOD WRITE SOME UNIT TESTS FOR THIS THING ***/ + +void init_mem_list(vmm_mem_list_t * list); +void free_mem_list(vmm_mem_list_t * list); + +int add_mem_list_pages(vmm_mem_list_t * list, addr_t addr, uint_t num_pages); +int remove_mem_list_pages(vmm_mem_list_t * list, addr_t addr, uint_t num_pages); + +mem_region_t * get_mem_list_cursor(vmm_mem_list_t * list, addr_t addr); + +addr_t get_mem_list_addr(vmm_mem_list_t * list, uint_t index); + +void print_mem_list(vmm_mem_list_t * list); + + +void init_mem_layout(vmm_mem_layout_t * layout); +void free_mem_layout(vmm_mem_layout_t * layout); + +layout_region_t * get_layout_cursor(vmm_mem_layout_t * layout, addr_t addr); + +int add_mem_range(vmm_mem_layout_t * layout, layout_region_t * region); +int add_shared_mem_range(vmm_mem_layout_t * layout, addr_t addr, uint_t num_pages, addr_t host_addr); +int add_unmapped_mem_range(vmm_mem_layout_t * layout, addr_t addr, uint_t num_pages); +int add_guest_mem_range(vmm_mem_layout_t * layout, addr_t addr, uint_t num_pages); + + +addr_t get_mem_layout_addr(vmm_mem_layout_t * list, uint_t index); +void print_mem_layout(vmm_mem_layout_t * layout); -void init_mem_map(vmm_mem_map_t * map); -void add_mem_map_pages(vmm_mem_map_t * map, ullong_t addr, uint_t numPages); -int remove_mem_map_pages(vmm_mem_map_t * map, ullong_t addr, uint_t numPages);