From: Patrick Bridges Date: Thu, 29 Jul 2010 17:48:14 +0000 (-0600) Subject: Debugged changes to make shadow and nested paging configurable again. X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=6d9d2f66b15fba2d85c6f74c84eee68444219775 Debugged changes to make shadow and nested paging configurable again. --- diff --git a/palacios/src/palacios/vmm_config.c b/palacios/src/palacios/vmm_config.c index cac4de5..e60f05b 100644 --- a/palacios/src/palacios/vmm_config.c +++ b/palacios/src/palacios/vmm_config.c @@ -241,23 +241,29 @@ static int pre_config_vm(struct v3_vm_info * vm, v3_cfg_tree_t * vm_cfg) { return 0; } -static int pre_config_core(struct guest_info * info, v3_cfg_tree_t * core_cfg) { +static int determine_paging_mode(struct guest_info *info, v3_cfg_tree_t * core_cfg) +{ extern v3_cpu_arch_t v3_cpu_types[]; - v3_cfg_tree_t * paging_cfg = v3_cfg_subtree(core_cfg, "paging"); - char * paging = v3_cfg_val(paging_cfg, NULL); - if (paging) { - if ((strcasecmp(paging, "nested") == 0)) { + v3_cfg_tree_t *vm_tree = info->vm_info->cfg_data->cfg; + v3_cfg_tree_t *pg_tree = v3_cfg_subtree(vm_tree, "paging"); + char *pg_type = v3_cfg_val(pg_tree, "type"); + char *pg_mode = v3_cfg_val(pg_tree, "mode"); + + PrintDebug("Paging mode specified as %s(%s)\n", pg_type, pg_mode); + + if (pg_type) { + if ((strcasecmp(pg_type, "nested") == 0)) { if (v3_cpu_types[info->cpu_id] == V3_SVM_REV3_CPU) { 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(paging, "shadow") == 0)) { + } else if ((strcasecmp(pg_type, "shadow") == 0)) { info->shdw_pg_mode = SHADOW_PAGING; } else { - PrintError("Invalid paging type specified in configuration. Defaulting to shadow paging\n"); + PrintError("Invalid paging type (%s) specified in configuration. Defaulting to shadow paging\n", pg_type); info->shdw_pg_mode = SHADOW_PAGING; } } else { @@ -272,6 +278,13 @@ static int pre_config_core(struct guest_info * info, v3_cfg_tree_t * core_cfg) { PrintError("Guest paging mode incorrectly set.\n"); return -1; } + return 0; +} + +static int pre_config_core(struct guest_info * info, v3_cfg_tree_t * core_cfg) { + + if (!determine_paging_mode(info, core_cfg)) + return -1; v3_init_core(info); diff --git a/palacios/src/palacios/vmm_shadow_paging.c b/palacios/src/palacios/vmm_shadow_paging.c index bd39cba..f4e9f32 100644 --- a/palacios/src/palacios/vmm_shadow_paging.c +++ b/palacios/src/palacios/vmm_shadow_paging.c @@ -141,10 +141,11 @@ int v3_init_shdw_pg_state(struct guest_info * core) { int v3_init_shdw_impl(struct v3_vm_info * vm) { struct v3_shdw_impl_state * impl_state = &(vm->shdw_impl); v3_cfg_tree_t * pg_cfg = v3_cfg_subtree(vm->cfg_data->cfg, "paging"); - char * type_name = v3_cfg_val(pg_cfg, NULL); + char * type_name = v3_cfg_val(pg_cfg, "type"); char * impl_name = v3_cfg_val(pg_cfg, "mode"); struct v3_shdw_pg_impl * impl = NULL; + PrintDebug("Checking if shadow paging requested.\n"); if (type_name && (strcasecmp(type_name, "shadow") != 0)) { PrintDebug("Shadow paging not specified for VM.\n"); return 0; diff --git a/utils/guest_creator/default.xml b/utils/guest_creator/default.xml index 5741088..a11f33e 100644 --- a/utils/guest_creator/default.xml +++ b/utils/guest_creator/default.xml @@ -7,7 +7,8 @@ enable - shadow + + 100