#include <palacios/vmm_xml.h>
#include <palacios/vmm_io.h>
#include <palacios/vmm_msr.h>
-#include <palacios/vmm_mptable.h>
#include <palacios/vmm_sprintf.h>
static int determine_paging_mode(struct guest_info * info, v3_cfg_tree_t * core_cfg) {
- extern v3_cpu_arch_t v3_cpu_types[];
+ extern v3_cpu_arch_t v3_mach_type;
v3_cfg_tree_t * vm_tree = info->vm_info->cfg_data->cfg;
v3_cfg_tree_t * pg_tree = v3_cfg_subtree(vm_tree, "paging");
if (pg_mode) {
if ((strcasecmp(pg_mode, "nested") == 0)) {
// we assume symmetric cores, so if core 0 has nested paging they all do
- if ((v3_cpu_types[0] == V3_SVM_REV3_CPU) ||
- (v3_cpu_types[0] == V3_VMX_EPT_CPU) ||
- (v3_cpu_types[0] == V3_VMX_EPT_UG_CPU)) {
+ if ((v3_mach_type == V3_SVM_REV3_CPU) ||
+ (v3_mach_type == V3_VMX_EPT_CPU) ||
+ (v3_mach_type == V3_VMX_EPT_UG_CPU)) {
+
+ V3_Print("Setting paging mode to NESTED\n");
info->shdw_pg_mode = NESTED_PAGING;
} else {
PrintError("Nested paging not supported on this hardware. Defaulting to shadow paging\n");
info->shdw_pg_mode = SHADOW_PAGING;
}
} else if ((strcasecmp(pg_mode, "shadow") == 0)) {
+ V3_Print("Setting paging mode to SHADOW\n");
info->shdw_pg_mode = SHADOW_PAGING;
} else {
PrintError("Invalid paging mode (%s) specified in configuration. Defaulting to shadow paging\n", pg_mode);
info->shdw_pg_mode = SHADOW_PAGING;
}
} else {
- PrintDebug("No paging type specified in configuration. Defaulting to shadow paging\n");
+ V3_Print("No paging type specified in configuration. Defaulting to shadow paging\n");
info->shdw_pg_mode = SHADOW_PAGING;
}
return -1;
}
- v3_init_core(info);
+ if (v3_init_core(info) == -1) {
+ PrintError("Error Initializing Core\n");
+ return -1;
+ }
if (info->vm_info->vm_class == V3_PC_VM) {
if (pre_config_pc_core(info, core_cfg) == -1) {
static int post_config_vm(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) {
- vm->run_state = VM_STOPPED;
+
// Configure the memory map for the guest
if (setup_memory_map(vm, cfg) == -1) {
return -1;
}
- /*
- * Initialize configured extensions
- */
- if (setup_extensions(vm, cfg) == -1) {
- PrintError("Failed to setup extensions\n");
+
+ if (vm->vm_class == V3_PC_VM) {
+ if (post_config_pc(vm, cfg) == -1) {
+ PrintError("PC Post configuration failure\n");
+ return -1;
+ }
+ } else {
+ PrintError("Invalid VM Class\n");
return -1;
}
+
/*
* Initialize configured devices
*/
v3_print_msr_map(vm);
- if (vm->vm_class == V3_PC_VM) {
- if (post_config_pc(vm, cfg) == -1) {
- PrintError("PC Post configuration failure\n");
- return -1;
- }
- } else {
- PrintError("Invalid VM Class\n");
+
+
+ /*
+ * Initialize configured extensions
+ */
+ if (setup_extensions(vm, cfg) == -1) {
+ PrintError("Failed to setup extensions\n");
return -1;
}
+
+ vm->run_state = VM_STOPPED;
+
return 0;
}
static int post_config_core(struct guest_info * info, v3_cfg_tree_t * cfg) {
- info->core_run_state = CORE_STOPPED;
if (v3_init_core_extensions(info) == -1) {
PrintError("Error intializing extension core states\n");
static struct v3_vm_info * allocate_guest(int num_cores) {
int guest_state_size = sizeof(struct v3_vm_info) + (sizeof(struct guest_info) * num_cores);
struct v3_vm_info * vm = V3_Malloc(guest_state_size);
+ int i = 0;
memset(vm, 0, guest_state_size);
vm->num_cores = num_cores;
+ for (i = 0; i < num_cores; i++) {
+ vm->cores[i].core_run_state = CORE_INVALID;
+ }
+
+ vm->run_state = VM_INVALID;
+
return vm;
}
struct v3_vm_info * v3_config_guest(void * cfg_blob, void * priv_data) {
- v3_cpu_arch_t cpu_type = v3_get_cpu_type(V3_Get_CPU());
+ extern v3_cpu_arch_t v3_mach_type;
struct v3_config * cfg_data = NULL;
struct v3_vm_info * vm = NULL;
int num_cores = 0;
v3_cfg_tree_t * cores_cfg = NULL;
v3_cfg_tree_t * per_core_cfg = NULL;
- if (cpu_type == V3_INVALID_CPU) {
+ if (v3_mach_type == V3_INVALID_CPU) {
PrintError("Configuring guest on invalid CPU\n");
return NULL;
}
for (i = 0; i < vm->num_cores; i++) {
struct guest_info * info = &(vm->cores[i]);
- info->cpu_id = i;
+ info->vcpu_id = i;
info->vm_info = vm;
info->core_cfg_data = per_core_cfg;