• John David Anglin's avatar
    parisc: make interrupt and interruption stack allocation reentrant · b63a2bbc
    John David Anglin authored
    The get_stack_use_cr30 and get_stack_use_r30 macros allocate a stack
    frame for external interrupts and interruptions requiring a stack frame.
    They are currently not reentrant in that they save register context
    before the stack is set or adjusted.
    
    I have observed a number of system crashes where there was clear
    evidence of stack corruption during interrupt processing, and as a
    result register corruption. Some interruptions can still occur during
    interruption processing, however external interrupts are disabled and
    data TLB misses don't occur for absolute accesses. So, it's not entirely
    clear what triggers this issue. Also, if an interruption occurs when
    Q=0, it is generally not possible to recover as the shadowed registers
    are not copied.
    
    The attached patch reworks the get_stack_use_cr30 and get_stack_use_r30
    macros to allocate stack before doing register saves. The new code is a
    couple of instructions shorter than the old implementation. Thus, it's
    an improvement even if it doesn't fully resolve the stack corruption
    issue. Based on limited testing, it improves SMP system stability.
    Signed-off-by: default avatarJohn David Anglin <dave.anglin@bell.net>
    Signed-off-by: default avatarHelge Deller <deller@gmx.de>
    b63a2bbc
assembly.h 12.6 KB