s390/noexec: execute kexec datamover without DAT
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Thu, 9 Nov 2017 22:00:14 +0000 (23:00 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 30 Nov 2017 08:40:38 +0000 (08:40 +0000)
commit d0e810eeb3d326978f248b8f0233a2f30f58c72d upstream.

Rebooting into a new kernel with kexec fails (system dies) if tried on
a machine that has no-execute support. Reason for this is that the so
called datamover code gets executed with DAT on (MMU is active) and
the page that contains the datamover is marked as non-executable.
Therefore when branching into the datamover an unexpected program
check happens and afterwards the machine is dead.

This can be simply avoided by disabling DAT, which also disables any
no-execute checks, just before the datamover gets executed.

In fact the first thing done by the datamover is to disable DAT. The
code in the datamover that disables DAT can be removed as well.

Thanks to Michael Holzheu and Gerald Schaefer for tracking this down.

Reviewed-by: Michael Holzheu <holzheu@linux.vnet.ibm.com>
Reviewed-by: Philipp Rudo <prudo@linux.vnet.ibm.com>
Cc: Gerald Schaefer <gerald.schaefer@de.ibm.com>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Fixes: 57d7f939e7bd ("s390: add no-execute support")
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/s390/kernel/machine_kexec.c
arch/s390/kernel/relocate_kernel.S

index b0ba2c26b45e4ebe2b20b709c4618cf96eba5df2..d6f7782e75c93d551e3147fb301a73c628b295e1 100644 (file)
@@ -269,6 +269,7 @@ static void __do_machine_kexec(void *data)
        s390_reset_system();
        data_mover = (relocate_kernel_t) page_to_phys(image->control_code_page);
 
+       __arch_local_irq_stnsm(0xfb); /* disable DAT - avoid no-execute */
        /* Call the moving routine */
        (*data_mover)(&image->head, image->start);
 
index ca37e5d5b40cc3ff37ec4873fdd2ed81c69f4f80..9c2c96da23d0292ebfae28de8f50219d47e7d8bf 100644 (file)
@@ -29,7 +29,6 @@
 ENTRY(relocate_kernel)
                basr    %r13,0          # base address
        .base:
-               stnsm   sys_msk-.base(%r13),0xfb        # disable DAT
                stctg   %c0,%c15,ctlregs-.base(%r13)
                stmg    %r0,%r15,gprregs-.base(%r13)
                lghi    %r0,3
@@ -103,8 +102,6 @@ ENTRY(relocate_kernel)
                .align  8
        load_psw:
                .long   0x00080000,0x80000000
-       sys_msk:
-               .quad   0
        ctlregs:
                .rept   16
                .quad   0