On Tue, Apr 18, 2023 at 12:02 AM Daniel Henrique Barboza <dbarb...@ventanamicro.com> wrote: > > The RVV verification will error out if fails and it's being done at the > end of riscv_cpu_validate_set_extensions(), after we've already set some > extensions that are dependent on RVV. Let's put it in its own function > and do it earlier. > > Signed-off-by: Daniel Henrique Barboza <dbarb...@ventanamicro.com> > Reviewed-by: LIU Zhiwei <zhiwei_...@linux.alibaba.com> > Reviewed-by: Weiwei Li <liwei...@iscas.ac.cn>
Acked-by: Alistair Francis <alistair.fran...@wdc.com> Alistair > --- > target/riscv/cpu.c | 89 +++++++++++++++++++++++++--------------------- > 1 file changed, 48 insertions(+), 41 deletions(-) > > diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c > index befa64528f..feca13aefb 100644 > --- a/target/riscv/cpu.c > +++ b/target/riscv/cpu.c > @@ -797,6 +797,46 @@ static void riscv_cpu_disas_set_info(CPUState *s, > disassemble_info *info) > } > } > > +static void riscv_cpu_validate_v(CPURISCVState *env, RISCVCPUConfig *cfg, > + Error **errp) > +{ > + int vext_version = VEXT_VERSION_1_00_0; > + > + if (!is_power_of_2(cfg->vlen)) { > + error_setg(errp, "Vector extension VLEN must be power of 2"); > + return; > + } > + if (cfg->vlen > RV_VLEN_MAX || cfg->vlen < 128) { > + error_setg(errp, > + "Vector extension implementation only supports VLEN " > + "in the range [128, %d]", RV_VLEN_MAX); > + return; > + } > + if (!is_power_of_2(cfg->elen)) { > + error_setg(errp, "Vector extension ELEN must be power of 2"); > + return; > + } > + if (cfg->elen > 64 || cfg->elen < 8) { > + error_setg(errp, > + "Vector extension implementation only supports ELEN " > + "in the range [8, 64]"); > + return; > + } > + if (cfg->vext_spec) { > + if (!g_strcmp0(cfg->vext_spec, "v1.0")) { > + vext_version = VEXT_VERSION_1_00_0; > + } else { > + error_setg(errp, "Unsupported vector spec version '%s'", > + cfg->vext_spec); > + return; > + } > + } else { > + qemu_log("vector version is not specified, " > + "use the default value v1.0\n"); > + } > + set_vext_version(env, vext_version); > +} > + > /* > * Check consistency between chosen extensions while setting > * cpu->cfg accordingly. > @@ -804,6 +844,7 @@ static void riscv_cpu_disas_set_info(CPUState *s, > disassemble_info *info) > static void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp) > { > CPURISCVState *env = &cpu->env; > + Error *local_err = NULL; > > /* Do some ISA extension error checking */ > if (riscv_has_ext(env, RVG) && > @@ -872,8 +913,14 @@ static void riscv_cpu_validate_set_extensions(RISCVCPU > *cpu, Error **errp) > return; > } > > - /* The V vector extension depends on the Zve64d extension */ > if (riscv_has_ext(env, RVV)) { > + riscv_cpu_validate_v(env, &cpu->cfg, &local_err); > + if (local_err != NULL) { > + error_propagate(errp, local_err); > + return; > + } > + > + /* The V vector extension depends on the Zve64d extension */ > cpu->cfg.ext_zve64d = true; > } > > @@ -1008,46 +1055,6 @@ static void riscv_cpu_validate_set_extensions(RISCVCPU > *cpu, Error **errp) > cpu->cfg.ext_zksed = true; > cpu->cfg.ext_zksh = true; > } > - > - if (riscv_has_ext(env, RVV)) { > - int vext_version = VEXT_VERSION_1_00_0; > - if (!is_power_of_2(cpu->cfg.vlen)) { > - error_setg(errp, > - "Vector extension VLEN must be power of 2"); > - return; > - } > - if (cpu->cfg.vlen > RV_VLEN_MAX || cpu->cfg.vlen < 128) { > - error_setg(errp, > - "Vector extension implementation only supports VLEN " > - "in the range [128, %d]", RV_VLEN_MAX); > - return; > - } > - if (!is_power_of_2(cpu->cfg.elen)) { > - error_setg(errp, > - "Vector extension ELEN must be power of 2"); > - return; > - } > - if (cpu->cfg.elen > 64 || cpu->cfg.elen < 8) { > - error_setg(errp, > - "Vector extension implementation only supports ELEN " > - "in the range [8, 64]"); > - return; > - } > - if (cpu->cfg.vext_spec) { > - if (!g_strcmp0(cpu->cfg.vext_spec, "v1.0")) { > - vext_version = VEXT_VERSION_1_00_0; > - } else { > - error_setg(errp, > - "Unsupported vector spec version '%s'", > - cpu->cfg.vext_spec); > - return; > - } > - } else { > - qemu_log("vector version is not specified, " > - "use the default value v1.0\n"); > - } > - set_vext_version(env, vext_version); > - } > } > > #ifndef CONFIG_USER_ONLY > -- > 2.39.2 > >