target/riscv: add cfg properties for Zc* extension
Add properties for Zca,Zcb,Zcf,Zcd,Zcmp,Zcmt extension. Add check for these properties. Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn> Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Message-Id: <20230307081403.61950-2-liweiwei@iscas.ac.cn> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
parent
48249c023d
commit
2288a5ce43
@ -939,6 +939,49 @@ static void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cpu->cfg.ext_c) {
|
||||||
|
cpu->cfg.ext_zca = true;
|
||||||
|
if (cpu->cfg.ext_f && env->misa_mxl_max == MXL_RV32) {
|
||||||
|
cpu->cfg.ext_zcf = true;
|
||||||
|
}
|
||||||
|
if (cpu->cfg.ext_d) {
|
||||||
|
cpu->cfg.ext_zcd = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (env->misa_mxl_max != MXL_RV32 && cpu->cfg.ext_zcf) {
|
||||||
|
error_setg(errp, "Zcf extension is only relevant to RV32");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!cpu->cfg.ext_f && cpu->cfg.ext_zcf) {
|
||||||
|
error_setg(errp, "Zcf extension requires F extension");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!cpu->cfg.ext_d && cpu->cfg.ext_zcd) {
|
||||||
|
error_setg(errp, "Zcd extension requires D extension");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((cpu->cfg.ext_zcf || cpu->cfg.ext_zcd || cpu->cfg.ext_zcb ||
|
||||||
|
cpu->cfg.ext_zcmp || cpu->cfg.ext_zcmt) && !cpu->cfg.ext_zca) {
|
||||||
|
error_setg(errp, "Zcf/Zcd/Zcb/Zcmp/Zcmt extensions require Zca "
|
||||||
|
"extension");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cpu->cfg.ext_zcd && (cpu->cfg.ext_zcmp || cpu->cfg.ext_zcmt)) {
|
||||||
|
error_setg(errp, "Zcmp/Zcmt extensions are incompatible with "
|
||||||
|
"Zcd extension");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cpu->cfg.ext_zcmt && !cpu->cfg.ext_icsr) {
|
||||||
|
error_setg(errp, "Zcmt extension requires Zicsr extension");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (cpu->cfg.ext_zk) {
|
if (cpu->cfg.ext_zk) {
|
||||||
cpu->cfg.ext_zkn = true;
|
cpu->cfg.ext_zkn = true;
|
||||||
cpu->cfg.ext_zkr = true;
|
cpu->cfg.ext_zkr = true;
|
||||||
|
@ -438,6 +438,12 @@ struct RISCVCPUConfig {
|
|||||||
bool ext_zbkc;
|
bool ext_zbkc;
|
||||||
bool ext_zbkx;
|
bool ext_zbkx;
|
||||||
bool ext_zbs;
|
bool ext_zbs;
|
||||||
|
bool ext_zca;
|
||||||
|
bool ext_zcb;
|
||||||
|
bool ext_zcd;
|
||||||
|
bool ext_zcf;
|
||||||
|
bool ext_zcmp;
|
||||||
|
bool ext_zcmt;
|
||||||
bool ext_zk;
|
bool ext_zk;
|
||||||
bool ext_zkn;
|
bool ext_zkn;
|
||||||
bool ext_zknd;
|
bool ext_zknd;
|
||||||
|
Loading…
Reference in New Issue
Block a user