• Scott Wood's avatar
    powerpc/booke64: Fix kernel hangs at kernel_dbg_exc · 6cecf76b
    Scott Wood authored
    MSR_DE is not cleared on entry to the kernel, and we don't clear it
    explicitly outside of debug code.  If we have MSR_DE set in
    prime_debug_regs(), and the new thread has events enabled in DBCR0
    (e.g.  ICMP is set in thread->dbsr0, even though it was cleared in the
    real DBCR0 when the thread got scheduled out), we'll end up taking a
    debug exception in the kernel when DBCR0 is loaded.  DSRR0 will not
    point to an exception vector, and the kernel ends up hanging at
    kernel_dbg_exc.  Fix this by always clearing MSR_DE when we load new
    debug state.
    
    Another observed source of kernel_dbg_exc hangs is with the branch
    taken event.  If this event is active, but we take a non-debug trap
    (e.g. a TLB miss or an asynchronous interrupt) before the next branch.
    We end up taking a branch-taken debug exception on the initial branch
    instruction of the exception vector, but because the debug exception is
    DBSR_BT rather than DBSR_IC we branch to kernel_dbg_exc before even
    checking the DSRR0 address.  Fix this by checking for DBSR_BT as well
    as DBSR_IC, which is what 32-bit does and what the comments suggest was
    intended in the 64-bit code as well.
    Signed-off-by: default avatarScott Wood <scottwood@freescale.com>
    Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
    6cecf76b
exceptions-64e.S 39.8 KB