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-changelog

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

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] x86: unify local_irq_XXX()
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Tue, 16 Dec 2008 22:30:38 -0800
Delivery-date: Tue, 16 Dec 2008 22:31:29 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# 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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] x86: unify local_irq_XXX(), Xen patchbot-unstable <=