X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_paging.c;h=271ee3faae9a8891e9796fa9e1aec15c2be1a66e;hb=dc450df7818a872a3e8a3725ec97bdc273756b06;hp=7200b954503def40ebf13e9331f6d38b6f43bcd7;hpb=7f5fe648423f83c0883d6daa3f15751f9e74daf0;p=palacios.releases.git diff --git a/palacios/src/palacios/vmm_paging.c b/palacios/src/palacios/vmm_paging.c index 7200b95..271ee3f 100644 --- a/palacios/src/palacios/vmm_paging.c +++ b/palacios/src/palacios/vmm_paging.c @@ -46,6 +46,11 @@ static pt_entry_type_t pte64_lookup(pte64_t * pt, addr_t addr, addr_t * entry); +#ifndef DEBUG_SHADOW_PAGING +#undef PrintDebug +#define PrintDebug(fmt, args...) +#endif + void delete_page_tables_32(pde32_t * pde) { @@ -414,11 +419,8 @@ int v3_check_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, addr_t va /* * 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 */ /** @@ -680,11 +682,8 @@ pde32_t * create_passthrough_pts_32(struct guest_info * guest_info) { 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; @@ -699,7 +698,14 @@ pde32_t * create_passthrough_pts_32(struct guest_info * guest_info) { } 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; @@ -784,11 +790,8 @@ pdpe32pae_t * create_passthrough_pts_32PAE(struct guest_info * guest_info) { 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; @@ -804,7 +807,13 @@ pdpe32pae_t * create_passthrough_pts_32PAE(struct guest_info * guest_info) { } 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; @@ -926,11 +935,8 @@ pml4e64_t * create_passthrough_pts_64(struct guest_info * info) { 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; @@ -945,7 +951,13 @@ pml4e64_t * create_passthrough_pts_64(struct guest_info * info) { } 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; @@ -1564,7 +1576,7 @@ int v3_drill_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, addr_t va 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; @@ -1640,7 +1652,7 @@ int v3_walk_guest_pt_32(struct guest_info * info, v3_reg_t guest_cr3, 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; @@ -1737,7 +1749,7 @@ int v3_walk_guest_pt_32pae(struct guest_info * info, v3_reg_t guest_cr3, 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; @@ -1865,7 +1877,7 @@ int v3_walk_guest_pt_64(struct guest_info * info, v3_reg_t guest_cr3, } 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); @@ -1915,7 +1927,7 @@ int v3_walk_host_pt_32(v3_reg_t 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); @@ -1974,7 +1986,7 @@ int v3_walk_host_pt_32pae(v3_reg_t 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);