int guest_pa_to_host_pa(struct guest_info * guest_info, addr_t guest_pa, addr_t * host_pa) {
// we use the shadow map here...
if (lookup_shadow_map_addr(&(guest_info->mem_map), guest_pa, host_pa) != HOST_REGION_PHYSICAL_MEMORY) {
+ PrintDebug("Could not find address in shadow map (addr=%x)\n", guest_pa);
return -1;
}
{
addr_t tmp_pa;
pde32_t * pde;
- addr_t guest_pde = CR3_TO_PDE32(guest_info->shdw_pg_state.guest_cr3.r_reg);
+ 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) {
return -1;
}
switch (pde32_lookup(pde, guest_va, &tmp_pa)) {
- case NOT_PRESENT:
+ case PDE32_ENTRY_NOT_PRESENT:
*guest_pa = 0;
return -1;
- case LARGE_PAGE:
+ case PDE32_ENTRY_LARGE_PAGE:
*guest_pa = tmp_pa;
return 0;
- case PTE32:
+ case PDE32_ENTRY_PTE32:
{
pte32_t * pte;
int bytes_read = 0;
while (count > 0) {
- int dist_to_pg_edge = (PAGE_OFFSET(cursor) + PAGE_SIZE) - cursor;
+ int dist_to_pg_edge = (PAGE_ADDR(cursor) + PAGE_SIZE) - cursor;
int bytes_to_copy = (dist_to_pg_edge > count) ? count : dist_to_pg_edge;
addr_t host_addr;
int bytes_read = 0;
while (count > 0) {
- int dist_to_pg_edge = (PAGE_OFFSET(cursor) + PAGE_SIZE) - cursor;
+ int dist_to_pg_edge = (PAGE_ADDR(cursor) + PAGE_SIZE) - cursor;
int bytes_to_copy = (dist_to_pg_edge > count) ? count : dist_to_pg_edge;
addr_t host_addr;
return bytes_read;
}
+
+ /*
+ PrintDebug("Trying to read %d bytes\n", bytes_to_copy);
+ PrintDebug("Dist to page edge=%d\n", dist_to_pg_edge);
+ PrintDebug("PAGE_ADDR=0x%x\n", PAGE_ADDR(cursor));
+ PrintDebug("guest_pa=0x%x\n", guest_pa);
+ */
+
memcpy(dest + bytes_read, (void*)host_addr, bytes_to_copy);
bytes_read += bytes_to_copy;
count -= bytes_to_copy;
- cursor += bytes_to_copy;
+ cursor += bytes_to_copy;
}
return bytes_read;
int bytes_written = 0;
while (count > 0) {
- int dist_to_pg_edge = (PAGE_OFFSET(cursor) + PAGE_SIZE) - cursor;
+ int dist_to_pg_edge = (PAGE_ADDR(cursor) + PAGE_SIZE) - cursor;
int bytes_to_copy = (dist_to_pg_edge > count) ? count : dist_to_pg_edge;
addr_t host_addr;
return bytes_written;
}
+
memcpy((void*)host_addr, src + bytes_written, bytes_to_copy);
-
+
bytes_written += bytes_to_copy;
count -= bytes_to_copy;
cursor += bytes_to_copy;