s390/mm: rework memcpy_real() to avoid DAT-off mode
authorAlexander Gordeev <agordeev@linux.ibm.com>
Sun, 24 Jul 2022 13:02:16 +0000 (15:02 +0200)
committerVasily Gorbik <gor@linux.ibm.com>
Wed, 14 Sep 2022 14:46:01 +0000 (16:46 +0200)
commit2f0e8aae26a27fe73d033788f8e92188e7584f41
tree07c8abbd98e7b51142126c6c5880eaeea65ccaf9
parent14a3a2624285d36624966935ec12f228d876c028
s390/mm: rework memcpy_real() to avoid DAT-off mode

Function memcpy_real() is an univeral data mover that does not
require DAT mode to be able reading from a physical address.
Its advantage is an ability to read from any address, even
those for which no kernel virtual mapping exists.

Although memcpy_real() is interrupt-safe, there are no handlers
that make use of this function. The compiler instrumentation
have to be disabled and separate no-DAT stack used to allow
execution of the function once DAT mode is disabled.

Rework memcpy_real() to overcome these shortcomings. As result,
data copying (which is primarily reading out a crashed system
memory by a user process) is executed on a regular stack with
enabled interrupts. Also, use of memcpy_real_buf swap buffer
becomes unnecessary and the swapping is eliminated.

The above is achieved by using a fixed virtual address range
that spans a single page and remaps that page repeatedly when
memcpy_real() is called for a particular physical address.

Reviewed-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
arch/s390/boot/startup.c
arch/s390/include/asm/maccess.h [new file with mode: 0644]
arch/s390/include/asm/pgtable.h
arch/s390/include/asm/processor.h
arch/s390/kernel/crash_dump.c
arch/s390/kernel/setup.c
arch/s390/mm/maccess.c
arch/s390/mm/vmem.c
drivers/s390/char/zcore.c