summaryrefslogtreecommitdiffstats
path: root/arch/alpha/kernel
diff options
context:
space:
mode:
authorIvan Kokshaysky <ink@jurassic.park.msu.ru>2005-06-30 18:02:18 +0200
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-07-01 07:29:48 +0200
commiteaf05be039cf5adfba5b1846452ce89646110fdb (patch)
treeda81bed900c4a80f53379feb2de477fc4047792c /arch/alpha/kernel
parentMerge master.kernel.org:/home/rmk/linux-2.6-arm (diff)
downloadlinux-eaf05be039cf5adfba5b1846452ce89646110fdb.tar.xz
linux-eaf05be039cf5adfba5b1846452ce89646110fdb.zip
[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')
-rw-r--r--arch/alpha/kernel/traps.c2
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)
siginfo_t info;
int signo, code;
- if (regs->ps == 0) {
+ if ((regs->ps & ~IPL_MAX) == 0) {
if (type == 1) {
const unsigned int *data
= (const unsigned int *) regs->pc;