X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fmmu%2Fvmm_shdw_pg_swapbypass_32.h;h=b814e4499d0fdd442983f669465630ccd99ba3a1;hb=774bac9fbb03ef8bf7c2ca2c79a8b87c9bc4c526;hp=1aee15a47d8626d953c7b7b63e1b2c4f35ac796f;hpb=14fa18cc54571eaa7aaa0f7d55677bdb4dad81a6;p=palacios.git diff --git a/palacios/src/palacios/mmu/vmm_shdw_pg_swapbypass_32.h b/palacios/src/palacios/mmu/vmm_shdw_pg_swapbypass_32.h index 1aee15a..b814e44 100644 --- a/palacios/src/palacios/mmu/vmm_shdw_pg_swapbypass_32.h +++ b/palacios/src/palacios/mmu/vmm_shdw_pg_swapbypass_32.h @@ -28,7 +28,7 @@ static inline int activate_shadow_pt_32(struct guest_info * info) { shdw_page->cr3 = shdw_page->page_pa; shadow_cr3->pdt_base_addr = PAGE_BASE_ADDR_4KB(shdw_page->page_pa); - PrintDebug( "Created new shadow page table %p\n", (void *)BASE_TO_PAGE_ADDR(shadow_cr3->pdt_base_addr)); + PrintDebug(info->vm_info, info, "Created new shadow page table %p\n", (void *)BASE_TO_PAGE_ADDR(shadow_cr3->pdt_base_addr)); shadow_cr3->pwt = guest_cr3->pwt; shadow_cr3->pcd = guest_cr3->pcd; @@ -65,11 +65,11 @@ static inline int handle_shadow_pagefault_32(struct guest_info * info, addr_t fa pde32_t * guest_pde = NULL; pde32_t * shadow_pde = (pde32_t *)&(shadow_pd[PDE32_INDEX(fault_addr)]); - PrintDebug("Shadow page fault handler: %p\n", (void*) fault_addr ); - PrintDebug("Handling PDE32 Fault\n"); + PrintDebug(info->vm_info, info, "Shadow page fault handler: %p\n", (void*) fault_addr ); + PrintDebug(info->vm_info, info, "Handling PDE32 Fault\n"); if (v3_gpa_to_hva(info, guest_cr3, (addr_t*)&guest_pd) == -1) { - PrintError("Invalid Guest PDE Address: 0x%p\n", (void *)guest_cr3); + PrintError(info->vm_info, info, "Invalid Guest PDE Address: 0x%p\n", (void *)guest_cr3); return -1; } @@ -84,10 +84,10 @@ static inline int handle_shadow_pagefault_32(struct guest_info * info, addr_t fa /* Was the page fault caused by the Guest's page tables? */ if (v3_is_guest_pf(guest_pde_access, shadow_pde_access) == 1) { - PrintDebug("Injecting PDE pf to guest: (guest access error=%d) (shdw access error=%d) (pf error code=%d)\n", + PrintDebug(info->vm_info, info, "Injecting PDE pf to guest: (guest access error=%d) (shdw access error=%d) (pf error code=%d)\n", *(uint_t *)&guest_pde_access, *(uint_t *)&shadow_pde_access, *(uint_t *)&error_code); if (v3_inject_guest_pf(info, fault_addr, error_code) == -1) { - PrintError("Could not inject guest page fault for vaddr %p\n", (void *)fault_addr); + PrintError(info->vm_info, info, "Could not inject guest page fault for vaddr %p\n", (void *)fault_addr); return -1; } return 0; @@ -99,11 +99,11 @@ static inline int handle_shadow_pagefault_32(struct guest_info * info, addr_t fa // // PDE Entry marked non user // - PrintDebug("Shadow Paging User access error (shadow_pde_access=0x%x, guest_pde_access=0x%x)\n", + PrintDebug(info->vm_info, info, "Shadow Paging User access error (shadow_pde_access=0x%x, guest_pde_access=0x%x)\n", shadow_pde_access, guest_pde_access); if (v3_inject_guest_pf(info, fault_addr, error_code) == -1) { - PrintError("Could not inject guest page fault for vaddr %p\n", (void *)fault_addr); + PrintError(info->vm_info, info, "Could not inject guest page fault for vaddr %p\n", (void *)fault_addr); return -1; } return 0; @@ -117,11 +117,11 @@ static inline int handle_shadow_pagefault_32(struct guest_info * info, addr_t fa (shadow_pde_access != PT_ACCESS_OK)) { // inject page fault in guest if (v3_inject_guest_pf(info, fault_addr, error_code) == -1) { - PrintError("Could not inject guest page fault for vaddr %p\n", (void *)fault_addr); + PrintError(info->vm_info, info, "Could not inject guest page fault for vaddr %p\n", (void *)fault_addr); return -1; } - PrintDebug("Unknown Error occurred (shadow_pde_access=%d)\n", shadow_pde_access); - PrintDebug("Manual Says to inject page fault into guest\n"); + PrintDebug(info->vm_info, info, "Unknown Error occurred (shadow_pde_access=%d)\n", shadow_pde_access); + PrintDebug(info->vm_info, info, "Manual Says to inject page fault into guest\n"); return 0; } @@ -176,18 +176,18 @@ static inline int handle_shadow_pagefault_32(struct guest_info * info, addr_t fa if (guest_pde->large_page == 0) { if (v3_gpa_to_hva(info, BASE_TO_PAGE_ADDR(guest_pde->pt_base_addr), (addr_t*)&guest_pt) == -1) { // Machine check the guest - PrintDebug("Invalid Guest PTE Address: 0x%p\n", (void *)BASE_TO_PAGE_ADDR(guest_pde->pt_base_addr)); + PrintDebug(info->vm_info, info, "Invalid Guest PTE Address: 0x%p\n", (void *)BASE_TO_PAGE_ADDR(guest_pde->pt_base_addr)); v3_raise_exception(info, MC_EXCEPTION); return 0; } if (handle_pte_shadow_pagefault_32(info, fault_addr, error_code, shadow_pt, guest_pt) == -1) { - PrintError("Error handling Page fault caused by PTE\n"); + PrintError(info->vm_info, info, "Error handling Page fault caused by PTE\n"); return -1; } } else { if (handle_4MB_shadow_pagefault_32(info, fault_addr, error_code, shadow_pt, (pde32_4MB_t *)guest_pde) == -1) { - PrintError("Error handling large pagefault\n"); + PrintError(info->vm_info, info, "Error handling large pagefault\n"); return -1; } } @@ -205,11 +205,11 @@ static int handle_pte_shadow_pagefault_32(struct guest_info * info, addr_t fault pte32_t * shadow_pte = (pte32_t *)&(shadow_pt[PTE32_INDEX(fault_addr)]); addr_t guest_pa = BASE_TO_PAGE_ADDR((addr_t)(guest_pte->page_base_addr)) + PAGE_OFFSET(fault_addr); - struct v3_mem_region * shdw_reg = v3_get_mem_region(info->vm_info, info->cpu_id, guest_pa); + struct v3_mem_region * shdw_reg = v3_get_mem_region(info->vm_info, info->vcpu_id, guest_pa); if (shdw_reg == NULL) { // Inject a machine check in the guest - PrintDebug("Invalid Guest Address in page table (0x%p)\n", (void *)guest_pa); + PrintDebug(info->vm_info, info, "Invalid Guest Address in page table (0x%p)\n", (void *)guest_pa); v3_raise_exception(info, MC_EXCEPTION); return 0; } @@ -224,7 +224,7 @@ static int handle_pte_shadow_pagefault_32(struct guest_info * info, addr_t fault /* Was the page fault caused by the Guest's page tables? */ if (v3_is_guest_pf(guest_pte_access, shadow_pte_access) == 1) { - PrintDebug("Access error injecting pf to guest (guest access error=%d) (pf error code=%d)\n", + PrintDebug(info->vm_info, info, "Access error injecting pf to guest (guest access error=%d) (pf error code=%d)\n", guest_pte_access, *(uint_t*)&error_code); @@ -241,7 +241,7 @@ static int handle_pte_shadow_pagefault_32(struct guest_info * info, addr_t fault -#ifdef CONFIG_SYMBIOTIC_SWAP_TELEMETRY +#ifdef V3_CONFIG_SYMBIOTIC_SWAP_TELEMETRY if (error_code.write == 0) { info->vm_info->swap_state.read_faults++; } else { @@ -253,11 +253,11 @@ static int handle_pte_shadow_pagefault_32(struct guest_info * info, addr_t fault swp_pg_addr = get_swapped_pg_addr(info->vm_info, guest_pte); if (swp_pg_addr != 0) { - PrintDebug("Swapped page address=%p\n", (void *)swp_pg_addr); + PrintDebug(info->vm_info, info, "Swapped page address=%p\n", (void *)swp_pg_addr); /* if (info->cpl == 0) { - PrintError("Swapped Page fault in kernel mode.... bad...\n"); + PrintError(info->vm_info, info, "Swapped Page fault in kernel mode.... bad...\n"); goto inject; } */ @@ -265,13 +265,13 @@ static int handle_pte_shadow_pagefault_32(struct guest_info * info, addr_t fault int sym_ret = get_vaddr_perms(info, fault_addr, guest_pte, &swap_perms); if (sym_ret == -1) { - PrintError("Symcall error...\n"); + PrintError(info->vm_info, info, "Symcall error...\n"); return -1; } else if (sym_ret == 0) { if (swap_perms.present == 0) { - PrintError("Nonpresent swapped page\n"); + PrintError(info->vm_info, info, "Nonpresent swapped page\n"); } // swap_perms.write ==1 || error_code.write == 0 @@ -287,7 +287,7 @@ static int handle_pte_shadow_pagefault_32(struct guest_info * info, addr_t fault swp_pg_pa = map_swp_page(info->vm_info, shadow_pte, guest_pte, (void *)swp_pg_addr); - PrintDebug("Page fault on swapped out page (vaddr=%p) (pte=%x) (error_code=%x)\n", + PrintDebug(info->vm_info, info, "Page fault on swapped out page (vaddr=%p) (pte=%x) (error_code=%x)\n", (void *)fault_addr, *(uint32_t *)guest_pte, *(uint32_t *)&error_code); shadow_pte->writable = swap_perms.write; @@ -301,15 +301,15 @@ static int handle_pte_shadow_pagefault_32(struct guest_info * info, addr_t fault shadow_pte->page_base_addr = swp_pg_pa; -#ifdef CONFIG_SYMBIOTIC_SWAP_TELEMETRY +#ifdef V3_CONFIG_SYMBIOTIC_SWAP_TELEMETRY info->vm_info->swap_state.mapped_pages++; #endif - // PrintError("Swap fault handled\n"); + // PrintError(info->vm_info, info, "Swap fault handled\n"); return 0; } } } else { - PrintDebug("Not a sym swappable page\n"); + PrintDebug(info->vm_info, info, "Not a sym swappable page\n"); } } @@ -317,7 +317,7 @@ static int handle_pte_shadow_pagefault_32(struct guest_info * info, addr_t fault // inject: if (v3_inject_guest_pf(info, fault_addr, error_code) == -1) { - PrintError("Could not inject guest page fault for vaddr %p\n", (void *)fault_addr); + PrintError(info->vm_info, info, "Could not inject guest page fault for vaddr %p\n", (void *)fault_addr); return -1; } @@ -329,27 +329,27 @@ static int handle_pte_shadow_pagefault_32(struct guest_info * info, addr_t fault 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"); + PrintDebug(info->vm_info, info, "Inconsistent state... Guest re-entry should flush tlb\n"); return 0; } if (shadow_pte_access == PT_ACCESS_NOT_PRESENT) { // Page Table Entry Not Present - PrintDebug("guest_pa =%p\n", (void *)guest_pa); + PrintDebug(info->vm_info, info, "guest_pa =%p\n", (void *)guest_pa); if ((shdw_reg->flags.alloced == 1) || (shdw_reg->flags.read == 1)) { addr_t shadow_pa = 0; if (v3_gpa_to_hpa(info, guest_pa, &shadow_pa) == -1) { - PrintError("could not translate page fault address (%p)\n", (void *)guest_pa); + PrintError(info->vm_info, info, "could not translate page fault address (%p)\n", (void *)guest_pa); return -1; } shadow_pte->page_base_addr = PAGE_BASE_ADDR(shadow_pa); - PrintDebug("\tMapping shadow page (%p)\n", (void *)BASE_TO_PAGE_ADDR(shadow_pte->page_base_addr)); + PrintDebug(info->vm_info, info, "\tMapping shadow page (%p)\n", (void *)BASE_TO_PAGE_ADDR(shadow_pte->page_base_addr)); shadow_pte->present = guest_pte->present; shadow_pte->user_page = guest_pte->user_page; @@ -380,7 +380,7 @@ static int handle_pte_shadow_pagefault_32(struct guest_info * info, addr_t fault // Page fault handled by hook functions if (shdw_reg->unhandled(info, fault_addr, guest_pa, shdw_reg, error_code) == -1) { - PrintError("Special Page fault handler returned error for address: %p\n", (void *)fault_addr); + PrintError(info->vm_info, info, "Special Page fault handler returned error for address: %p\n", (void *)fault_addr); return -1; } } @@ -389,11 +389,11 @@ static int handle_pte_shadow_pagefault_32(struct guest_info * info, addr_t fault if (shdw_reg->flags.write == 1) { - PrintDebug("Shadow PTE Write Error\n"); + PrintDebug(info->vm_info, info, "Shadow PTE Write Error\n"); shadow_pte->writable = guest_pte->writable; } else { if (shdw_reg->unhandled(info, fault_addr, guest_pa, shdw_reg, error_code) == -1) { - PrintError("Special Page fault handler returned error for address: %p\n", (void *)fault_addr); + PrintError(info->vm_info, info, "Special Page fault handler returned error for address: %p\n", (void *)fault_addr); return -1; } } @@ -404,12 +404,12 @@ static int handle_pte_shadow_pagefault_32(struct guest_info * info, addr_t fault } else { // Inject page fault into the guest if (v3_inject_guest_pf(info, fault_addr, error_code) == -1) { - PrintError("Could not inject guest page fault for vaddr %p\n", (void *)fault_addr); + PrintError(info->vm_info, info, "Could not inject guest page fault for vaddr %p\n", (void *)fault_addr); return -1; } - PrintError("PTE Page fault fell through... Not sure if this should ever happen\n"); - PrintError("Manual Says to inject page fault into guest\n"); + PrintError(info->vm_info, info, "PTE Page fault fell through... Not sure if this should ever happen\n"); + PrintError(info->vm_info, info, "Manual Says to inject page fault into guest\n"); return -1; } @@ -427,15 +427,15 @@ static int handle_4MB_shadow_pagefault_32(struct guest_info * info, addr_t guest_fault_pa = BASE_TO_PAGE_ADDR_4MB(large_guest_pde->page_base_addr) + PAGE_OFFSET_4MB(fault_addr); - PrintDebug("Handling 4MB fault (guest_fault_pa=%p) (error_code=%x)\n", (void *)guest_fault_pa, *(uint_t*)&error_code); - PrintDebug("ShadowPT=%p, LargeGuestPDE=%p\n", shadow_pt, large_guest_pde); + PrintDebug(info->vm_info, info, "Handling 4MB fault (guest_fault_pa=%p) (error_code=%x)\n", (void *)guest_fault_pa, *(uint_t*)&error_code); + PrintDebug(info->vm_info, info, "ShadowPT=%p, LargeGuestPDE=%p\n", shadow_pt, large_guest_pde); - struct v3_mem_region * shdw_reg = v3_get_mem_region(info->vm_info, info->cpu_id, guest_fault_pa); + struct v3_mem_region * shdw_reg = v3_get_mem_region(info->vm_info, info->vcpu_id, guest_fault_pa); if (shdw_reg == NULL) { // Inject a machine check in the guest - PrintDebug("Invalid Guest Address in page table (0x%p)\n", (void *)guest_fault_pa); + PrintDebug(info->vm_info, info, "Invalid Guest Address in page table (0x%p)\n", (void *)guest_fault_pa); v3_raise_exception(info, MC_EXCEPTION); return -1; } @@ -443,7 +443,7 @@ static int handle_4MB_shadow_pagefault_32(struct guest_info * info, if (shadow_pte_access == PT_ACCESS_OK) { // Inconsistent state... // Guest Re-Entry will flush tables and everything should now workd - PrintDebug("Inconsistent state... Guest re-entry should flush tlb\n"); + PrintDebug(info->vm_info, info, "Inconsistent state... Guest re-entry should flush tlb\n"); return 0; } @@ -456,12 +456,12 @@ static int handle_4MB_shadow_pagefault_32(struct guest_info * info, addr_t shadow_pa = 0; if (v3_gpa_to_hpa(info, guest_fault_pa, &shadow_pa) == -1) { - PrintError("could not translate page fault address (%p)\n", (void *)guest_fault_pa); + PrintError(info->vm_info, info, "could not translate page fault address (%p)\n", (void *)guest_fault_pa); return -1; } shadow_pte->page_base_addr = PAGE_BASE_ADDR(shadow_pa); - PrintDebug("\tMapping shadow page (%p)\n", (void *)BASE_TO_PAGE_ADDR(shadow_pte->page_base_addr)); + PrintDebug(info->vm_info, info, "\tMapping shadow page (%p)\n", (void *)BASE_TO_PAGE_ADDR(shadow_pte->page_base_addr)); shadow_pte->present = 1; @@ -486,22 +486,22 @@ static int handle_4MB_shadow_pagefault_32(struct guest_info * info, } else { if (shdw_reg->unhandled(info, fault_addr, guest_fault_pa, shdw_reg, error_code) == -1) { - PrintError("Special Page Fault handler returned error for address: %p\n", (void *)fault_addr); + PrintError(info->vm_info, info, "Special Page Fault handler returned error for address: %p\n", (void *)fault_addr); return -1; } } } else if (shadow_pte_access == PT_ACCESS_WRITE_ERROR) { if (shdw_reg->unhandled(info, fault_addr, guest_fault_pa, shdw_reg, error_code) == -1) { - PrintError("Special Page Fault handler returned error for address: %p\n", (void *)fault_addr); + PrintError(info->vm_info, info, "Special Page Fault handler returned error for address: %p\n", (void *)fault_addr); return -1; } } else { - PrintError("Error in large page fault handler...\n"); - PrintError("This case should have been handled at the top level handler\n"); + PrintError(info->vm_info, info, "Error in large page fault handler...\n"); + PrintError(info->vm_info, info, "This case should have been handled at the top level handler\n"); return -1; } - PrintDebug("Returning from large page fault handler\n"); + PrintDebug(info->vm_info, info, "Returning from large page fault handler\n"); return 0; } @@ -526,7 +526,7 @@ static inline int handle_shadow_invlpg_32(struct guest_info * info, addr_t vaddr pde32_t * guest_pde; if (v3_gpa_to_hva(info, guest_cr3, (addr_t*)&guest_pd) == -1) { - PrintError("Invalid Guest PDE Address: 0x%p\n", (void *)guest_cr3); + PrintError(info->vm_info, info, "Invalid Guest PDE Address: 0x%p\n", (void *)guest_cr3); return -1; } @@ -534,12 +534,12 @@ static inline int handle_shadow_invlpg_32(struct guest_info * info, addr_t vaddr if (guest_pde->large_page == 1) { shadow_pde->present = 0; - PrintDebug("Invalidating Large Page\n"); + PrintDebug(info->vm_info, info, "Invalidating Large Page\n"); } else if (shadow_pde->present == 1) { pte32_t * shadow_pt = (pte32_t *)(addr_t)BASE_TO_PAGE_ADDR_4KB(shadow_pde->pt_base_addr); pte32_t * shadow_pte = (pte32_t *) V3_VAddr( (void*) &shadow_pt[PTE32_INDEX(vaddr)] ); - PrintDebug("Setting not present\n"); + PrintDebug(info->vm_info, info, "Setting not present\n"); shadow_pte->present = 0; }