local_irq_disable

[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)

如果没有定义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 }



你可能感兴趣的:(local_irq_disable)