s390/sclp: fix possible control register corruption
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Thu, 7 Jan 2016 12:37:22 +0000 (13:37 +0100)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Mon, 11 Jan 2016 12:03:00 +0000 (13:03 +0100)
sclp_sync_wait() disables all external interrupt classes except for
the service signal subclass.

The static mask used for that however is wrong. It clears a couple of
bits which shouldn't be cleared and on the other hand potentially does
not clear bits which should be cleared.

Fix this by using the same generic mask like we do it in our delay
implementation.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Reviewed-by: Gerald Schaefer <gerald.schaefer@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
drivers/s390/char/sclp.c

index f58bf4c6c3ee55eabbae7491050f0f3a54a79ba9..272898225dbb4f42fc84ee884fb0e6b7be3864b7 100644 (file)
@@ -579,9 +579,8 @@ sclp_sync_wait(void)
        old_tick = local_tick_disable();
        trace_hardirqs_on();
        __ctl_store(cr0, 0, 0);
-       cr0_sync = cr0;
-       cr0_sync &= 0xffff00a0;
-       cr0_sync |= 0x00000200;
+       cr0_sync = cr0 & ~CR0_IRQ_SUBCLASS_MASK;
+       cr0_sync |= 1UL << (63 - 54);
        __ctl_load(cr0_sync, 0, 0);
        __arch_local_irq_stosm(0x01);
        /* Loop until driver state indicates finished request */