diff options
author | Jan Beulich <jbeulich@suse.com> | 2011-09-17 16:38:31 +0100 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2011-09-17 16:38:31 +0100 |
commit | 50ecdcd19e41783c40db0277bfd447d5dd9f8015 (patch) | |
tree | 2694b33088b8119f601b9858ff96feb6c4166e5d | |
parent | 6e8d37c4fe940ae1589e535f2b3bebfdfea2559b (diff) | |
download | xen-50ecdcd19e41783c40db0277bfd447d5dd9f8015.tar.gz xen-50ecdcd19e41783c40db0277bfd447d5dd9f8015.tar.bz2 xen-50ecdcd19e41783c40db0277bfd447d5dd9f8015.zip |
x86/vmx: don't call __vmxoff() blindly
If vmx_vcpu_up() failed, __vmxon() would generally not have got
(successfully) executed, and in that case __vmxoff() will #UD.
Additionally, any panic() during early resume (namely the tboot
related one) would cause vmx_cpu_down() to get executed without
vmx_cpu_up() having run before.
Signed-off-by: Jan Beulich <jbeulich@suse.com>
xen-unstable changeset: 23848:cf37d2eec2ef
xen-unstable date: Sat Sep 17 16:26:37 2011 +0100
-rw-r--r-- | xen/arch/x86/hvm/vmx/vmcs.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/xen/arch/x86/hvm/vmx/vmcs.c b/xen/arch/x86/hvm/vmx/vmcs.c index e51dcdaf11..b21e46129c 100644 --- a/xen/arch/x86/hvm/vmx/vmcs.c +++ b/xen/arch/x86/hvm/vmx/vmcs.c @@ -70,6 +70,7 @@ bool_t cpu_has_vmx_ins_outs_instr_info __read_mostly; static DEFINE_PER_CPU_READ_MOSTLY(struct vmcs_struct *, vmxon_region); static DEFINE_PER_CPU(struct vmcs_struct *, current_vmcs); static DEFINE_PER_CPU(struct list_head, active_vmcs_list); +static DEFINE_PER_CPU(bool_t, vmxon); static u32 vmcs_revision_id __read_mostly; @@ -517,6 +518,7 @@ int vmx_cpu_up(void) printk("CPU%d: unexpected VMXON failure\n", cpu); return -EINVAL; case 0: /* success */ + this_cpu(vmxon) = 1; break; default: BUG(); @@ -538,6 +540,9 @@ void vmx_cpu_down(void) struct list_head *active_vmcs_list = &this_cpu(active_vmcs_list); unsigned long flags; + if ( !this_cpu(vmxon) ) + return; + local_irq_save(flags); while ( !list_empty(active_vmcs_list) ) @@ -545,6 +550,7 @@ void vmx_cpu_down(void) struct vcpu, arch.hvm_vmx.active_list)); BUG_ON(!(read_cr4() & X86_CR4_VMXE)); + this_cpu(vmxon) = 0; __vmxoff(); local_irq_restore(flags); |