123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- #ifndef __ASM_ARM_IRQFLAGS_H
- #define __ASM_ARM_IRQFLAGS_H
- #ifdef __KERNEL__
- #include <asm/ptrace.h>
- /*
- * CPU interrupt mask handling.
- */
- #ifdef CONFIG_CPU_V7M
- #define IRQMASK_REG_NAME_R "primask"
- #define IRQMASK_REG_NAME_W "primask"
- #define IRQMASK_I_BIT 1
- #else
- #define IRQMASK_REG_NAME_R "cpsr"
- #define IRQMASK_REG_NAME_W "cpsr_c"
- #define IRQMASK_I_BIT PSR_I_BIT
- #endif
- #if __LINUX_ARM_ARCH__ >= 6
- #define arch_local_irq_save arch_local_irq_save
- static inline unsigned long arch_local_irq_save(void)
- {
- unsigned long flags;
- asm volatile(
- " mrs %0, " IRQMASK_REG_NAME_R " @ arch_local_irq_save\n"
- " cpsid i"
- : "=r" (flags) : : "memory", "cc");
- return flags;
- }
- #define arch_local_irq_enable arch_local_irq_enable
- static inline void arch_local_irq_enable(void)
- {
- asm volatile(
- " cpsie i @ arch_local_irq_enable"
- :
- :
- : "memory", "cc");
- }
- #define arch_local_irq_disable arch_local_irq_disable
- static inline void arch_local_irq_disable(void)
- {
- asm volatile(
- " cpsid i @ arch_local_irq_disable"
- :
- :
- : "memory", "cc");
- }
- #define local_fiq_enable() __asm__("cpsie f @ __stf" : : : "memory", "cc")
- #define local_fiq_disable() __asm__("cpsid f @ __clf" : : : "memory", "cc")
- #ifndef CONFIG_CPU_V7M
- #define local_abt_enable() __asm__("cpsie a @ __sta" : : : "memory", "cc")
- #define local_abt_disable() __asm__("cpsid a @ __cla" : : : "memory", "cc")
- #else
- #define local_abt_enable() do { } while (0)
- #define local_abt_disable() do { } while (0)
- #endif
- #else
- /*
- * Save the current interrupt enable state & disable IRQs
- */
- #define arch_local_irq_save arch_local_irq_save
- static inline unsigned long arch_local_irq_save(void)
- {
- unsigned long flags, temp;
- asm volatile(
- " mrs %0, cpsr @ arch_local_irq_save\n"
- " orr %1, %0, #128\n"
- " msr cpsr_c, %1"
- : "=r" (flags), "=r" (temp)
- :
- : "memory", "cc");
- return flags;
- }
- /*
- * Enable IRQs
- */
- #define arch_local_irq_enable arch_local_irq_enable
- static inline void arch_local_irq_enable(void)
- {
- unsigned long temp;
- asm volatile(
- " mrs %0, cpsr @ arch_local_irq_enable\n"
- " bic %0, %0, #128\n"
- " msr cpsr_c, %0"
- : "=r" (temp)
- :
- : "memory", "cc");
- }
- /*
- * Disable IRQs
- */
- #define arch_local_irq_disable arch_local_irq_disable
- static inline void arch_local_irq_disable(void)
- {
- unsigned long temp;
- asm volatile(
- " mrs %0, cpsr @ arch_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"); \
- })
- #define local_abt_enable() do { } while (0)
- #define local_abt_disable() do { } while (0)
- #endif
- /*
- * Save the current interrupt enable state.
- */
- #define arch_local_save_flags arch_local_save_flags
- static inline unsigned long arch_local_save_flags(void)
- {
- unsigned long flags;
- asm volatile(
- " mrs %0, " IRQMASK_REG_NAME_R " @ local_save_flags"
- : "=r" (flags) : : "memory", "cc");
- return flags;
- }
- /*
- * restore saved IRQ & FIQ state
- */
- #define arch_local_irq_restore arch_local_irq_restore
- static inline void arch_local_irq_restore(unsigned long flags)
- {
- asm volatile(
- " msr " IRQMASK_REG_NAME_W ", %0 @ local_irq_restore"
- :
- : "r" (flags)
- : "memory", "cc");
- }
- #define arch_irqs_disabled_flags arch_irqs_disabled_flags
- static inline int arch_irqs_disabled_flags(unsigned long flags)
- {
- return flags & IRQMASK_I_BIT;
- }
- #include <asm-generic/irqflags.h>
- #endif /* ifdef __KERNEL__ */
- #endif /* ifndef __ASM_ARM_IRQFLAGS_H */
|