irqflags.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. /*
  2. * Copyright IBM Corp. 2006,2010
  3. * Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>
  4. */
  5. #ifndef __ASM_IRQFLAGS_H
  6. #define __ASM_IRQFLAGS_H
  7. #include <linux/types.h>
  8. #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2)
  9. /* store then or system mask. */
  10. #define __raw_local_irq_stosm(__or) \
  11. ({ \
  12. unsigned long __mask; \
  13. asm volatile( \
  14. " stosm %0,%1" \
  15. : "=Q" (__mask) : "i" (__or) : "memory"); \
  16. __mask; \
  17. })
  18. /* store then and system mask. */
  19. #define __raw_local_irq_stnsm(__and) \
  20. ({ \
  21. unsigned long __mask; \
  22. asm volatile( \
  23. " stnsm %0,%1" \
  24. : "=Q" (__mask) : "i" (__and) : "memory"); \
  25. __mask; \
  26. })
  27. /* set system mask. */
  28. #define __raw_local_irq_ssm(__mask) \
  29. ({ \
  30. asm volatile("ssm %0" : : "Q" (__mask) : "memory"); \
  31. })
  32. #else /* __GNUC__ */
  33. /* store then or system mask. */
  34. #define __raw_local_irq_stosm(__or) \
  35. ({ \
  36. unsigned long __mask; \
  37. asm volatile( \
  38. " stosm 0(%1),%2" \
  39. : "=m" (__mask) \
  40. : "a" (&__mask), "i" (__or) : "memory"); \
  41. __mask; \
  42. })
  43. /* store then and system mask. */
  44. #define __raw_local_irq_stnsm(__and) \
  45. ({ \
  46. unsigned long __mask; \
  47. asm volatile( \
  48. " stnsm 0(%1),%2" \
  49. : "=m" (__mask) \
  50. : "a" (&__mask), "i" (__and) : "memory"); \
  51. __mask; \
  52. })
  53. /* set system mask. */
  54. #define __raw_local_irq_ssm(__mask) \
  55. ({ \
  56. asm volatile( \
  57. " ssm 0(%0)" \
  58. : : "a" (&__mask), "m" (__mask) : "memory"); \
  59. })
  60. #endif /* __GNUC__ */
  61. /* interrupt control.. */
  62. static inline unsigned long raw_local_irq_enable(void)
  63. {
  64. return __raw_local_irq_stosm(0x03);
  65. }
  66. static inline unsigned long raw_local_irq_disable(void)
  67. {
  68. return __raw_local_irq_stnsm(0xfc);
  69. }
  70. #define raw_local_save_flags(x) \
  71. do { \
  72. typecheck(unsigned long, x); \
  73. (x) = __raw_local_irq_stosm(0x00); \
  74. } while (0)
  75. static inline void raw_local_irq_restore(unsigned long flags)
  76. {
  77. __raw_local_irq_ssm(flags);
  78. }
  79. static inline int raw_irqs_disabled_flags(unsigned long flags)
  80. {
  81. return !(flags & (3UL << (BITS_PER_LONG - 8)));
  82. }
  83. /* For spinlocks etc */
  84. #define raw_local_irq_save(x) ((x) = raw_local_irq_disable())
  85. #endif /* __ASM_IRQFLAGS_H */