/*
* 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
*/
/**
struct shadow_region * region = get_shadow_region_by_addr(map, 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) ||
+ (region->host_type == SHDW_REGION_UNALLOCATED)) {
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;
struct shadow_region * region = get_shadow_region_by_addr(map, 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) ||
+ (region->host_type == SHDW_REGION_UNALLOCATED)) {
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;
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) ||
+ (region->host_type == SHDW_REGION_UNALLOCATED)) {
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);