From: Keir Fraser Date: Mon, 14 Jan 2013 13:55:45 +0000 (+0000) Subject: x86: Assert !in_atomic() before exiting to guest context. X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=143c33f1bcc93392beea4c045dd19917bd81888f;p=people%2Faperard%2Fxen-arm.git x86: Assert !in_atomic() before exiting to guest context. Signed-off-by: Keir Fraser --- diff --git a/xen/arch/x86/hvm/svm/entry.S b/xen/arch/x86/hvm/svm/entry.S index e70b499e4e..a025be3c55 100644 --- a/xen/arch/x86/hvm/svm/entry.S +++ b/xen/arch/x86/hvm/svm/entry.S @@ -42,6 +42,7 @@ ENTRY(svm_asm_do_resume) call svm_intr_assist call_with_regs(nsvm_vcpu_switch) + ASSERT_NOT_IN_ATOMIC get_current(bx) CLGI diff --git a/xen/arch/x86/hvm/vmx/entry.S b/xen/arch/x86/hvm/vmx/entry.S index 43b759135e..e50fa76bb8 100644 --- a/xen/arch/x86/hvm/vmx/entry.S +++ b/xen/arch/x86/hvm/vmx/entry.S @@ -98,6 +98,7 @@ vmx_asm_vmexit_handler: vmx_asm_do_vmentry: call vmx_intr_assist call nvmx_switch_guest + ASSERT_NOT_IN_ATOMIC get_current(bx) cli diff --git a/xen/arch/x86/x86_64/compat/entry.S b/xen/arch/x86/x86_64/compat/entry.S index 37c82a1c17..7051f90213 100644 --- a/xen/arch/x86/x86_64/compat/entry.S +++ b/xen/arch/x86/x86_64/compat/entry.S @@ -92,6 +92,7 @@ compat_skip_clobber: /* %rbx: struct vcpu */ ENTRY(compat_test_all_events) + ASSERT_NOT_IN_ATOMIC cli # tests must not race interrupts /*compat_test_softirqs:*/ movl VCPU_processor(%rbx),%eax diff --git a/xen/arch/x86/x86_64/entry.S b/xen/arch/x86/x86_64/entry.S index 462b16fe65..408c348696 100644 --- a/xen/arch/x86/x86_64/entry.S +++ b/xen/arch/x86/x86_64/entry.S @@ -190,6 +190,7 @@ skip_clobber: /* %rbx: struct vcpu */ test_all_events: + ASSERT_NOT_IN_ATOMIC cli # tests must not race interrupts /*test_softirqs:*/ movl VCPU_processor(%rbx),%eax diff --git a/xen/common/preempt.c b/xen/common/preempt.c index a02eb6d28d..38f73b023e 100644 --- a/xen/common/preempt.c +++ b/xen/common/preempt.c @@ -30,3 +30,9 @@ bool_t in_atomic(void) { return preempt_count() || in_irq() || !local_irq_is_enabled(); } + +/* asm helper */ +void bug_if_in_atomic(void) +{ + BUG_ON(in_atomic()); +} diff --git a/xen/include/asm-x86/asm_defns.h b/xen/include/asm-x86/asm_defns.h index c1175c4775..d167e33593 100644 --- a/xen/include/asm-x86/asm_defns.h +++ b/xen/include/asm-x86/asm_defns.h @@ -59,6 +59,14 @@ void ret_from_intr(void); GET_STACK_BASE(reg); \ __GET_CURRENT(reg) +#ifndef NDEBUG +#define ASSERT_NOT_IN_ATOMIC \ + sti; /* sometimes called with interrupts disabled: safe to enable */ \ + call bug_if_in_atomic +#else +#define ASSERT_NOT_IN_ATOMIC +#endif + #endif #endif /* __X86_ASM_DEFNS_H__ */