X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fmmu%2Fvmm_shdw_pg_tlb_64.h;h=38aebe62cd1a60778ff3f0c82deb1f20cad83cdb;hb=a0d3be5212e7a5053ba213ce7bd26c7124cf01e3;hp=011a882b1865f2466e42dc8923889b7bad0fe46d;hpb=1fd0d9b438ed24410346ad7a4a23de70a6ad68ea;p=palacios.git diff --git a/palacios/src/palacios/mmu/vmm_shdw_pg_tlb_64.h b/palacios/src/palacios/mmu/vmm_shdw_pg_tlb_64.h index 011a882..38aebe6 100644 --- a/palacios/src/palacios/mmu/vmm_shdw_pg_tlb_64.h +++ b/palacios/src/palacios/mmu/vmm_shdw_pg_tlb_64.h @@ -338,23 +338,19 @@ static int handle_pde_shadow_pagefault_64(struct guest_info * info, addr_t fault if (shadow_pde_access == PT_ACCESS_NOT_PRESENT) { // Check if we can use large pages and the guest memory is properly aligned // to potentially use a large page - if (info->use_large_pages && guest_pde->large_page) { - // Check underlying physical memory map to see if a large page is viable + + if ((info->use_large_pages == 1) && (guest_pde->large_page == 1)) { addr_t guest_pa = BASE_TO_PAGE_ADDR_2MB(((pde64_2MB_t *)guest_pde)->page_base_addr); - addr_t host_pa; - if (v3_get_max_page_size(info, guest_pa, PAGE_SIZE_2MB) < PAGE_SIZE_2MB) { - PrintDebug("Underlying physical memory map doesn't allow use of a large page.\n"); - // Fallthrough to small pages - } else if ((v3_gpa_to_hpa(info, guest_pa, &host_pa) != 0) - || (v3_compute_page_alignment(host_pa) < PAGE_SIZE_2MB)) { - PrintDebug("Host memory alignment doesn't allow use of a large page.\n"); - // Fallthrough to small pages - } else if (handle_2MB_shadow_pagefault_pde_64(info, fault_addr, error_code, shadow_pde_access, - (pde64_2MB_t *)shadow_pde, (pde64_2MB_t *)guest_pde) == 0) { - return 0; - } else { - PrintError("Error handling large pagefault with large page\n"); - return -1; + uint32_t page_size = v3_get_max_page_size(info, guest_pa, LONG); + + if (page_size == PAGE_SIZE_2MB) { + if (handle_2MB_shadow_pagefault_pde_64(info, fault_addr, error_code, shadow_pde_access, + (pde64_2MB_t *)shadow_pde, (pde64_2MB_t *)guest_pde) == -1) { + PrintError("Error handling large pagefault with large page\n"); + return -1; + } + + return 0; } // Fallthrough to handle the region with small pages } @@ -367,7 +363,6 @@ static int handle_pde_shadow_pagefault_64(struct guest_info * info, addr_t fault shadow_pde->present = 1; shadow_pde->user_page = guest_pde->user_page; - if (guest_pde->large_page == 0) { shadow_pde->writable = guest_pde->writable; } else {