irqflags_32.h
来自「linux 内核源代码」· C头文件 代码 · 共 198 行
H
198 行
/* * include/asm-i386/irqflags.h * * IRQ flags handling * * This file gets included from lowlevel asm headers too, to provide * wrapped versions of the local_irq_*() APIs, based on the * raw_local_irq_*() functions from the lowlevel headers. */#ifndef _ASM_IRQFLAGS_H#define _ASM_IRQFLAGS_H#include <asm/processor-flags.h>#ifndef __ASSEMBLY__static inline unsigned long native_save_fl(void){ unsigned long f; asm volatile("pushfl ; popl %0":"=g" (f): /* no input */); return f;}static inline void native_restore_fl(unsigned long f){ asm volatile("pushl %0 ; popfl": /* no output */ :"g" (f) :"memory", "cc");}static inline void native_irq_disable(void){ asm volatile("cli": : :"memory");}static inline void native_irq_enable(void){ asm volatile("sti": : :"memory");}static inline void native_safe_halt(void){ asm volatile("sti; hlt": : :"memory");}static inline void native_halt(void){ asm volatile("hlt": : :"memory");}#endif /* __ASSEMBLY__ */#ifdef CONFIG_PARAVIRT#include <asm/paravirt.h>#else#ifndef __ASSEMBLY__static inline unsigned long __raw_local_save_flags(void){ return native_save_fl();}static inline void raw_local_irq_restore(unsigned long flags){ native_restore_fl(flags);}static inline void raw_local_irq_disable(void){ native_irq_disable();}static inline void raw_local_irq_enable(void){ native_irq_enable();}/* * Used in the idle loop; sti takes one instruction cycle * to complete: */static inline void raw_safe_halt(void){ native_safe_halt();}/* * Used when interrupts are already enabled or to * shutdown the processor: */static inline void halt(void){ native_halt();}/* * For spinlocks, etc: */static inline unsigned long __raw_local_irq_save(void){ unsigned long flags = __raw_local_save_flags(); raw_local_irq_disable(); return flags;}#else#define DISABLE_INTERRUPTS(clobbers) cli#define ENABLE_INTERRUPTS(clobbers) sti#define ENABLE_INTERRUPTS_SYSEXIT sti; sysexit#define INTERRUPT_RETURN iret#define GET_CR0_INTO_EAX movl %cr0, %eax#endif /* __ASSEMBLY__ */#endif /* CONFIG_PARAVIRT */#ifndef __ASSEMBLY__#define raw_local_save_flags(flags) \ do { (flags) = __raw_local_save_flags(); } while (0)#define raw_local_irq_save(flags) \ do { (flags) = __raw_local_irq_save(); } while (0)static inline int raw_irqs_disabled_flags(unsigned long flags){ return !(flags & X86_EFLAGS_IF);}static inline int raw_irqs_disabled(void){ unsigned long flags = __raw_local_save_flags(); return raw_irqs_disabled_flags(flags);}/* * makes the traced hardirq state match with the machine state * * should be a rarely used function, only in places where its * otherwise impossible to know the irq state, like in traps. */static inline void trace_hardirqs_fixup_flags(unsigned long flags){ if (raw_irqs_disabled_flags(flags)) trace_hardirqs_off(); else trace_hardirqs_on();}static inline void trace_hardirqs_fixup(void){ unsigned long flags = __raw_local_save_flags(); trace_hardirqs_fixup_flags(flags);}#endif /* __ASSEMBLY__ *//* * Do the CPU's IRQ-state tracing from assembly code. We call a * C function, so save all the C-clobbered registers: */#ifdef CONFIG_TRACE_IRQFLAGS# define TRACE_IRQS_ON \ pushl %eax; \ pushl %ecx; \ pushl %edx; \ call trace_hardirqs_on; \ popl %edx; \ popl %ecx; \ popl %eax;# define TRACE_IRQS_OFF \ pushl %eax; \ pushl %ecx; \ pushl %edx; \ call trace_hardirqs_off; \ popl %edx; \ popl %ecx; \ popl %eax;#else# define TRACE_IRQS_ON# define TRACE_IRQS_OFF#endif#ifdef CONFIG_DEBUG_LOCK_ALLOC# define LOCKDEP_SYS_EXIT \ pushl %eax; \ pushl %ecx; \ pushl %edx; \ call lockdep_sys_exit; \ popl %edx; \ popl %ecx; \ popl %eax;#else# define LOCKDEP_SYS_EXIT#endif#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?