X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_shadow_paging_32.h;h=50045e93ddaa2d6554ef14b80348ed2a16292a0b;hb=87bd3921fe6a17138bdba3a41b501a8d620cb48a;hp=28e718efa3c3c66520207cf7129ac7e629d7eaf1;hpb=99681a48f662b5a8371f20b255b3789012d2a9fa;p=palacios.git diff --git a/palacios/src/palacios/vmm_shadow_paging_32.h b/palacios/src/palacios/vmm_shadow_paging_32.h index 28e718e..50045e9 100644 --- a/palacios/src/palacios/vmm_shadow_paging_32.h +++ b/palacios/src/palacios/vmm_shadow_paging_32.h @@ -1,3 +1,22 @@ +/* + * 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 + * Copyright (c) 2008, The V3VEE Project + * All rights reserved. + * + * Author: Jack Lange + * + * 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); @@ -63,11 +82,11 @@ static inline int activate_shadow_pt_32(struct guest_info * info) { 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"); @@ -133,7 +152,8 @@ static inline int handle_shadow_pagefault_32(struct guest_info * info, addr_t fa 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; @@ -207,8 +227,7 @@ static inline int handle_shadow_pagefault_32(struct guest_info * info, addr_t fa } } 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 @@ -239,9 +258,9 @@ static inline int handle_shadow_pagefault_32(struct guest_info * info, addr_t fa 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; @@ -392,9 +411,9 @@ static int handle_shadow_pte32_fault(struct guest_info * info, #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? */ @@ -404,6 +423,7 @@ static int handle_shadow_pte32_fault(struct guest_info * info, inject_guest_pf(info, fault_addr, error_code); return 0; } + if (shadow_pte_access == PT_ACCESS_OK) {