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.


added back in 32 bit support
[palacios.git] / palacios / src / palacios / vmm_shadow_paging_32.h
index c358c3c..5e1d9c9 100644 (file)
@@ -34,7 +34,7 @@ static inline int activate_shadow_pt_32(struct guest_info * info) {
     shadow_cr3->pcd = guest_cr3->pcd;
   
 #ifdef CONFIG_SYMBIOTIC_SWAP
-    v3_swap_flush(info);
+    v3_swap_flush(info->vm_info);
 #endif
 
     return 0;
@@ -206,7 +206,7 @@ static int handle_pte_shadow_pagefault_32(struct guest_info * info, addr_t fault
     pte32_t * shadow_pte = (pte32_t *)&(shadow_pt[PTE32_INDEX(fault_addr)]);
     addr_t guest_pa = BASE_TO_PAGE_ADDR((addr_t)(guest_pte->page_base_addr)) +  PAGE_OFFSET(fault_addr);
 
-    struct v3_shadow_region * shdw_reg =  v3_get_shadow_region(info, guest_pa);
+    struct v3_shadow_region * shdw_reg =  v3_get_shadow_region(info->vm_info, info->cpu_id, guest_pa);
 
     if (shdw_reg == NULL) {
        // Inject a machine check in the guest
@@ -230,64 +230,92 @@ static int handle_pte_shadow_pagefault_32(struct guest_info * info, addr_t fault
        
 #ifdef CONFIG_SYMBIOTIC_SWAP
        if (is_swapped_pte32(guest_pte)) {
+
            pf_error_t swap_perms;
 
+
+           /*
+           int sym_ret = v3_get_vaddr_perms(info, fault_addr, guest_pte, &swap_perms);
+           sym_ret = 0;
+           */
+           addr_t swp_pg_addr = 0;
+
+
+
 #ifdef CONFIG_SYMBIOTIC_SWAP_TELEMETRY
            if (error_code.write == 0) {
-               info->swap_state.read_faults++;
+               info->vm_info->swap_state.read_faults++;
            } else {
-               info->swap_state.write_faults++;
+               info->vm_info->swap_state.write_faults++;
            }
 #endif
 
-           if (v3_get_vaddr_perms(info, fault_addr, guest_pte, &swap_perms) == -1) {
-               PrintError("Error getting Swapped page permissions\n");
-               return -1;
-           }
 
+           swp_pg_addr = v3_get_swapped_pg_addr(info->vm_info,  guest_pte);
 
-           // swap_perms.write == 1 || error_code.write == 0
-           // swap_perms.user == 0 || error_code.user == 1
+           if (swp_pg_addr != 0) {
+               PrintDebug("Swapped page address=%p\n", (void *)swp_pg_addr);
 
-           // This checks for permissions violations that require a guest PF injection
-           if ( (swap_perms.present == 1) && 
-                ( (swap_perms.write == 1) || 
-                  (error_code.write == 0) ) &&
-                ( (swap_perms.user == 1) || 
-                  (error_code.user == 0) ) ) {
-               addr_t swp_pg_addr = 0;
+               /*
+               if (info->cpl == 0) {
+                   PrintError("Swapped Page fault in kernel mode.... bad...\n");
+                   goto inject;
+               }
+               */
 
-               PrintDebug("Page fault on swapped out page (vaddr=%p) (pte=%x) (error_code=%x)\n", 
-                        (void *)fault_addr, *(uint32_t *)guest_pte, *(uint32_t *)&error_code);
+               int sym_ret = v3_get_vaddr_perms(info, fault_addr, guest_pte, &swap_perms);
 
-               swp_pg_addr = v3_get_swapped_pg_addr(info, shadow_pte, guest_pte);
+               if (sym_ret == -1) {
+                   PrintError("Symcall error...\n");
+                   return -1;
+               } else if (sym_ret == 0) {
 
-               PrintDebug("Swapped page address=%p\n", (void *)swp_pg_addr);
 
-               if (swp_pg_addr != 0) {
-                   shadow_pte->writable = swap_perms.write;
-                   shadow_pte->user_page = swap_perms.user;
-                   
-                   shadow_pte->write_through = 0;
-                   shadow_pte->cache_disable = 0;
-                   shadow_pte->global_page = 0;
-                   
-                   shadow_pte->present = 1;
+                   if (swap_perms.present == 0) {
+                       PrintError("Nonpresent swapped page\n");
+                   }
                    
-                   shadow_pte->page_base_addr = swp_pg_addr;
+                   // swap_perms.write ==1 || error_code.write == 0
+                   // swap_perms.user == 0 || error_code.user == 1
                    
+                   // This checks for permissions violations that require a guest PF injection
+                   if ( (swap_perms.present == 1) && 
+                        ( (swap_perms.write == 1) || 
+                          (error_code.write == 0) ) &&
+                        ( (swap_perms.user == 1) || 
+                          (error_code.user == 0) ) ) {
+                       addr_t swp_pg_pa = 0;
+                       
+                       swp_pg_pa = v3_map_swp_page(info->vm_info, shadow_pte, guest_pte, (void *)swp_pg_addr);
+
+                       PrintDebug("Page fault on swapped out page (vaddr=%p) (pte=%x) (error_code=%x)\n", 
+                                  (void *)fault_addr, *(uint32_t *)guest_pte, *(uint32_t *)&error_code);
+                       
+                       shadow_pte->writable = swap_perms.write;
+                       shadow_pte->user_page = swap_perms.user;
+                       
+                       shadow_pte->write_through = 0;
+                       shadow_pte->cache_disable = 0;
+                       shadow_pte->global_page = 0;
+                       
+                       shadow_pte->present = 1;
+                       
+                       shadow_pte->page_base_addr = swp_pg_pa;
+                       
 #ifdef CONFIG_SYMBIOTIC_SWAP_TELEMETRY
-                   info->swap_state.mapped_pages++;
+                       info->vm_info->swap_state.mapped_pages++;
 #endif
-
-                   return 0;
+                       //              PrintError("Swap fault handled\n");
+                       return 0;
+                   }
                }
            } else {
                PrintDebug("Not a sym swappable page\n");
            }
+
        }
 #endif
-       
+       //   inject:
 
        if (inject_guest_pf(info, fault_addr, error_code) == -1) {
            PrintError("Could not inject guest page fault for vaddr %p\n", (void *)fault_addr);
@@ -313,7 +341,7 @@ static int handle_pte_shadow_pagefault_32(struct guest_info * info, addr_t fault
 
        if ((shdw_reg->host_type == SHDW_REGION_ALLOCATED) ||
            (shdw_reg->host_type == SHDW_REGION_WRITE_HOOK)) {
-           addr_t shadow_pa = v3_get_shadow_addr(shdw_reg, guest_pa);
+           addr_t shadow_pa = v3_get_shadow_addr(shdw_reg, info->cpu_id, guest_pa);
       
            shadow_pte->page_base_addr = PAGE_BASE_ADDR(shadow_pa);
 
@@ -399,7 +427,7 @@ static int handle_4MB_shadow_pagefault_32(struct guest_info * info,
     PrintDebug("Handling 4MB fault (guest_fault_pa=%p) (error_code=%x)\n", (void *)guest_fault_pa, *(uint_t*)&error_code);
     PrintDebug("ShadowPT=%p, LargeGuestPDE=%p\n", shadow_pt, large_guest_pde);
 
-    struct v3_shadow_region * shdw_reg = v3_get_shadow_region(info, guest_fault_pa);
+    struct v3_shadow_region * shdw_reg = v3_get_shadow_region(info->vm_info, info->cpu_id, guest_fault_pa);
 
  
     if (shdw_reg == NULL) {
@@ -422,7 +450,7 @@ static int handle_4MB_shadow_pagefault_32(struct guest_info * info,
 
        if ((shdw_reg->host_type == SHDW_REGION_ALLOCATED) || 
            (shdw_reg->host_type == SHDW_REGION_WRITE_HOOK)) {
-           addr_t shadow_pa = v3_get_shadow_addr(shdw_reg, guest_fault_pa);
+           addr_t shadow_pa = v3_get_shadow_addr(shdw_reg, info->cpu_id, guest_fault_pa);
 
            shadow_pte->page_base_addr = PAGE_BASE_ADDR(shadow_pa);