On Fri, Oct 6, 2023 at 11:23 PM Daniel Henrique Barboza <dbarb...@ventanamicro.com> wrote: > > zicntr is the Base Counters and Timers extension described in chapter 12 > of the unprivileged spec. It describes support for RDCYCLE, RDTIME and > RDINSTRET. > > QEMU already implements it way before it was a discrete extension. > zicntr is part of the RVA22 profile, so let's add it to QEMU to make the > future profile implementation flag complete. > > Given than it represents an already existing feature, default it to > 'true'. Change the realize() time validation to disable it in case its > dependency (icsr) isn't present.
What happens if a user disables this though? Alistair > > Signed-off-by: Daniel Henrique Barboza <dbarb...@ventanamicro.com> > --- > target/riscv/cpu.c | 7 +++++++ > target/riscv/cpu_cfg.h | 1 + > target/riscv/tcg/tcg-cpu.c | 4 ++++ > 3 files changed, 12 insertions(+) > > diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c > index 521bb88538..8783a415b1 100644 > --- a/target/riscv/cpu.c > +++ b/target/riscv/cpu.c > @@ -79,6 +79,7 @@ const RISCVIsaExtData isa_edata_arr[] = { > ISA_EXT_DATA_ENTRY(zicbom, PRIV_VERSION_1_12_0, ext_icbom), > ISA_EXT_DATA_ENTRY(zicboz, PRIV_VERSION_1_12_0, ext_icboz), > ISA_EXT_DATA_ENTRY(zicond, PRIV_VERSION_1_12_0, ext_zicond), > + ISA_EXT_DATA_ENTRY(zicntr, PRIV_VERSION_1_12_0, ext_icntr), > ISA_EXT_DATA_ENTRY(zicsr, PRIV_VERSION_1_10_0, ext_icsr), > ISA_EXT_DATA_ENTRY(zifencei, PRIV_VERSION_1_10_0, ext_ifencei), > ISA_EXT_DATA_ENTRY(zihintntl, PRIV_VERSION_1_10_0, ext_zihintntl), > @@ -1265,6 +1266,12 @@ const RISCVCPUMultiExtConfig riscv_cpu_extensions[] = { > MULTI_EXT_CFG_BOOL("svnapot", ext_svnapot, false), > MULTI_EXT_CFG_BOOL("svpbmt", ext_svpbmt, false), > > + /* > + * Always default true - we'll disable it during > + * realize() if needed. > + */ > + MULTI_EXT_CFG_BOOL("zicntr", ext_icntr, true), > + > MULTI_EXT_CFG_BOOL("zba", ext_zba, true), > MULTI_EXT_CFG_BOOL("zbb", ext_zbb, true), > MULTI_EXT_CFG_BOOL("zbc", ext_zbc, true), > diff --git a/target/riscv/cpu_cfg.h b/target/riscv/cpu_cfg.h > index 0e6a0f245c..671b8c7cb8 100644 > --- a/target/riscv/cpu_cfg.h > +++ b/target/riscv/cpu_cfg.h > @@ -62,6 +62,7 @@ struct RISCVCPUConfig { > bool ext_zksh; > bool ext_zkt; > bool ext_ifencei; > + bool ext_icntr; > bool ext_icsr; > bool ext_icbom; > bool ext_icboz; > diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c > index 08b806dc07..df187bc143 100644 > --- a/target/riscv/tcg/tcg-cpu.c > +++ b/target/riscv/tcg/tcg-cpu.c > @@ -542,6 +542,10 @@ void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, > Error **errp) > cpu_cfg_ext_auto_update(cpu, CPU_CFG_OFFSET(ext_zksh), true); > } > > + if (cpu->cfg.ext_icntr && !cpu->cfg.ext_icsr) { > + cpu->cfg.ext_icntr = false; > + } > + > /* > * Disable isa extensions based on priv spec after we > * validated and set everything we need. > -- > 2.41.0 > >