Logo Search packages:      
Sourcecode: linux-2.6 version File versions

irqflags.h

#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");                              \
      })
      
/*
 * 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

Generated by  Doxygen 1.6.0   Back to index