s390: split cleanup_sie

The current code uses the address in %r11 to figure out whether
it was called from the machine check handler or from a normal
interrupt handler. Instead of doing this implicit logic (which
is mostly a leftover from the old critical cleanup approach)
just add a second label and use that.

Signed-off-by: Sven Schnelle <svens@linux.ibm.com>
Reviewed-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
This commit is contained in:
Sven Schnelle 2021-02-03 17:50:00 +01:00 committed by Vasily Gorbik
parent 33ea04872d
commit efa5473590
1 changed files with 7 additions and 10 deletions

View File

@ -214,7 +214,7 @@ ENTRY(sie64a)
# are some corner cases (e.g. runtime instrumentation) where ILC is unpredictable. # are some corner cases (e.g. runtime instrumentation) where ILC is unpredictable.
# Other instructions between sie64a and .Lsie_done should not cause program # Other instructions between sie64a and .Lsie_done should not cause program
# interrupts. So lets use 3 nops as a landing pad for all possible rewinds. # interrupts. So lets use 3 nops as a landing pad for all possible rewinds.
# See also .Lcleanup_sie # See also .Lcleanup_sie_mcck/.Lcleanup_sie_int
.Lrewind_pad6: .Lrewind_pad6:
nopr 7 nopr 7
.Lrewind_pad4: .Lrewind_pad4:
@ -398,8 +398,7 @@ ENTRY(\name)
lghi %r13,.Lsie_done - .Lsie_gmap lghi %r13,.Lsie_done - .Lsie_gmap
clgr %r14,%r13 clgr %r14,%r13
jhe 0f jhe 0f
lghi %r11,__LC_SAVE_AREA_ASYNC # inside critical section, do cleanup brasl %r14,.Lcleanup_sie_int
brasl %r14,.Lcleanup_sie
#endif #endif
0: CHECK_STACK __LC_SAVE_AREA_ASYNC 0: CHECK_STACK __LC_SAVE_AREA_ASYNC
lgr %r11,%r15 lgr %r11,%r15
@ -548,8 +547,7 @@ ENTRY(mcck_int_handler)
lghi %r13,.Lsie_done - .Lsie_gmap lghi %r13,.Lsie_done - .Lsie_gmap
clgr %r14,%r13 clgr %r14,%r13
jhe .Lmcck_stack jhe .Lmcck_stack
lghi %r11,__LC_GPREGS_SAVE_AREA+64 # inside critical section, do cleanup brasl %r14,.Lcleanup_sie_mcck
brasl %r14,.Lcleanup_sie
#endif #endif
j .Lmcck_stack j .Lmcck_stack
.Lmcck_user: .Lmcck_user:
@ -651,16 +649,15 @@ ENDPROC(stack_overflow)
#endif #endif
#if IS_ENABLED(CONFIG_KVM) #if IS_ENABLED(CONFIG_KVM)
.Lcleanup_sie: .Lcleanup_sie_mcck:
cghi %r11,__LC_SAVE_AREA_ASYNC #Is this in normal interrupt?
je 1f
larl %r13,.Lsie_entry larl %r13,.Lsie_entry
slgr %r9,%r13 slgr %r9,%r13
larl %r13,.Lsie_skip larl %r13,.Lsie_skip
clgr %r9,%r13 clgr %r9,%r13
jh 1f jh .Lcleanup_sie_int
oi __LC_CPU_FLAGS+7, _CIF_MCCK_GUEST oi __LC_CPU_FLAGS+7, _CIF_MCCK_GUEST
1: BPENTER __SF_SIE_FLAGS(%r15),(_TIF_ISOLATE_BP|_TIF_ISOLATE_BP_GUEST) .Lcleanup_sie_int:
BPENTER __SF_SIE_FLAGS(%r15),(_TIF_ISOLATE_BP|_TIF_ISOLATE_BP_GUEST)
lg %r9,__SF_SIE_CONTROL(%r15) # get control block pointer lg %r9,__SF_SIE_CONTROL(%r15) # get control block pointer
ni __SIE_PROG0C+3(%r9),0xfe # no longer in SIE ni __SIE_PROG0C+3(%r9),0xfe # no longer in SIE
lctlg %c1,%c1,__LC_KERNEL_ASCE lctlg %c1,%c1,__LC_KERNEL_ASCE