Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v3.1-rc8 155 lines 2.7 kB view raw
1#ifndef __ASM_ARM_IRQFLAGS_H 2#define __ASM_ARM_IRQFLAGS_H 3 4#ifdef __KERNEL__ 5 6#include <asm/ptrace.h> 7 8/* 9 * CPU interrupt mask handling. 10 */ 11#if __LINUX_ARM_ARCH__ >= 6 12 13static inline unsigned long arch_local_irq_save(void) 14{ 15 unsigned long flags; 16 17 asm volatile( 18 " mrs %0, cpsr @ arch_local_irq_save\n" 19 " cpsid i" 20 : "=r" (flags) : : "memory", "cc"); 21 return flags; 22} 23 24static inline void arch_local_irq_enable(void) 25{ 26 asm volatile( 27 " cpsie i @ arch_local_irq_enable" 28 : 29 : 30 : "memory", "cc"); 31} 32 33static inline void arch_local_irq_disable(void) 34{ 35 asm volatile( 36 " cpsid i @ arch_local_irq_disable" 37 : 38 : 39 : "memory", "cc"); 40} 41 42#define local_fiq_enable() __asm__("cpsie f @ __stf" : : : "memory", "cc") 43#define local_fiq_disable() __asm__("cpsid f @ __clf" : : : "memory", "cc") 44#else 45 46/* 47 * Save the current interrupt enable state & disable IRQs 48 */ 49static inline unsigned long arch_local_irq_save(void) 50{ 51 unsigned long flags, temp; 52 53 asm volatile( 54 " mrs %0, cpsr @ arch_local_irq_save\n" 55 " orr %1, %0, #128\n" 56 " msr cpsr_c, %1" 57 : "=r" (flags), "=r" (temp) 58 : 59 : "memory", "cc"); 60 return flags; 61} 62 63/* 64 * Enable IRQs 65 */ 66static inline void arch_local_irq_enable(void) 67{ 68 unsigned long temp; 69 asm volatile( 70 " mrs %0, cpsr @ arch_local_irq_enable\n" 71 " bic %0, %0, #128\n" 72 " msr cpsr_c, %0" 73 : "=r" (temp) 74 : 75 : "memory", "cc"); 76} 77 78/* 79 * Disable IRQs 80 */ 81static inline void arch_local_irq_disable(void) 82{ 83 unsigned long temp; 84 asm volatile( 85 " mrs %0, cpsr @ arch_local_irq_disable\n" 86 " orr %0, %0, #128\n" 87 " msr cpsr_c, %0" 88 : "=r" (temp) 89 : 90 : "memory", "cc"); 91} 92 93/* 94 * Enable FIQs 95 */ 96#define local_fiq_enable() \ 97 ({ \ 98 unsigned long temp; \ 99 __asm__ __volatile__( \ 100 "mrs %0, cpsr @ stf\n" \ 101" bic %0, %0, #64\n" \ 102" msr cpsr_c, %0" \ 103 : "=r" (temp) \ 104 : \ 105 : "memory", "cc"); \ 106 }) 107 108/* 109 * Disable FIQs 110 */ 111#define local_fiq_disable() \ 112 ({ \ 113 unsigned long temp; \ 114 __asm__ __volatile__( \ 115 "mrs %0, cpsr @ clf\n" \ 116" orr %0, %0, #64\n" \ 117" msr cpsr_c, %0" \ 118 : "=r" (temp) \ 119 : \ 120 : "memory", "cc"); \ 121 }) 122 123#endif 124 125/* 126 * Save the current interrupt enable state. 127 */ 128static inline unsigned long arch_local_save_flags(void) 129{ 130 unsigned long flags; 131 asm volatile( 132 " mrs %0, cpsr @ local_save_flags" 133 : "=r" (flags) : : "memory", "cc"); 134 return flags; 135} 136 137/* 138 * restore saved IRQ & FIQ state 139 */ 140static inline void arch_local_irq_restore(unsigned long flags) 141{ 142 asm volatile( 143 " msr cpsr_c, %0 @ local_irq_restore" 144 : 145 : "r" (flags) 146 : "memory", "cc"); 147} 148 149static inline int arch_irqs_disabled_flags(unsigned long flags) 150{ 151 return flags & PSR_I_BIT; 152} 153 154#endif 155#endif