+/*
+ * This file is part of the Palacios Virtual Machine Monitor developed
+ * by the V3VEE Project with funding from the United States National
+ * Science Foundation and the Department of Energy.
+ *
+ * The V3VEE Project is a joint project between Northwestern University
+ * and the University of New Mexico. You can find out more at
+ * http://www.v3vee.org
+ *
+ * Copyright (c) 2008, Jack Lange <jarusl@cs.northwestern.edu>
+ * Copyright (c) 2008, The V3VEE Project <http://www.v3vee.org>
+ * All rights reserved.
+ *
+ * Author: Jack Lange <jarusl@cs.northwestern.edu>
+ *
+ * This is free software. You are permitted to use,
+ * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
+ */
+
static int cache_page_tables_32(struct guest_info * info, addr_t pde) {
struct shadow_page_state * state = &(info->shdw_pg_state);
PrintError("CR3 Cache failed\n");
return -1;
} else if (cached == 0) {
- addr_t shadow_pt;
-
- shadow_pt = create_new_shadow_pt(info);
+ struct shadow_page_data * shdw_page = create_new_shadow_pt(info);
+
+ shdw_page->cr3 = shdw_page->page_pa;
- shadow_cr3->pdt_base_addr = (addr_t)V3_PAddr((void *)(addr_t)PAGE_BASE_ADDR(shadow_pt));
+ shadow_cr3->pdt_base_addr = PAGE_BASE_ADDR(shdw_page->page_pa);
PrintDebug( "Created new shadow page table %p\n", (void *)BASE_TO_PAGE_ADDR(shadow_cr3->pdt_base_addr));
} else {
PrintDebug("Reusing cached shadow Page table\n");
if (shadow_pde_access == PT_ACCESS_NOT_PRESENT)
{
- pte32_t * shadow_pt = (pte32_t *)create_new_shadow_pt(info);
+ struct shadow_page_data * shdw_page = create_new_shadow_pt(info);
+ pte32_t * shadow_pt = (pte32_t *)V3_VAddr((void *)shdw_page->page_pa);
shadow_pde->present = 1;
shadow_pde->user_page = guest_pde->user_page;
}
}
else if ((shadow_pde_access == PT_ACCESS_WRITE_ERROR) &&
- (guest_pde->large_page == 1) &&
- (((pde32_4MB_t *)guest_pde)->dirty == 0))
+ (guest_pde->large_page == 1))
{
//
// Page Directory Entry marked read-only
PrintDebug("Manual Says to inject page fault into guest\n");
#ifdef DEBUG_SHADOW_PAGING
PrintDebug("Guest PDE: (access=%d)\n\t", guest_pde_access);
- PrintPTEntry(PAGE_PD32, fault_addr, guest_pde);
+ PrintPTEntry(info, PAGE_PD32, fault_addr, guest_pde);
PrintDebug("Shadow PDE: (access=%d)\n\t", shadow_pde_access);
- PrintPTEntry(PAGE_PD32, fault_addr, shadow_pde);
+ PrintPTEntry(info, PAGE_PD32, fault_addr, shadow_pde);
#endif
return 0;
#ifdef DEBUG_SHADOW_PAGING
PrintDebug("Guest PTE: (access=%d)\n\t", guest_pte_access);
- PrintPTEntry(PAGE_PT32, fault_addr, guest_pte);
+ PrintPTEntry(info, PAGE_PT32, fault_addr, guest_pte);
PrintDebug("Shadow PTE: (access=%d)\n\t", shadow_pte_access);
- PrintPTEntry(PAGE_PT32, fault_addr, shadow_pte);
+ PrintPTEntry(info, PAGE_PT32, fault_addr, shadow_pte);
#endif
/* Was the page fault caused by the Guest's page tables? */
inject_guest_pf(info, fault_addr, error_code);
return 0;
}
+
if (shadow_pte_access == PT_ACCESS_OK) {