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.


lots of fixes
[palacios.git] / palacios / src / palacios / vmm_shadow_paging_32.h
index c358c3c..fc2df95 100644 (file)
@@ -230,8 +230,18 @@ 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++;
@@ -240,54 +250,72 @@ static int handle_pte_shadow_pagefault_32(struct guest_info * info, addr_t fault
            }
 #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,  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, 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->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);