Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Linux/arch/x86/include/asm/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 3 kB image not shown  

Quelle  irqflags.h   Sprache: C

 
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _X86_IRQFLAGS_H_
#define _X86_IRQFLAGS_H_

#include <asm/processor-flags.h>

#ifndef __ASSEMBLER__

#include <asm/nospec-branch.h>

/*
 * Interrupt control:
 */


/* Declaration required for gcc < 4.9 to prevent -Werror=missing-prototypes */
extern inline unsigned long native_save_fl(void);
extern __always_inline unsigned long native_save_fl(void)
{
 unsigned long flags;

 /*
 * "=rm" is safe here, because "pop" adjusts the stack before
 * it evaluates its effective address -- this is part of the
 * documented behavior of the "pop" instruction.
 */

 asm volatile("# __raw_save_flags\n\t"
       "pushf ; pop %0"
       : "=rm" (flags)
       : /* no input */
       : "memory");

 return flags;
}

static __always_inline void native_irq_disable(void)
{
 asm volatile("cli": : :"memory");
}

static __always_inline void native_irq_enable(void)
{
 asm volatile("sti": : :"memory");
}

static __always_inline void native_safe_halt(void)
{
 x86_idle_clear_cpu_buffers();
 asm volatile("sti; hlt": : :"memory");
}

static __always_inline void native_halt(void)
{
 x86_idle_clear_cpu_buffers();
 asm volatile("hlt": : :"memory");
}

static __always_inline int native_irqs_disabled_flags(unsigned long flags)
{
 return !(flags & X86_EFLAGS_IF);
}

static __always_inline unsigned long native_local_irq_save(void)
{
 unsigned long flags = native_save_fl();

 native_irq_disable();

 return flags;
}

static __always_inline void native_local_irq_restore(unsigned long flags)
{
 if (!native_irqs_disabled_flags(flags))
  native_irq_enable();
}

#endif

#ifndef CONFIG_PARAVIRT
#ifndef __ASSEMBLY__
/*
 * Used in the idle loop; sti takes one instruction cycle
 * to complete:
 */

static __always_inline void arch_safe_halt(void)
{
 native_safe_halt();
}

/*
 * Used when interrupts are already enabled or to
 * shutdown the processor:
 */

static __always_inline void halt(void)
{
 native_halt();
}
#endif /* __ASSEMBLY__ */
#endif /* CONFIG_PARAVIRT */

#ifdef CONFIG_PARAVIRT_XXL
#include <asm/paravirt.h>
#else
#ifndef __ASSEMBLER__
#include <linux/types.h>

static __always_inline unsigned long arch_local_save_flags(void)
{
 return native_save_fl();
}

static __always_inline void arch_local_irq_disable(void)
{
 native_irq_disable();
}

static __always_inline void arch_local_irq_enable(void)
{
 native_irq_enable();
}

/*
 * For spinlocks, etc:
 */

static __always_inline unsigned long arch_local_irq_save(void)
{
 unsigned long flags = arch_local_save_flags();
 arch_local_irq_disable();
 return flags;
}
#else

#ifdef CONFIG_X86_64
#ifdef CONFIG_DEBUG_ENTRY
#define SAVE_FLAGS  pushfq; popq %rax
#endif

#endif

#endif /* __ASSEMBLER__ */
#endif /* CONFIG_PARAVIRT_XXL */

#ifndef __ASSEMBLER__
static __always_inline int arch_irqs_disabled_flags(unsigned long flags)
{
 return !(flags & X86_EFLAGS_IF);
}

static __always_inline int arch_irqs_disabled(void)
{
 unsigned long flags = arch_local_save_flags();

 return arch_irqs_disabled_flags(flags);
}

static __always_inline void arch_local_irq_restore(unsigned long flags)
{
 if (!arch_irqs_disabled_flags(flags))
  arch_local_irq_enable();
}
#endif /* !__ASSEMBLER__ */

#endif

Messung V0.5
C=95 H=82 G=88

¤ Dauer der Verarbeitung: 0.11 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.