tech-kern archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[RFC][PATCH][ARM32] Ctrl+C in the shell provides panic
The fast soft interrupt handler should be executed when interrupt depth
are equal to 0. So, we need to revert back the depth value before
cpu_dosoftints() call. Without this we have got panic just after Ctrl+C
pressing in the shell when __HAVE_FAST_SOFTINTS is enabled.
There is looks like hack until now.
On Fri, May 9, 2008 at 11:22 AM, Andy Shevchenko
<andy.shevchenko%gmail.com@localhost> wrote:
> Hello.
>
> I've built the NetBSD-current/H4 (for TI OMAP 2420SDP) with the soft
> interrupts enabled.
> When I try to press Ctrl+C in a shell, I've got kernel panic.
>
> Really, all *signal() functions in the kern_sig.c check ci_intr_depth and
> panic when value great zero. The non-zero value is mean interrupt context of
> code.
>
> ...
> void
> pgsignal(struct pgrp *pgrp, int sig, int checkctty)
> {
> ksiginfo_t ksi;
>
> >>>>> KASSERT(!cpu_intr_p());
> KASSERT(mutex_owned(proc_lock));
> ...
>
> The depth value is changed only in two places in the irq_entry()
> (irq_dispatch.S): before call ARM_IRQ_HANDLER is incremented and after just
> reverted back.
>
> If I just comment out all of those assertions the shell start to work fine.
> However, I understand is it wrong way to fix.
>
> Please, provide ideas, comments and so on how to fix the issue. Thanks.
>
> --
> With Best Regards,
> Andy Shevchenko
>
>
Index: sys/arch/arm/arm32/irq_dispatch.S
===================================================================
RCS file: /cvsroot/src/sys/arch/arm/arm32/irq_dispatch.S,v
retrieving revision 1.10
diff -u -r1.10 irq_dispatch.S
--- sys/arch/arm/arm32/irq_dispatch.S 27 Apr 2008 18:58:44 -0000 1.10
+++ sys/arch/arm/arm32/irq_dispatch.S 9 May 2008 09:06:13 -0000
@@ -104,28 +104,10 @@
PUSHFRAMEINSVC /* Push an interrupt frame */
ENABLE_ALIGNMENT_FAULTS /* finishes with curcpu() in r4 */
- /*
- * Increment the interrupt nesting depth and call the interrupt
- * dispatch routine. We've pushed a frame, so we can safely use
- * callee-saved regs here. We use the following registers, which
- * we expect to presist:
- *
- * r4 address of current cpu_info
- * r6 old value of `ci_intr_depth'
- */
mov r0, sp /* arg for dispatcher */
- ldr r6, [r4, #CI_INTR_DEPTH]
- add r1, r6, #1
- str r1, [r4, #CI_INTR_DEPTH]
bl ARM_IRQ_HANDLER
- /*
- * Restore the old interrupt depth value (which should be the
- * same as decrementing it at this point).
- */
- str r6, [r4, #CI_INTR_DEPTH]
-
LOCK_CAS_CHECK
DO_AST_AND_RESTORE_ALIGNMENT_FAULTS
Index: sys/arch/arm/pic/pic.c
===================================================================
RCS file: /cvsroot/src/sys/arch/arm/pic/pic.c,v
retrieving revision 1.3
diff -u -r1.3 pic.c
--- sys/arch/arm/pic/pic.c 28 Apr 2008 20:23:14 -0000 1.3
+++ sys/arch/arm/pic/pic.c 9 May 2008 09:06:13 -0000
@@ -339,6 +339,9 @@
struct cpu_info * const ci = curcpu();
if (__predict_false(newipl == IPL_HIGH))
return;
+
+ ci->ci_intr_depth++;
+
while ((pic_pending_ipls & ~__BIT(newipl)) > __BIT(newipl)) {
KASSERT(pic_pending_ipls < __BIT(NIPL));
for (;;) {
@@ -352,6 +355,9 @@
pic_list_unblock_irqs();
}
}
+
+ ci->ci_intr_depth--;
+
if (ci->ci_cpl != newipl)
ci->ci_cpl = newipl;
#ifdef __HAVE_FAST_SOFTINTS
--
With Best Regards,
Andy Shevchenko
Home |
Main Index |
Thread Index |
Old Index