X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_shadow_paging.c;h=f57dddabce0742d5f82375d8d28315d38d671e0a;hb=7229981629c6baa0afb61cc99cfcf6dd029c9c93;hp=da219c260a3d57df7d6f6626c96a7c6be674889e;hpb=570f2903178711d599b0ba465901f52bdc6d66a6;p=palacios.git diff --git a/palacios/src/palacios/vmm_shadow_paging.c b/palacios/src/palacios/vmm_shadow_paging.c index da219c2..f57ddda 100644 --- a/palacios/src/palacios/vmm_shadow_paging.c +++ b/palacios/src/palacios/vmm_shadow_paging.c @@ -33,20 +33,22 @@ -#ifdef CONFIG_SHADOW_PAGING_TELEMETRY +#ifdef V3_CONFIG_SHADOW_PAGING_TELEMETRY #include #endif -#ifdef CONFIG_SYMBIOTIC_SWAP +#ifdef V3_CONFIG_SYMBIOTIC_SWAP #include #endif -#ifndef CONFIG_DEBUG_SHADOW_PAGING +#ifndef V3_CONFIG_DEBUG_SHADOW_PAGING #undef PrintDebug #define PrintDebug(fmt, args...) #endif +static const char default_strategy[] = "VTLB"; + static struct hashtable * master_shdw_pg_table = NULL; @@ -93,6 +95,11 @@ int V3_init_shdw_paging() { return 0; } +int V3_deinit_shdw_paging() { + v3_free_htable(master_shdw_pg_table, 0, 0); + return 0; +} + /*** @@ -100,7 +107,7 @@ int V3_init_shdw_paging() { ***/ -#ifdef CONFIG_SHADOW_PAGING_TELEMETRY +#ifdef V3_CONFIG_SHADOW_PAGING_TELEMETRY static void telemetry_cb(struct v3_vm_info * vm, void * private_data, char * hdr) { int i = 0; for (i = 0; i < vm->num_cores; i++) { @@ -129,7 +136,7 @@ int v3_init_shdw_pg_state(struct guest_info * core) { } -#ifdef CONFIG_SHADOW_PAGING_TELEMETRY +#ifdef V3_CONFIG_SHADOW_PAGING_TELEMETRY v3_add_telemetry_cb(core->vm_info, telemetry_cb, NULL); #endif @@ -137,26 +144,43 @@ int v3_init_shdw_pg_state(struct guest_info * core) { } +int v3_deinit_shdw_pg_state(struct guest_info * core) { + struct v3_shdw_pg_impl * impl = core->vm_info->shdw_impl.current_impl; + + if (impl->local_deinit(core) == -1) { + PrintError("Error deinitializing shadow paging state\n"); + return -1; + } + + + return 0; +} + + 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, "type"); - char * impl_name = v3_cfg_val(pg_cfg, "mode"); + char * pg_mode = v3_cfg_val(pg_cfg, "mode"); + char * pg_strat = v3_cfg_val(pg_cfg, "strategy"); struct v3_shdw_pg_impl * impl = NULL; PrintDebug("Checking if shadow paging requested.\n"); - if (type_name && (strcasecmp(type_name, "nested") == 0)) { + if ((pg_mode != NULL) && (strcasecmp(pg_mode, "nested") == 0)) { PrintDebug("Nested paging specified - not initializing shadow paging.\n"); return 0; } + + if (pg_strat == NULL) { + pg_strat = (char *)default_strategy; + } 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); + impl = (struct v3_shdw_pg_impl *)v3_htable_search(master_shdw_pg_table, (addr_t)pg_strat); if (impl == NULL) { - PrintError("Could not find shadow paging impl (%s)\n", impl_name); + PrintError("Could not find shadow paging impl (%s)\n", pg_strat); return -1; } @@ -167,8 +191,16 @@ int v3_init_shdw_impl(struct v3_vm_info * vm) { return -1; } - + return 0; +} + +int v3_deinit_shdw_impl(struct v3_vm_info * vm) { + struct v3_shdw_pg_impl * impl = vm->shdw_impl.current_impl; + if (impl->deinit(vm) == -1) { + PrintError("Error deinitializing shadow paging implementation\n"); + return -1; + } return 0; } @@ -267,7 +299,7 @@ int v3_handle_shadow_invlpg(struct guest_info * core) { int v3_inject_guest_pf(struct guest_info * core, addr_t fault_addr, pf_error_t error_code) { core->ctrl_regs.cr2 = fault_addr; -#ifdef CONFIG_SHADOW_PAGING_TELEMETRY +#ifdef V3_CONFIG_SHADOW_PAGING_TELEMETRY core->shdw_pg_state.guest_faults++; #endif