WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH] x86: unify local_irq_XXX()

To: <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH] x86: unify local_irq_XXX()
From: "Jan Beulich" <jbeulich@xxxxxxxxxx>
Date: Thu, 11 Dec 2008 10:35:32 +0000
Delivery-date: Thu, 11 Dec 2008 02:35:45 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
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>

--- 2008-11-20.orig/xen/include/asm-x86/system.h        2008-04-30 
11:54:44.000000000 +0200
+++ 2008-11-20/xen/include/asm-x86/system.h     2008-12-11 09:51:06.000000000 
+0100
@@ -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 */
 }
 
--- 2008-11-20.orig/xen/include/asm-x86/x86_32/system.h 2007-11-26 
16:57:03.000000000 +0100
+++ 2008-11-20/xen/include/asm-x86/x86_32/system.h      2008-12-11 
09:33:14.000000000 +0100
@@ -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__ */
--- 2008-11-20.orig/xen/include/asm-x86/x86_64/system.h 2007-11-26 
16:57:03.000000000 +0100
+++ 2008-11-20/xen/include/asm-x86/x86_64/system.h      2008-12-11 
09:33:40.000000000 +0100
@@ -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-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-devel] [PATCH] x86: unify local_irq_XXX(), Jan Beulich <=