irqflags.h 2.3 KB

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