linux/arch/sparc/include/asm/irqflags_64.h
<<
>>
Prefs
   1/*
   2 * include/asm/irqflags.h
   3 *
   4 * IRQ flags handling
   5 *
   6 * This file gets included from lowlevel asm headers too, to provide
   7 * wrapped versions of the local_irq_*() APIs, based on the
   8 * arch_local_irq_*() functions from the lowlevel headers.
   9 */
  10#ifndef _ASM_IRQFLAGS_H
  11#define _ASM_IRQFLAGS_H
  12
  13#include <asm/pil.h>
  14
  15#ifndef __ASSEMBLY__
  16
  17static inline notrace unsigned long arch_local_save_flags(void)
  18{
  19        unsigned long flags;
  20
  21        __asm__ __volatile__(
  22                "rdpr   %%pil, %0"
  23                : "=r" (flags)
  24        );
  25
  26        return flags;
  27}
  28
  29static inline notrace void arch_local_irq_restore(unsigned long flags)
  30{
  31        __asm__ __volatile__(
  32                "wrpr   %0, %%pil"
  33                : /* no output */
  34                : "r" (flags)
  35                : "memory"
  36        );
  37}
  38
  39static inline notrace void arch_local_irq_disable(void)
  40{
  41        __asm__ __volatile__(
  42                "wrpr   %0, %%pil"
  43                : /* no outputs */
  44                : "i" (PIL_NORMAL_MAX)
  45                : "memory"
  46        );
  47}
  48
  49static inline notrace void arch_local_irq_enable(void)
  50{
  51        __asm__ __volatile__(
  52                "wrpr   0, %%pil"
  53                : /* no outputs */
  54                : /* no inputs */
  55                : "memory"
  56        );
  57}
  58
  59static inline notrace int arch_irqs_disabled_flags(unsigned long flags)
  60{
  61        return (flags > 0);
  62}
  63
  64static inline notrace int arch_irqs_disabled(void)
  65{
  66        return arch_irqs_disabled_flags(arch_local_save_flags());
  67}
  68
  69static inline notrace unsigned long arch_local_irq_save(void)
  70{
  71        unsigned long flags, tmp;
  72
  73        /* Disable interrupts to PIL_NORMAL_MAX unless we already
  74         * are using PIL_NMI, in which case PIL_NMI is retained.
  75         *
  76         * The only values we ever program into the %pil are 0,
  77         * PIL_NORMAL_MAX and PIL_NMI.
  78         *
  79         * Since PIL_NMI is the largest %pil value and all bits are
  80         * set in it (0xf), it doesn't matter what PIL_NORMAL_MAX
  81         * actually is.
  82         */
  83        __asm__ __volatile__(
  84                "rdpr   %%pil, %0\n\t"
  85                "or     %0, %2, %1\n\t"
  86                "wrpr   %1, 0x0, %%pil"
  87                : "=r" (flags), "=r" (tmp)
  88                : "i" (PIL_NORMAL_MAX)
  89                : "memory"
  90        );
  91
  92        return flags;
  93}
  94
  95#endif /* (__ASSEMBLY__) */
  96
  97#endif /* !(_ASM_IRQFLAGS_H) */
  98