target/riscv: Add step to validate 'B' extension
If the B extension is enabled warn if the user has disabled any of the required extensions that are part of the 'B' extension. Conversely enable the extensions that make up the 'B' extension if it is enabled. Signed-off-by: Rob Bradford <rbradford@rivosinc.com> Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> Reviewed-by: Andrew Jones <ajones@ventanamicro.com> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Message-ID: <20240111161644.33630-3-rbradford@rivosinc.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
parent
2317ba9fa7
commit
45982b2897
@ -442,6 +442,35 @@ static void riscv_cpu_validate_g(RISCVCPU *cpu)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void riscv_cpu_validate_b(RISCVCPU *cpu)
|
||||||
|
{
|
||||||
|
const char *warn_msg = "RVB mandates disabled extension %s";
|
||||||
|
|
||||||
|
if (!cpu->cfg.ext_zba) {
|
||||||
|
if (!cpu_cfg_ext_is_user_set(CPU_CFG_OFFSET(ext_zba))) {
|
||||||
|
cpu->cfg.ext_zba = true;
|
||||||
|
} else {
|
||||||
|
warn_report(warn_msg, "zba");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!cpu->cfg.ext_zbb) {
|
||||||
|
if (!cpu_cfg_ext_is_user_set(CPU_CFG_OFFSET(ext_zbb))) {
|
||||||
|
cpu->cfg.ext_zbb = true;
|
||||||
|
} else {
|
||||||
|
warn_report(warn_msg, "zbb");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!cpu->cfg.ext_zbs) {
|
||||||
|
if (!cpu_cfg_ext_is_user_set(CPU_CFG_OFFSET(ext_zbs))) {
|
||||||
|
cpu->cfg.ext_zbs = true;
|
||||||
|
} else {
|
||||||
|
warn_report(warn_msg, "zbs");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check consistency between chosen extensions while setting
|
* Check consistency between chosen extensions while setting
|
||||||
* cpu->cfg accordingly.
|
* cpu->cfg accordingly.
|
||||||
@ -455,6 +484,10 @@ void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
|
|||||||
riscv_cpu_validate_g(cpu);
|
riscv_cpu_validate_g(cpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (riscv_has_ext(env, RVB)) {
|
||||||
|
riscv_cpu_validate_b(cpu);
|
||||||
|
}
|
||||||
|
|
||||||
if (riscv_has_ext(env, RVI) && riscv_has_ext(env, RVE)) {
|
if (riscv_has_ext(env, RVI) && riscv_has_ext(env, RVE)) {
|
||||||
error_setg(errp,
|
error_setg(errp,
|
||||||
"I and E extensions are incompatible");
|
"I and E extensions are incompatible");
|
||||||
|
Loading…
Reference in New Issue
Block a user