s390/nmi: fix order of register validation
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Tue, 21 Feb 2017 09:51:55 +0000 (10:51 +0100)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Thu, 23 Feb 2017 09:06:39 +0000 (10:06 +0100)
When validating register contents first validate control registers
since these control the availability of features later being
validated.
For example the control register 0 should be validated first, before
the additional floating point (AFP) registers are validated, since
control register 0 contains the AFP-register control bit.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/kernel/nmi.c

index 56e14d0..b76b5fe 100644 (file)
@@ -116,6 +116,18 @@ static int notrace s390_validate_registers(union mci mci, int umode)
                        s390_handle_damage();
                kill_task = 1;
        }
+       /* Validate control registers */
+       if (!mci.cr) {
+               /*
+                * Control registers have unknown contents.
+                * Can't recover and therefore stopping machine.
+                */
+               s390_handle_damage();
+       } else {
+               asm volatile(
+                       "       lctlg   0,15,0(%0)"
+                       : : "a" (&S390_lowcore.cregs_save_area) : "memory");
+       }
        if (!mci.fp) {
                /*
                 * Floating point registers can't be restored. If the
@@ -208,18 +220,6 @@ static int notrace s390_validate_registers(union mci mci, int umode)
                 */
                kill_task = 1;
        }
-       /* Validate control registers */
-       if (!mci.cr) {
-               /*
-                * Control registers have unknown contents.
-                * Can't recover and therefore stopping machine.
-                */
-               s390_handle_damage();
-       } else {
-               asm volatile(
-                       "       lctlg   0,15,0(%0)"
-                       : : "a" (&S390_lowcore.cregs_save_area) : "memory");
-       }
        /*
         * We don't even try to validate the TOD register, since we simply
         * can't write something sensible into that register.