Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
irqflags_64.h
Go to the documentation of this file.
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 {
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) */