X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_ctrl_regs.c;h=f56c5a62851ed463ea9bea133bb8f89429172e0e;hb=refs%2Ftags%2F1.0;hp=a6301dbfa7cbc65625521222cc701cf20f24b4c8;hpb=bba3c2474e4c2bffe6b8c34d888700f4793cc7af;p=palacios.git diff --git a/palacios/src/palacios/vmm_ctrl_regs.c b/palacios/src/palacios/vmm_ctrl_regs.c index a6301db..f56c5a6 100644 --- a/palacios/src/palacios/vmm_ctrl_regs.c +++ b/palacios/src/palacios/vmm_ctrl_regs.c @@ -120,7 +120,7 @@ int v3_handle_cr0_write(struct guest_info * info) { if (v3_get_mem_mode(info) == VIRTUAL_MEM) { struct cr3_32 * shadow_cr3 = (struct cr3_32 *)&(info->shdw_pg_state.shadow_cr3); - + PrintDebug("Setting up Shadow Page Table\n"); info->ctrl_regs.cr3 = *(addr_t*)shadow_cr3; } else { info->ctrl_regs.cr3 = *(addr_t*)&(info->direct_map_pt); @@ -261,25 +261,34 @@ int v3_handle_cr3_write(struct guest_info * info) { *(uint_t*)shadow_cr3, *(uint_t*)guest_cr3); - cached = v3_cache_page_tables32(info, (addr_t)V3_PAddr((void *)(addr_t)CR3_TO_PDE32((void *)*(addr_t *)new_cr3))); + cached = v3_cache_page_tables32(info, (addr_t)V3_PAddr((void *)(addr_t)CR3_TO_PDE32((void *)*(addr_t *)new_cr3))); + if (cached == -1) { PrintError("CR3 Cache failed\n"); return -1; } else if (cached == 0) { addr_t shadow_pt; - PrintDebug("New CR3 is different - flushing shadow page table\n"); + if( info->mem_mode == VIRTUAL_MEM ) + { + PrintDebug("New CR3 is different - flushing shadow page table %p\n", shadow_cr3 ); - delete_page_tables_pde32((pde32_t *)CR3_TO_PDE32(*(uint_t*)shadow_cr3)); + delete_page_tables_pde32((pde32_t *)CR3_TO_PDE32(*(uint_t*)shadow_cr3)); + } shadow_pt = v3_create_new_shadow_pt32(); shadow_cr3->pdt_base_addr = (addr_t)V3_PAddr((void *)(addr_t)PD32_BASE_ADDR(shadow_pt)); + PrintDebug( "Created new shadow page table %p\n", shadow_cr3->pdt_base_addr ); + //PrintDebugPageTables( (pde32_t *)CR3_TO_PDE32(*(uint_t*)shadow_cr3) ); + + } else { PrintDebug("Reusing cached shadow Page table\n"); } + shadow_cr3->pwt = new_cr3->pwt; shadow_cr3->pcd = new_cr3->pcd;