lkml.org 
[lkml]   [2017]   [Nov]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 3.16 078/133] ARC: Re-enable MMU upon Machine Check exception
    3.16.51-rc1 review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Jose Abreu <Jose.Abreu@synopsys.com>

    commit 1ee55a8f7f6b7ca4c0c59e0b4b4e3584a085c2d3 upstream.

    I recently came upon a scenario where I would get a double fault
    machine check exception tiriggered by a kernel module.
    However the ensuing crash stacktrace (ksym lookup) was not working
    correctly.

    Turns out that machine check auto-disables MMU while modules are allocated
    in kernel vaddr spapce.

    This patch re-enables the MMU before start printing the stacktrace
    making stacktracing of modules work upon a fatal exception.

    Signed-off-by: Jose Abreu <joabreu@synopsys.com>
    Reviewed-by: Alexey Brodkin <abrodkin@synopsys.com>
    Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
    [vgupta: moved code into low level handler to avoid in 2 places]
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    ---
    arch/arc/kernel/entry.S | 6 ++++++
    arch/arc/mm/tlb.c | 3 ---
    2 files changed, 6 insertions(+), 3 deletions(-)

    --- a/arch/arc/kernel/entry.S
    +++ b/arch/arc/kernel/entry.S
    @@ -315,6 +315,12 @@ ENTRY(EV_MachineCheck)
    lr r0, [efa]
    mov r1, sp

    + ; hardware auto-disables MMU, re-enable it to allow kernel vaddr
    + ; access for say stack unwinding of modules for crash dumps
    + lr r3, [ARC_REG_PID]
    + or r3, r3, MMU_ENABLE
    + sr r3, [ARC_REG_PID]
    +
    lsr r3, r2, 8
    bmsk r3, r3, 7
    brne r3, ECR_C_MCHK_DUP_TLB, 1f
    --- a/arch/arc/mm/tlb.c
    +++ b/arch/arc/mm/tlb.c
    @@ -691,9 +691,6 @@ void do_tlb_overlap_fault(unsigned long

    local_irq_save(flags);

    - /* re-enable the MMU */
    - write_aux_reg(ARC_REG_PID, MMU_ENABLE | read_aux_reg(ARC_REG_PID));
    -
    /* loop thru all sets of TLB */
    for (set = 0; set < mmu->sets; set++) {

    \
     
     \ /
      Last update: 2017-11-22 03:23    [W:4.076 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site