]> xenbits.xensource.com Git - people/aperard/xen-arm.git/commitdiff
x86: Assert !in_atomic() before exiting to guest context.
authorKeir Fraser <keir@xen.org>
Mon, 14 Jan 2013 13:55:45 +0000 (13:55 +0000)
committerKeir Fraser <keir@xen.org>
Mon, 14 Jan 2013 13:55:45 +0000 (13:55 +0000)
Signed-off-by: Keir Fraser <keir@xen.org>
xen/arch/x86/hvm/svm/entry.S
xen/arch/x86/hvm/vmx/entry.S
xen/arch/x86/x86_64/compat/entry.S
xen/arch/x86/x86_64/entry.S
xen/common/preempt.c
xen/include/asm-x86/asm_defns.h

index e70b499e4e914edfffecb9ed1e74ccb23e1a8445..a025be3c55b91a85647e077caab24eba6cb2a0f4 100644 (file)
@@ -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
index 43b759135ee9d872420d6e6fdfa1f652eacc9f93..e50fa76bb8c9daf479ca2cb87c962179cf5579d3 100644 (file)
@@ -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
index 37c82a1c1795475a7e4a97250ee65b9925b48d59..7051f90213af3c5770c898b1c9e085a8b3ac9e86 100644 (file)
@@ -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
index 462b16fe652ebce3b1d4e14cb5ddee378dec07c6..408c3486969fcd4e2d2b4a86d5faa68657bc3f7f 100644 (file)
@@ -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
index a02eb6d28d060e420ad413c897383c38f10063fa..38f73b023e51fa0b9f6a4f4f401a15eb189e82b7 100644 (file)
@@ -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());
+}
index c1175c4775b7279566ca6d73ed909d962bc540ff..d167e33593b52bbbf97a694e37210ea6701268a6 100644 (file)
@@ -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__ */