X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_mem.c;h=c43dcae3c4063ff075f0171d48fdf8c98bdaf092;hb=481925dd42fdf715897007abbc32d81bda2d2586;hp=2a4782232ed2757c942e58f33ce0708eaf94fab9;hpb=e8fd1090974b1f82edd92d155ccdad6ad24b074b;p=palacios.git diff --git a/palacios/src/palacios/vmm_mem.c b/palacios/src/palacios/vmm_mem.c index 2a47822..c43dcae 100644 --- a/palacios/src/palacios/vmm_mem.c +++ b/palacios/src/palacios/vmm_mem.c @@ -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); } @@ -410,6 +411,19 @@ void v3_delete_mem_region(struct v3_vm_info * vm, struct v3_mem_region * reg) { return; } + + v3_rb_erase(&(reg->tree_node), &(vm->mem_map.mem_regions)); + + + + // If the guest isn't running then there shouldn't be anything to invalidate. + // Page tables should __always__ be created on demand during execution + // NOTE: This is a sanity check, and can be removed if that assumption changes + if (vm->run_state != VM_RUNNING) { + V3_Free(reg); + return; + } + for (i = 0; i < vm->num_cores; i++) { struct guest_info * info = &(vm->cores[i]); @@ -443,8 +457,6 @@ void v3_delete_mem_region(struct v3_vm_info * vm, struct v3_mem_region * reg) { } } - v3_rb_erase(&(reg->tree_node), &(vm->mem_map.mem_regions)); - V3_Free(reg); // flush virtual page tables @@ -458,9 +470,6 @@ uint32_t v3_get_max_page_size(struct guest_info * core, addr_t page_addr, v3_cpu addr_t pg_end = 0; uint32_t page_size = PAGE_SIZE_4KB; struct v3_mem_region * reg = NULL; - - - PrintError("Getting max page size for addr %p\n", (void *)page_addr); switch (mode) { case PROTECTED: @@ -518,8 +527,6 @@ uint32_t v3_get_max_page_size(struct guest_info * core, addr_t page_addr, v3_cpu return -1; } - - PrintError("Returning PAGE size = %d\n", page_size); return page_size; }