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.


Generalization of constraints on page allocation and implementation/use
[palacios.git] / palacios / src / palacios / vmm_direct_paging.c
index f313e8d..1175b25 100644 (file)
@@ -161,7 +161,7 @@ static addr_t create_generic_pt_page(struct guest_info *core) {
     void * page = 0;
     void *temp;
 
-    temp = V3_AllocPagesExtended(1, PAGE_SIZE_4KB, -1, 0); // no constraints
+    temp = V3_AllocPagesExtended(1, PAGE_SIZE_4KB, -1, 0, 0); // no constraints
 
     if (!temp) {  
        PrintError(VM_NONE, VCORE_NONE,"Cannot allocate page\n");
@@ -182,6 +182,10 @@ static addr_t create_generic_pt_page(struct guest_info *core) {
 
 
 int v3_init_passthrough_pts(struct guest_info * info) {
+    if (info->shdw_pg_mode == NESTED_PAGING && is_vmx_nested()) { 
+        // skip - ept_init will do this allocation
+        return 0;
+    }
     info->direct_map_pt = (addr_t)V3_PAddr((void *)create_generic_pt_page(info));
     return 0;
 }
@@ -190,6 +194,18 @@ int v3_init_passthrough_pts(struct guest_info * info) {
 int v3_free_passthrough_pts(struct guest_info * core) {
     v3_cpu_mode_t mode = v3_get_vm_cpu_mode(core);
 
+    if (core->shdw_pg_mode == NESTED_PAGING && is_vmx_nested()) { 
+        // there are no passthrough page tables, but
+        // the EPT implementation is using direct_map_pt to store
+        // the EPT root table pointer...  and the EPT tables
+        // are not compatible with regular x86 tables, so we
+        // must not attempt to free them here...
+        return 0;
+    }
+  
+    // we are either in shadow or in SVM nested
+    // in either case, we can nuke the PTs
+
     // Delete the old direct map page tables
     switch(mode) {
        case REAL:
@@ -200,7 +216,9 @@ int v3_free_passthrough_pts(struct guest_info * core) {
        case LONG:
        case LONG_32_COMPAT:
            // Long mode will only use 32PAE page tables...
-           delete_page_tables_32pae((pdpe32pae_t *)V3_VAddr((void *)(core->direct_map_pt)));
+           if (core->direct_map_pt) { 
+               delete_page_tables_32pae((pdpe32pae_t *)V3_VAddr((void *)(core->direct_map_pt))); 
+           }
            break;
        default:
            PrintError(core->vm_info, core, "Unknown CPU Mode\n");
@@ -607,6 +625,8 @@ int v3_init_nested_paging_core(struct guest_info *core, void *hwinfo)
     return init_ept(core, (struct vmx_hw_info *) hwinfo);
   } else {
     // no initialization for SVM
+    // the direct map page tables are used since the 
+    // nested pt format is identical to the main pt format
     return 0;
   }
 }
@@ -635,9 +655,17 @@ int v3_deinit_nested_paging(struct v3_vm_info *vm)
 
 int v3_deinit_nested_paging_core(struct guest_info *core)
 {
-  // nothing to do..  probably dealloc?  FIXME PAD
-
-  return 0;
+  if (core->shdw_pg_mode == NESTED_PAGING) {
+    if (is_vmx_nested()) {
+     return deinit_ept(core);
+    } else {
+      // SVM nested deinit is handled by the passthrough paging teardown
+      return 0;
+    }
+  } else {
+    // not relevant
+    return 0;
+  }
 }