X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_mem.c;h=390de616db8317747748076d328930281ca948b4;hb=3f777ee2e04c359758b0658b04ff8f076d38f2f9;hp=cb5993a71a0347f9bdb7c6f5b8adad5393074735;hpb=94f67717b6461df514dc225ed84f03b44c44061b;p=palacios.git diff --git a/palacios/src/palacios/vmm_mem.c b/palacios/src/palacios/vmm_mem.c index cb5993a..390de61 100644 --- a/palacios/src/palacios/vmm_mem.c +++ b/palacios/src/palacios/vmm_mem.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -72,6 +73,15 @@ int v3_init_mem_map(struct v3_vm_info * vm) { map->base_region.host_addr = (addr_t)V3_AllocPages(mem_pages); #endif + if ((void*)map->base_region.host_addr == NULL) { + PrintError("Could not allocate guest memory\n"); + return -1; + } + + // Clear the memory... + memset(V3_VAddr((void *)map->base_region.host_addr), 0, mem_pages * PAGE_SIZE_4KB); + + map->base_region.flags.read = 1; map->base_region.flags.write = 1; map->base_region.flags.exec = 1; @@ -80,13 +90,6 @@ int v3_init_mem_map(struct v3_vm_info * vm) { map->base_region.unhandled = unhandled_err; - if ((void *)map->base_region.host_addr == NULL) { - PrintError("Could not allocate Guest memory\n"); - return -1; - } - - //memset(V3_VAddr((void *)map->base_region.host_addr), 0xffffffff, map->base_region.guest_end); - v3_register_hypercall(vm, MEM_OFFSET_HCALL, mem_offset_hypercall, NULL); return 0; @@ -113,8 +116,20 @@ void v3_delete_mem_map(struct v3_vm_info * vm) { struct v3_mem_region * v3_create_mem_region(struct v3_vm_info * vm, uint16_t core_id, addr_t guest_addr_start, addr_t guest_addr_end) { - - struct v3_mem_region * entry = (struct v3_mem_region *)V3_Malloc(sizeof(struct v3_mem_region)); + struct v3_mem_region * entry = NULL; + + if (guest_addr_start >= guest_addr_end) { + PrintError("Region start is after region end\n"); + return NULL; + } + + entry = (struct v3_mem_region *)V3_Malloc(sizeof(struct v3_mem_region)); + + if (!entry) { + PrintError("Cannot allocate in creating a memory region\n"); + return NULL; + } + memset(entry, 0, sizeof(struct v3_mem_region)); entry->guest_start = guest_addr_start; @@ -302,6 +317,10 @@ static struct v3_mem_region * get_next_mem_region( struct v3_vm_info * vm, uint1 struct v3_mem_region * reg = NULL; struct v3_mem_region * parent = NULL; + if (n == NULL) { + return NULL; + } + while (n) { reg = rb_entry(n, struct v3_mem_region, tree_node); @@ -478,7 +497,7 @@ uint32_t v3_get_max_page_size(struct guest_info * core, addr_t page_addr, v3_cpu pg_start = PAGE_ADDR_4MB(page_addr); pg_end = (pg_start + PAGE_SIZE_4MB); - reg = get_overlapping_region(core->vm_info, core->cpu_id, pg_start, pg_end); + reg = get_overlapping_region(core->vm_info, core->vcpu_id, pg_start, pg_end); if ((reg) && ((reg->host_addr % PAGE_SIZE_4MB) == 0)) { page_size = PAGE_SIZE_4MB; @@ -490,7 +509,7 @@ uint32_t v3_get_max_page_size(struct guest_info * core, addr_t page_addr, v3_cpu pg_start = PAGE_ADDR_2MB(page_addr); pg_end = (pg_start + PAGE_SIZE_2MB); - reg = get_overlapping_region(core->vm_info, core->cpu_id, pg_start, pg_end); + reg = get_overlapping_region(core->vm_info, core->vcpu_id, pg_start, pg_end); if ((reg) && ((reg->host_addr % PAGE_SIZE_2MB) == 0)) { page_size = PAGE_SIZE_2MB; @@ -504,7 +523,7 @@ uint32_t v3_get_max_page_size(struct guest_info * core, addr_t page_addr, v3_cpu pg_start = PAGE_ADDR_1GB(page_addr); pg_end = (pg_start + PAGE_SIZE_1GB); - reg = get_overlapping_region(core->vm_info, core->cpu_id, pg_start, pg_end); + reg = get_overlapping_region(core->vm_info, core->vcpu_id, pg_start, pg_end); if ((reg) && ((reg->host_addr % PAGE_SIZE_1GB) == 0)) { page_size = PAGE_SIZE_1GB; @@ -516,7 +535,7 @@ uint32_t v3_get_max_page_size(struct guest_info * core, addr_t page_addr, v3_cpu pg_start = PAGE_ADDR_2MB(page_addr); pg_end = (pg_start + PAGE_SIZE_2MB); - reg = get_overlapping_region(core->vm_info, core->cpu_id, pg_start, pg_end); + reg = get_overlapping_region(core->vm_info, core->vcpu_id, pg_start, pg_end); if ((reg) && ((reg->host_addr % PAGE_SIZE_2MB) == 0)) { page_size = PAGE_SIZE_2MB;