/* * 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 # 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 */