[Author: Bo Shen <[email protected]>]
[Linux kernel: git: 0c0bd34]
<include/linux/irqflags.h>
local_irq_disable
如果定义CONFIG_TRACE_IRQFLAGS_SUPPORT
91 #define local_irq_disable() \ 92 do { raw_local_irq_disable(); trace_hardirqs_off(); } while (0)
137 #define local_irq_disable() do { raw_local_irq_disable(); } while (0)
下面分析raw_local_irq_disable
59 #define raw_local_irq_disable() arch_local_irq_disable()
<arch/arm/include/asm/irqflags.h>
43 static inline void arch_local_irq_disable(void) 44 { 45 asm volatile( 46 " cpsid i @ arch_local_irq_disable" 47 : 48 : 49 : "memory", "cc"); 50 }
如果ARM芯片使用的架构是V5及以下,使用下面语句。
91 static inline void arch_local_irq_disable(void) 92 { 93 unsigned long temp; 94 asm volatile( 95 " mrs %0, cpsr @ arch_local_irq_disable\n" 96 " orr %0, %0, #128\n" 97 " msr cpsr_c, %0" 98 : "=r" (temp) 99 : 100 : "memory", "cc"); 101 }