irqflags.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. #ifndef __ASM_ARM_IRQFLAGS_H
  2. #define __ASM_ARM_IRQFLAGS_H
  3. #ifdef __KERNEL__
  4. #include <asm/ptrace.h>
  5. /*
  6. * CPU interrupt mask handling.
  7. */
  8. #if __LINUX_ARM_ARCH__ >= 6
  9. #define raw_local_irq_save(x) \
  10. ({ \
  11. __asm__ __volatile__( \
  12. "mrs %0, cpsr @ local_irq_save\n" \
  13. "cpsid i" \
  14. : "=r" (x) : : "memory", "cc"); \
  15. })
  16. #define raw_local_irq_enable() __asm__("cpsie i @ __sti" : : : "memory", "cc")
  17. #define raw_local_irq_disable() __asm__("cpsid i @ __cli" : : : "memory", "cc")
  18. #define local_fiq_enable() __asm__("cpsie f @ __stf" : : : "memory", "cc")
  19. #define local_fiq_disable() __asm__("cpsid f @ __clf" : : : "memory", "cc")
  20. #else
  21. /*
  22. * Save the current interrupt enable state & disable IRQs
  23. */
  24. #define raw_local_irq_save(x) \
  25. ({ \
  26. unsigned long temp; \
  27. (void) (&temp == &x); \
  28. __asm__ __volatile__( \
  29. "mrs %0, cpsr @ local_irq_save\n" \
  30. " orr %1, %0, #128\n" \
  31. " msr cpsr_c, %1" \
  32. : "=r" (x), "=r" (temp) \
  33. : \
  34. : "memory", "cc"); \
  35. })
  36. /*
  37. * Enable IRQs
  38. */
  39. #define raw_local_irq_enable() \
  40. ({ \
  41. unsigned long temp; \
  42. __asm__ __volatile__( \
  43. "mrs %0, cpsr @ local_irq_enable\n" \
  44. " bic %0, %0, #128\n" \
  45. " msr cpsr_c, %0" \
  46. : "=r" (temp) \
  47. : \
  48. : "memory", "cc"); \
  49. })
  50. /*
  51. * Disable IRQs
  52. */
  53. #define raw_local_irq_disable() \
  54. ({ \
  55. unsigned long temp; \
  56. __asm__ __volatile__( \
  57. "mrs %0, cpsr @ local_irq_disable\n" \
  58. " orr %0, %0, #128\n" \
  59. " msr cpsr_c, %0" \
  60. : "=r" (temp) \
  61. : \
  62. : "memory", "cc"); \
  63. })
  64. /*
  65. * Enable FIQs
  66. */
  67. #define local_fiq_enable() \
  68. ({ \
  69. unsigned long temp; \
  70. __asm__ __volatile__( \
  71. "mrs %0, cpsr @ stf\n" \
  72. " bic %0, %0, #64\n" \
  73. " msr cpsr_c, %0" \
  74. : "=r" (temp) \
  75. : \
  76. : "memory", "cc"); \
  77. })
  78. /*
  79. * Disable FIQs
  80. */
  81. #define local_fiq_disable() \
  82. ({ \
  83. unsigned long temp; \
  84. __asm__ __volatile__( \
  85. "mrs %0, cpsr @ clf\n" \
  86. " orr %0, %0, #64\n" \
  87. " msr cpsr_c, %0" \
  88. : "=r" (temp) \
  89. : \
  90. : "memory", "cc"); \
  91. })
  92. #endif
  93. /*
  94. * Save the current interrupt enable state.
  95. */
  96. #define raw_local_save_flags(x) \
  97. ({ \
  98. __asm__ __volatile__( \
  99. "mrs %0, cpsr @ local_save_flags" \
  100. : "=r" (x) : : "memory", "cc"); \
  101. })
  102. /*
  103. * restore saved IRQ & FIQ state
  104. */
  105. #define raw_local_irq_restore(x) \
  106. __asm__ __volatile__( \
  107. "msr cpsr_c, %0 @ local_irq_restore\n" \
  108. : \
  109. : "r" (x) \
  110. : "memory", "cc")
  111. #define raw_irqs_disabled_flags(flags) \
  112. ({ \
  113. (int)((flags) & PSR_I_BIT); \
  114. })
  115. #endif
  116. #endif