| From f85f1baaa18932a041fd2b1c2ca6cfd9898c7d2b Mon Sep 17 00:00:00 2001 |
| From: Claudio Imbrenda <imbrenda@linux.ibm.com> |
| Date: Tue, 2 Mar 2021 13:36:44 +0100 |
| Subject: KVM: s390: split kvm_s390_logical_to_effective |
| |
| From: Claudio Imbrenda <imbrenda@linux.ibm.com> |
| |
| commit f85f1baaa18932a041fd2b1c2ca6cfd9898c7d2b upstream. |
| |
| 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> |
| Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com> |
| Cc: stable@vger.kernel.org # for VSIE: correctly handle MVPG when in VSIE |
| Link: https://lore.kernel.org/r/20210302174443.514363-2-imbrenda@linux.ibm.com |
| Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/s390/kvm/gaccess.h | 31 ++++++++++++++++++++++++------- |
| 1 file changed, 24 insertions(+), 7 deletions(-) |
| |
| --- a/arch/s390/kvm/gaccess.h |
| +++ b/arch/s390/kvm/gaccess.h |
| @@ -37,6 +37,29 @@ static inline unsigned long kvm_s390_rea |
| } |
| |
| /** |
| + * _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 |
| * @ga: guest logical address |
| @@ -52,13 +75,7 @@ static inline unsigned long kvm_s390_rea |
| static inline unsigned long kvm_s390_logical_to_effective(struct kvm_vcpu *vcpu, |
| unsigned long ga) |
| { |
| - 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); |
| } |
| |
| /* |