qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 5/6] Determine the desired FPU mode


From: Peter Maydell
Subject: Re: [Qemu-devel] [PATCH 5/6] Determine the desired FPU mode
Date: Fri, 26 Oct 2018 19:12:44 +0100

On 26 October 2018 at 15:21, Stefan Markovic <address@hidden> wrote:
> From: Stefan Markovic <address@hidden>
>
> Floating-point mode is calculated from MIPS.abiflags FP ABI value
> (based on kernel implementation). Illegal combinations are rejected.
>
> Signed-off-by: Stefan Markovic <address@hidden>
> ---
>  linux-user/mips/cpu_loop.c | 75 
> ++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 75 insertions(+)

> +     if ((info->fp_abi > MAX_FP_ABI && info->fp_abi != MIPS_ABI_FP_UNKNOWN)
> +        || (info->interp_fp_abi > MAX_FP_ABI &&
> +            info->interp_fp_abi != MIPS_ABI_FP_UNKNOWN)) {
> +        fprintf(stderr, "qemu: Program and interpreter have "
> +                        "unexpected FPU modes\n");
> +        exit(137);

Why are we exit()ing with a funny exit status code here?

If this is a "can't happen" case, then we should assert(). If
it is a "can happen if fed an odd binary" case, then we should just
exit(1) as we do already in this function for an unsupported NaN mode.

> +    }
> +
> +    prog_req = (info->fp_abi == MIPS_ABI_FP_UNKNOWN) ? none_req
> +                                            : fpu_reqs[info->fp_abi];
> +    interp_req = (info->interp_fp_abi == MIPS_ABI_FP_UNKNOWN) ? none_req
> +                                            : fpu_reqs[info->interp_fp_abi];
> +
> +    prog_req.single &= interp_req.single;
> +    prog_req.soft &= interp_req.soft;
> +    prog_req.fr1 &= interp_req.fr1;
> +    prog_req.frdefault &= interp_req.frdefault;
> +    prog_req.fre &= interp_req.fre;
> +
> +    bool cpu_has_mips_r2_r6 = env->insn_flags & ISA_MIPS32R2 ||
> +                              env->insn_flags & ISA_MIPS64R2 ||
> +                              env->insn_flags & ISA_MIPS32R6 ||
> +                              env->insn_flags & ISA_MIPS64R6;
> +
> +    if (prog_req.fre && !prog_req.frdefault && !prog_req.fr1) {
> +        env->CP0_Config5 |= (1 << CP0C5_FRE);
> +        if (env->active_fpu.fcr0 & (1 << FCR0_FREP)) {
> +            env->hflags |= MIPS_HFLAG_FRE;
> +        }
> +    } else if ((prog_req.fr1 && prog_req.frdefault) ||
> +         (prog_req.single && !prog_req.frdefault)) {
> +        if ((env->active_fpu.fcr0 & (1 << FCR0_F64)
> +            && cpu_has_mips_r2_r6) || prog_req.fr1) {
> +            env->CP0_Status |= (1 << CP0St_FR);
> +            env->hflags |= MIPS_HFLAG_F64;
> +        }
> +    } else  if (!prog_req.fre && !prog_req.frdefault &&
> +          !prog_req.fr1 && !prog_req.single && !prog_req.soft) {
> +        exit(137);
> +    }

Ditto here (and we haven't printed any error message here...)

thanks
-- PMM



reply via email to

[Prev in Thread] Current Thread [Next in Thread]