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