• James Morse's avatar
    arm64: remove irq_count and do_softirq_own_stack() · d224a69e
    James Morse authored
    sysrq_handle_reboot() re-enables interrupts while on the irq stack. The
    irq_stack implementation wrongly assumed this would only ever happen
    via the softirq path, allowing it to update irq_count late, in
    do_softirq_own_stack().
    
    This means if an irq occurs in sysrq_handle_reboot(), during
    emergency_restart() the stack will be corrupted, as irq_count wasn't
    updated.
    
    Lose the optimisation, and instead of moving the adding/subtracting of
    irq_count into irq_stack_entry/irq_stack_exit, remove it, and compare
    sp_el0 (struct thread_info) with sp & ~(THREAD_SIZE - 1). This tells us
    if we are on a task stack, if so, we can safely switch to the irq stack.
    Finally, remove do_softirq_own_stack(), we don't need it anymore.
    Reported-by: default avatarWill Deacon <will.deacon@arm.com>
    Signed-off-by: default avatarJames Morse <james.morse@arm.com>
    [will: use get_thread_info macro]
    Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
    d224a69e
irq.c 1.74 KB