s390: add separate program check exit path
authorHeiko Carstens <hca@linux.ibm.com>
Wed, 11 Nov 2020 17:46:26 +0000 (18:46 +0100)
committerHeiko Carstens <hca@linux.ibm.com>
Fri, 20 Nov 2020 18:17:24 +0000 (19:17 +0100)
System call and program check handler both use the system call exit
path when returning to previous context. However the program check
handler jumps right to the end of the system call exit path if the
previous context is kernel context.

This lead to the quite odd double disabling of interrupts in the
system call exit path introduced with commit ce9dfafe29be ("s390:
fix system call exit path").

To avoid that have a separate program check handler exit path if the
previous context is kernel context.

Reviewed-by: Sven Schnelle <svens@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
arch/s390/kernel/entry.S

index 5346545..0a7811d 100644 (file)
@@ -430,8 +430,6 @@ ENTRY(system_call)
        TSTMSK  __LC_CPU_FLAGS,(_CIF_WORK-_CIF_FPU)
        jnz     .Lsysc_work
        BPEXIT  __TI_flags(%r12),_TIF_ISOLATE_BP
-.Lsysc_restore:
-       DISABLE_INTS
        TSTMSK  __LC_CPU_FLAGS, _CIF_FPU
        jz      .Lsysc_skip_fpu
        brasl   %r14,load_fpu_regs
@@ -709,10 +707,20 @@ ENTRY(pgm_check_handler)
 .Lpgm_return:
        LOCKDEP_SYS_EXIT
        tm      __PT_PSW+1(%r11),0x01   # returning to user ?
-       jno     .Lsysc_restore
+       jno     .Lpgm_restore
        TSTMSK  __PT_FLAGS(%r11),_PIF_SYSCALL
        jo      .Lsysc_do_syscall
        j       .Lsysc_tif
+.Lpgm_restore:
+       DISABLE_INTS
+       TSTMSK  __LC_CPU_FLAGS, _CIF_FPU
+       jz      .Lpgm_skip_fpu
+       brasl   %r14,load_fpu_regs
+.Lpgm_skip_fpu:
+       mvc     __LC_RETURN_PSW(16),__PT_PSW(%r11)
+       stpt    __LC_EXIT_TIMER
+       lmg     %r0,%r15,__PT_R0(%r11)
+       b       __LC_RETURN_LPSWE
 
 #
 # PER event in supervisor state, must be kprobes