1 /* 2 * Copyright IBM Corp. 2006, 2010 3 * Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com> 4 */ 5 6 #ifndef __ASM_IRQFLAGS_H 7 #define __ASM_IRQFLAGS_H 8 9 #include <linux/types.h> 10 11 #define ARCH_IRQ_ENABLED (3UL << (BITS_PER_LONG - 8)) 12 13 /* store then OR system mask. */ 14 #define __arch_local_irq_stosm(__or) \ 15 ({ \ 16 unsigned long __mask; \ 17 asm volatile( \ 18 " stosm %0,%1" \ 19 : "=Q" (__mask) : "i" (__or) : "memory"); \ 20 __mask; \ 21 }) 22 23 /* store then AND system mask. */ 24 #define __arch_local_irq_stnsm(__and) \ 25 ({ \ 26 unsigned long __mask; \ 27 asm volatile( \ 28 " stnsm %0,%1" \ 29 : "=Q" (__mask) : "i" (__and) : "memory"); \ 30 __mask; \ 31 }) 32 33 /* set system mask. */ 34 static inline notrace void __arch_local_irq_ssm(unsigned long flags) 35 { 36 asm volatile("ssm %0" : : "Q" (flags) : "memory"); 37 } 38 39 static inline notrace unsigned long arch_local_save_flags(void) 40 { 41 return __arch_local_irq_stnsm(0xff); 42 } 43 44 static inline notrace unsigned long arch_local_irq_save(void) 45 { 46 return __arch_local_irq_stnsm(0xfc); 47 } 48 49 static inline notrace void arch_local_irq_disable(void) 50 { 51 arch_local_irq_save(); 52 } 53 54 static inline notrace void arch_local_irq_enable(void) 55 { 56 __arch_local_irq_stosm(0x03); 57 } 58 59 /* This only restores external and I/O interrupt state */ 60 static inline notrace void arch_local_irq_restore(unsigned long flags) 61 { 62 /* only disabled->disabled and disabled->enabled is valid */ 63 if (flags & ARCH_IRQ_ENABLED) 64 arch_local_irq_enable(); 65 } 66 67 static inline notrace bool arch_irqs_disabled_flags(unsigned long flags) 68 { 69 return !(flags & ARCH_IRQ_ENABLED); 70 } 71 72 static inline notrace bool arch_irqs_disabled(void) 73 { 74 return arch_irqs_disabled_flags(arch_local_save_flags()); 75 } 76 77 #endif /* __ASM_IRQFLAGS_H */ 78