On Sun, Aug 25, 2024 at 3:34 AM Daniel Henrique Barboza
<dbarb...@ventanamicro.com> wrote:
>
> Gitlab issue [1] reports a misleading error when trying to run a 'rv64'
> cpu with 'zfinx' and without 'f':
>
> $ ./build/qemu-system-riscv64 -nographic -M virt -cpu rv64,zfinx=true,f=false
> qemu-system-riscv64: Zfinx cannot be supported together with F extension
>
> The user explicitly disabled F and the error message mentions a conflict
> with Zfinx and F.
>
> The problem isn't the error reporting, but the logic used when applying
> the implied ZFA rule that enables RVF unconditionally, without honoring
> user choice (i.e. keep F disabled).
>
> Change cpu_enable_implied_rule() to check if the user deliberately
> disabled a MISA bit. In this case we shouldn't either re-enable the bit
> nor apply any implied rules related to it.
>
> After this change the error message now shows:
>
> $ ./build/qemu-system-riscv64 -nographic -M virt -cpu rv64,zfinx=true,f=false
> qemu-system-riscv64: Zfa extension requires F extension
>
> Disabling 'zfa':
>
> $ ./build/qemu-system-riscv64 -nographic -M virt -cpu 
> rv64,zfinx=true,f=false,zfa=false
> qemu-system-riscv64: D extension requires F extension
>
> And finally after disabling 'd':
>
> $ ./build/qemu-system-riscv64 -nographic -M virt -cpu 
> rv64,zfinx=true,f=false,zfa=false,d=false
> (OpenSBI boots ...)
>
> [1] https://gitlab.com/qemu-project/qemu/-/issues/2486
>
> Cc: Frank Chang <frank.ch...@sifive.com>
> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2486
> Fixes: 047da861f9 ("target/riscv: Introduce extension implied rule helpers")
> Signed-off-by: Daniel Henrique Barboza <dbarb...@ventanamicro.com>

Reviewed-by: Alistair Francis <alistair.fran...@wdc.com>

Alistair

> ---
>  target/riscv/tcg/tcg-cpu.c | 13 ++++++++++---
>  1 file changed, 10 insertions(+), 3 deletions(-)
>
> diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
> index b8814ab753..dea8ab7a43 100644
> --- a/target/riscv/tcg/tcg-cpu.c
> +++ b/target/riscv/tcg/tcg-cpu.c
> @@ -778,11 +778,18 @@ static void cpu_enable_implied_rule(RISCVCPU *cpu,
>      if (!enabled) {
>          /* Enable the implied MISAs. */
>          if (rule->implied_misa_exts) {
> -            riscv_cpu_set_misa_ext(env,
> -                                   env->misa_ext | rule->implied_misa_exts);
> -
>              for (i = 0; misa_bits[i] != 0; i++) {
>                  if (rule->implied_misa_exts & misa_bits[i]) {
> +                    /*
> +                     * If the user disabled the misa_bit do not re-enable it
> +                     * and do not apply any implied rules related to it.
> +                     */
> +                    if (cpu_misa_ext_is_user_set(misa_bits[i]) &&
> +                        !(env->misa_ext & misa_bits[i])) {
> +                        continue;
> +                    }
> +
> +                    riscv_cpu_set_misa_ext(env, env->misa_ext | 
> misa_bits[i]);
>                      ir = g_hash_table_lookup(misa_ext_implied_rules,
>                                               GUINT_TO_POINTER(misa_bits[i]));
>
> --
> 2.45.2
>
>

Reply via email to