Commit c2b2b9a2 authored by Bjorn Helgaas's avatar Bjorn Helgaas Committed by David Mosberger

[PATCH] irq cleanups

Cleanup the irq handling macros.
parent 4dbfeac2
...@@ -117,62 +117,51 @@ ia64_insn_group_barrier (void) ...@@ -117,62 +117,51 @@ ia64_insn_group_barrier (void)
*/ */
/* For spinlocks etc */ /* For spinlocks etc */
/* clearing psr.i is implicitly serialized (visible by next insn) */
/* setting psr.i requires data serialization */
#define __local_irq_save(x) __asm__ __volatile__ ("mov %0=psr;;" \
"rsm psr.i;;" \
: "=r" (x) :: "memory")
#define __local_irq_disable() __asm__ __volatile__ (";; rsm psr.i;;" ::: "memory")
#define __local_irq_restore(x) __asm__ __volatile__ ("cmp.ne p6,p7=%0,r0;;" \
"(p6) ssm psr.i;" \
"(p7) rsm psr.i;;" \
"(p6) srlz.d" \
:: "r" ((x) & IA64_PSR_I) \
: "p6", "p7", "memory")
#ifdef CONFIG_IA64_DEBUG_IRQ #ifdef CONFIG_IA64_DEBUG_IRQ
extern unsigned long last_cli_ip; extern unsigned long last_cli_ip;
# define local_irq_save(x) \ # define __save_ip() __asm__ ("mov %0=ip" : "=r" (last_cli_ip))
do { \
unsigned long ip, psr; \
\
__asm__ __volatile__ ("mov %0=psr;; rsm psr.i;;" : "=r" (psr) :: "memory"); \
if (psr & (1UL << 14)) { \
__asm__ ("mov %0=ip" : "=r"(ip)); \
last_cli_ip = ip; \
} \
(x) = psr; \
} while (0)
# define local_irq_disable() \ # define local_irq_save(x) \
do { \ do { \
unsigned long ip, psr; \ unsigned long psr; \
\ \
__asm__ __volatile__ ("mov %0=psr;; rsm psr.i;;" : "=r" (psr) :: "memory"); \ __local_irq_save(psr); \
if (psr & (1UL << 14)) { \ if (psr & IA64_PSR_I) \
__asm__ ("mov %0=ip" : "=r"(ip)); \ __save_ip(); \
last_cli_ip = ip; \ (x) = psr; \
} \
} while (0) } while (0)
# define local_irq_restore(x) \ # define local_irq_disable() do { unsigned long x; local_irq_save(x); } while (0)
do { \
unsigned long ip, old_psr, psr = (x); \ # define local_irq_restore(x) \
\ do { \
__asm__ __volatile__ ("mov %0=psr;" \ unsigned long old_psr, psr = (x); \
"cmp.ne p6,p7=%1,r0;;" \ \
"(p6) ssm psr.i;" \ local_save_flags(old_psr); \
"(p7) rsm psr.i;;" \ __local_irq_restore(psr); \
"(p6) srlz.d" \ if ((old_psr & IA64_PSR_I) && !(psr & IA64_PSR_I)) \
: "=r" (old_psr) : "r"((psr) & IA64_PSR_I) \ __save_ip(); \
: "p6", "p7", "memory"); \
if ((old_psr & IA64_PSR_I) && !(psr & IA64_PSR_I)) { \
__asm__ ("mov %0=ip" : "=r"(ip)); \
last_cli_ip = ip; \
} \
} while (0) } while (0)
#else /* !CONFIG_IA64_DEBUG_IRQ */ #else /* !CONFIG_IA64_DEBUG_IRQ */
/* clearing of psr.i is implicitly serialized (visible by next insn) */ # define local_irq_save(x) __local_irq_save(x)
# define local_irq_save(x) __asm__ __volatile__ ("mov %0=psr;; rsm psr.i;;" \ # define local_irq_disable() __local_irq_disable()
: "=r" (x) :: "memory") # define local_irq_restore(x) __local_irq_restore(x)
# define local_irq_disable() __asm__ __volatile__ (";; rsm psr.i;;" ::: "memory")
/* (potentially) setting psr.i requires data serialization: */
# define local_irq_restore(x) __asm__ __volatile__ ("cmp.ne p6,p7=%0,r0;;" \
"(p6) ssm psr.i;" \
"(p7) rsm psr.i;;" \
"srlz.d" \
:: "r"((x) & IA64_PSR_I) \
: "p6", "p7", "memory")
#endif /* !CONFIG_IA64_DEBUG_IRQ */ #endif /* !CONFIG_IA64_DEBUG_IRQ */
#define local_irq_enable() __asm__ __volatile__ (";; ssm psr.i;; srlz.d" ::: "memory") #define local_irq_enable() __asm__ __volatile__ (";; ssm psr.i;; srlz.d" ::: "memory")
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment