mirror of https://github.com/xemu-project/xemu.git
target/riscv/cpu.c: add riscv_cpu_validate_v()
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 <dbarboza@ventanamicro.com> Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com> Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Message-Id: <20230517135714.211809-2-dbarboza@ventanamicro.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
parent
6672e29d3b
commit
d63be18490
|
@ -834,6 +834,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.
|
||||
|
@ -841,6 +881,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) &&
|
||||
|
@ -909,8 +950,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;
|
||||
}
|
||||
|
||||
|
@ -1045,46 +1092,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
|
||||
|
|
Loading…
Reference in New Issue