*hpa = (addr_t)(os_hooks)->vaddr_to_paddr((void *)hva);
if (*hpa == 0) {
- PrintDebug("In HVA->HPA: Invalid HVA(%p)->HPA lookup\n",
+ PrintDebug(VM_NONE, VCORE_NONE, "In HVA->HPA: Invalid HVA(%p)->HPA lookup\n",
(void *)hva);
return -1;
}
} else {
- PrintDebug("In HVA->HPA: os_hooks not defined\n");
+ PrintDebug(VM_NONE, VCORE_NONE,"In HVA->HPA: os_hooks not defined\n");
return -1;
}
return 0;
*hva = (addr_t)(os_hooks)->paddr_to_vaddr((void *)hpa);
if (*hva == 0) {
- PrintDebug("In HPA->HVA: Invalid HPA(%p)->HVA lookup\n",
+ PrintDebug(VM_NONE, VCORE_NONE,"In HPA->HVA: Invalid HPA(%p)->HVA lookup\n",
(void *)hpa);
return -1;
}
} else {
- PrintDebug("In HPA->HVA: os_hooks not defined\n");
+ PrintDebug(VM_NONE, VCORE_NONE,"In HPA->HVA: os_hooks not defined\n");
return -1;
}
return 0;
struct v3_mem_region * reg = v3_get_mem_region(info->vm_info, info->vcpu_id, gpa);
if (reg == NULL) {
- PrintDebug("In GPA->HPA: Could not find address in shadow map (addr=%p) (NULL REGION)\n",
+ PrintDebug(info->vm_info,info,"In GPA->HPA: Could not find address in shadow map (addr=%p) (NULL REGION)\n",
(void *)gpa);
return -1;
}
if (reg->flags.alloced == 0) {
- //PrintDebug("In GPA->HPA: Tried to translate physical address of non allocated page (addr=%p)\n",
+ //PrintDebug(info->vm_info, info, "In GPA->HPA: Tried to translate physical address of non allocated page (addr=%p)\n",
// (void *)gpa);
//v3_print_mem_map(info->vm_info);
return -1;
//
int v3_hpa_to_gpa(struct guest_info * guest_info, addr_t hpa, addr_t * gpa) {
*gpa = 0;
- PrintDebug("ERROR!!! HPA->GPA currently not implemented!!!\n");
+ PrintDebug(guest_info->vm_info, guest_info, "ERROR!!! HPA->GPA currently not implemented!!!\n");
return -1;
}
*gpa = 0;
if (v3_hva_to_hpa(hva, &hpa) != 0) {
- PrintDebug("In HVA->GPA: Invalid HVA(%p)->HPA lookup\n",
+ PrintDebug(guest_info->vm_info, guest_info, "In HVA->GPA: Invalid HVA(%p)->HPA lookup\n",
(void *)hva);
return -1;
}
if (v3_hpa_to_gpa(guest_info, hpa, gpa) != 0) {
- PrintDebug("In HVA->GPA: Invalid HPA(%p)->GPA lookup\n",
+ PrintDebug(guest_info->vm_info, guest_info, "In HVA->GPA: Invalid HPA(%p)->GPA lookup\n",
(void *)hpa);
return -1;
}
*hva = 0;
if (v3_gpa_to_hpa(guest_info, gpa, &hpa) != 0) {
- // PrintDebug("In GPA->HVA: Invalid GPA(%p)->HPA lookup\n",
+ // PrintDebug(guest_info->vm_info, guest_info, "In GPA->HVA: Invalid GPA(%p)->HPA lookup\n",
// (void *)gpa);
return -1;
}
if (v3_hpa_to_hva(hpa, hva) != 0) {
- PrintDebug("In GPA->HVA: Invalid HPA(%p)->HVA lookup\n",
+ PrintDebug(guest_info->vm_info, guest_info, "In GPA->HVA: Invalid HPA(%p)->HVA lookup\n",
(void *)hpa);
return -1;
}
switch (guest_info->cpu_mode) {
case PROTECTED:
if (v3_translate_guest_pt_32(guest_info, guest_cr3, gva, gpa) == -1) {
- PrintDebug("Could not translate addr (%p) through 32 bit guest PT at %p\n",
+ PrintDebug(guest_info->vm_info, guest_info, "Could not translate addr (%p) through 32 bit guest PT at %p\n",
(void *)gva, (void *)(addr_t)guest_cr3);
return -1;
}
break;
case PROTECTED_PAE:
if (v3_translate_guest_pt_32pae(guest_info, guest_cr3, gva, gpa) == -1) {
- PrintDebug("Could not translate addr (%p) through 32 bitpae guest PT at %p\n",
+ PrintDebug(guest_info->vm_info, guest_info, "Could not translate addr (%p) through 32 bitpae guest PT at %p\n",
(void *)gva, (void *)(addr_t)guest_cr3);
return -1;
}
case LONG_32_COMPAT:
case LONG_16_COMPAT:
if (v3_translate_guest_pt_64(guest_info, guest_cr3, gva, gpa) == -1) {
- PrintDebug("Could not translate addr (%p) through 64 bit guest PT at %p\n",
+ PrintDebug(guest_info->vm_info, guest_info, "Could not translate addr (%p) through 64 bit guest PT at %p\n",
(void *)gva, (void *)(addr_t)guest_cr3);
return -1;
}
*/
int v3_gpa_to_gva(struct guest_info * guest_info, addr_t gpa, addr_t * gva) {
*gva = 0;
- PrintDebug("ERROR!!: GPA->GVA Not Implemented!!\n");
+ PrintDebug(guest_info->vm_info, guest_info, "ERROR!!: GPA->GVA Not Implemented!!\n");
return -1;
}
*hpa = 0;
if (v3_gva_to_gpa(guest_info, gva, &gpa) != 0) {
- PrintDebug("In GVA->HPA: Invalid GVA(%p)->GPA lookup\n",
+ PrintDebug(guest_info->vm_info, guest_info, "In GVA->HPA: Invalid GVA(%p)->GPA lookup\n",
(void *)gva);
return -1;
}
if (v3_gpa_to_hpa(guest_info, gpa, hpa) != 0) {
- PrintDebug("In GVA->HPA: Invalid GPA(%p)->HPA lookup\n",
+ PrintDebug(guest_info->vm_info, guest_info, "In GVA->HPA: Invalid GPA(%p)->HPA lookup\n",
(void *)gpa);
return -1;
}
*gva = 0;
if (v3_hpa_to_gpa(guest_info, hpa, &gpa) != 0) {
- PrintDebug("In HPA->GVA: Invalid HPA(%p)->GPA lookup\n",
+ PrintDebug(guest_info->vm_info, guest_info, "In HPA->GVA: Invalid HPA(%p)->GPA lookup\n",
(void *)hpa);
return -1;
}
if (v3_gpa_to_gva(guest_info, gpa, gva) != 0) {
- PrintDebug("In HPA->GVA: Invalid GPA(%p)->GVA lookup\n",
+ PrintDebug(guest_info->vm_info, guest_info, "In HPA->GVA: Invalid GPA(%p)->GVA lookup\n",
(void *)gpa);
return -1;
}
*hva = 0;
if (v3_gva_to_gpa(guest_info, gva, &gpa) != 0) {
- PrintDebug("In GVA->HVA: Invalid GVA(%p)->GPA lookup\n",
+ PrintDebug(guest_info->vm_info, guest_info, "In GVA->HVA: Invalid GVA(%p)->GPA lookup\n",
(void *)gva);
return -1;
}
if (v3_gpa_to_hpa(guest_info, gpa, &hpa) != 0) {
- PrintDebug("In GVA->HVA: Invalid GPA(%p)->HPA lookup\n",
+ PrintDebug(guest_info->vm_info, guest_info, "In GVA->HVA: Invalid GPA(%p)->HPA lookup\n",
(void *)gpa);
return -1;
}
if (v3_hpa_to_hva(hpa, hva) != 0) {
- PrintDebug("In GVA->HVA: Invalid HPA(%p)->HVA lookup\n",
+ PrintDebug(guest_info->vm_info, guest_info, "In GVA->HVA: Invalid HPA(%p)->HVA lookup\n",
(void *)hpa);
return -1;
}
*gva = 0;
if (v3_hva_to_hpa(hva, &hpa) != 0) {
- PrintDebug("In HVA->GVA: Invalid HVA(%p)->HPA lookup\n",
+ PrintDebug(guest_info->vm_info, guest_info, "In HVA->GVA: Invalid HVA(%p)->HPA lookup\n",
(void *)hva);
return -1;
}
if (v3_hpa_to_gpa(guest_info, hpa, &gpa) != 0) {
- PrintDebug("In HVA->GVA: Invalid HPA(%p)->GPA lookup\n",
+ PrintDebug(guest_info->vm_info, guest_info, "In HVA->GVA: Invalid HPA(%p)->GPA lookup\n",
(void *)hva);
return -1;
}
if (v3_gpa_to_gva(guest_info, gpa, gva) != 0) {
- PrintDebug("In HVA->GVA: Invalid GPA(%p)->GVA lookup\n",
+ PrintDebug(guest_info->vm_info, guest_info, "In HVA->GVA: Invalid GPA(%p)->GVA lookup\n",
(void *)gpa);
return -1;
}
if (v3_gva_to_hva(guest_info, cursor, &host_addr) != 0) {
- PrintDebug("Invalid GVA(%p)->HVA lookup\n", (void *)cursor);
+ PrintDebug(guest_info->vm_info, guest_info, "Invalid GVA(%p)->HVA lookup\n", (void *)cursor);
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);
+ PrintDebug(info->vm_info, info, "Trying to read %d bytes\n", bytes_to_copy);
+ PrintDebug(info->vm_info, info, "Dist to page edge=%d\n", dist_to_pg_edge);
+ PrintDebug(info->vm_info, info, "PAGE_ADDR=0x%x\n", PAGE_ADDR(cursor));
+ PrintDebug(info->vm_info, info, "guest_pa=0x%x\n", guest_pa);
*/
memcpy(dest + bytes_read, (void*)host_addr, bytes_to_copy);
}
+/* This clones v3_read_gva_memory
+ * We write only as far as page translations are available
+ */
+int v3_write_gva_memory(struct guest_info * guest_info, addr_t gva, int count, uchar_t * src) {
+ addr_t cursor = gva;
+ int bytes_written = 0;
+
+
+
+ while (count > 0) {
+ 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 = 0;
+
+
+ if (v3_gva_to_hva(guest_info, cursor, &host_addr) != 0) {
+ PrintDebug(guest_info->vm_info, guest_info, "Invalid GVA(%p)->HVA lookup\n", (void *)cursor);
+ 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;
+ }
+
+ return bytes_written;
+}
+
+
/* This is a straight address conversion + copy,