diff options
author | Ivan Kokshaysky <ink@jurassic.park.msu.ru> | 2005-06-30 12:02:18 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-07-01 01:29:48 -0400 |
commit | eaf05be039cf5adfba5b1846452ce89646110fdb (patch) | |
tree | da81bed900c4a80f53379feb2de477fc4047792c /arch/alpha/kernel/traps.c | |
parent | 62351cc38d3eaf3de0327054dd6ebc039f4da80d (diff) |
[PATCH] alpha smp fix
As usual, the reason of this breakage is quite silly: in do_entIF, we
are checking for PS == 0 to see whether it was a kernel BUG() or
userspace trap.
It works, unless BUG() happens in interrupt - PS is not 0 in kernel mode
due to non-zero IPL, and the things get messed up horribly then. In
this particular case it was BUG_ON(!irqs_disabled()) triggered in
run_posix_cpu_timers(), so we ended up shooting "current" with the
bursts of one SIGTRAP and three SIGILLs on every timer tick. ;-)
Diffstat (limited to 'arch/alpha/kernel/traps.c')
-rw-r--r-- | arch/alpha/kernel/traps.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/arch/alpha/kernel/traps.c b/arch/alpha/kernel/traps.c index fd7bd17cc960..6f509a644bdd 100644 --- a/arch/alpha/kernel/traps.c +++ b/arch/alpha/kernel/traps.c | |||
@@ -240,7 +240,7 @@ do_entIF(unsigned long type, struct pt_regs *regs) | |||
240 | siginfo_t info; | 240 | siginfo_t info; |
241 | int signo, code; | 241 | int signo, code; |
242 | 242 | ||
243 | if (regs->ps == 0) { | 243 | if ((regs->ps & ~IPL_MAX) == 0) { |
244 | if (type == 1) { | 244 | if (type == 1) { |
245 | const unsigned int *data | 245 | const unsigned int *data |
246 | = (const unsigned int *) regs->pc; | 246 | = (const unsigned int *) regs->pc; |