| From d6df52e9996dcc2062c3d9c9123288468bb95b52 Mon Sep 17 00:00:00 2001 |
| From: Vasily Gorbik <gor@linux.ibm.com> |
| Date: Wed, 24 Jun 2020 17:39:14 +0200 |
| Subject: s390/maccess: add no DAT mode to kernel_write |
| |
| From: Vasily Gorbik <gor@linux.ibm.com> |
| |
| commit d6df52e9996dcc2062c3d9c9123288468bb95b52 upstream. |
| |
| To be able to patch kernel code before paging is initialized do plain |
| memcpy if DAT is off. This is required to enable early jump label |
| initialization. |
| |
| Reviewed-by: Heiko Carstens <heiko.carstens@de.ibm.com> |
| Signed-off-by: Vasily Gorbik <gor@linux.ibm.com> |
| Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/s390/mm/maccess.c | 16 +++++++++++----- |
| 1 file changed, 11 insertions(+), 5 deletions(-) |
| |
| --- a/arch/s390/mm/maccess.c |
| +++ b/arch/s390/mm/maccess.c |
| @@ -58,13 +58,19 @@ static notrace long s390_kernel_write_od |
| */ |
| void notrace s390_kernel_write(void *dst, const void *src, size_t size) |
| { |
| + unsigned long flags; |
| long copied; |
| |
| - while (size) { |
| - copied = s390_kernel_write_odd(dst, src, size); |
| - dst += copied; |
| - src += copied; |
| - size -= copied; |
| + flags = arch_local_save_flags(); |
| + if (!(flags & PSW_MASK_DAT)) { |
| + memcpy(dst, src, size); |
| + } else { |
| + while (size) { |
| + copied = s390_kernel_write_odd(dst, src, size); |
| + dst += copied; |
| + src += copied; |
| + size -= copied; |
| + } |
| } |
| } |
| |