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
|
* Check consistency between chosen extensions while setting
|
||||||
* cpu->cfg accordingly.
|
* 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)
|
static void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
|
||||||
{
|
{
|
||||||
CPURISCVState *env = &cpu->env;
|
CPURISCVState *env = &cpu->env;
|
||||||
|
Error *local_err = NULL;
|
||||||
|
|
||||||
/* Do some ISA extension error checking */
|
/* Do some ISA extension error checking */
|
||||||
if (riscv_has_ext(env, RVG) &&
|
if (riscv_has_ext(env, RVG) &&
|
||||||
|
@ -909,8 +950,14 @@ static void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The V vector extension depends on the Zve64d extension */
|
|
||||||
if (riscv_has_ext(env, RVV)) {
|
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;
|
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_zksed = true;
|
||||||
cpu->cfg.ext_zksh = 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
|
#ifndef CONFIG_USER_ONLY
|
||||||
|
|
Loading…
Reference in New Issue