[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] x86: unify local_irq_XXX()



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1228995360 0
# Node ID f4c1a347311bbdc7dbf3b1b213719929cf03ede3
# Parent  68555b9a7d98a6e91b55766e54d8e6d08589b3ac
x86: unify local_irq_XXX()

This also removes an inconsistency in that x86-64's __save_flags() had
a memory clobber, while x86_32's didn't.

It further adds type checking since blindly using {pop,push}{l,q} on a
memory operand of unknown size bares the risk of corrupting other
data.

Finally, it eliminates the redundant (with local_irq_restore())
__restore_flags() macro and renames __save_flags() to
local_save_flags(), making the naming consistent with Linux (again?).

Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>
---
 xen/include/asm-x86/system.h        |   22 +++++++++++++++++++---
 xen/include/asm-x86/x86_32/system.h |   10 ----------
 xen/include/asm-x86/x86_64/system.h |   10 ----------
 3 files changed, 19 insertions(+), 23 deletions(-)

diff -r 68555b9a7d98 -r f4c1a347311b xen/include/asm-x86/system.h
--- a/xen/include/asm-x86/system.h      Thu Dec 11 11:32:39 2008 +0000
+++ b/xen/include/asm-x86/system.h      Thu Dec 11 11:36:00 2008 +0000
@@ -1,8 +1,7 @@
 #ifndef __ASM_SYSTEM_H
 #define __ASM_SYSTEM_H
 
-#include <xen/config.h>
-#include <xen/types.h>
+#include <xen/lib.h>
 #include <asm/bitops.h>
 
 #define read_segment_register(name)                             \
@@ -171,10 +170,27 @@ static always_inline unsigned long __cmp
 /* used when interrupts are already enabled or to shutdown the processor */
 #define halt()          asm volatile ( "hlt" : : : "memory" )
 
+#define local_save_flags(x)                                      \
+({                                                               \
+    BUILD_BUG_ON(sizeof(x) != sizeof(long));                     \
+    asm volatile ( "pushf" __OS " ; pop" __OS " %0" : "=g" (x)); \
+})
+#define local_irq_save(x)                                        \
+({                                                               \
+    local_save_flags(x);                                         \
+    local_irq_disable();                                         \
+})
+#define local_irq_restore(x)                                     \
+({                                                               \
+    BUILD_BUG_ON(sizeof(x) != sizeof(long));                     \
+    asm volatile ( "push" __OS " %0 ; popf" __OS                 \
+                   : : "g" (x) : "memory", "cc" );               \
+})
+
 static inline int local_irq_is_enabled(void)
 {
     unsigned long flags;
-    __save_flags(flags);
+    local_save_flags(flags);
     return !!(flags & (1<<9)); /* EFLAGS_IF */
 }
 
diff -r 68555b9a7d98 -r f4c1a347311b xen/include/asm-x86/x86_32/system.h
--- a/xen/include/asm-x86/x86_32/system.h       Thu Dec 11 11:32:39 2008 +0000
+++ b/xen/include/asm-x86/x86_32/system.h       Thu Dec 11 11:36:00 2008 +0000
@@ -101,14 +101,4 @@ static inline void atomic_write64(uint64
 #define mb()                    \
     asm volatile ( "lock; addl $0,0(%%esp)" : : : "memory" )
 
-#define __save_flags(x)         \
-    asm volatile ( "pushfl ; popl %0" : "=g" (x) : )
-#define __restore_flags(x)      \
-    asm volatile ( "pushl %0 ; popfl" : : "g" (x) : "memory", "cc" )
-
-#define local_irq_save(x)       \
-    asm volatile ( "pushfl ; popl %0 ; cli" : "=g" (x) : : "memory" )
-#define local_irq_restore(x)    \
-    __restore_flags(x)
-
 #endif /* __X86_32_SYSTEM_H__ */
diff -r 68555b9a7d98 -r f4c1a347311b xen/include/asm-x86/x86_64/system.h
--- a/xen/include/asm-x86/x86_64/system.h       Thu Dec 11 11:32:39 2008 +0000
+++ b/xen/include/asm-x86/x86_64/system.h       Thu Dec 11 11:36:00 2008 +0000
@@ -55,14 +55,4 @@ static inline void atomic_write64(uint64
 #define mb()                    \
     asm volatile ( "mfence" : : : "memory" )
 
-#define __save_flags(x)         \
-    asm volatile ( "pushfq ; popq %q0" : "=g" (x) : :"memory" )
-#define __restore_flags(x)      \
-    asm volatile ( "pushq %0 ; popfq" : : "g" (x) : "memory", "cc" )
-
-#define local_irq_save(x)       \
-    asm volatile ( "pushfq ; popq %0 ; cli" : "=g" (x) : : "memory" )
-#define local_irq_restore(x)    \
-    __restore_flags(x)
-
 #endif /* __X86_64_SYSTEM_H__ */

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.