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:
parent
33ea04872d
commit
efa5473590
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue