[Author: Bo Shen <voice.shen@gmail.com>]
[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)
如果没有定义CONFIG_TRACE_IRQFLAGS_SUPPORT
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()
对于ARM芯片来说,如果芯片使用的架构是 V6或以上,则使用下面语句。
<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 }