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.


update page free interface to allow freeing of multiple pages (needed for linux)
Jack Lange [Fri, 19 Nov 2010 03:44:07 +0000 (21:44 -0600)]
palacios/include/palacios/vmm.h
palacios/src/palacios/mmu/vmm_shdw_pg_kvm.c
palacios/src/palacios/vmm_mem.c
palacios/src/palacios/vmm_paging.c

index 8742ff6..a0827fd 100644 (file)
@@ -90,11 +90,11 @@ struct guest_info;
     })
 
 
-#define V3_FreePage(page)                              \
+#define V3_FreePages(page, num_pages)                  \
     do {                                               \
        extern struct v3_os_hooks * os_hooks;           \
-       if ((os_hooks) && (os_hooks)->free_page) {      \
-           (os_hooks)->free_page(page);                \
+       if ((os_hooks) && (os_hooks)->free_pages) {     \
+           (os_hooks)->free_pages(page, num_pages);    \
        }                                               \
     } while(0)
 
@@ -270,14 +270,14 @@ struct v3_os_hooks {
     void (*print)(const char * format, ...)
        __attribute__ ((format (printf, 1, 2)));
   
-    void *(*allocate_pages)(int numPages, unsigned int alignment);
-    void (*free_page)(void * page);
+    void *(*allocate_pages)(int num_pages, unsigned int alignment);
+    void (*free_pages)(void * page, int num_pages);
 
     void *(*malloc)(unsigned int size);
     void (*free)(void * addr);
 
-    void *(*paddr_to_vaddr)(void *addr);
-    void *(*vaddr_to_paddr)(void *addr);
+    void *(*paddr_to_vaddr)(void * addr);
+    void *(*vaddr_to_paddr)(void * addr);
 
     int (*hook_interrupt)(struct v3_vm_info * vm, unsigned int irq);
     int (*ack_irq)(int irq);
index decf6b9..250cbba 100644 (file)
@@ -116,7 +116,7 @@ static void shadow_free_page (struct guest_info * core, struct shadow_page_cache
 {
     list_del(&page->link);
 
-    V3_FreePage((void *)page->page_pa);
+    V3_FreePages((void *)page->page_pa, 1);
     page->page_pa=(addr_t)V3_AllocPages(1);
        
     list_add(&page->link,&core->free_pages);
@@ -163,7 +163,7 @@ static void free_shadow_pages(struct guest_info * core)
     while (!list_empty(&core->free_pages)) {
        page = list_entry(core->free_pages.next, struct shadow_page_cache_data, link);
        list_del(&page->link);
-       V3_FreePage((void *)page->page_pa);
+       V3_FreePages((void *)page->page_pa, 1);
        page->page_pa = ~(addr_t)0; //invalid address
     }
 }
index a1505c3..56dcbbb 100644 (file)
@@ -96,6 +96,7 @@ void v3_delete_mem_map(struct v3_vm_info * vm) {
     struct rb_node * node = v3_rb_first(&(vm->mem_map.mem_regions));
     struct v3_mem_region * reg;
     struct rb_node * tmp_node = NULL;
+    addr_t mem_pages = vm->mem_size >> 12;
   
     while (node) {
        reg = rb_entry(node, struct v3_mem_region, tree_node);
@@ -105,7 +106,7 @@ void v3_delete_mem_map(struct v3_vm_info * vm) {
        v3_delete_mem_region(vm, reg);
     }
 
-    V3_FreePage((void *)(vm->mem_map.base_region.host_addr));
+    V3_FreePages((void *)(vm->mem_map.base_region.host_addr), mem_pages);
 }
 
 
index 1030fe2..05d1025 100644 (file)
@@ -67,11 +67,11 @@ void delete_page_tables_32(pde32_t * pde) {
            // We double cast, first to an addr_t to handle 64 bit issues, then to the pointer
       
            PrintDebug("Deleting PT Page %d (%p)\n", i, (void *)(addr_t)BASE_TO_PAGE_ADDR_4KB(pde[i].pt_base_addr));
-           V3_FreePage((void *)(addr_t)BASE_TO_PAGE_ADDR_4KB(pde[i].pt_base_addr));
+           V3_FreePages((void *)(addr_t)BASE_TO_PAGE_ADDR_4KB(pde[i].pt_base_addr), 1);
        }
     }
 
-    V3_FreePage(V3_PAddr(pde));
+    V3_FreePages(V3_PAddr(pde), 1);
 }
 
 void delete_page_tables_32pae(pdpe32pae_t * pdpe) {
@@ -96,13 +96,13 @@ void delete_page_tables_32pae(pdpe32pae_t * pdpe) {
                continue;
            }
 
-           V3_FreePage((void *)(addr_t)BASE_TO_PAGE_ADDR_4KB(pde[j].pt_base_addr));
+           V3_FreePages((void *)(addr_t)BASE_TO_PAGE_ADDR_4KB(pde[j].pt_base_addr), 1);
        }
 
-       V3_FreePage(V3_PAddr(pde));
+       V3_FreePages(V3_PAddr(pde), 1);
     }
 
-    V3_FreePage(V3_PAddr(pdpe));
+    V3_FreePages(V3_PAddr(pdpe), 1);
 }
 
 void delete_page_tables_64(pml4e64_t * pml4) {
@@ -133,16 +133,16 @@ void delete_page_tables_64(pml4e64_t * pml4) {
                    continue;
                }
 
-               V3_FreePage((void *)(addr_t)BASE_TO_PAGE_ADDR_4KB(pde[k].pt_base_addr));
+               V3_FreePages((void *)(addr_t)BASE_TO_PAGE_ADDR_4KB(pde[k].pt_base_addr), 1);
            }
            
-           V3_FreePage(V3_PAddr(pde));
+           V3_FreePages(V3_PAddr(pde), 1);
        }
 
-       V3_FreePage(V3_PAddr(pdpe));
+       V3_FreePages(V3_PAddr(pdpe), 1);
     }
 
-    V3_FreePage(V3_PAddr(pml4));
+    V3_FreePages(V3_PAddr(pml4), 1);
 }