Re: [PATCH v16 06/20] target/s390x: Adjust addressing mode checks for sha512 and sha256

Eric Farman <[email protected]>
Newsgroups org.kernel.vger.linux-s390,org.nongnu.qemu-devel
Message-ID <[email protected]>

On 8/24/26 4:31 AM, Harald Freudenberger wrote:
> The handling for different addressing modes in the both sha
> implementations cpacf sha256 and sha512 was incomplete. Rework this
> addressing checking to clearly have support for s390 64 bit and 32 bit
> addressing mode but raise an exception otherwise.
> 
> Also bail out early (for KIMD only) if length is 0.
> 
> Signed-off-by: Harald Freudenberger <[email protected]>
> Suggested-by: Ilya Leoshkevich <[email protected]>
> ---
>   target/s390x/tcg/cpacf_sha256.c | 16 +++++++++++++---
>   target/s390x/tcg/cpacf_sha512.c | 16 +++++++++++++---
>   2 files changed, 26 insertions(+), 6 deletions(-)

I was going to ask why this wasn't just included in the first place, but 
I see that sha512 is pre-existing. So, makes sense this way...

Reviewed-by: Eric Farman <[email protected]>

> 
> diff --git a/target/s390x/tcg/cpacf_sha256.c b/target/s390x/tcg/cpacf_sha256.c
> index 67321b565c..de305b6838 100644
> --- a/target/s390x/tcg/cpacf_sha256.c
> +++ b/target/s390x/tcg/cpacf_sha256.c
> @@ -111,14 +111,24 @@ int cpacf_sha256(CPUS390XState *env, const int mmu_idx, uintptr_t ra,
>   {
>       enum { MAX_BLOCKS_PER_RUN = 128 }; /* 128 * 64 = 8K */
>       uint64_t len = *len_reg, processed = 0;
> -    int message_reg_len = 64;
> +    int message_reg_len;
>       uint32_t a[8];
>   
>       g_assert(type == S390_FEAT_TYPE_KIMD || type == S390_FEAT_TYPE_KLMD);
>   
> -    if (!(env->psw.mask & PSW_MASK_64)) {
> +    /* check addressing mode, raise exception if not supported here */
> +    if (env->psw.mask & PSW_MASK_64) {
> +        message_reg_len = 64;
> +    } else if (env->psw.mask & PSW_MASK_32) {
> +        message_reg_len = 32;
>           len = (uint32_t)len;
> -        message_reg_len = (env->psw.mask & PSW_MASK_32) ? 32 : 24;
> +    } else {
> +        tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra);
> +    }
> +
> +    /* for KIMD only: early bail out if length is zero */
> +    if (type == S390_FEAT_TYPE_KIMD && !len) {
> +        return 0;
>       }
>   
>       /* KIMD: length has to be properly aligned. */
> diff --git a/target/s390x/tcg/cpacf_sha512.c b/target/s390x/tcg/cpacf_sha512.c
> index edd8dae78f..cad8e0e1bd 100644
> --- a/target/s390x/tcg/cpacf_sha512.c
> +++ b/target/s390x/tcg/cpacf_sha512.c
> @@ -126,13 +126,23 @@ int cpacf_sha512(CPUS390XState *env, const int mmu_idx, uintptr_t ra,
>   {
>       enum { MAX_BLOCKS_PER_RUN = 64 }; /* Arbitrary: keep interactivity. */
>       uint64_t len = *len_reg, a[8], processed = 0;
> -    int message_reg_len = 64;
> +    int message_reg_len;
>   
>       g_assert(type == S390_FEAT_TYPE_KIMD || type == S390_FEAT_TYPE_KLMD);
>   
> -    if (!(env->psw.mask & PSW_MASK_64)) {
> +    /* check addressing mode, raise exception if not supported here */
> +    if (env->psw.mask & PSW_MASK_64) {
> +        message_reg_len = 64;
> +    } else if (env->psw.mask & PSW_MASK_32) {
> +        message_reg_len = 32;
>           len = (uint32_t)len;
> -        message_reg_len = (env->psw.mask & PSW_MASK_32) ? 32 : 24;
> +    } else {
> +        tcg_s390_program_interrupt(env, PGM_SPECIFICATION, ra);
> +    }
> +
> +    /* for KIMD only: early bail out if length is zero */
> +    if (type == S390_FEAT_TYPE_KIMD && !len) {
> +        return 0;
>       }
>   
>       /* KIMD: length has to be properly aligned. */
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.