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.


updated to use pa_to_va address conversion
Jack Lange [Tue, 21 Oct 2008 23:44:50 +0000 (18:44 -0500)]
now bombs out on first instruction of guest

palacios/include/palacios/vmm.h
palacios/include/palacios/vmm_paging.h
palacios/src/palacios/svm.c
palacios/src/palacios/vm_guest_mem.c
palacios/src/palacios/vmm_config.c
palacios/src/palacios/vmm_ctrl_regs.c
palacios/src/palacios/vmm_emulator.c
palacios/src/palacios/vmm_paging.c
palacios/src/palacios/vmm_shadow_paging.c

index 5fcfeb3..cafc5ab 100644 (file)
   } while(0)                                   \
 
 
+#define V3_VAddr(addr) ({                              \
+      extern struct v3_os_hooks * os_hooks;            \
+      void * var = 0;                                  \
+      if ((os_hooks) && (os_hooks)->paddr_to_vaddr) {  \
+       var = (os_hooks)->paddr_to_vaddr(addr);         \
+      }                                                        \
+      var;                                             \
+    })
+
+
+#define V3_PAddr(addr) ({                              \
+      extern struct v3_os_hooks * os_hooks;            \
+      void * var = 0;                                  \
+      if ((os_hooks) && (os_hooks)->vaddr_to_paddr) {  \
+       var = (os_hooks)->vaddr_to_paddr(addr);         \
+      }                                                        \
+      var;                                             \
+    })
+
 
 
 #define V3_Malloc(size) ({                     \
index 93059e1..1721760 100644 (file)
@@ -129,9 +129,9 @@ the host state in the vmcs before entering the guest.
 
 
 
-#define CR3_TO_PDE32(cr3) (((ulong_t)cr3) & 0xfffff000)
-#define CR3_TO_PDPTRE(cr3) (((ulong_t)cr3) & 0xffffffe0)
-#define CR3_TO_PML4E64(cr3)  (((ullong_t)cr3) & 0x000ffffffffff000LL)
+#define CR3_TO_PDE32(cr3) (V3_VAddr((void *)(((ulong_t)cr3) & 0xfffff000)))
+#define CR3_TO_PDPTRE(cr3) (V3_VAddr((void *)(((ulong_t)cr3) & 0xffffffe0)))
+#define CR3_TO_PML4E64(cr3)  (V3_VAddr((void *)(((ullong_t)cr3) & 0x000ffffffffff000LL)))
 
 
 
