#include <palacios/vmm.h>
#include <palacios/vm_guest_mem.h>
-#include <palacios/vmm_emulate.h>
+#include <palacios/vmm_decoder.h>
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;
}
}
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 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) {
return -1;
}
- PrintDebugPageTables(shadow_pde);
-
+ //PrintDebugPageTables(shadow_pde);
+ PrintDebug("Returning end of PDE function\n");
return 0;
}
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;
}
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;
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
return -1;
}
+ PrintDebug("Returning end of function\n");
return 0;
}
/* 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;
PrintDebug("invalid Instruction Opcode\n");
PrintTraceMemDump(instr, 15);
return -1;
- }
+ }
}
return 0;