Logo Search packages:      
Sourcecode: linux version File versions  Download package

irqflags.h

/*
 * Copyright (C) 2006 Atmark Techno, Inc.
 *
 * This file is subject to the terms and conditions of the GNU General Public
 * License. See the file "COPYING" in the main directory of this archive
 * for more details.
 */

#ifndef _ASM_MICROBLAZE_IRQFLAGS_H
#define _ASM_MICROBLAZE_IRQFLAGS_H

#include <linux/irqflags.h>

# if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR

# define local_irq_save(flags)                        \
      do {                                \
            asm volatile ("# local_irq_save     \n\t" \
                        "msrclr %0, %1    \n\t" \
                        "nop  \n\t"       \
                        : "=r"(flags)           \
                        : "i"(MSR_IE)           \
                        : "memory");            \
      } while (0)

# define local_irq_disable()                          \
      do {                                      \
            asm volatile ("# local_irq_disable \n\t"  \
                        "msrclr r0, %0 \n\t"          \
                        "nop  \n\t"             \
                        :                       \
                        : "i"(MSR_IE)                 \
                        : "memory");                  \
      } while (0)

# define local_irq_enable()                           \
      do {                                      \
            asm volatile ("# local_irq_enable \n\t"         \
                        "msrset     r0, %0 \n\t"            \
                        "nop  \n\t"             \
                        :                       \
                        : "i"(MSR_IE)                 \
                        : "memory");                  \
      } while (0)

# else /* CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR == 0 */

# define local_irq_save(flags)                              \
      do {                                      \
            register unsigned tmp;                    \
            asm volatile ("# local_irq_save     \n\t"       \
                        "mfs  %0, rmsr \n\t"          \
                        "nop \n\t"              \
                        "andi %1, %0, %2 \n\t"  \
                        "mts  rmsr, %1 \n\t"          \
                        "nop \n\t"              \
                        : "=r"(flags), "=r" (tmp)     \
                        : "i"(~MSR_IE)                \
                        : "memory");                  \
      } while (0)

# define local_irq_disable()                          \
      do {                                      \
            register unsigned tmp;                    \
            asm volatile ("# local_irq_disable \n\t"  \
                        "mfs  %0, rmsr \n\t"          \
                        "nop \n\t"              \
                        "andi %0, %0, %1 \n\t"  \
                        "mts  rmsr, %0 \n\t"          \
                        "nop \n\t"              \
                        : "=r"(tmp)             \
                        : "i"(~MSR_IE)                \
                        : "memory");                  \
      } while (0)

# define local_irq_enable()                           \
      do {                                      \
            register unsigned tmp;                    \
            asm volatile ("# local_irq_enable \n\t"         \
                        "mfs  %0, rmsr \n\t"          \
                        "nop \n\t"              \
                        "ori  %0, %0, %1 \n\t"  \
                        "mts  rmsr, %0 \n\t"          \
                        "nop \n\t"              \
                        : "=r"(tmp)             \
                        : "i"(MSR_IE)                 \
                        : "memory");                  \
      } while (0)

# endif /* CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR */

#define local_save_flags(flags)                             \
      do {                                      \
            asm volatile ("# local_save_flags \n\t"         \
                        "mfs  %0, rmsr \n\t"          \
                        "nop  \n\t"             \
                        : "=r"(flags)                 \
                        :                       \
                        : "memory");                  \
      } while (0)

#define local_irq_restore(flags)                \
      do {                                \
            asm volatile ("# local_irq_restore \n\t"\
                        "mts  rmsr, %0 \n\t"    \
                        "nop  \n\t"       \
                        :                 \
                        : "r"(flags)            \
                        : "memory");            \
      } while (0)

static inline int irqs_disabled(void)
{
      unsigned long flags;

      local_save_flags(flags);
      return ((flags & MSR_IE) == 0);
}

#define raw_irqs_disabled irqs_disabled
#define raw_irqs_disabled_flags(flags)    ((flags) == 0)

#endif /* _ASM_MICROBLAZE_IRQFLAGS_H */

Generated by  Doxygen 1.6.0   Back to index