5 #include <geekos/ktypes.h>
8 typedef unsigned long addr_t;
11 typedef struct mem_region {
15 struct mem_region * next;
16 struct mem_region * prev;
20 typedef struct vmm_mem_list {
26 // mem_region_t * tail;
32 /* Describes the layout of memory for the guest */
33 /* We use this to build the guest page tables */
35 typedef enum region_type {GUEST, UNMAPPED, SHARED} region_type_t;
38 typedef struct layout_region {
46 struct layout_region * next;
47 struct layout_region * prev;
51 typedef struct vmm_mem_layout {
55 uint_t num_guest_pages;
57 layout_region_t * head;
61 /*** FOR THE LOVE OF GOD WRITE SOME UNIT TESTS FOR THIS THING ***/
63 void init_mem_list(vmm_mem_list_t * list);
64 void free_mem_list(vmm_mem_list_t * list);
66 int add_mem_list_pages(vmm_mem_list_t * list, addr_t addr, uint_t num_pages);
67 int remove_mem_list_pages(vmm_mem_list_t * list, addr_t addr, uint_t num_pages);
69 mem_region_t * get_mem_list_cursor(vmm_mem_list_t * list, addr_t addr);
71 addr_t get_mem_list_addr(vmm_mem_list_t * list, uint_t index);
73 void print_mem_list(vmm_mem_list_t * list);
76 void init_mem_layout(vmm_mem_layout_t * layout);
77 void free_mem_layout(vmm_mem_layout_t * layout);
79 layout_region_t * get_layout_cursor(vmm_mem_layout_t * layout, addr_t addr);
81 int add_mem_range(vmm_mem_layout_t * layout, layout_region_t * region);
82 int add_shared_mem_range(vmm_mem_layout_t * layout, addr_t addr, uint_t num_pages, addr_t host_addr);
83 int add_unmapped_mem_range(vmm_mem_layout_t * layout, addr_t addr, uint_t num_pages);
84 int add_guest_mem_range(vmm_mem_layout_t * layout, addr_t addr, uint_t num_pages);
87 addr_t get_mem_layout_addr(vmm_mem_layout_t * list, uint_t index);
89 void print_mem_layout(vmm_mem_layout_t * layout);