Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


build fixes to merge the Palacios configuration parameters with Linux parameters.
[palacios.git] / palacios / src / palacios / vmm_shadow_paging.c
index 4f9d00f..9743073 100644 (file)
 
 
 
-#ifdef CONFIG_SHADOW_PAGING_TELEMETRY
+#ifdef V3_CONFIG_SHADOW_PAGING_TELEMETRY
 #include <palacios/vmm_telemetry.h>
 #endif
 
-#ifdef CONFIG_SYMBIOTIC_SWAP
+#ifdef V3_CONFIG_SYMBIOTIC_SWAP
 #include <palacios/vmm_sym_swap.h>
 #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,19 +144,46 @@ 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 V3_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);
     v3_cfg_tree_t * pg_cfg = v3_cfg_subtree(vm->cfg_data->cfg, "paging");
-    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 ((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;
     }
    
@@ -160,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;
 }
@@ -260,7 +302,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