#include <palacios/vmm_shadow_paging.h>
#include <palacios/vmm_direct_paging.h>
+#include <interfaces/vmm_numa.h>
uint64_t v3_mem_block_size = V3_CONFIG_MEM_BLOCK_SIZE;
struct v3_mem_map * map = &(vm->mem_map);
uint32_t block_index = gpa / v3_mem_block_size;
- if (gpa > (map->num_base_regions * v3_mem_block_size) ||
+ if ((gpa >= (map->num_base_regions * v3_mem_block_size)) ||
(block_index >= map->num_base_regions)) {
PrintError(vm, VCORE_NONE, "Guest Address Exceeds Base Memory Size (ga=0x%p), (limit=0x%p)\n",
(void *)gpa, (void *)vm->mem_size);
region->host_addr = (addr_t)V3_AllocPagesExtended(block_pages,
PAGE_SIZE_4KB,
node_id,
- will_use_shadow_paging(vm) ?
- V3_ALLOC_PAGES_CONSTRAINT_4GB : 0 );
+ 0); // no constraints
if ((void *)region->host_addr == NULL) {
PrintError(vm, VCORE_NONE, "Could not allocate guest memory\n");
// Clear the memory...
memset(V3_VAddr((void *)region->host_addr), 0, v3_mem_block_size);
+
+ // Note assigned numa ID could be different than our request...
+ region->numa_id = v3_numa_hpa_to_node(region->host_addr);
region->flags.read = 1;
region->flags.write = 1;
region->flags.exec = 1;
region->flags.base = 1;
region->flags.alloced = 1;
+ region->flags.limit32 = will_use_shadow_paging(vm);
+
region->unhandled = unhandled_err;
}
struct v3_mem_region * start_region = v3_get_mem_region(vm, core_id, start_gpa);
if (start_region == NULL) {
- PrintError(vm, VCORE_NONE, "Invalid memory region\n");
+ PrintError(vm, VCORE_NONE, "No overlapping region for core=%d, start_gpa=%p\n", core_id, (void*)start_gpa);
+ v3_print_mem_map(vm);
return NULL;
}