s390/kvm: improve stack frame constants in entry.S
The code in sie64a uses the stack frame passed to the function to store some temporary data in the empty1 array (see struct stack_frame in asm/processor.h. Replace the __SF_EMPTY+x constants with a properly defined offset: s/__SF_EMPTY/__SF_SIE_CONTROL/, s/__SF_EMPTY+8/__SF_SIE_SAVEAREA/, s/__SF_EMPTY+16/__SF_SIE_REASON/, s/__SF_EMPTY+24/__SF_SIE_FLAGS/. Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
e5b98199de
commit
92fa7a13c8
|
@ -63,6 +63,7 @@ int main(void)
|
||||||
OFFSET(__SF_SIE_CONTROL, stack_frame, empty1[0]);
|
OFFSET(__SF_SIE_CONTROL, stack_frame, empty1[0]);
|
||||||
OFFSET(__SF_SIE_SAVEAREA, stack_frame, empty1[1]);
|
OFFSET(__SF_SIE_SAVEAREA, stack_frame, empty1[1]);
|
||||||
OFFSET(__SF_SIE_REASON, stack_frame, empty1[2]);
|
OFFSET(__SF_SIE_REASON, stack_frame, empty1[2]);
|
||||||
|
OFFSET(__SF_SIE_FLAGS, stack_frame, empty1[3]);
|
||||||
BLANK();
|
BLANK();
|
||||||
/* timeval/timezone offsets for use by vdso */
|
/* timeval/timezone offsets for use by vdso */
|
||||||
OFFSET(__VDSO_UPD_COUNT, vdso_data, tb_update_count);
|
OFFSET(__VDSO_UPD_COUNT, vdso_data, tb_update_count);
|
||||||
|
|
|
@ -297,10 +297,10 @@ ENTRY(__switch_to)
|
||||||
ENTRY(sie64a)
|
ENTRY(sie64a)
|
||||||
stmg %r6,%r14,__SF_GPRS(%r15) # save kernel registers
|
stmg %r6,%r14,__SF_GPRS(%r15) # save kernel registers
|
||||||
lg %r12,__LC_CURRENT
|
lg %r12,__LC_CURRENT
|
||||||
stg %r2,__SF_EMPTY(%r15) # save control block pointer
|
stg %r2,__SF_SIE_CONTROL(%r15) # save control block pointer
|
||||||
stg %r3,__SF_EMPTY+8(%r15) # save guest register save area
|
stg %r3,__SF_SIE_SAVEAREA(%r15) # save guest register save area
|
||||||
xc __SF_EMPTY+16(8,%r15),__SF_EMPTY+16(%r15) # reason code = 0
|
xc __SF_SIE_REASON(8,%r15),__SF_SIE_REASON(%r15) # reason code = 0
|
||||||
mvc __SF_EMPTY+24(8,%r15),__TI_flags(%r12) # copy thread flags
|
mvc __SF_SIE_FLAGS(8,%r15),__TI_flags(%r12) # copy thread flags
|
||||||
TSTMSK __LC_CPU_FLAGS,_CIF_FPU # load guest fp/vx registers ?
|
TSTMSK __LC_CPU_FLAGS,_CIF_FPU # load guest fp/vx registers ?
|
||||||
jno .Lsie_load_guest_gprs
|
jno .Lsie_load_guest_gprs
|
||||||
brasl %r14,load_fpu_regs # load guest fp/vx regs
|
brasl %r14,load_fpu_regs # load guest fp/vx regs
|
||||||
|
@ -311,18 +311,18 @@ ENTRY(sie64a)
|
||||||
jz .Lsie_gmap
|
jz .Lsie_gmap
|
||||||
lctlg %c1,%c1,__GMAP_ASCE(%r14) # load primary asce
|
lctlg %c1,%c1,__GMAP_ASCE(%r14) # load primary asce
|
||||||
.Lsie_gmap:
|
.Lsie_gmap:
|
||||||
lg %r14,__SF_EMPTY(%r15) # get control block pointer
|
lg %r14,__SF_SIE_CONTROL(%r15) # get control block pointer
|
||||||
oi __SIE_PROG0C+3(%r14),1 # we are going into SIE now
|
oi __SIE_PROG0C+3(%r14),1 # we are going into SIE now
|
||||||
tm __SIE_PROG20+3(%r14),3 # last exit...
|
tm __SIE_PROG20+3(%r14),3 # last exit...
|
||||||
jnz .Lsie_skip
|
jnz .Lsie_skip
|
||||||
TSTMSK __LC_CPU_FLAGS,_CIF_FPU
|
TSTMSK __LC_CPU_FLAGS,_CIF_FPU
|
||||||
jo .Lsie_skip # exit if fp/vx regs changed
|
jo .Lsie_skip # exit if fp/vx regs changed
|
||||||
BPEXIT __SF_EMPTY+24(%r15),(_TIF_ISOLATE_BP|_TIF_ISOLATE_BP_GUEST)
|
BPEXIT __SF_SIE_FLAGS(%r15),(_TIF_ISOLATE_BP|_TIF_ISOLATE_BP_GUEST)
|
||||||
.Lsie_entry:
|
.Lsie_entry:
|
||||||
sie 0(%r14)
|
sie 0(%r14)
|
||||||
.Lsie_exit:
|
.Lsie_exit:
|
||||||
BPOFF
|
BPOFF
|
||||||
BPENTER __SF_EMPTY+24(%r15),(_TIF_ISOLATE_BP|_TIF_ISOLATE_BP_GUEST)
|
BPENTER __SF_SIE_FLAGS(%r15),(_TIF_ISOLATE_BP|_TIF_ISOLATE_BP_GUEST)
|
||||||
.Lsie_skip:
|
.Lsie_skip:
|
||||||
ni __SIE_PROG0C+3(%r14),0xfe # no longer in SIE
|
ni __SIE_PROG0C+3(%r14),0xfe # no longer in SIE
|
||||||
lctlg %c1,%c1,__LC_USER_ASCE # load primary asce
|
lctlg %c1,%c1,__LC_USER_ASCE # load primary asce
|
||||||
|
@ -341,7 +341,7 @@ ENTRY(sie64a)
|
||||||
nopr 7
|
nopr 7
|
||||||
.globl sie_exit
|
.globl sie_exit
|
||||||
sie_exit:
|
sie_exit:
|
||||||
lg %r14,__SF_EMPTY+8(%r15) # load guest register save area
|
lg %r14,__SF_SIE_SAVEAREA(%r15) # load guest register save area
|
||||||
stmg %r0,%r13,0(%r14) # save guest gprs 0-13
|
stmg %r0,%r13,0(%r14) # save guest gprs 0-13
|
||||||
xgr %r0,%r0 # clear guest registers to
|
xgr %r0,%r0 # clear guest registers to
|
||||||
xgr %r1,%r1 # prevent speculative use
|
xgr %r1,%r1 # prevent speculative use
|
||||||
|
@ -350,11 +350,11 @@ sie_exit:
|
||||||
xgr %r4,%r4
|
xgr %r4,%r4
|
||||||
xgr %r5,%r5
|
xgr %r5,%r5
|
||||||
lmg %r6,%r14,__SF_GPRS(%r15) # restore kernel registers
|
lmg %r6,%r14,__SF_GPRS(%r15) # restore kernel registers
|
||||||
lg %r2,__SF_EMPTY+16(%r15) # return exit reason code
|
lg %r2,__SF_SIE_REASON(%r15) # return exit reason code
|
||||||
BR_R1USE_R14
|
BR_R1USE_R14
|
||||||
.Lsie_fault:
|
.Lsie_fault:
|
||||||
lghi %r14,-EFAULT
|
lghi %r14,-EFAULT
|
||||||
stg %r14,__SF_EMPTY+16(%r15) # set exit reason code
|
stg %r14,__SF_SIE_REASON(%r15) # set exit reason code
|
||||||
j sie_exit
|
j sie_exit
|
||||||
|
|
||||||
EX_TABLE(.Lrewind_pad6,.Lsie_fault)
|
EX_TABLE(.Lrewind_pad6,.Lsie_fault)
|
||||||
|
@ -643,7 +643,7 @@ ENTRY(pgm_check_handler)
|
||||||
slg %r14,BASED(.Lsie_critical_start)
|
slg %r14,BASED(.Lsie_critical_start)
|
||||||
clg %r14,BASED(.Lsie_critical_length)
|
clg %r14,BASED(.Lsie_critical_length)
|
||||||
jhe 0f
|
jhe 0f
|
||||||
lg %r14,__SF_EMPTY(%r15) # get control block pointer
|
lg %r14,__SF_SIE_CONTROL(%r15) # get control block pointer
|
||||||
ni __SIE_PROG0C+3(%r14),0xfe # no longer in SIE
|
ni __SIE_PROG0C+3(%r14),0xfe # no longer in SIE
|
||||||
lctlg %c1,%c1,__LC_USER_ASCE # load primary asce
|
lctlg %c1,%c1,__LC_USER_ASCE # load primary asce
|
||||||
larl %r9,sie_exit # skip forward to sie_exit
|
larl %r9,sie_exit # skip forward to sie_exit
|
||||||
|
@ -1353,8 +1353,8 @@ cleanup_critical:
|
||||||
clg %r9,BASED(.Lsie_crit_mcck_length)
|
clg %r9,BASED(.Lsie_crit_mcck_length)
|
||||||
jh 1f
|
jh 1f
|
||||||
oi __LC_CPU_FLAGS+7, _CIF_MCCK_GUEST
|
oi __LC_CPU_FLAGS+7, _CIF_MCCK_GUEST
|
||||||
1: BPENTER __SF_EMPTY+24(%r15),(_TIF_ISOLATE_BP|_TIF_ISOLATE_BP_GUEST)
|
1: BPENTER __SF_SIE_FLAGS(%r15),(_TIF_ISOLATE_BP|_TIF_ISOLATE_BP_GUEST)
|
||||||
lg %r9,__SF_EMPTY(%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_USER_ASCE # load primary asce
|
lctlg %c1,%c1,__LC_USER_ASCE # load primary asce
|
||||||
larl %r9,sie_exit # skip forward to sie_exit
|
larl %r9,sie_exit # skip forward to sie_exit
|
||||||
|
|
Loading…
Reference in New Issue