96 lines
3.5 KiB
Diff
96 lines
3.5 KiB
Diff
# HG changeset patch
|
|
# User Keir Fraser <keir.fraser@citrix.com>
|
|
# 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@novell.com>
|
|
|
|
--- a/xen/include/asm-x86/system.h
|
|
+++ b/xen/include/asm-x86/system.h
|
|
@@ -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 */
|
|
}
|
|
|
|
--- a/xen/include/asm-x86/x86_32/system.h
|
|
+++ b/xen/include/asm-x86/x86_32/system.h
|
|
@@ -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__ */
|
|
--- a/xen/include/asm-x86/x86_64/system.h
|
|
+++ b/xen/include/asm-x86/x86_64/system.h
|
|
@@ -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__ */
|