#include <palacios/vmm_sprintf.h>
+#ifdef V3_CONFIG_SWAPPING
+#include <palacios/vmm_swapping.h>
+#endif
+#ifdef V3_CONFIG_MULTIBOOT
+#include <palacios/vmm_multiboot.h>
+#endif
+#ifdef V3_CONFIG_HVM
+#include <palacios/vmm_hvm.h>
+#endif
#include <palacios/vmm_host_events.h>
#include <palacios/vmm_perftune.h>
#define COOKIE_V0 "v3vee\0\0\0"
#define COOKIE_V1 "v3vee\0\0\1"
-
-
-
// This is used to access the configuration file index table
struct file_hdr_v0 {
uint32_t index;
V3_Print(VM_NONE, VCORE_NONE, "File index=%d id=%s\n", idx, id);
strncpy(file->tag, id, V3_MAX_TAG_LEN);
+ file->tag[V3_MAX_TAG_LEN-1] = 0 ;
if (version==0) {
struct file_hdr_v0 * hdr = &(files_v0->hdrs[idx]);
if (alignment != PAGE_SIZE_4KB) {
PrintError(VM_NONE, VCORE_NONE, "Aligned page allocations are not supported in this host (requested alignment=%d)\n", alignment);
PrintError(VM_NONE, VCORE_NONE, "Ignoring alignment request\n");
+ alignment = PAGE_SIZE_4KB;
}
#endif
}
+
static int pre_config_vm(struct v3_vm_info * vm, v3_cfg_tree_t * vm_cfg) {
char * memory_str = v3_cfg_val(vm_cfg, "memory");
char * schedule_hz_str = v3_cfg_val(vm_cfg, "schedule_hz");
char * vm_class = v3_cfg_val(vm_cfg, "class");
char * align_str = v3_cfg_val(v3_cfg_subtree(vm_cfg, "memory"), "alignment");
uint32_t sched_hz = 100; // set the schedule frequency to 100 HZ
-
+
if (!memory_str) {
PrintError(VM_NONE, VCORE_NONE, "Memory is a required configuration parameter\n");
vm->mem_size = (addr_t)atoi(memory_str) * 1024 * 1024;
vm->mem_align = get_alignment(align_str);
-
+ // set up defaults for memory management for threads associated
+ // with this VM
+ vm->resource_control.pg_alignment=vm->mem_align;
+ vm->resource_control.pg_node_id=-1;
+
+#ifdef V3_CONFIG_SWAPPING
+ if (v3_init_swapping_vm(vm,vm_cfg)) {
+ PrintError(vm,VCORE_NONE,"Unable to initialize swapping correctly\n");
+ return -1;
+ }
+ if (vm->swap_state.enable_swapping) {
+ PrintDebug(vm,VCORE_NONE,"Swapping enabled\n");
+ } else {
+ PrintDebug(vm,VCORE_NONE,"Swapping disabled\n");
+ }
+#endif
+
PrintDebug(VM_NONE, VCORE_NONE, "Alignment for %lu bytes of memory computed as 0x%x\n", vm->mem_size, vm->mem_align);
if (strcasecmp(vm_class, "PC") == 0) {
return -1;
}
-
+#ifdef V3_CONFIG_MULTIBOOT
+ if (v3_init_multiboot_vm(vm,vm_cfg)) {
+ PrintError(vm,VCORE_NONE,"Cannot initialize Multiboot for VM\n");
+ return -1;
+ }
+#endif
+#ifdef V3_CONFIG_HVM
+ if (v3_init_hvm_vm(vm,vm_cfg)) {
+ PrintError(vm,VCORE_NONE,"Cannot initialize HVM for VM\n");
+ return -1;
+ }
+#endif
if (schedule_hz_str) {
sched_hz = atoi(schedule_hz_str);
return -1;
}
+#ifdef V3_CONFIG_MULTIBOOT
+ if (v3_init_multiboot_core(info)) {
+ PrintError(info->vm_info, info, "Error Initializing Multiboot Core\n");
+ return -1;
+ }
+#endif
+#ifdef V3_CONFIG_HVM
+ if (v3_init_hvm_core(info)) {
+ PrintError(info->vm_info, info, "Error Initializing HVM Core\n");
+ return -1;
+ }
+#endif
+
if (info->vm_info->vm_class == V3_PC_VM) {
if (pre_config_pc_core(info, core_cfg) == -1) {
PrintError(info->vm_info, info, "PC Post configuration failure\n");
return vm;
}
+/*
+
+
+*/
struct v3_vm_info * v3_config_guest(void * cfg_blob, void * priv_data) {
v3_cfg_tree_t * cores_cfg = NULL;
v3_cfg_tree_t * per_core_cfg = NULL;
+
if (v3_mach_type == V3_INVALID_CPU) {
PrintError(VM_NONE, VCORE_NONE, "Configuring guest on invalid CPU\n");
return NULL;
cfg_data = parse_config(cfg_blob);
+
if (!cfg_data) {
PrintError(VM_NONE, VCORE_NONE, "Could not parse configuration\n");
return NULL;
}
+
cores_cfg = v3_cfg_subtree(cfg_data->cfg, "cores");
if (!cores_cfg) {
return NULL;
}
+#ifdef V3_CONFIG_CACHEPART
+ // Need to initialize cache management and resource control
+ // as early as possible so that allocations are done accordingly
+ if (v3_init_cachepart_vm(vm,cfg_data->cfg)) {
+ PrintError(VM_NONE, VCORE_NONE, "Could not initialize cache partioning\n");
+ V3_Free(vm);
+ return NULL;
+ }
+#endif
+
vm->host_priv_data = priv_data;
vm->cfg_data = cfg_data;