5 #include <geekos/ktypes.h>
9 * The mem list is TEMPORARY, simply to lock down which pages are assigned to the VM
10 * We will remove it and use the host page allocation mechanism in the future
14 typedef unsigned long addr_t;
17 typedef struct mem_region {
21 struct mem_region * next;
22 struct mem_region * prev;
26 typedef struct vmm_mem_list {
32 // mem_region_t * tail;
38 /* Describes the layout of memory for the guest */
39 /* We use this to build the guest page tables */
41 typedef enum region_type {GUEST, UNMAPPED, SHARED} region_type_t;
44 typedef struct layout_region {
52 struct layout_region * next;
53 struct layout_region * prev;
57 typedef struct vmm_mem_layout {
61 layout_region_t * head;
65 /*** FOR THE LOVE OF GOD WRITE SOME UNIT TESTS FOR THIS THING ***/
67 void init_mem_list(vmm_mem_list_t * list);
68 void free_mem_list(vmm_mem_list_t * list);
70 int add_mem_list_pages(vmm_mem_list_t * list, addr_t addr, uint_t num_pages);
71 int remove_mem_list_pages(vmm_mem_list_t * list, addr_t addr, uint_t num_pages);
73 mem_region_t * get_mem_list_cursor(vmm_mem_list_t * list, addr_t addr);
75 addr_t get_mem_list_addr(vmm_mem_list_t * list, uint_t index);
77 void print_mem_list(vmm_mem_list_t * list);
80 void init_mem_layout(vmm_mem_layout_t * layout);
81 void free_mem_layout(vmm_mem_layout_t * layout);
84 int add_mem_range(vmm_mem_layout_t * layout, layout_region_t * region);
85 int add_shared_mem_range(vmm_mem_layout_t * layout, addr_t start, addr_t end, addr_t host_addr);
86 int add_unmapped_mem_range(vmm_mem_layout_t * layout, addr_t start, addr_t end);
87 int add_guest_mem_range(vmm_mem_layout_t * layout, addr_t start, addr_t end);
90 addr_t get_mem_layout_addr(vmm_mem_layout_t * layout, uint_t index);
91 layout_region_t * get_mem_layout_region(vmm_mem_layout_t * layout, addr_t addr);
93 void print_mem_layout(vmm_mem_layout_t * layout);