+#ifndef DEBUG_SHADOW_PAGING
+#undef PrintDebug
+#define PrintDebug(fmt, args...)
+#endif
+
void delete_page_tables_32(pde32_t * pde) {
/*
* PAGE TABLE LOOKUP FUNCTIONS
*
- *
* The value of entry is a return type:
* Page not present: *entry = 0
- * Large Page: *entry = translated physical address (byte granularity)
- * PTE entry: *entry is the address of the PTE Page
*/
/**
}
pt_access_status_t inline v3_can_access_pde64(pde64_t * pde, addr_t addr, pf_error_t access_type) {
- gen_pt_t * entry = (gen_pt_t *)&pde[PDE32_INDEX(addr)];
+ gen_pt_t * entry = (gen_pt_t *)&pde[PDE64_INDEX(addr)];
return can_access_pt_entry(entry, access_type);
}
pde32_t * create_passthrough_pts_32(struct guest_info * guest_info) {
addr_t current_page_addr = 0;
int i, j;
- struct shadow_map * map = &(guest_info->mem_map);
pde32_t * pde = V3_VAddr(V3_AllocPages(1));
for (j = 0; j < MAX_PTE32_ENTRIES; j++) {
- struct shadow_region * region = get_shadow_region_by_addr(map, current_page_addr);
+ struct v3_shadow_region * region = v3_get_shadow_region(guest_info, current_page_addr);
if (!region ||
- (region->host_type == HOST_REGION_HOOK) ||
- (region->host_type == HOST_REGION_UNALLOCATED) ||
- (region->host_type == HOST_REGION_MEMORY_MAPPED_DEVICE) ||
- (region->host_type == HOST_REGION_REMOTE) ||
- (region->host_type == HOST_REGION_SWAPPED)) {
+ (region->host_type == SHDW_REGION_FULL_HOOK)) {
pte[j].present = 0;
pte[j].writable = 0;
pte[j].user_page = 0;
} else {
addr_t host_addr;
pte[j].present = 1;
- pte[j].writable = 1;
+
+ if (region->host_type == SHDW_REGION_WRITE_HOOK) {
+ pte[j].writable = 0;
+ PrintDebug("Marking Write hook host_addr %p as RO\n", (void *)current_page_addr);
+ } else {
+ pte[j].writable = 1;
+ }
+
pte[j].user_page = 1;
pte[j].write_through = 0;
pte[j].cache_disable = 0;
pdpe32pae_t * create_passthrough_pts_32PAE(struct guest_info * guest_info) {
addr_t current_page_addr = 0;
int i, j, k;
- struct shadow_map * map = &(guest_info->mem_map);
pdpe32pae_t * pdpe = V3_VAddr(V3_AllocPages(1));
memset(pdpe, 0, PAGE_SIZE);
for (k = 0; k < MAX_PTE32PAE_ENTRIES; k++) {
- struct shadow_region * region = get_shadow_region_by_addr(map, current_page_addr);
+ struct v3_shadow_region * region = v3_get_shadow_region(guest_info, current_page_addr);
if (!region ||
- (region->host_type == HOST_REGION_HOOK) ||
- (region->host_type == HOST_REGION_UNALLOCATED) ||
- (region->host_type == HOST_REGION_MEMORY_MAPPED_DEVICE) ||
- (region->host_type == HOST_REGION_REMOTE) ||
- (region->host_type == HOST_REGION_SWAPPED)) {
+ (region->host_type == SHDW_REGION_FULL_HOOK)) {
pte[k].present = 0;
pte[k].writable = 0;
pte[k].user_page = 0;
} else {
addr_t host_addr;
pte[k].present = 1;
- pte[k].writable = 1;
+
+ if (region->host_type == SHDW_REGION_WRITE_HOOK) {
+ pte[k].writable = 0;
+ } else {
+ pte[k].writable = 1;
+ }
+
pte[k].user_page = 1;
pte[k].write_through = 0;
pte[k].cache_disable = 0;
pml4e64_t * create_passthrough_pts_64(struct guest_info * info) {
addr_t current_page_addr = 0;
int i, j, k, m;
- struct shadow_map * map = &(info->mem_map);
pml4e64_t * pml = V3_VAddr(V3_AllocPages(1));
for (m = 0; m < MAX_PTE64_ENTRIES; m++) {
- struct shadow_region * region = get_shadow_region_by_addr(map, current_page_addr);
+ struct v3_shadow_region * region = v3_get_shadow_region(info, current_page_addr);
if (!region ||
- (region->host_type == HOST_REGION_HOOK) ||
- (region->host_type == HOST_REGION_UNALLOCATED) ||
- (region->host_type == HOST_REGION_MEMORY_MAPPED_DEVICE) ||
- (region->host_type == HOST_REGION_REMOTE) ||
- (region->host_type == HOST_REGION_SWAPPED)) {
+ (region->host_type == SHDW_REGION_FULL_HOOK)) {
pte[m].present = 0;
pte[m].writable = 0;
pte[m].user_page = 0;
} else {
addr_t host_addr;
pte[m].present = 1;
- pte[m].writable = 1;
+
+ if (region->host_type == SHDW_REGION_WRITE_HOOK) {
+ pte[m].writable = 0;
+ } else {
+ pte[m].writable = 1;
+ }
+
pte[m].user_page = 1;
pte[m].write_through = 0;
pte[m].cache_disable = 0;
int v3_walk_guest_pt_32(struct guest_info * info, v3_reg_t guest_cr3,
- void (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+ int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
void * private_data) {
addr_t guest_pde_pa = CR3_TO_PDE32_PA(guest_cr3);
pde32_t * guest_pde = NULL;
int v3_walk_guest_pt_32pae(struct guest_info * info, v3_reg_t guest_cr3,
- void (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+ int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
void * private_data) {
addr_t guest_pdpe_pa = CR3_TO_PDPE32PAE_PA(guest_cr3);
pdpe32pae_t * guest_pdpe = NULL;
int v3_walk_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3,
- void (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+ int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
void * private_data) {
addr_t guest_pml_pa = CR3_TO_PML4E64_PA(guest_cr3);
pml4e64_t * guest_pml = NULL;
}
int v3_walk_host_pt_32(v3_reg_t host_cr3,
- void (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+ int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
void * private_data) {
pde32_t * host_pde = (pde32_t *)CR3_TO_PDE32_VA(host_cr3);
addr_t pde_pa = CR3_TO_PDE32_PA(host_cr3);
int v3_walk_host_pt_32pae(v3_reg_t host_cr3,
- void (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+ int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
void * private_data) {
pdpe32pae_t * host_pdpe = (pdpe32pae_t *)CR3_TO_PDPE32PAE_VA(host_cr3);
addr_t pdpe_pa = CR3_TO_PDPE32PAE_PA(host_cr3);
int v3_walk_host_pt_64(v3_reg_t host_cr3,
- void (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
+ int (*callback)(page_type_t type, addr_t vaddr, addr_t page_ptr, addr_t page_pa, void * private_data),
void * private_data) {
pml4e64_t * host_pml = (pml4e64_t *)CR3_TO_PML4E64_VA(host_cr3);
addr_t pml_pa = CR3_TO_PML4E64_PA(host_cr3);