diff options
-rw-r--r-- | arch/sparc/Kconfig.debug | 4 | ||||
-rw-r--r-- | arch/sparc/kernel/irq.c | 12 | ||||
-rw-r--r-- | include/asm-sparc/irqflags.h | 39 | ||||
-rw-r--r-- | include/asm-sparc/system.h | 22 |
4 files changed, 51 insertions, 26 deletions
diff --git a/arch/sparc/Kconfig.debug b/arch/sparc/Kconfig.debug index 120f6b529348..87dd496f15eb 100644 --- a/arch/sparc/Kconfig.debug +++ b/arch/sparc/Kconfig.debug | |||
@@ -1,5 +1,9 @@ | |||
1 | menu "Kernel hacking" | 1 | menu "Kernel hacking" |
2 | 2 | ||
3 | config TRACE_IRQFLAGS_SUPPORT | ||
4 | bool | ||
5 | default y | ||
6 | |||
3 | source "lib/Kconfig.debug" | 7 | source "lib/Kconfig.debug" |
4 | 8 | ||
5 | config DEBUG_STACK_USAGE | 9 | config DEBUG_STACK_USAGE |
diff --git a/arch/sparc/kernel/irq.c b/arch/sparc/kernel/irq.c index b76dc03fc318..722d67d32961 100644 --- a/arch/sparc/kernel/irq.c +++ b/arch/sparc/kernel/irq.c | |||
@@ -56,7 +56,7 @@ | |||
56 | #define SMP_NOP2 | 56 | #define SMP_NOP2 |
57 | #define SMP_NOP3 | 57 | #define SMP_NOP3 |
58 | #endif /* SMP */ | 58 | #endif /* SMP */ |
59 | unsigned long __local_irq_save(void) | 59 | unsigned long __raw_local_irq_save(void) |
60 | { | 60 | { |
61 | unsigned long retval; | 61 | unsigned long retval; |
62 | unsigned long tmp; | 62 | unsigned long tmp; |
@@ -74,7 +74,7 @@ unsigned long __local_irq_save(void) | |||
74 | return retval; | 74 | return retval; |
75 | } | 75 | } |
76 | 76 | ||
77 | void local_irq_enable(void) | 77 | void raw_local_irq_enable(void) |
78 | { | 78 | { |
79 | unsigned long tmp; | 79 | unsigned long tmp; |
80 | 80 | ||
@@ -89,7 +89,7 @@ void local_irq_enable(void) | |||
89 | : "memory"); | 89 | : "memory"); |
90 | } | 90 | } |
91 | 91 | ||
92 | void local_irq_restore(unsigned long old_psr) | 92 | void raw_local_irq_restore(unsigned long old_psr) |
93 | { | 93 | { |
94 | unsigned long tmp; | 94 | unsigned long tmp; |
95 | 95 | ||
@@ -105,9 +105,9 @@ void local_irq_restore(unsigned long old_psr) | |||
105 | : "memory"); | 105 | : "memory"); |
106 | } | 106 | } |
107 | 107 | ||
108 | EXPORT_SYMBOL(__local_irq_save); | 108 | EXPORT_SYMBOL(__raw_local_irq_save); |
109 | EXPORT_SYMBOL(local_irq_enable); | 109 | EXPORT_SYMBOL(raw_local_irq_enable); |
110 | EXPORT_SYMBOL(local_irq_restore); | 110 | EXPORT_SYMBOL(raw_local_irq_restore); |
111 | 111 | ||
112 | /* | 112 | /* |
113 | * Dave Redman (djhr@tadpole.co.uk) | 113 | * Dave Redman (djhr@tadpole.co.uk) |
diff --git a/include/asm-sparc/irqflags.h b/include/asm-sparc/irqflags.h new file mode 100644 index 000000000000..db398fb32826 --- /dev/null +++ b/include/asm-sparc/irqflags.h | |||
@@ -0,0 +1,39 @@ | |||
1 | /* | ||
2 | * include/asm-sparc/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 | * raw_local_irq_*() functions from the lowlevel headers. | ||
9 | */ | ||
10 | #ifndef _ASM_IRQFLAGS_H | ||
11 | #define _ASM_IRQFLAGS_H | ||
12 | |||
13 | #ifndef __ASSEMBLY__ | ||
14 | |||
15 | extern void raw_local_irq_restore(unsigned long); | ||
16 | extern unsigned long __raw_local_irq_save(void); | ||
17 | extern void raw_local_irq_enable(void); | ||
18 | |||
19 | static inline unsigned long getipl(void) | ||
20 | { | ||
21 | unsigned long retval; | ||
22 | |||
23 | __asm__ __volatile__("rd %%psr, %0" : "=r" (retval)); | ||
24 | return retval; | ||
25 | } | ||
26 | |||
27 | #define raw_local_save_flags(flags) ((flags) = getipl()) | ||
28 | #define raw_local_irq_save(flags) ((flags) = __raw_local_irq_save()) | ||
29 | #define raw_local_irq_disable() ((void) __raw_local_irq_save()) | ||
30 | #define raw_irqs_disabled() ((getipl() & PSR_PIL) != 0) | ||
31 | |||
32 | static inline int raw_irqs_disabled_flags(unsigned long flags) | ||
33 | { | ||
34 | return ((flags & PSR_PIL) != 0); | ||
35 | } | ||
36 | |||
37 | #endif /* (__ASSEMBLY__) */ | ||
38 | |||
39 | #endif /* !(_ASM_IRQFLAGS_H) */ | ||
diff --git a/include/asm-sparc/system.h b/include/asm-sparc/system.h index d1a2572e3f55..8c259de02614 100644 --- a/include/asm-sparc/system.h +++ b/include/asm-sparc/system.h | |||
@@ -15,6 +15,8 @@ | |||
15 | 15 | ||
16 | #ifndef __ASSEMBLY__ | 16 | #ifndef __ASSEMBLY__ |
17 | 17 | ||
18 | #include <linux/irqflags.h> | ||
19 | |||
18 | /* | 20 | /* |
19 | * Sparc (general) CPU types | 21 | * Sparc (general) CPU types |
20 | */ | 22 | */ |
@@ -164,26 +166,6 @@ extern void fpsave(unsigned long *fpregs, unsigned long *fsr, | |||
164 | "o0", "o1", "o2", "o3", "o7"); \ | 166 | "o0", "o1", "o2", "o3", "o7"); \ |
165 | } while(0) | 167 | } while(0) |
166 | 168 | ||
167 | /* | ||
168 | * Changing the IRQ level on the Sparc. | ||
169 | */ | ||
170 | extern void local_irq_restore(unsigned long); | ||
171 | extern unsigned long __local_irq_save(void); | ||
172 | extern void local_irq_enable(void); | ||
173 | |||
174 | static inline unsigned long getipl(void) | ||
175 | { | ||
176 | unsigned long retval; | ||
177 | |||
178 | __asm__ __volatile__("rd %%psr, %0" : "=r" (retval)); | ||
179 | return retval; | ||
180 | } | ||
181 | |||
182 | #define local_save_flags(flags) ((flags) = getipl()) | ||
183 | #define local_irq_save(flags) ((flags) = __local_irq_save()) | ||
184 | #define local_irq_disable() ((void) __local_irq_save()) | ||
185 | #define irqs_disabled() ((getipl() & PSR_PIL) != 0) | ||
186 | |||
187 | /* XXX Change this if we ever use a PSO mode kernel. */ | 169 | /* XXX Change this if we ever use a PSO mode kernel. */ |
188 | #define mb() __asm__ __volatile__ ("" : : : "memory") | 170 | #define mb() __asm__ __volatile__ ("" : : : "memory") |
189 | #define rmb() mb() | 171 | #define rmb() mb() |