local_irq_disable()

소스 분석

local_irq_disable

  • 현재 CPU의 인터럽트를 disable

raw_local_irq_disable() –> arch_local_irq_disable()

include/linux/irqflags.h

#define raw_local_irq_disable()         arch_local_irq_disable()

 

arch/arm/include/asm/irqflags.h

static inline void arch_local_irq_disable(void)
{
        asm volatile(
                "       cpsid i                 @ arch_local_irq_disable"
                :
                :
                : "memory", "cc");
}

raw_local_irq_save() –> arch_local_irq_save()

#define raw_local_irq_save(flags)                       	\
        do {                                            		\
                typecheck(unsigned long, flags);        	\
                flags = arch_local_irq_save();          	\
        } while (0)
  • 현재 CPU의 cpsr값을 변수에 저장한다.

 

static inline unsigned long arch_local_irq_save(void)
{
        unsigned long flags;

        asm volatile(
                "       mrs     %0, " IRQMASK_REG_NAME_R "      
                "       cpsid   i"
                : "=r" (flags) : : "memory", "cc");
        return flags;
}

#define IRQMASK_REG_NAME_R "cpsr"

raw_local_irq_restore() –> arch_local_irq_restore()

#define raw_local_irq_restore(flags)                    \
        do {                                            \
                typecheck(unsigned long, flags);        \
                arch_local_irq_restore(flags);          \
        } while (0)
  • 변수에 저장된 cpsr값을 읽어 현재 CPU의 cpsr_c 부분을 변경(현재 CPU의 인터럽트 상태를 저장되었던 상태로 되돌림)
static inline void arch_local_irq_restore(unsigned long flags)
{
        asm volatile(
                "       msr     " IRQMASK_REG_NAME_W ", %0      
                :
                : "r" (flags)
                : "memory", "cc");
}

#define IRQMASK_REG_NAME_W "cpsr_c"

 

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.