X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_shadow_paging.c;h=b46469ca86331445f15f60454617dc45bc3c8b48;hb=a54d166ba28dae8eb26498794bd5e94fc43267a3;hp=434b34ed556b95ee36699015d357186fe344173b;hpb=6adf4a960b1a2999fa47f5e29e7583cfdf4d3b6f;p=palacios.git diff --git a/palacios/src/palacios/vmm_shadow_paging.c b/palacios/src/palacios/vmm_shadow_paging.c index 434b34e..b46469c 100644 --- a/palacios/src/palacios/vmm_shadow_paging.c +++ b/palacios/src/palacios/vmm_shadow_paging.c @@ -47,6 +47,8 @@ #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; +} + /*** @@ -137,6 +144,22 @@ 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; + } + +#ifdef CONFIG_SHADOW_PAGING_TELEMETRY + v3_remove_telemetry_cb(core->vm_info, telemetry_cb, NULL); +#endif + + return 0; +} + + int v3_init_shdw_impl(struct v3_vm_info * vm) { struct v3_shdw_impl_state * impl_state = &(vm->shdw_impl); @@ -146,10 +169,14 @@ int v3_init_shdw_impl(struct v3_vm_info * vm) { struct v3_shdw_pg_impl * impl = NULL; PrintDebug("Checking if shadow paging requested.\n"); - if (pg_mode && (strcasecmp(pg_mode, "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"); @@ -167,8 +194,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; }