diff options
author | David S. Miller <davem@davemloft.net> | 2008-11-24 00:55:29 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-12-04 12:17:02 -0500 |
commit | b4f4372f96e0573d752d9e45beda02fabf716cc8 (patch) | |
tree | 641798dfe78c1407908c68b64427cd55cdc18b34 /arch/sparc/include | |
parent | c6afec5e4d323e7b88a7d6e291a5aa021a8fcb7d (diff) |
sparc64: Make %pil level 15 a pseudo-NMI.
So that we can profile code even in a local_irq_disable() section,
only write 14 (instead of 15) into the %pil register to disable IRQs.
This allows PIL level 15 to serve as a pseudo NMI.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc/include')
-rw-r--r-- | arch/sparc/include/asm/irqflags_64.h | 6 | ||||
-rw-r--r-- | arch/sparc/include/asm/pil.h | 9 | ||||
-rw-r--r-- | arch/sparc/include/asm/ttable.h | 15 |
3 files changed, 25 insertions, 5 deletions
diff --git a/arch/sparc/include/asm/irqflags_64.h b/arch/sparc/include/asm/irqflags_64.h index bb42e59162a..8b49bf920df 100644 --- a/arch/sparc/include/asm/irqflags_64.h +++ b/arch/sparc/include/asm/irqflags_64.h | |||
@@ -10,6 +10,8 @@ | |||
10 | #ifndef _ASM_IRQFLAGS_H | 10 | #ifndef _ASM_IRQFLAGS_H |
11 | #define _ASM_IRQFLAGS_H | 11 | #define _ASM_IRQFLAGS_H |
12 | 12 | ||
13 | #include <asm/pil.h> | ||
14 | |||
13 | #ifndef __ASSEMBLY__ | 15 | #ifndef __ASSEMBLY__ |
14 | 16 | ||
15 | static inline unsigned long __raw_local_save_flags(void) | 17 | static inline unsigned long __raw_local_save_flags(void) |
@@ -40,9 +42,9 @@ static inline void raw_local_irq_restore(unsigned long flags) | |||
40 | static inline void raw_local_irq_disable(void) | 42 | static inline void raw_local_irq_disable(void) |
41 | { | 43 | { |
42 | __asm__ __volatile__( | 44 | __asm__ __volatile__( |
43 | "wrpr 15, %%pil" | 45 | "wrpr %0, %%pil" |
44 | : /* no outputs */ | 46 | : /* no outputs */ |
45 | : /* no inputs */ | 47 | : "i" (PIL_NORMAL_MAX) |
46 | : "memory" | 48 | : "memory" |
47 | ); | 49 | ); |
48 | } | 50 | } |
diff --git a/arch/sparc/include/asm/pil.h b/arch/sparc/include/asm/pil.h index 71819bb943f..d573820c0ff 100644 --- a/arch/sparc/include/asm/pil.h +++ b/arch/sparc/include/asm/pil.h | |||
@@ -10,7 +10,12 @@ | |||
10 | * | 10 | * |
11 | * In fact any XCALL which has to etrap/rtrap has a problem because | 11 | * In fact any XCALL which has to etrap/rtrap has a problem because |
12 | * it is difficult to prevent rtrap from running BH's, and that would | 12 | * it is difficult to prevent rtrap from running BH's, and that would |
13 | * need to be done if the XCALL arrived while %pil==15. | 13 | * need to be done if the XCALL arrived while %pil==PIL_NORMAL_MAX. |
14 | * | ||
15 | * Finally, in order to handle profiling events even when a | ||
16 | * local_irq_disable() is in progress, we only disable up to level 14 | ||
17 | * interrupts. Profile counter overflow interrupts arrive at level | ||
18 | * 15. | ||
14 | */ | 19 | */ |
15 | #define PIL_SMP_CALL_FUNC 1 | 20 | #define PIL_SMP_CALL_FUNC 1 |
16 | #define PIL_SMP_RECEIVE_SIGNAL 2 | 21 | #define PIL_SMP_RECEIVE_SIGNAL 2 |
@@ -18,5 +23,7 @@ | |||
18 | #define PIL_SMP_CTX_NEW_VERSION 4 | 23 | #define PIL_SMP_CTX_NEW_VERSION 4 |
19 | #define PIL_DEVICE_IRQ 5 | 24 | #define PIL_DEVICE_IRQ 5 |
20 | #define PIL_SMP_CALL_FUNC_SNGL 6 | 25 | #define PIL_SMP_CALL_FUNC_SNGL 6 |
26 | #define PIL_NORMAL_MAX 14 | ||
27 | #define PIL_NMI 15 | ||
21 | 28 | ||
22 | #endif /* !(_SPARC64_PIL_H) */ | 29 | #endif /* !(_SPARC64_PIL_H) */ |
diff --git a/arch/sparc/include/asm/ttable.h b/arch/sparc/include/asm/ttable.h index 5708ba2719f..bb2c0770a6a 100644 --- a/arch/sparc/include/asm/ttable.h +++ b/arch/sparc/include/asm/ttable.h | |||
@@ -2,6 +2,7 @@ | |||
2 | #define _SPARC64_TTABLE_H | 2 | #define _SPARC64_TTABLE_H |
3 | 3 | ||
4 | #include <asm/utrap.h> | 4 | #include <asm/utrap.h> |
5 | #include <asm/pil.h> | ||
5 | 6 | ||
6 | #ifdef __ASSEMBLY__ | 7 | #ifdef __ASSEMBLY__ |
7 | #include <asm/thread_info.h> | 8 | #include <asm/thread_info.h> |
@@ -123,7 +124,7 @@ | |||
123 | 124 | ||
124 | #define TRAP_IRQ(routine, level) \ | 125 | #define TRAP_IRQ(routine, level) \ |
125 | rdpr %pil, %g2; \ | 126 | rdpr %pil, %g2; \ |
126 | wrpr %g0, 15, %pil; \ | 127 | wrpr %g0, PIL_NORMAL_MAX, %pil; \ |
127 | sethi %hi(1f-4), %g7; \ | 128 | sethi %hi(1f-4), %g7; \ |
128 | ba,pt %xcc, etrap_irq; \ | 129 | ba,pt %xcc, etrap_irq; \ |
129 | or %g7, %lo(1f-4), %g7; \ | 130 | or %g7, %lo(1f-4), %g7; \ |
@@ -143,7 +144,7 @@ | |||
143 | 144 | ||
144 | #define TRAP_IRQ(routine, level) \ | 145 | #define TRAP_IRQ(routine, level) \ |
145 | rdpr %pil, %g2; \ | 146 | rdpr %pil, %g2; \ |
146 | wrpr %g0, 15, %pil; \ | 147 | wrpr %g0, PIL_NORMAL_MAX, %pil; \ |
147 | ba,pt %xcc, etrap_irq; \ | 148 | ba,pt %xcc, etrap_irq; \ |
148 | rd %pc, %g7; \ | 149 | rd %pc, %g7; \ |
149 | mov level, %o0; \ | 150 | mov level, %o0; \ |
@@ -153,6 +154,16 @@ | |||
153 | 154 | ||
154 | #endif | 155 | #endif |
155 | 156 | ||
157 | #define TRAP_NMI_IRQ(routine, level) \ | ||
158 | rdpr %pil, %g2; \ | ||
159 | wrpr %g0, PIL_NMI, %pil; \ | ||
160 | ba,pt %xcc, etrap_irq; \ | ||
161 | rd %pc, %g7; \ | ||
162 | mov level, %o0; \ | ||
163 | call routine; \ | ||
164 | add %sp, PTREGS_OFF, %o1; \ | ||
165 | ba,a,pt %xcc, rtrap_irq; | ||
166 | |||
156 | #define TRAP_IVEC TRAP_NOSAVE(do_ivec) | 167 | #define TRAP_IVEC TRAP_NOSAVE(do_ivec) |
157 | 168 | ||
158 | #define BTRAP(lvl) TRAP_ARG(bad_trap, lvl) | 169 | #define BTRAP(lvl) TRAP_ARG(bad_trap, lvl) |