index bb0e217..28eadc7 100644 (file)
@@ -50,7 +50,7 @@ extern int v3_svm_launch(vmcb_t * vmcb, struct v3_gprs * vm_regs);
 
 
 static vmcb_t * Allocate_VMCB() {
-  vmcb_t * vmcb_page = (vmcb_t *)V3_AllocPages(1);
+  vmcb_t * vmcb_page = (vmcb_t *)V3_VAddr(V3_AllocPages(1));
 
   memset(vmcb_page, 0, 4096);
 
@@ -164,10 +164,10 @@ static void Init_VMCB_BIOS(vmcb_t * vmcb, struct guest_info *vm_info) {
     struct vmm_io_hook * iter;
     addr_t io_port_bitmap;
     
-    io_port_bitmap = (addr_t)V3_AllocPages(3);
+    io_port_bitmap = (addr_t)V3_VAddr(V3_AllocPages(3));
     memset((uchar_t*)io_port_bitmap, 0, PAGE_SIZE * 3);
     
-    ctrl_area->IOPM_BASE_PA = io_port_bitmap;
+    ctrl_area->IOPM_BASE_PA = (addr_t)V3_PAddr((void *)io_port_bitmap);
 
     //PrintDebug("Setting up IO Map at 0x%x\n", io_port_bitmap);
 
@@ -307,7 +307,7 @@ static int start_svm_guest(struct guest_info *info) {
     rdtscll(info->time_state.cached_host_tsc);
     guest_ctrl->TSC_OFFSET = info->time_state.guest_tsc - info->time_state.cached_host_tsc;
 
-    v3_svm_launch((vmcb_t*)(info->vmm_data), &(info->vm_regs));
+    v3_svm_launch((vmcb_t*)V3_PAddr(info->vmm_data), &(info->vm_regs));
 
     rdtscll(tmp_tsc);
     //PrintDebug("SVM Returned\n");
index f89e321..51393d6 100644 (file)
@@ -151,9 +151,9 @@ int guest_va_to_guest_pa(struct guest_info * guest_info, addr_t guest_va, addr_t
       addr_t guest_pde = 0;
       
       if (guest_info->shdw_pg_mode == SHADOW_PAGING) {
-       guest_pde = CR3_TO_PDE32(guest_info->shdw_pg_state.guest_cr3);
+       guest_pde = (addr_t)CR3_TO_PDE32((void *)(guest_info->shdw_pg_state.guest_cr3));
       } else if (guest_info->shdw_pg_mode == NESTED_PAGING) {
-       guest_pde = CR3_TO_PDE32(guest_info->ctrl_regs.cr3);
+       guest_pde = (addr_t)CR3_TO_PDE32((void *)(guest_info->ctrl_regs.cr3));
       }
       
       if (guest_pa_to_host_va(guest_info, guest_pde, (addr_t *)&pde) == -1) {
index 10742f7..37c5312 100644 (file)
@@ -105,7 +105,7 @@ int v3_config_guest(struct guest_info * info, struct v3_vm_config * config_ptr)
     void * guest_mem =  V3_AllocPages(num_pages);
 
     PrintDebug("Layout Region %d bytes\n", config_ptr->rombios_size);
-    memcpy(guest_mem, config_ptr->rombios, config_ptr->rombios_size);
+    memcpy(V3_VAddr(guest_mem), config_ptr->rombios, config_ptr->rombios_size);
 
     add_shadow_region_passthrough(info, ROMBIOS_START, ROMBIOS_START + (num_pages * PAGE_SIZE), (addr_t)guest_mem);
     
@@ -122,7 +122,7 @@ int v3_config_guest(struct guest_info * info, struct v3_vm_config * config_ptr)
     void * guest_mem =  V3_AllocPages(num_pages);
 
     PrintDebug("Layout Region %d bytes\n", config_ptr->vgabios_size);
-    memcpy(guest_mem, config_ptr->vgabios, config_ptr->vgabios_size);
+    memcpy(V3_VAddr(guest_mem), config_ptr->vgabios, config_ptr->vgabios_size);
 
     add_shadow_region_passthrough(info, VGABIOS_START, VGABIOS_START + (num_pages * PAGE_SIZE), (addr_t)guest_mem);
     
index 01c66a7..31d0000 100644 (file)
@@ -261,7 +261,7 @@ int v3_handle_cr3_write(struct guest_info * info) {
                 *(uint_t*)shadow_cr3, *(uint_t*)guest_cr3);
       
 
-      cached = v3_cache_page_tables32(info, CR3_TO_PDE32(*(addr_t *)new_cr3));
+      cached = v3_cache_page_tables32(info, (addr_t)CR3_TO_PDE32((void *)*(addr_t *)new_cr3));
 
       if (cached == -1) {
        PrintError("CR3 Cache failed\n");
@@ -275,7 +275,7 @@ int v3_handle_cr3_write(struct guest_info * info) {
        
        shadow_pt =  v3_create_new_shadow_pt32();
        
-       shadow_cr3->pdt_base_addr = PD32_BASE_ADDR(shadow_pt);    
+       shadow_cr3->pdt_base_addr = (addr_t)V3_PAddr((void *)(addr_t)PD32_BASE_ADDR(shadow_pt));
       } else {
        PrintDebug("Reusing cached shadow Page table\n");
       }
index b539490..db53ca8 100644 (file)
@@ -55,7 +55,7 @@ int v3_init_emulator(struct guest_info * info) {
 }
 
 static addr_t get_new_page() {
-  void * page = V3_AllocPages(1);
+  void * page = V3_VAddr(V3_AllocPages(1));
   memset(page, 0, PAGE_SIZE);
 
   return (addr_t)page;
@@ -184,14 +184,14 @@ int v3_emulate_memory_read(struct guest_info * info, addr_t read_gva,
   data_page->pte.present = 1;
   data_page->pte.writable = 0;
   data_page->pte.user_page = 1;
-  data_page->pte.page_base_addr = PT32_BASE_ADDR(data_page->page_addr);
+  data_page->pte.page_base_addr = PT32_BASE_ADDR((addr_t)V3_PAddr((void *)(addr_t)(data_page->page_addr)));
 
 
   // Read the data directly onto the emulated page
   ret = read(read_gpa, (void *)(data_page->page_addr + data_addr_offset), instr_info.op_size, private_data);
   if ((ret == -1) || ((uint_t)ret != instr_info.op_size)) {
     PrintError("Read error in emulator\n");
-    V3_FreePage((void *)(data_page->page_addr));
+    V3_FreePage((void *)V3_PAddr((void *)(data_page->page_addr)));
     V3_Free(data_page);
     return -1;
   }
@@ -275,7 +275,7 @@ int v3_emulate_memory_write(struct guest_info * info, addr_t write_gva,
   data_page->pte.present = 1;
   data_page->pte.writable = 1;
   data_page->pte.user_page = 1;
-  data_page->pte.page_base_addr = PT32_BASE_ADDR(data_page->page_addr);
+  data_page->pte.page_base_addr = PT32_BASE_ADDR((addr_t)V3_PAddr((void *)(addr_t)(data_page->page_addr)));
 
 
 
@@ -351,7 +351,7 @@ int v3_emulation_exit_handler(struct guest_info * info) {
     PrintDebug("wiping page %x\n", empg->va); 
 
     v3_replace_shdw_page32(info, empg->va, &dummy_pte, &empte32_t);
-    V3_FreePage((void *)(empg->page_addr));
+    V3_FreePage((void *)(V3_PAddr((void *)(empg->page_addr))));
 
     list_del(&(empg->page_list));
     V3_Free(empg);
index 58d3359..e850f88 100644 (file)
@@ -51,7 +51,7 @@ void delete_page_tables_pde32(pde32_t * pde) {
   }
 
   //  PrintDebug("Deleting PDE (%x)\n", pde);
-  V3_FreePage(pde);
+  V3_FreePage(V3_PAddr(pde));
 }
 
 
@@ -170,11 +170,11 @@ pde32_t * create_passthrough_pde32_pts(struct guest_info * guest_info) {
   int i, j;
   struct shadow_map * map = &(guest_info->mem_map);
 
-  pde32_t * pde = V3_AllocPages(1);
+  pde32_t * pde = V3_VAddr(V3_AllocPages(1));
 
   for (i = 0; i < MAX_PDE32_ENTRIES; i++) {
     int pte_present = 0;
-    pte32_t * pte = V3_AllocPages(1);
+    pte32_t * pte = V3_VAddr(V3_AllocPages(1));
     
 
     for (j = 0; j < MAX_PTE32_ENTRIES; j++) {
@@ -225,7 +225,7 @@ pde32_t * create_passthrough_pde32_pts(struct guest_info * guest_info) {
     }
 
     if (pte_present == 0) { 
-      V3_FreePage(pte);
+      V3_FreePage(V3_PAddr(pte));
 
       pde[i].present = 0;
       pde[i].writable = 0;
@@ -249,7 +249,7 @@ pde32_t * create_passthrough_pde32_pts(struct guest_info * guest_info) {
       pde[i].large_page = 0;
       pde[i].global_page = 0;
       pde[i].vmm_info = 0;
-      pde[i].pt_base_addr = PAGE_ALIGNED_ADDR((addr_t)pte);
+      pde[i].pt_base_addr = PAGE_ALIGNED_ADDR((addr_t)V3_PAddr(pte));
     }
 
   }
@@ -335,7 +335,7 @@ void PrintDebugPageTables(pde32_t * pde)
   for (i = 0; (i < MAX_PDE32_ENTRIES); i++) { 
     if (pde[i].present) {
       PrintPDE32((addr_t)(PAGE_SIZE * MAX_PTE32_ENTRIES * i), &(pde[i]));
-      PrintPT32((addr_t)(PAGE_SIZE * MAX_PTE32_ENTRIES * i), (pte32_t *)(addr_t)(pde[i].pt_base_addr << PAGE_POWER));
+      PrintPT32((addr_t)(PAGE_SIZE * MAX_PTE32_ENTRIES * i), (pte32_t *)V3_VAddr((void *)(addr_t)(pde[i].pt_base_addr << PAGE_POWER)));
     }
   }
 }
index 6c8e1fe..2f91b96 100644 (file)
@@ -247,7 +247,7 @@ int v3_handle_shadow_pagefault(struct guest_info * info, addr_t fault_addr, pf_e
 addr_t v3_create_new_shadow_pt32() {
   void * host_pde = 0;
 
-  host_pde = V3_AllocPages(1);
+  host_pde = V3_VAddr(V3_AllocPages(1));
   memset(host_pde, 0, PAGE_SIZE);
 
   return (addr_t)host_pde;
@@ -385,7 +385,7 @@ static int handle_large_pagefault32(struct guest_info * info,
 static int handle_shadow_pagefault32(struct guest_info * info, addr_t fault_addr, pf_error_t error_code) {
   pde32_t * guest_pd = NULL;
   pde32_t * shadow_pd = (pde32_t *)CR3_TO_PDE32(info->shdw_pg_state.shadow_cr3);
-  addr_t guest_cr3 = CR3_TO_PDE32(info->shdw_pg_state.guest_cr3);
+  addr_t guest_cr3 = (addr_t)CR3_TO_PDE32(info->shdw_pg_state.guest_cr3);
   pt_access_status_t guest_pde_access;
   pt_access_status_t shadow_pde_access;
   pde32_t * guest_pde = NULL;
@@ -434,7 +434,7 @@ static int handle_shadow_pagefault32(struct guest_info * info, addr_t fault_addr
       
       guest_pde->accessed = 1;
       
-      shadow_pde->pt_base_addr = PD32_BASE_ADDR((addr_t)shadow_pt);
+      shadow_pde->pt_base_addr = PD32_BASE_ADDR((addr_t)V3_PAddr(shadow_pt));
       
       if (guest_pde->large_page == 0) {
        shadow_pde->writable = guest_pde->writable;
@@ -696,7 +696,7 @@ int v3_handle_shadow_invlpg(struct guest_info * info) {
       addr_t first_operand;
       addr_t second_operand;
       v3_operand_type_t addr_type;
-      addr_t guest_cr3 = CR3_TO_PDE32(info->shdw_pg_state.guest_cr3);
+      addr_t guest_cr3 = (addr_t)CR3_TO_PDE32(info->shdw_pg_state.guest_cr3);
 
       pde32_t * guest_pd = NULL;