X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvm_guest_mem.c;h=0fc0e40bacc495d7e90c32facfd75187e0b25788;hb=858a36782662b04562c0d83db75e11cb55e8b91b;hp=7b98d83d6969ad3aba79255074383b96862657bb;hpb=639fdba00d36b2a60fad3d28703459354cf8744f;p=palacios.releases.git diff --git a/palacios/src/palacios/vm_guest_mem.c b/palacios/src/palacios/vm_guest_mem.c index 7b98d83..0fc0e40 100644 --- a/palacios/src/palacios/vm_guest_mem.c +++ b/palacios/src/palacios/vm_guest_mem.c @@ -115,21 +115,24 @@ int guest_pa_to_host_va(struct guest_info * guest_info, addr_t guest_pa, addr_t int guest_va_to_guest_pa(struct guest_info * guest_info, addr_t guest_va, addr_t * guest_pa) { - if (guest_info->page_mode == SHADOW_PAGING) { - switch (guest_info->cpu_mode) { - case REAL: - case PROTECTED: - case LONG: - case PROTECTED_PAE: + if (guest_info->shdw_pg_mode == SHADOW_PAGING) { + if (guest_info->mem_mode == PHYSICAL_MEM) { // guest virtual address is the same as the physical *guest_pa = guest_va; return 0; - case PROTECTED_PG: + } + + + + // Guest Is in Paged mode + switch (guest_info->cpu_mode) { + case PROTECTED: { addr_t tmp_pa = 0; pde32_t * pde = 0; addr_t guest_pde = CR3_TO_PDE32(guest_info->shdw_pg_state.guest_cr3); + if (guest_pa_to_host_va(guest_info, guest_pde, (addr_t *)&pde) == -1) { PrintDebug("In GVA->GPA: Invalid GPA(%x)->HVA PDE32 lookup\n", guest_pde); return -1; @@ -167,18 +170,18 @@ int guest_va_to_guest_pa(struct guest_info * guest_info, addr_t guest_va, addr_t return -1; } } - case PROTECTED_PAE_PG: + case PROTECTED_PAE: { // Fill in } - case LONG_PG: + case LONG: { // Fill in } default: return -1; } - } else if (guest_info->page_mode == NESTED_PAGING) { + } else if (guest_info->shdw_pg_mode == NESTED_PAGING) { // Fill in @@ -318,10 +321,43 @@ int read_guest_va_memory(struct guest_info * guest_info, addr_t guest_va, int co int bytes_to_copy = (dist_to_pg_edge > count) ? count : dist_to_pg_edge; addr_t host_addr = 0; + + + /* JRL FIXME: + * This should be somewhere else.... + */ + /* + addr_t tmp_addr; + + addr_t shadow_pde = CR3_TO_PDE32(guest_info->shdw_pg_state.shadow_cr3); + + // Check the Shadow Page Tables first (Virtual TLB) + if (pt32_lookup((pde32_t *)shadow_pde, cursor, &tmp_addr) == 0) { + host_addr = tmp_addr; + + if (host_pa_to_host_va(tmp_addr, &host_addr) != 0) { + return bytes_read; + } + } else { + + // No entry in the VTLB, do a guest page table walk + + if (guest_va_to_host_va(guest_info, cursor, &host_addr) != 0) { + PrintDebug("Invalid GVA(%x)->HVA lookup\n", cursor); + return bytes_read; + } + } +*/ + /* JRL: END GRUESOME HACK */ + + + if (guest_va_to_host_va(guest_info, cursor, &host_addr) != 0) { PrintDebug("Invalid GVA(%x)->HVA lookup\n", cursor); return bytes_read; } + + memcpy(dest + bytes_read, (void*)host_addr, bytes_to_copy); @@ -352,8 +388,7 @@ int read_guest_pa_memory(struct guest_info * guest_info, addr_t guest_pa, int co if (guest_pa_to_host_va(guest_info, cursor, &host_addr) != 0) { return bytes_read; - } - + } /* PrintDebug("Trying to read %d bytes\n", bytes_to_copy);