5 #include <geekos/ktypes.h>
10 typedef struct mem_region {
14 struct mem_region * next;
15 struct mem_region * prev;
19 typedef struct vmm_mem_list {
25 // mem_region_t * tail;
31 /* Describes the layout of memory for the guest */
32 /* We use this to build the guest page tables */
34 typedef enum region_type {GUEST, UNMAPPED, SHARED} region_type_t;
37 typedef struct layout_region {
45 struct layout_region * next;
46 struct layout_region * prev;
52 typedef struct vmm_mem_layout {
56 layout_region_t * head;
57 //layout_region_t * tail;
62 /*** FOR THE LOVE OF GOD WRITE SOME UNIT TESTS FOR THIS THING ***/
64 void init_mem_list(vmm_mem_list_t * list);
65 void free_mem_list(vmm_mem_list_t * list);
67 int add_mem_list_pages(vmm_mem_list_t * list, ullong_t addr, uint_t num_pages);
68 int remove_mem_list_pages(vmm_mem_list_t * list, ullong_t addr, uint_t num_pages);
70 mem_region_t * get_mem_list_cursor(vmm_mem_list_t * list, ullong_t addr);
74 void init_mem_laout(vmm_mem_layout_t * layout);
75 void free_mem_layout(vmm_mem_layout_t * layout);
77 layout_region_t * get_layout_cursor(vmm_mem_layout_t * layout, ullong_t addr);
79 int add_mem_range(vmm_mem_layout_t * layout, layout_region_t * region);
80 int add_shared_mem_range(vmm_mem_layout_t * layout, ullong_t addr, uint_t num_pages, ullong_t host_addr);
81 int add_unmapped_mem_range(vmm_mem_layout_t * layout, ullong_t addr, uint_t num_pages);
82 int add_guest_mem_range(vmm_mem_layout_t * layout, ullong_t addr, uint_t num_pages);