5 #include <geekos/ktypes.h>
7 typedef ulong_t addr_t;
12 Virtual Physical Virtual Physical Virtual Physical
20 // These are the types of physical memory address regions
21 // from the perspective of the guest
22 typedef enum guest_region_type {
23 GUEST_REGION_PHYSICAL_MEMORY,
25 GUEST_REGION_MEMORY_MAPPED_DEVICE} guest_region_type_t;
27 // These are the types of physical memory address regions
28 // from the perspective of the HOST
29 typedef enum host_region_type {
30 HOST_REGION_PHYSICAL_MEMORY,
31 HOST_REGION_UNALLOCATED,
33 HOST_REGION_MEMORY_MAPPED_DEVICE,
40 typedef struct shadow_region {
41 guest_region_type_t guest_type;
45 host_region_type_t host_type;
47 struct physical_addr {
50 // Other addresses, like on disk, etc, would go here
52 struct shadow_region *next, *prev;
57 typedef struct shadow_map {
60 shadow_region_t * head;
64 void init_shadow_region(shadow_region_t * entry,
65 addr_t guest_addr_start,
66 addr_t guest_addr_end,
67 guest_region_type_t guest_region_type,
68 host_region_type_t host_region_type);
70 void init_shadow_region_physical(shadow_region_t * entry,
71 addr_t guest_addr_start,
72 addr_t guest_addr_end,
73 guest_region_type_t guest_region_type,
74 addr_t host_addr_start,
75 host_region_type_t host_region_type);
77 void init_shadow_map(shadow_map_t * map);
78 void free_shadow_map(shadow_map_t * map);
80 shadow_region_t * get_shadow_region_by_addr(shadow_map_t * map, addr_t guest_addr);
82 shadow_region_t * get_shadow_region_by_index(shadow_map_t * map, uint_t index);
84 int guest_paddr_to_host_paddr(shadow_region_t * entry,
90 // Adding a region that overlaps with an existing region results is undefined
91 // and will probably fail
92 int add_shadow_region(shadow_map_t * map, shadow_region_t * entry);
95 // Deletions result in splitting
96 int delete_shadow_region(shadow_map_t * map,
101 void print_shadow_map(shadow_map_t * map);