X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_direct_paging.c;h=716e029f92a12617c80c66ce9f5c924e940bcfa8;hb=42b80fddfbfea5c5603b71d80d3e2ba2a53a2074;hp=2884923c26010e21b9363aec27a230802bdc4401;hpb=604e1d91e2cb21ca9b0afcb9a27cabd7119d67a4;p=palacios.git diff --git a/palacios/src/palacios/vmm_direct_paging.c b/palacios/src/palacios/vmm_direct_paging.c index 2884923..716e029 100644 --- a/palacios/src/palacios/vmm_direct_paging.c +++ b/palacios/src/palacios/vmm_direct_paging.c @@ -161,7 +161,10 @@ 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, + core->resource_control.pg_node_id, + core->resource_control.pg_filter_func, + core->resource_control.pg_filter_state); if (!temp) { PrintError(VM_NONE, VCORE_NONE,"Cannot allocate page\n"); @@ -182,6 +185,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 +197,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: @@ -388,6 +407,7 @@ int v3_init_passthrough_paging(struct v3_vm_info *vm) { INIT_LIST_HEAD(&(vm->passthrough_impl.event_callback_list)); v3_rw_lock_init(&(vm->passthrough_impl.event_callback_lock)); + vm->passthrough_impl.inited=1; return 0; } @@ -396,6 +416,10 @@ int v3_deinit_passthrough_paging(struct v3_vm_info *vm) struct passthrough_event_callback *cb,*temp; addr_t flags; + if (!vm->passthrough_impl.inited) { + return 0; + } + flags=v3_write_lock_irqsave(&(vm->passthrough_impl.event_callback_lock)); list_for_each_entry_safe(cb, @@ -600,6 +624,7 @@ int v3_init_nested_paging(struct v3_vm_info *vm) { INIT_LIST_HEAD(&(vm->nested_impl.event_callback_list)); v3_rw_lock_init(&(vm->nested_impl.event_callback_lock)); + vm->nested_impl.inited=1; return 0; } @@ -609,6 +634,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; } } @@ -618,6 +645,10 @@ int v3_deinit_nested_paging(struct v3_vm_info *vm) struct nested_event_callback *cb,*temp; addr_t flags; + if (!vm->nested_impl.inited) { + return 0; + } + flags=v3_write_lock_irqsave(&(vm->nested_impl.event_callback_lock)); list_for_each_entry_safe(cb, @@ -637,9 +668,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; + } }