• Sven Schnelle's avatar
    s390: add stack for machine check handler · b61b1595
    Sven Schnelle authored
    The previous code used the normal kernel stack for machine checks.
    This is problematic when a machine check interrupts a system call
    or interrupt handler right at the beginning where registers are set up.
    
    Assume system_call is interrupted at the first instruction and a machine
    check is triggered. The machine check handler is called, checks the PSW
    to see whether it is coming from user space, notices that it is already
    in kernel mode but %r15 still contains the user space stack. This would
    lead to a kernel crash.
    
    There are basically two ways of fixing that: Either using the 'critical
    cleanup' approach which compares the address in the PSW to see whether
    it is already at a point where the stack has been set up, or use an extra
    stack for the machine check handler.
    
    For simplicity, we will go with the second approach and allocate an extra
    stack. This adds some memory overhead for large systems, but usually large
    system have plenty of memory so this isn't really a concern. But it keeps
    the mchk stack setup simple and less error prone.
    
    Fixes: 0b0ed657 ("s390: remove critical section cleanup from entry.S")
    Signed-off-by: default avatarSven Schnelle <svens@linux.ibm.com>
    Cc: <stable@kernel.org> # v5.8+
    Reviewed-by: default avatarHeiko Carstens <hca@linux.ibm.com>
    Signed-off-by: default avatarVasily Gorbik <gor@linux.ibm.com>
    b61b1595
smp.c 31.3 KB