X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_shadow_paging.c;h=39a024c1ce4fae1293ae10a8bacfd194de2e37d9;hb=858a36782662b04562c0d83db75e11cb55e8b91b;hp=142f41d3f0f4e7188007e63121c013c601374f90;hpb=b527f44a71d32952d7b129a7ce5dbeb3969fb8d2;p=palacios.git diff --git a/palacios/src/palacios/vmm_shadow_paging.c b/palacios/src/palacios/vmm_shadow_paging.c index 142f41d..39a024c 100644 --- a/palacios/src/palacios/vmm_shadow_paging.c +++ b/palacios/src/palacios/vmm_shadow_paging.c @@ -3,7 +3,7 @@ #include #include -#include +#include @@ -19,23 +19,25 @@ int init_shadow_page_state(struct shadow_page_state * state) { int handle_shadow_pagefault(struct guest_info * info, addr_t fault_addr, pf_error_t error_code) { - switch (info->cpu_mode) { - case PROTECTED_PG: - return handle_shadow_pagefault32(info, fault_addr, error_code); - break; - case PROTECTED_PAE_PG: - case LONG_PG: - // currently not handled - return -1; - break; - case REAL: - case PROTECTED: - case PROTECTED_PAE: - case LONG: + if (info->mem_mode == PHYSICAL_MEM) { // If paging is not turned on we need to handle the special cases return handle_special_page_fault(info, fault_addr, error_code); - break; - default: + } else if (info->mem_mode == VIRTUAL_MEM) { + + switch (info->cpu_mode) { + case PROTECTED: + return handle_shadow_pagefault32(info, fault_addr, error_code); + break; + case PROTECTED_PAE: + case LONG: + // currently not handled + return -1; + break; + default: + return -1; + } + } else { + PrintDebug("Invalid Memory mode\n"); return -1; } } @@ -67,9 +69,14 @@ int handle_shadow_pagefault32(struct guest_info * info, addr_t fault_addr, pf_er info->ctrl_regs.cr2 = fault_addr; raise_exception_with_error(info, PF_EXCEPTION, *(uint_t *)&error_code); + PrintDebug("Injecting PDE pf to guest\n"); return 0; } + + // Check that the Guest PDE entry points to valid memory + // else Machine Check the guest + shadow_pde_access = can_access_pde32(shadow_pde, fault_addr, error_code); @@ -100,6 +107,10 @@ int handle_shadow_pagefault32(struct guest_info * info, addr_t fault_addr, pf_er * Check the Intel manual because we are ignoring Large Page issues here * Also be wary of hooked pages */ + + PrintDebug("Large PAge!!!\n"); + return -1; + } } else if (shadow_pde_access == PT_WRITE_ERROR) { @@ -151,8 +162,8 @@ int handle_shadow_pagefault32(struct guest_info * info, addr_t fault_addr, pf_er return -1; } - PrintDebugPageTables(shadow_pde); - + //PrintDebugPageTables(shadow_pde); + PrintDebug("Returning end of PDE function\n"); return 0; } @@ -183,6 +194,7 @@ int handle_shadow_pte32_fault(struct guest_info * info, info->ctrl_regs.cr2 = fault_addr; raise_exception_with_error(info, PF_EXCEPTION, *(uint_t *)&error_code); + PrintDebug("Access error injecting pf to guest\n"); return 0; } @@ -192,6 +204,7 @@ int handle_shadow_pte32_fault(struct guest_info * info, if (shadow_pte_access == PT_ACCESS_OK) { // Inconsistent state... // Guest Re-Entry will flush page tables and everything should now work + PrintDebug("Inconsistent state... Guest re-entry should flush tlb\n"); return 0; } else if (shadow_pte_access == PT_ENTRY_NOT_PRESENT) { addr_t shadow_pa; @@ -247,6 +260,8 @@ int handle_shadow_pte32_fault(struct guest_info * info, guest_pte_entry->dirty = 1; shadow_pte_entry->writable = guest_pte_entry->writable; + PrintDebug("Shadow PTE Write Error\n"); + return 0; } else { // Inject page fault into the guest @@ -259,6 +274,7 @@ int handle_shadow_pte32_fault(struct guest_info * info, return -1; } + PrintDebug("Returning end of function\n"); return 0; } @@ -277,7 +293,15 @@ addr_t create_new_shadow_pt32(struct guest_info * info) { /* Currently Does not work with Segmentation!!! */ int handle_shadow_invlpg(struct guest_info * info) { - if (info->cpu_mode == PROTECTED_PG) { + if (info->mem_mode != VIRTUAL_MEM) { + // Paging must be turned on... + // should handle with some sort of fault I think + PrintDebug("ERROR: INVLPG called in non paged mode\n"); + return -1; + } + + + if (info->cpu_mode == PROTECTED) { char instr[15]; int ret; int index = 0; @@ -334,7 +358,7 @@ int handle_shadow_invlpg(struct guest_info * info) { PrintDebug("invalid Instruction Opcode\n"); PrintTraceMemDump(instr, 15); return -1; - } + } } return 0;