• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef _ASM_SCORE_IRQFLAGS_H
2 #define _ASM_SCORE_IRQFLAGS_H
3 
4 #ifndef __ASSEMBLY__
5 
6 #include <linux/types.h>
7 
arch_local_save_flags(void)8 static 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 
arch_local_irq_save(void)30 static 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 
arch_local_irq_restore(unsigned long flags)53 static 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 
arch_local_irq_enable(void)71 static 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 
arch_local_irq_disable(void)89 static 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 
arch_irqs_disabled_flags(unsigned long flags)108 static inline bool arch_irqs_disabled_flags(unsigned long flags)
109 {
110 	return !(flags & 1);
111 }
112 
arch_irqs_disabled(void)113 static 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