• Ralf Baechle's avatar
    MIPS: Malta: Don't crash on spurious interrupt. · e376fdf4
    Ralf Baechle authored
    48d480b0 [[MIPS] Malta: Fix off by one bug in interrupt
    handler.] did not take in account that irq_ffs() will also return 0 if for some reason
    the set of pending interrupts happens to be empty.
    
    This is trivial to trigger with a RM5261 CPU module running a 64-bit kernel and results
    in something like the following:
    
    CPU 0 Unable to handle kernel paging request at virtual address 0000000000000000, epc == ffffffff801772d0, ra == ffffffff8017ad24
    Oops[#1]:
    Cpu 0
    $ 0   : 0000000000000000 ffffffff9000a4e0 ffffffff9000a4e0 ffffffff9000a4e0
    $ 4   : ffffffff80592be0 0000000000000000 00000000000000d6 ffffffff80322ed0
    $ 8   : ffffffff805fe538 0000000000000000 ffffffff9000a4e0 ffffffff80590000
    $12   : 00000000000000d6 0000000000000000 ffffffff80600000 ffffffff805fe538
    $16   : 0000000000000000 0000000000000010 ffffffff80592be0 0000000000000010
    $20   : 0000000000000000 0000000000500001 0000000000000000 ffffffff8051e078
    $24   : 0000000000000028 ffffffff803226e8
    $28   : 9800000003828000 980000000382b900 ffffffff8051e060 ffffffff8017ad24
    Hi    : 0000000000000000
    Lo    : 0000006388974000
    epc   : ffffffff801772d0 handle_irq_event_percpu+0x70/0x2f0
        Not tainted
    ra    : ffffffff8017ad24 handle_percpu_irq+0x54/0x88
    Status: 9000a4e2    KX SX UX KERNEL EXL
    Cause : 00808008
    BadVA : 0000000000000000
    PrId  : 000028a0 (Nevada)
    Modules linked in:
    Process init (pid: 1, threadinfo=9800000003828000, task=9800000003827968, tls=0000000077087490)
    Stack : ffffffff80592be0 ffffffff8058d248 0000000000000040 0000000000000000
            ffffffff80613340 0000000000500001 ffffffff805a0000 0000000000000882
            9800000003b89000 ffffffff8017ad24 00000000000000d5 0000000000000010
            ffffffff9000a4e1 ffffffff801769f4 ffffffff9000a4e0 ffffffff801037f8
            0000000000000000 ffffffff80101c44 0000000000000000 ffffffff9000a4e0
            0000000000000000 9000000018000000 90000000180003f9 0000000000000001
            0000000000000000 00000000000000ff 0000000000000018 0000000000000001
            0000000000000001 00000000003fffff 0000000000000020 ffffffff802cf7ac
            ffffffff80208918 000000007fdadf08 ffffffff80612d88 ffffffff9000a4e1
            0000000000000040 0000000000000000 ffffffff80613340 0000000000500001
            ...
    Call Trace:
    [<ffffffff801772d0>] handle_irq_event_percpu+0x70/0x2f0
    [<ffffffff8017ad24>] handle_percpu_irq+0x54/0x88
    [<ffffffff801769f4>] generic_handle_irq+0x44/0x60
    [<ffffffff801037f8>] do_IRQ+0x48/0x70
    [<ffffffff80101c44>] ret_from_irq+0x0/0x4
    [<ffffffff80326170>] serial8250_startup+0x310/0x870
    [<ffffffff8032175c>] uart_startup.part.7+0x9c/0x330
    [<ffffffff80321b4c>] uart_open+0x15c/0x1b0
    [<ffffffff80302034>] tty_open+0x1fc/0x720
    [<ffffffff801bffac>] chrdev_open+0x7c/0x180
    [<ffffffff801b9ab8>] do_dentry_open.isra.14+0x288/0x390
    [<ffffffff801bac5c>] nameidata_to_filp+0x5c/0xc0
    [<ffffffff801ca700>] do_last.isra.33+0x330/0x8f0
    [<ffffffff801caf3c>] path_openat+0xbc/0x440
    [<ffffffff801cb3c8>] do_filp_open+0x38/0xa8
    [<ffffffff801bade4>] do_sys_open+0x124/0x218
    [<ffffffff80110538>] handle_sys+0x118/0x13c
    
    Code: 02d5a825  12800012  02a0b02d <de820000> de850008  0040f809  0220202d  0040a82d  40026000
    ---[ end trace 5d8e7b9a86badd2d ]---
    Kernel panic - not syncing: Fatal exception in interrupt
    Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
    e376fdf4
malta-int.c 20.4 KB