Re: [PATCH v5 1/3] s390/kvm: split kvm_s390_logical_to_effective

Christian Borntraeger
2021-03-05T15:09:50Z

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);
> }
>
> /*
>