Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v2.6.33 103 lines 2.3 kB view raw
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#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2) 12 13/* store then or system mask. */ 14#define __raw_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 __raw_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#define __raw_local_irq_ssm(__mask) \ 35({ \ 36 asm volatile("ssm %0" : : "Q" (__mask) : "memory"); \ 37}) 38 39#else /* __GNUC__ */ 40 41/* store then or system mask. */ 42#define __raw_local_irq_stosm(__or) \ 43({ \ 44 unsigned long __mask; \ 45 asm volatile( \ 46 " stosm 0(%1),%2" \ 47 : "=m" (__mask) \ 48 : "a" (&__mask), "i" (__or) : "memory"); \ 49 __mask; \ 50}) 51 52/* store then and system mask. */ 53#define __raw_local_irq_stnsm(__and) \ 54({ \ 55 unsigned long __mask; \ 56 asm volatile( \ 57 " stnsm 0(%1),%2" \ 58 : "=m" (__mask) \ 59 : "a" (&__mask), "i" (__and) : "memory"); \ 60 __mask; \ 61}) 62 63/* set system mask. */ 64#define __raw_local_irq_ssm(__mask) \ 65({ \ 66 asm volatile( \ 67 " ssm 0(%0)" \ 68 : : "a" (&__mask), "m" (__mask) : "memory"); \ 69}) 70 71#endif /* __GNUC__ */ 72 73/* interrupt control.. */ 74static inline unsigned long raw_local_irq_enable(void) 75{ 76 return __raw_local_irq_stosm(0x03); 77} 78 79static inline unsigned long raw_local_irq_disable(void) 80{ 81 return __raw_local_irq_stnsm(0xfc); 82} 83 84#define raw_local_save_flags(x) \ 85do { \ 86 typecheck(unsigned long, x); \ 87 (x) = __raw_local_irq_stosm(0x00); \ 88} while (0) 89 90static inline void raw_local_irq_restore(unsigned long flags) 91{ 92 __raw_local_irq_ssm(flags); 93} 94 95static inline int raw_irqs_disabled_flags(unsigned long flags) 96{ 97 return !(flags & (3UL << (BITS_PER_LONG - 8))); 98} 99 100/* For spinlocks etc */ 101#define raw_local_irq_save(x) ((x) = raw_local_irq_disable()) 102 103#endif /* __ASM_IRQFLAGS_H */