1
2
3
4
5
6
7
8
9
10
11#ifndef _ASM_IRQFLAGS_H
12#define _ASM_IRQFLAGS_H
13
14#include <asm/pil.h>
15
16#ifndef __ASSEMBLY__
17
18static inline notrace unsigned long arch_local_save_flags(void)
19{
20 unsigned long flags;
21
22 __asm__ __volatile__(
23 "rdpr %%pil, %0"
24 : "=r" (flags)
25 );
26
27 return flags;
28}
29
30static inline notrace void arch_local_irq_restore(unsigned long flags)
31{
32 __asm__ __volatile__(
33 "wrpr %0, %%pil"
34 :
35 : "r" (flags)
36 : "memory"
37 );
38}
39
40static inline notrace void arch_local_irq_disable(void)
41{
42 __asm__ __volatile__(
43 "wrpr %0, %%pil"
44 :
45 : "i" (PIL_NORMAL_MAX)
46 : "memory"
47 );
48}
49
50static inline notrace void arch_local_irq_enable(void)
51{
52 __asm__ __volatile__(
53 "wrpr 0, %%pil"
54 :
55 :
56 : "memory"
57 );
58}
59
60static inline notrace int arch_irqs_disabled_flags(unsigned long flags)
61{
62 return (flags > 0);
63}
64
65static inline notrace int arch_irqs_disabled(void)
66{
67 return arch_irqs_disabled_flags(arch_local_save_flags());
68}
69
70static inline notrace unsigned long arch_local_irq_save(void)
71{
72 unsigned long flags, tmp;
73
74
75
76
77
78
79
80
81
82
83
84 __asm__ __volatile__(
85 "rdpr %%pil, %0\n\t"
86 "or %0, %2, %1\n\t"
87 "wrpr %1, 0x0, %%pil"
88 : "=r" (flags), "=r" (tmp)
89 : "i" (PIL_NORMAL_MAX)
90 : "memory"
91 );
92
93 return flags;
94}
95
96#endif
97
98#endif
99