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");
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);