Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Guest mem gpa/gva memset functions
[palacios.git] / palacios / src / palacios / vm_guest_mem.c
index ca6c601..9c7703e 100644 (file)
 #include <palacios/vmm.h>
 #include <palacios/vmm_paging.h>
 
+#ifndef V3_CONFIG_DEBUG_MEM_ERRORS
+#undef PrintDebug
+#define PrintDebug(fmt, args...)
+#endif
+
 extern struct v3_os_hooks * os_hooks;
 
 
@@ -34,12 +39,12 @@ int v3_hva_to_hpa(addr_t hva, addr_t * hpa) {
        *hpa = (addr_t)(os_hooks)->vaddr_to_paddr((void *)hva);
   
        if (*hpa == 0) {
-           PrintError("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 {
-       PrintError("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;
@@ -52,28 +57,28 @@ int v3_hpa_to_hva(addr_t hpa, addr_t * hva) {
        *hva = (addr_t)(os_hooks)->paddr_to_vaddr((void *)hpa);
     
        if (*hva == 0) {
-           PrintError("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 {
-       PrintError("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;
 }
 
 int v3_gpa_to_hpa(struct guest_info * info, addr_t gpa, addr_t * hpa) {
-    struct v3_mem_region * reg = v3_get_mem_region(info->vm_info, info->cpu_id, gpa);
+    struct v3_mem_region * reg = v3_get_mem_region(info->vm_info, info->vcpu_id, gpa);
 
     if (reg == NULL) {
-       PrintError("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) {
-       //PrintError("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;
@@ -91,7 +96,7 @@ int v3_gpa_to_hpa(struct guest_info * info, addr_t gpa, addr_t * hpa) {
 // 
 int v3_hpa_to_gpa(struct guest_info * guest_info, addr_t hpa, addr_t * gpa) {
     *gpa = 0;
-    PrintError("ERROR!!! HPA->GPA currently not implemented!!!\n");
+    PrintDebug(guest_info->vm_info, guest_info, "ERROR!!! HPA->GPA currently not implemented!!!\n");
 
     return -1;
 }
@@ -110,13 +115,13 @@ int v3_hva_to_gpa(struct guest_info * guest_info, addr_t hva, addr_t * gpa) {
     *gpa = 0;
 
     if (v3_hva_to_hpa(hva, &hpa) != 0) {
-       PrintError("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) {
-       PrintError("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;
     }
@@ -133,13 +138,13 @@ int v3_gpa_to_hva(struct guest_info * guest_info, addr_t gpa, addr_t * hva) {
     *hva = 0;
 
     if (v3_gpa_to_hpa(guest_info, gpa, &hpa) != 0) {
-       //      PrintError("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) {
-       PrintError("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;
     }
@@ -168,14 +173,14 @@ int v3_gva_to_gpa(struct guest_info * guest_info, addr_t gva, addr_t * gpa) {
     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;
            }
@@ -184,7 +189,7 @@ int v3_gva_to_gpa(struct guest_info * guest_info, addr_t gva, addr_t * gpa) {
        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;
            }
@@ -205,7 +210,7 @@ int v3_gva_to_gpa(struct guest_info * guest_info, addr_t gva, addr_t * gpa) {
  */
 int v3_gpa_to_gva(struct guest_info * guest_info, addr_t gpa, addr_t * gva) {
     *gva = 0;
-    PrintError("ERROR!!: GPA->GVA Not Implemented!!\n");
+    PrintDebug(guest_info->vm_info, guest_info, "ERROR!!: GPA->GVA Not Implemented!!\n");
     return -1;
 }
 
@@ -221,13 +226,13 @@ int v3_gva_to_hpa(struct guest_info * guest_info, addr_t gva, addr_t * hpa) {
     *hpa = 0;
 
     if (v3_gva_to_gpa(guest_info, gva, &gpa) != 0) {
-       PrintError("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) {
-       PrintError("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;
     }
@@ -242,13 +247,13 @@ int v3_hpa_to_gva(struct guest_info * guest_info, addr_t hpa, addr_t * gva) {
     *gva = 0;
 
     if (v3_hpa_to_gpa(guest_info, hpa, &gpa) != 0) {
-       PrintError("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) {
-       PrintError("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;
     }
@@ -266,19 +271,19 @@ int v3_gva_to_hva(struct guest_info * guest_info, addr_t gva, addr_t * hva) {
     *hva = 0;
 
     if (v3_gva_to_gpa(guest_info, gva, &gpa) != 0) {
-       PrintError("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) {
-       PrintError("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) {
-       PrintError("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;
     }
@@ -295,19 +300,19 @@ int v3_hva_to_gva(struct guest_info * guest_info, addr_t hva, addr_t * gva) {
     *gva = 0;
 
     if (v3_hva_to_hpa(hva, &hpa) != 0) {
-       PrintError("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) {
-       PrintError("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) {
-       PrintError("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;
     }
@@ -336,7 +341,7 @@ int v3_read_gva_memory(struct guest_info * guest_info, addr_t gva, int count, uc
 
     
        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;
        }
     
@@ -374,10 +379,10 @@ int v3_read_gpa_memory(struct guest_info * guest_info, addr_t gpa, int count, uc
        }    
     
        /*
-         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);
@@ -391,6 +396,72 @@ int v3_read_gpa_memory(struct guest_info * guest_info, addr_t gpa, int count, uc
 }
 
 
+/* 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;
+}
+
+int v3_set_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;
+       }
+    
+    
+
+       memset((void*)host_addr,
+              src,
+              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, 
@@ -420,3 +491,28 @@ int v3_write_gpa_memory(struct guest_info * guest_info, addr_t gpa, int count, u
     return bytes_written;
 }
 
+
+int v3_set_gpa_memory(struct guest_info * guest_info, addr_t gpa, int count, uchar_t src) {
+    addr_t cursor = gpa;
+    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;
+
+       if (v3_gpa_to_hva(guest_info, cursor, &host_addr) != 0) {
+           return bytes_written;
+       }
+
+
+       memset((void*)host_addr, src, bytes_to_copy);
+
+       bytes_written += bytes_to_copy;
+       count -= bytes_to_copy;
+       cursor += bytes_to_copy;    
+    }
+
+    return bytes_written;
+}
+