2 * This file is part of the Palacios Virtual Machine Monitor developed
3 * by the V3VEE Project with funding from the United States National
4 * Science Foundation and the Department of Energy.
6 * The V3VEE Project is a joint project between Northwestern University
7 * and the University of New Mexico. You can find out more at
10 * Copyright (c) 2008, Jack Lange <jarusl@cs.northwestern.edu>
11 * Copyright (c) 2008, The V3VEE Project <http://www.v3vee.org>
12 * All rights reserved.
14 * Author: Jack Lange <jarusl@cs.northwestern.edu>
16 * This is free software. You are permitted to use,
17 * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
28 #include <palacios/vmm_types.h>
30 #include <palacios/vmm_paging.h>
38 Virtual Physical Virtual Physical Virtual Physical
46 // These are the types of physical memory address regions
47 // from the perspective of the guest
48 typedef enum guest_region_type {
50 GUEST_REGION_PHYSICAL_MEMORY,
51 GUEST_REGION_MEMORY_MAPPED_DEVICE} guest_region_type_t;
53 // These are the types of physical memory address regions
54 // from the perspective of the HOST
55 typedef enum host_region_type {
56 HOST_REGION_INVALID, // This region is INVALID (this is a return type, to denote errors)
57 HOST_REGION_HOOK, // This region is mapped as not present (always generate page faults)
58 HOST_REGION_PHYSICAL_MEMORY, // Region is a section of host memory
59 HOST_REGION_MEMORY_MAPPED_DEVICE, // Region is allocated for DMA
60 HOST_REGION_UNALLOCATED, // Region is mapped on demand
61 HOST_REGION_REMOTE, // Region is located on a remote machine
62 HOST_REGION_SWAPPED, // Region is swapped
67 #define shadow_mem_type_t host_region_type_t
69 struct shadow_region {
70 guest_region_type_t guest_type;
74 host_region_type_t host_type;
75 addr_t host_addr; // This either points to a host address mapping,
76 // or a structure holding the map info
78 struct shadow_region *next, *prev;
86 struct shadow_region * head;
90 void init_shadow_region(struct shadow_region * entry,
91 addr_t guest_addr_start,
92 addr_t guest_addr_end,
93 guest_region_type_t guest_region_type,
94 host_region_type_t host_region_type);
97 void init_shadow_region_physical(struct shadow_region * entry,
98 addr_t guest_addr_start,
99 addr_t guest_addr_end,
100 guest_region_type_t guest_region_type,
101 addr_t host_addr_start,
102 host_region_type_t host_region_type);
105 int add_shadow_region_passthrough(struct guest_info * guest_info,
106 addr_t guest_addr_start,
107 addr_t guest_addr_end,
110 void init_shadow_map(struct guest_info * info);
111 void free_shadow_map(struct shadow_map * map);
113 struct shadow_region * get_shadow_region_by_addr(struct shadow_map * map, addr_t guest_addr);
115 struct shadow_region * get_shadow_region_by_index(struct shadow_map * map, uint_t index);
117 host_region_type_t lookup_shadow_map_addr(struct shadow_map * map, addr_t guest_addr, addr_t * host_addr);
119 host_region_type_t get_shadow_addr_type(struct guest_info * info, addr_t guest_addr);
120 addr_t get_shadow_addr(struct guest_info * info, addr_t guest_addr);
123 // Adding a region that overlaps with an existing region results is undefined
124 // and will probably fail
125 int add_shadow_region(struct shadow_map * map, struct shadow_region * entry);
128 // Deletions result in splitting
129 int delete_shadow_region(struct shadow_map * map,
134 void print_shadow_map(struct shadow_map * map);
138 struct vmm_mem_hook {
139 // Called when data is read from a memory page
140 int (*read)(addr_t guest_addr, void * dst, uint_t length, void * priv_data);
142 // Called when data is written to a memory page
143 int (*write)(addr_t guest_addr, void * src, uint_t length, void * priv_data);
146 struct shadow_region * region;
151 struct vmm_mem_hook * get_mem_hook(struct guest_info * info, addr_t guest_addr);
153 int hook_guest_mem(struct guest_info * info, addr_t guest_addr_start, addr_t guest_addr_end,
154 int (*read)(addr_t guest_addr, void * dst, uint_t length, void * priv_data),
155 int (*write)(addr_t guest_addr, void * src, uint_t length, void * priv_data),
157 int unhook_guest_mem(struct guest_info * info, addr_t guest_addr);
162 int handle_special_page_fault(struct guest_info * info, addr_t fault_addr, addr_t gp_addr, pf_error_t access_info);
165 #endif // ! __V3VEE__