irqflags_64.h

来自「linux 内核源代码」· C头文件 代码 · 共 177 行

H
177
字号
/* * include/asm-x86_64/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__/* * Interrupt control: */static inline unsigned long __raw_local_save_flags(void){	unsigned long flags;	__asm__ __volatile__(		"# __raw_save_flags\n\t"		"pushfq ; popq %q0"		: "=g" (flags)		: /* no input */		: "memory"	);	return flags;}#define raw_local_save_flags(flags) \		do { (flags) = __raw_local_save_flags(); } while (0)static inline void raw_local_irq_restore(unsigned long flags){	__asm__ __volatile__(		"pushq %0 ; popfq"		: /* no output */		:"g" (flags)		:"memory", "cc"	);}#ifdef CONFIG_X86_VSMP/* * Interrupt control for the VSMP architecture: */static inline void raw_local_irq_disable(void){	unsigned long flags = __raw_local_save_flags();	raw_local_irq_restore((flags & ~X86_EFLAGS_IF) | X86_EFLAGS_AC);}static inline void raw_local_irq_enable(void){	unsigned long flags = __raw_local_save_flags();	raw_local_irq_restore((flags | X86_EFLAGS_IF) & (~X86_EFLAGS_AC));}static inline int raw_irqs_disabled_flags(unsigned long flags){	return !(flags & X86_EFLAGS_IF) || (flags & X86_EFLAGS_AC);}#else /* CONFIG_X86_VSMP */static inline void raw_local_irq_disable(void){	__asm__ __volatile__("cli" : : : "memory");}static inline void raw_local_irq_enable(void){	__asm__ __volatile__("sti" : : : "memory");}static inline int raw_irqs_disabled_flags(unsigned long flags){	return !(flags & X86_EFLAGS_IF);}#endif/* * 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;}#define raw_local_irq_save(flags) \		do { (flags) = __raw_local_irq_save(); } while (0)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);}/* * Used in the idle loop; sti takes one instruction cycle * to complete: */static inline void raw_safe_halt(void){	__asm__ __volatile__("sti; hlt" : : : "memory");}/* * Used when interrupts are already enabled or to * shutdown the processor: */static inline void halt(void){	__asm__ __volatile__("hlt": : :"memory");}#else /* __ASSEMBLY__: */# ifdef CONFIG_TRACE_IRQFLAGS#  define TRACE_IRQS_ON		call trace_hardirqs_on_thunk#  define TRACE_IRQS_OFF	call trace_hardirqs_off_thunk# else#  define TRACE_IRQS_ON#  define TRACE_IRQS_OFF# endif# ifdef CONFIG_DEBUG_LOCK_ALLOC#  define LOCKDEP_SYS_EXIT	call lockdep_sys_exit_thunk#  define LOCKDEP_SYS_EXIT_IRQ	\	TRACE_IRQS_ON; \	sti; \	SAVE_REST; \	LOCKDEP_SYS_EXIT; \	RESTORE_REST; \	cli; \	TRACE_IRQS_OFF;# else#  define LOCKDEP_SYS_EXIT#  define LOCKDEP_SYS_EXIT_IRQ# endif#endif#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?