})
-#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)
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);
{
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);
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
}
}
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);
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);
}
// 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) {
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) {
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);
}