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 17 static 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 29 static 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 39 static 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 49 static 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 59 static inline notrace int arch_irqs_disabled_flags(unsigned long flags) 60 { 61 return (flags > 0); 62 } 63 64 static inline notrace int arch_irqs_disabled(void) 65 { 66 return arch_irqs_disabled_flags(arch_local_save_flags()); 67 } 68 69 static 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