From: Patrick Bridges Date: Tue, 27 Jul 2010 19:02:22 +0000 (-0600) Subject: Fixed up configuration support for nested/shadow paging X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=commitdiff_plain;h=00fc14723ccdc218a89755cbf750167071d68b35;p=palacios.git Fixed up configuration support for nested/shadow paging --- diff --git a/palacios/src/palacios/vmm_config.c b/palacios/src/palacios/vmm_config.c index 39c4d49..4c37015 100644 --- a/palacios/src/palacios/vmm_config.c +++ b/palacios/src/palacios/vmm_config.c @@ -244,24 +244,37 @@ static int pre_config_vm(struct v3_vm_info * vm, v3_cfg_tree_t * vm_cfg) { static int pre_config_core(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, "mode"); - - - - if ((v3_cpu_types[info->cpu_id] == V3_SVM_REV3_CPU) && - (paging) && (strcasecmp(paging, "nested") == 0)) { - PrintDebug("Guest Page Mode: NESTED_PAGING\n"); - info->shdw_pg_mode = NESTED_PAGING; + char * paging = v3_cfg_val(paging_cfg, NULL); + + if (paging) { + if ((strcasecmp(paging, "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)) { + info->shdw_pg_mode = SHADOW_PAGING; + } else { + PrintError("Invalid paging type specified in configuration. Defaulting to shadow paging\n"); + info->shdw_pg_mode = SHADOW_PAGING; + } } else { - PrintDebug("Guest Page Mode: SHADOW_PAGING\n"); - + PrintDebug("No paging type specified in configuration.\n"); info->shdw_pg_mode = SHADOW_PAGING; } - + if (info->shdw_pg_mode == NESTED_PAGING) { + PrintDebug("Guest Page Mode: NESTED_PAGING\n"); + } else if (info->shdw_pg_mode == SHADOW_PAGING) { + PrintDebug("Guest Page Mode: SHADOW_PAGING\n"); + } else { + PrintError("Guest paging mode incorrectly set.\n"); + return -1; + } v3_init_core(info); - if (info->vm_info->vm_class == V3_PC_VM) { if (pre_config_pc_core(info, core_cfg) == -1) { PrintError("PC Post configuration failure\n"); diff --git a/palacios/src/palacios/vmm_shadow_paging.c b/palacios/src/palacios/vmm_shadow_paging.c index 4f9d00f..bd39cba 100644 --- a/palacios/src/palacios/vmm_shadow_paging.c +++ b/palacios/src/palacios/vmm_shadow_paging.c @@ -141,9 +141,15 @@ 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 * impl_name = v3_cfg_val(pg_cfg, "mode"); struct v3_shdw_pg_impl * impl = NULL; + if (type_name && (strcasecmp(type_name, "shadow") != 0)) { + PrintDebug("Shadow paging not specified for VM.\n"); + return 0; + } + V3_Print("Initialization of Shadow Paging implementation\n"); impl = (struct v3_shdw_pg_impl *)v3_htable_search(master_shdw_pg_table, (addr_t)impl_name); diff --git a/utils/guest_creator/default.xml b/utils/guest_creator/default.xml index 9d94d3f..603eb83 100644 --- a/utils/guest_creator/default.xml +++ b/utils/guest_creator/default.xml @@ -7,7 +7,7 @@ enable - + shadow 100