summaryrefslogtreecommitdiffstats
path: root/arch/sparc/kernel/rtrap_64.S
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2010-04-20 09:48:37 +0200
committerDavid S. Miller <davem@davemloft.net>2010-04-20 09:48:37 +0200
commit28a1f533ae8606020238b840b82ae70a3f87609e (patch)
treeaba93c055c8e2cd36b05846ed38173daba44ce53 /arch/sparc/kernel/rtrap_64.S
parentsparc64: Use correct pt_regs in decode_access_size() error paths. (diff)
downloadlinux-28a1f533ae8606020238b840b82ae70a3f87609e.tar.xz
linux-28a1f533ae8606020238b840b82ae70a3f87609e.zip
sparc64: Fix hardirq tracing in trap return path.
We can overflow the hardirq stack if we set the %pil here so early, just let the normal control flow do it. This is fine as we are allowed to do the actual IRQ enable at any point after we call trace_hardirqs_on. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc/kernel/rtrap_64.S')
-rw-r--r--arch/sparc/kernel/rtrap_64.S12
1 files changed, 11 insertions, 1 deletions
diff --git a/arch/sparc/kernel/rtrap_64.S b/arch/sparc/kernel/rtrap_64.S
index 83f1873c6c13..090b9e9ad5e3 100644
--- a/arch/sparc/kernel/rtrap_64.S
+++ b/arch/sparc/kernel/rtrap_64.S
@@ -130,7 +130,17 @@ rtrap_xcall:
nop
call trace_hardirqs_on
nop
- wrpr %l4, %pil
+ /* Do not actually set the %pil here. We will do that
+ * below after we clear PSTATE_IE in the %pstate register.
+ * If we re-enable interrupts here, we can recurse down
+ * the hardirq stack potentially endlessly, causing a
+ * stack overflow.
+ *
+ * It is tempting to put this test and trace_hardirqs_on
+ * call at the 'rt_continue' label, but that will not work
+ * as that path hits unconditionally and we do not want to
+ * execute this in NMI return paths, for example.
+ */
#endif
rtrap_no_irq_enable:
andcc %l1, TSTATE_PRIV, %l3