s390/kdump: remove nodat stack restriction for calling nodat functions
authorAlexander Gordeev <agordeev@linux.ibm.com>
Mon, 3 Apr 2023 06:44:40 +0000 (08:44 +0200)
committerVasily Gorbik <gor@linux.ibm.com>
Wed, 19 Apr 2023 15:24:16 +0000 (17:24 +0200)
commit2d1b21eceaf0765d60b543b2b8e26c2f55517259
tree1de582fe2a05fc11880b4365c886b1d3be288058
parent82caf7aba107dbc0e70c330786bed9961a098ab0
s390/kdump: remove nodat stack restriction for calling nodat functions

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: Alexander Gordeev <agordeev@linux.ibm.com>
Reviewed-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
arch/s390/include/asm/stacktrace.h
arch/s390/kernel/machine_kexec.c