linux/arch/score/include/asm/irqflags.h
<<
>>
Prefs
   1#ifndef _ASM_SCORE_IRQFLAGS_H
   2#define _ASM_SCORE_IRQFLAGS_H
   3
   4#ifndef __ASSEMBLY__
   5
   6#include <linux/types.h>
   7
   8static inline unsigned long arch_local_save_flags(void)
   9{
  10        unsigned long flags;
  11
  12        asm volatile(
  13                "       mfcr    r8, cr0         \n"
  14                "       nop                     \n"
  15                "       nop                     \n"
  16                "       mv      %0, r8          \n"
  17                "       nop                     \n"
  18                "       nop                     \n"
  19                "       nop                     \n"
  20                "       nop                     \n"
  21                "       nop                     \n"
  22                "       ldi     r9, 0x1         \n"
  23                "       and     %0, %0, r9      \n"
  24                : "=r" (flags)
  25                :
  26                : "r8", "r9");
  27        return flags;
  28}
  29
  30static inline unsigned long arch_local_irq_save(void)
  31{
  32        unsigned long flags;
  33
  34        asm volatile(
  35                "       mfcr    r8, cr0         \n"
  36                "       li      r9, 0xfffffffe  \n"
  37                "       nop                     \n"
  38                "       mv      %0, r8          \n"
  39                "       and     r8, r8, r9      \n"
  40                "       mtcr    r8, cr0         \n"
  41                "       nop                     \n"
  42                "       nop                     \n"
  43                "       nop                     \n"
  44                "       nop                     \n"
  45                "       nop                     \n"
  46                : "=r" (flags)
  47                :
  48                : "r8", "r9", "memory");
  49
  50        return flags;
  51}
  52
  53static inline void arch_local_irq_restore(unsigned long flags)
  54{
  55        asm volatile(
  56                "       mfcr    r8, cr0         \n"
  57                "       ldi     r9, 0x1         \n"
  58                "       and     %0, %0, r9      \n"
  59                "       or      r8, r8, %0      \n"
  60                "       mtcr    r8, cr0         \n"
  61                "       nop                     \n"
  62                "       nop                     \n"
  63                "       nop                     \n"
  64                "       nop                     \n"
  65                "       nop                     \n"
  66                :
  67                : "r"(flags)
  68                : "r8", "r9", "memory");
  69}
  70
  71static inline void arch_local_irq_enable(void)
  72{
  73        asm volatile(
  74                "       mfcr    r8,cr0          \n"
  75                "       nop                     \n"
  76                "       nop                     \n"
  77                "       ori     r8,0x1          \n"
  78                "       mtcr    r8,cr0          \n"
  79                "       nop                     \n"
  80                "       nop                     \n"
  81                "       nop                     \n"
  82                "       nop                     \n"
  83                "       nop                     \n"
  84                :
  85                :
  86                : "r8", "memory");
  87}
  88
  89static inline void arch_local_irq_disable(void)
  90{
  91        asm volatile(
  92                "       mfcr    r8,cr0          \n"
  93                "       nop                     \n"
  94                "       nop                     \n"
  95                "       srli    r8,r8,1         \n"
  96                "       slli    r8,r8,1         \n"
  97                "       mtcr    r8,cr0          \n"
  98                "       nop                     \n"
  99                "       nop                     \n"
 100                "       nop                     \n"
 101                "       nop                     \n"
 102                "       nop                     \n"
 103                :
 104                :
 105                : "r8", "memory");
 106}
 107
 108static inline bool arch_irqs_disabled_flags(unsigned long flags)
 109{
 110        return !(flags & 1);
 111}
 112
 113static inline bool arch_irqs_disabled(void)
 114{
 115        return arch_irqs_disabled_flags(arch_local_save_flags());
 116}
 117
 118#endif /* __ASSEMBLY__ */
 119
 120#endif /* _ASM_SCORE_IRQFLAGS_H */
 121