x86: unify local_irq_XXX()
PATCH 1/1 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 <[email protected]>
xen/include/asm-x86/system.h +19 -3
@@ -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 */ }
xen/include/asm-x86/x86_32/system.h +0 -10
@@ -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__ */
xen/include/asm-x86/x86_64/system.h +0 -10
@@ -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__ */