| #ifndef __ASM_ARM_IRQFLAGS_H |
| #define __ASM_ARM_IRQFLAGS_H |
| |
| #ifdef __KERNEL__ |
| |
| #include <asm/ptrace.h> |
| |
| /* |
| * CPU interrupt mask handling. |
| */ |
| #if __LINUX_ARM_ARCH__ >= 6 |
| |
| #define raw_local_irq_save(x) \ |
| ({ \ |
| __asm__ __volatile__( \ |
| "mrs %0, cpsr @ local_irq_save\n" \ |
| "cpsid i" \ |
| : "=r" (x) : : "memory", "cc"); \ |
| }) |
| |
| #define raw_local_irq_enable() __asm__("cpsie i @ __sti" : : : "memory", "cc") |
| #define raw_local_irq_disable() __asm__("cpsid i @ __cli" : : : "memory", "cc") |
| #define local_fiq_enable() __asm__("cpsie f @ __stf" : : : "memory", "cc") |
| #define local_fiq_disable() __asm__("cpsid f @ __clf" : : : "memory", "cc") |
| |
| #else |
| |
| /* |
| * Save the current interrupt enable state & disable IRQs |
| */ |
| #define raw_local_irq_save(x) \ |
| ({ \ |
| unsigned long temp; \ |
| (void) (&temp == &x); \ |
| __asm__ __volatile__( \ |
| "mrs %0, cpsr @ local_irq_save\n" \ |
| " orr %1, %0, #128\n" \ |
| " msr cpsr_c, %1" \ |
| : "=r" (x), "=r" (temp) \ |
| : \ |
| : "memory", "cc"); \ |
| }) |
| /* |
| * Save the current interrupt enable state & disable IRQs |
| */ |
| #define raw_local_irq_fiq_save(x) \ |
| ({ \ |
| unsigned long temp; \ |
| (void) (&temp == &x); \ |
| __asm__ __volatile__( \ |
| "mrs %0, cpsr @ local_irq_fiq_save\n" \ |
| " orr %1, %0, #0xC0\n" \ |
| " msr cpsr_c, %1" \ |
| : "=r" (x), "=r" (temp) \ |
| : \ |
| : "memory", "cc"); \ |
| }) |
| |
| /* |
| * Enable IRQs |
| */ |
| #define raw_local_irq_enable() \ |
| ({ \ |
| unsigned long temp; \ |
| __asm__ __volatile__( \ |
| "mrs %0, cpsr @ local_irq_enable\n" \ |
| " bic %0, %0, #128\n" \ |
| " msr cpsr_c, %0" \ |
| : "=r" (temp) \ |
| : \ |
| : "memory", "cc"); \ |
| }) |
| |
| /* |
| * Disable IRQs |
| */ |
| #define raw_local_irq_disable() \ |
| ({ \ |
| unsigned long temp; \ |
| __asm__ __volatile__( \ |
| "mrs %0, cpsr @ local_irq_disable\n" \ |
| " orr %0, %0, #128\n" \ |
| " msr cpsr_c, %0" \ |
| : "=r" (temp) \ |
| : \ |
| : "memory", "cc"); \ |
| }) |
| |
| /* |
| * Enable FIQs |
| */ |
| #define local_fiq_enable() \ |
| ({ \ |
| unsigned long temp; \ |
| __asm__ __volatile__( \ |
| "mrs %0, cpsr @ stf\n" \ |
| " bic %0, %0, #64\n" \ |
| " msr cpsr_c, %0" \ |
| : "=r" (temp) \ |
| : \ |
| : "memory", "cc"); \ |
| }) |
| |
| /* |
| * Disable FIQs |
| */ |
| #define local_fiq_disable() \ |
| ({ \ |
| unsigned long temp; \ |
| __asm__ __volatile__( \ |
| "mrs %0, cpsr @ clf\n" \ |
| " orr %0, %0, #64\n" \ |
| " msr cpsr_c, %0" \ |
| : "=r" (temp) \ |
| : \ |
| : "memory", "cc"); \ |
| }) |
| |
| #endif |
| |
| /* |
| * Save the current interrupt enable state. |
| */ |
| #define raw_local_save_flags(x) \ |
| ({ \ |
| __asm__ __volatile__( \ |
| "mrs %0, cpsr @ local_save_flags" \ |
| : "=r" (x) : : "memory", "cc"); \ |
| }) |
| |
| /* |
| * restore saved IRQ & FIQ state |
| */ |
| #define raw_local_irq_restore(x) \ |
| __asm__ __volatile__( \ |
| "msr cpsr_c, %0 @ local_irq_restore\n" \ |
| : \ |
| : "r" (x) \ |
| : "memory", "cc") |
| |
| #define raw_irqs_disabled_flags(flags) \ |
| ({ \ |
| (int)((flags) & PSR_I_BIT); \ |
| }) |
| |
| #endif |
| #endif |