s390/entry: Pass the asce as parameter to sie64a()
Pass the guest ASCE explicitly as parameter, instead of having sie64a() take it from lowcore. This removes hidden state from lowcore, and makes things look cleaner. Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com> Reviewed-by: Nico Boehr <nrb@linux.ibm.com> Link: https://lore.kernel.org/r/20240703155900.103783-2-imbrenda@linux.ibm.com Signed-off-by: Heiko Carstens <hca@linux.ibm.com> Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
This commit is contained in:
parent
b7a5e5dfbd
commit
723ac2d6ba
@ -1029,11 +1029,12 @@ void kvm_arch_crypto_clear_masks(struct kvm *kvm);
|
|||||||
void kvm_arch_crypto_set_masks(struct kvm *kvm, unsigned long *apm,
|
void kvm_arch_crypto_set_masks(struct kvm *kvm, unsigned long *apm,
|
||||||
unsigned long *aqm, unsigned long *adm);
|
unsigned long *aqm, unsigned long *adm);
|
||||||
|
|
||||||
int __sie64a(phys_addr_t sie_block_phys, struct kvm_s390_sie_block *sie_block, u64 *rsa);
|
int __sie64a(phys_addr_t sie_block_phys, struct kvm_s390_sie_block *sie_block, u64 *rsa,
|
||||||
|
unsigned long gasce);
|
||||||
|
|
||||||
static inline int sie64a(struct kvm_s390_sie_block *sie_block, u64 *rsa)
|
static inline int sie64a(struct kvm_s390_sie_block *sie_block, u64 *rsa, unsigned long gasce)
|
||||||
{
|
{
|
||||||
return __sie64a(virt_to_phys(sie_block), sie_block, rsa);
|
return __sie64a(virt_to_phys(sie_block), sie_block, rsa, gasce);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern char sie_exit;
|
extern char sie_exit;
|
||||||
|
@ -65,6 +65,7 @@ struct stack_frame {
|
|||||||
unsigned long sie_reason;
|
unsigned long sie_reason;
|
||||||
unsigned long sie_flags;
|
unsigned long sie_flags;
|
||||||
unsigned long sie_control_block_phys;
|
unsigned long sie_control_block_phys;
|
||||||
|
unsigned long sie_guest_asce;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
unsigned long gprs[10];
|
unsigned long gprs[10];
|
||||||
|
@ -63,6 +63,7 @@ int main(void)
|
|||||||
OFFSET(__SF_SIE_REASON, stack_frame, sie_reason);
|
OFFSET(__SF_SIE_REASON, stack_frame, sie_reason);
|
||||||
OFFSET(__SF_SIE_FLAGS, stack_frame, sie_flags);
|
OFFSET(__SF_SIE_FLAGS, stack_frame, sie_flags);
|
||||||
OFFSET(__SF_SIE_CONTROL_PHYS, stack_frame, sie_control_block_phys);
|
OFFSET(__SF_SIE_CONTROL_PHYS, stack_frame, sie_control_block_phys);
|
||||||
|
OFFSET(__SF_SIE_GUEST_ASCE, stack_frame, sie_guest_asce);
|
||||||
DEFINE(STACK_FRAME_OVERHEAD, sizeof(struct stack_frame));
|
DEFINE(STACK_FRAME_OVERHEAD, sizeof(struct stack_frame));
|
||||||
BLANK();
|
BLANK();
|
||||||
OFFSET(__SFUSER_BACKCHAIN, stack_frame_user, back_chain);
|
OFFSET(__SFUSER_BACKCHAIN, stack_frame_user, back_chain);
|
||||||
|
@ -179,6 +179,7 @@ SYM_FUNC_END(__switch_to_asm)
|
|||||||
* %r2 pointer to sie control block phys
|
* %r2 pointer to sie control block phys
|
||||||
* %r3 pointer to sie control block virt
|
* %r3 pointer to sie control block virt
|
||||||
* %r4 guest register save area
|
* %r4 guest register save area
|
||||||
|
* %r5 guest asce
|
||||||
*/
|
*/
|
||||||
SYM_FUNC_START(__sie64a)
|
SYM_FUNC_START(__sie64a)
|
||||||
stmg %r6,%r14,__SF_GPRS(%r15) # save kernel registers
|
stmg %r6,%r14,__SF_GPRS(%r15) # save kernel registers
|
||||||
@ -186,15 +187,12 @@ SYM_FUNC_START(__sie64a)
|
|||||||
stg %r2,__SF_SIE_CONTROL_PHYS(%r15) # save sie block physical..
|
stg %r2,__SF_SIE_CONTROL_PHYS(%r15) # save sie block physical..
|
||||||
stg %r3,__SF_SIE_CONTROL(%r15) # ...and virtual addresses
|
stg %r3,__SF_SIE_CONTROL(%r15) # ...and virtual addresses
|
||||||
stg %r4,__SF_SIE_SAVEAREA(%r15) # save guest register save area
|
stg %r4,__SF_SIE_SAVEAREA(%r15) # save guest register save area
|
||||||
|
stg %r5,__SF_SIE_GUEST_ASCE(%r15) # save guest asce
|
||||||
xc __SF_SIE_REASON(8,%r15),__SF_SIE_REASON(%r15) # reason code = 0
|
xc __SF_SIE_REASON(8,%r15),__SF_SIE_REASON(%r15) # reason code = 0
|
||||||
mvc __SF_SIE_FLAGS(8,%r15),__TI_flags(%r12) # copy thread flags
|
mvc __SF_SIE_FLAGS(8,%r15),__TI_flags(%r12) # copy thread flags
|
||||||
lmg %r0,%r13,0(%r4) # load guest gprs 0-13
|
lmg %r0,%r13,0(%r4) # load guest gprs 0-13
|
||||||
lg %r14,__LC_GMAP # get gmap pointer
|
|
||||||
ltgr %r14,%r14
|
|
||||||
jz .Lsie_gmap
|
|
||||||
oi __LC_CPU_FLAGS+7,_CIF_SIE
|
oi __LC_CPU_FLAGS+7,_CIF_SIE
|
||||||
lctlg %c1,%c1,__GMAP_ASCE(%r14) # load primary asce
|
lctlg %c1,%c1,__SF_SIE_GUEST_ASCE(%r15) # load primary asce
|
||||||
.Lsie_gmap:
|
|
||||||
lg %r14,__SF_SIE_CONTROL(%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...
|
||||||
|
@ -4829,7 +4829,8 @@ static int __vcpu_run(struct kvm_vcpu *vcpu)
|
|||||||
sizeof(sie_page->pv_grregs));
|
sizeof(sie_page->pv_grregs));
|
||||||
}
|
}
|
||||||
exit_reason = sie64a(vcpu->arch.sie_block,
|
exit_reason = sie64a(vcpu->arch.sie_block,
|
||||||
vcpu->run->s.regs.gprs);
|
vcpu->run->s.regs.gprs,
|
||||||
|
gmap_get_enabled()->asce);
|
||||||
if (kvm_s390_pv_cpu_is_protected(vcpu)) {
|
if (kvm_s390_pv_cpu_is_protected(vcpu)) {
|
||||||
memcpy(vcpu->run->s.regs.gprs,
|
memcpy(vcpu->run->s.regs.gprs,
|
||||||
sie_page->pv_grregs,
|
sie_page->pv_grregs,
|
||||||
|
@ -1150,7 +1150,7 @@ static int do_vsie_run(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
|
|||||||
vcpu->arch.sie_block->prog0c |= PROG_IN_SIE;
|
vcpu->arch.sie_block->prog0c |= PROG_IN_SIE;
|
||||||
barrier();
|
barrier();
|
||||||
if (!kvm_s390_vcpu_sie_inhibited(vcpu))
|
if (!kvm_s390_vcpu_sie_inhibited(vcpu))
|
||||||
rc = sie64a(scb_s, vcpu->run->s.regs.gprs);
|
rc = sie64a(scb_s, vcpu->run->s.regs.gprs, gmap_get_enabled()->asce);
|
||||||
barrier();
|
barrier();
|
||||||
vcpu->arch.sie_block->prog0c &= ~PROG_IN_SIE;
|
vcpu->arch.sie_block->prog0c &= ~PROG_IN_SIE;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user