Message ID | 20210302174443.514363-2-imbrenda@linux.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | s390/kvm: fix MVPG when in VSIE | expand |
On 02.03.21 18:44, Claudio Imbrenda wrote: > Split kvm_s390_logical_to_effective to a generic function called > _kvm_s390_logical_to_effective. The new function takes a PSW and an address > and returns the address with the appropriate bits masked off. The old > function now calls the new function with the appropriate PSW from the vCPU. > > This is needed to avoid code duplication for vSIE. > > Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com> We might need cc stable here as well for patch 3? Otherwise this looks good. Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com> > --- > arch/s390/kvm/gaccess.h | 29 ++++++++++++++++++++++++----- > 1 file changed, 24 insertions(+), 5 deletions(-) > > diff --git a/arch/s390/kvm/gaccess.h b/arch/s390/kvm/gaccess.h > index f4c51756c462..107fdfd2eadd 100644 > --- a/arch/s390/kvm/gaccess.h > +++ b/arch/s390/kvm/gaccess.h > @@ -36,6 +36,29 @@ static inline unsigned long kvm_s390_real_to_abs(struct kvm_vcpu *vcpu, > return gra; > } > > +/** > + * _kvm_s390_logical_to_effective - convert guest logical to effective address > + * @psw: psw of the guest > + * @ga: guest logical address > + * > + * Convert a guest logical address to an effective address by applying the > + * rules of the addressing mode defined by bits 31 and 32 of the given PSW > + * (extendended/basic addressing mode). > + * > + * Depending on the addressing mode, the upper 40 bits (24 bit addressing > + * mode), 33 bits (31 bit addressing mode) or no bits (64 bit addressing > + * mode) of @ga will be zeroed and the remaining bits will be returned. > + */ > +static inline unsigned long _kvm_s390_logical_to_effective(psw_t *psw, > + unsigned long ga) > +{ > + if (psw_bits(*psw).eaba == PSW_BITS_AMODE_64BIT) > + return ga; > + if (psw_bits(*psw).eaba == PSW_BITS_AMODE_31BIT) > + return ga & ((1UL << 31) - 1); > + return ga & ((1UL << 24) - 1); > +} > + > /** > * kvm_s390_logical_to_effective - convert guest logical to effective address > * @vcpu: guest virtual cpu > @@ -54,11 +77,7 @@ static inline unsigned long kvm_s390_logical_to_effective(struct kvm_vcpu *vcpu, > { > psw_t *psw = &vcpu->arch.sie_block->gpsw; > > - if (psw_bits(*psw).eaba == PSW_BITS_AMODE_64BIT) > - return ga; > - if (psw_bits(*psw).eaba == PSW_BITS_AMODE_31BIT) > - return ga & ((1UL << 31) - 1); > - return ga & ((1UL << 24) - 1); > + return _kvm_s390_logical_to_effective(&vcpu->arch.sie_block->gpsw, ga); > } > > /* >
diff --git a/arch/s390/kvm/gaccess.h b/arch/s390/kvm/gaccess.h index f4c51756c462..107fdfd2eadd 100644 --- a/arch/s390/kvm/gaccess.h +++ b/arch/s390/kvm/gaccess.h @@ -36,6 +36,29 @@ static inline unsigned long kvm_s390_real_to_abs(struct kvm_vcpu *vcpu, return gra; } +/** + * _kvm_s390_logical_to_effective - convert guest logical to effective address + * @psw: psw of the guest + * @ga: guest logical address + * + * Convert a guest logical address to an effective address by applying the + * rules of the addressing mode defined by bits 31 and 32 of the given PSW + * (extendended/basic addressing mode). + * + * Depending on the addressing mode, the upper 40 bits (24 bit addressing + * mode), 33 bits (31 bit addressing mode) or no bits (64 bit addressing + * mode) of @ga will be zeroed and the remaining bits will be returned. + */ +static inline unsigned long _kvm_s390_logical_to_effective(psw_t *psw, + unsigned long ga) +{ + if (psw_bits(*psw).eaba == PSW_BITS_AMODE_64BIT) + return ga; + if (psw_bits(*psw).eaba == PSW_BITS_AMODE_31BIT) + return ga & ((1UL << 31) - 1); + return ga & ((1UL << 24) - 1); +} + /** * kvm_s390_logical_to_effective - convert guest logical to effective address * @vcpu: guest virtual cpu @@ -54,11 +77,7 @@ static inline unsigned long kvm_s390_logical_to_effective(struct kvm_vcpu *vcpu, { psw_t *psw = &vcpu->arch.sie_block->gpsw; - if (psw_bits(*psw).eaba == PSW_BITS_AMODE_64BIT) - return ga; - if (psw_bits(*psw).eaba == PSW_BITS_AMODE_31BIT) - return ga & ((1UL << 31) - 1); - return ga & ((1UL << 24) - 1); + return _kvm_s390_logical_to_effective(&vcpu->arch.sie_block->gpsw, ga); } /*
Split kvm_s390_logical_to_effective to a generic function called _kvm_s390_logical_to_effective. The new function takes a PSW and an address and returns the address with the appropriate bits masked off. The old function now calls the new function with the appropriate PSW from the vCPU. This is needed to avoid code duplication for vSIE. Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com> --- arch/s390/kvm/gaccess.h | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-)