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