From: Jack Lange Date: Tue, 30 Aug 2011 19:57:46 +0000 (-0400) Subject: deinitialization fixes X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=commitdiff_plain;h=7ded4d4eee46a7bccff35de9e4438fd94624547f;p=palacios-OLD.git deinitialization fixes --- diff --git a/palacios/src/palacios/vmm.c b/palacios/src/palacios/vmm.c index 9e0fe08..078ae4a 100644 --- a/palacios/src/palacios/vmm.c +++ b/palacios/src/palacios/vmm.c @@ -154,7 +154,8 @@ void Shutdown_V3() { if ((os_hooks) && (os_hooks->call_on_cpu)) { for (i = 0; i < V3_CONFIG_MAX_CPUS; i++) { if (v3_cpu_types[i] != V3_INVALID_CPU) { - deinit_cpu((void *)(addr_t)i); + V3_Call_On_CPU(i, deinit_cpu, (void *)(addr_t)i); + //deinit_cpu((void *)(addr_t)i); } } } diff --git a/palacios/src/palacios/vmx.c b/palacios/src/palacios/vmx.c index e2e6d4b..f1d0939 100644 --- a/palacios/src/palacios/vmx.c +++ b/palacios/src/palacios/vmx.c @@ -993,6 +993,7 @@ int v3_reset_vmx_vm_core(struct guest_info * core, addr_t rip) { void v3_init_vmx_cpu(int cpu_id) { + addr_t vmx_on_region = 0; if (cpu_id == 0) { if (v3_init_vmx_hw(&hw_info) == -1) { @@ -1005,17 +1006,18 @@ void v3_init_vmx_cpu(int cpu_id) { // Setup VMXON Region - host_vmcs_ptrs[cpu_id] = allocate_vmcs(); + vmx_on_region = allocate_vmcs(); - PrintDebug("VMXON pointer: 0x%p\n", (void *)host_vmcs_ptrs[cpu_id]); - if (vmx_on(host_vmcs_ptrs[cpu_id]) == VMX_SUCCESS) { + if (vmx_on(vmx_on_region) == VMX_SUCCESS) { V3_Print("VMX Enabled\n"); + host_vmcs_ptrs[cpu_id] = vmx_on_region; } else { - PrintError("VMX initialization failure\n"); - return; + V3_Print("VMX already enabled\n"); + V3_FreePages((void *)vmx_on_region, 1); } - + + PrintDebug("VMXON pointer: 0x%p\n", (void *)host_vmcs_ptrs[cpu_id]); { struct vmx_sec_proc_ctrls sec_proc_ctrls; @@ -1038,5 +1040,16 @@ void v3_init_vmx_cpu(int cpu_id) { void v3_deinit_vmx_cpu(int cpu_id) { extern v3_cpu_arch_t v3_cpu_types[]; v3_cpu_types[cpu_id] = V3_INVALID_CPU; - V3_FreePages((void *)host_vmcs_ptrs[cpu_id], 1); + + if (host_vmcs_ptrs[cpu_id] != 0) { + V3_Print("Disabling VMX\n"); + + if (vmx_off() != VMX_SUCCESS) { + PrintError("Error executing VMXOFF\n"); + } + + V3_FreePages((void *)host_vmcs_ptrs[cpu_id], 1); + + host_vmcs_ptrs[cpu_id] = 0; + } }