• Michael Ellerman's avatar
    powerpc: Skip emulating & leave interrupts off for kernel program checks · b3f6a459
    Michael Ellerman authored
    In the program check handler we handle some causes with interrupts off
    and others with interrupts on.
    
    We need to enable interrupts to handle the emulation cases, because they
    access userspace memory and might sleep.
    
    For faults in the kernel we don't want to do any emulation, and
    emulate_instruction() enforces that. do_mathemu() doesn't but probably
    should.
    
    The other disadvantage of enabling interrupts for kernel faults is that
    we may take another interrupt, and recurse. As seen below:
    
      --- Exception: e40 at c000000000004ee0 performance_monitor_relon_pSeries_1
      [link register   ] c00000000000f858 .arch_local_irq_restore+0x38/0x90
      [c000000fb185dc10] 0000000000000000 (unreliable)
      [c000000fb185dc80] c0000000007d8558 .program_check_exception+0x298/0x2d0
      [c000000fb185dd00] c000000000002f40 emulation_assist_common+0x140/0x180
      --- Exception: e40 at c000000000004ee0 performance_monitor_relon_pSeries_1
      [link register   ] c00000000000f858 .arch_local_irq_restore+0x38/0x90
      [c000000fb185dff0] 00000000008b9190 (unreliable)
      [c000000fb185e060] c0000000007d8558 .program_check_exception+0x298/0x2d0
    
    So avoid both problems by checking if the fault was in the kernel and
    skipping the enable of interrupts and the emulation. Go straight to
    delivering the SIGILL, which for kernel faults calls die() and so on,
    dropping us in the debugger etc.
    Signed-off-by: default avatarMichael Ellerman <michael@ellerman.id.au>
    Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
    b3f6a459
traps.c 47.2 KB