• Alexander Gordeev's avatar
    s390/kdump: remove nodat stack restriction for calling nodat functions · 2d1b21ec
    Alexander Gordeev authored
    To allow calling of DAT-off code from kernel the stack needs
    to be switched to nodat_stack (or other stack mapped as 1:1).
    
    Before call_nodat() macro was introduced that was necessary
    to provide the very same memory address for STNSM and STOSM
    instructions. If the kernel would stay on a random stack
    (e.g. a virtually mapped one) then a virtual address provided
    for STNSM instruction could differ from the physical address
    needed for the corresponding STOSM instruction.
    
    After call_nodat() macro is introduced the kernel stack does
    not need to be mapped 1:1 anymore, since the macro stores the
    physical memory address of return PSW in a register before
    entering DAT-off mode. This way the return LPSWE instruction
    is able to pick the correct memory location and restore the
    DAT-on mode. That however might fail in case the 16-byte return
    PSW happened to cross page boundary: PSW mask and PSW address
    could end up in two separate non-contiguous physical pages.
    
    Align the return PSW on 16-byte boundary so it always fits
    into a single physical page. As result any stack (including
    the virtually mapped one) could be used for calling DAT-off
    code and prior switching to nodat_stack becomes unnecessary.
    Signed-off-by: default avatarAlexander Gordeev <agordeev@linux.ibm.com>
    Reviewed-by: default avatarHeiko Carstens <hca@linux.ibm.com>
    Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
    Signed-off-by: default avatarVasily Gorbik <gor@linux.ibm.com>
    2d1b21ec
machine_kexec.c 6.67 KB