Message ID | 20240429-countinhibit_fix-v1-2-802ec1e99133@rivosinc.com |
---|---|
State | New |
Headers | show |
Series | Assorted fixes for PMU | expand |
On 4/29/24 16:28, Atish Patra wrote: > scounteren/hcountern are also WARL registers similar to mcountern. > Only set the bits for the available counters during the write to > preserve the WARL behavior. > > Signed-off-by: Atish Patra <atishp@rivosinc.com> > --- Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> > target/riscv/csr.c | 12 ++++++++++-- > 1 file changed, 10 insertions(+), 2 deletions(-) > > diff --git a/target/riscv/csr.c b/target/riscv/csr.c > index 68ca31aff47d..a01911541d67 100644 > --- a/target/riscv/csr.c > +++ b/target/riscv/csr.c > @@ -2843,7 +2843,11 @@ static RISCVException read_scounteren(CPURISCVState *env, int csrno, > static RISCVException write_scounteren(CPURISCVState *env, int csrno, > target_ulong val) > { > - env->scounteren = val; > + RISCVCPU *cpu = env_archcpu(env); > + > + /* WARL register - disable unavailable counters */ > + env->scounteren = val & (cpu->pmu_avail_ctrs | COUNTEREN_CY | COUNTEREN_TM | > + COUNTEREN_IR); > return RISCV_EXCP_NONE; > } > > @@ -3475,7 +3479,11 @@ static RISCVException read_hcounteren(CPURISCVState *env, int csrno, > static RISCVException write_hcounteren(CPURISCVState *env, int csrno, > target_ulong val) > { > - env->hcounteren = val; > + RISCVCPU *cpu = env_archcpu(env); > + > + /* WARL register - disable unavailable counters */ > + env->hcounteren = val & (cpu->pmu_avail_ctrs | COUNTEREN_CY | COUNTEREN_TM | > + COUNTEREN_IR); > return RISCV_EXCP_NONE; > } > >
On Tue, Apr 30, 2024 at 5:29 AM Atish Patra <atishp@rivosinc.com> wrote: > > scounteren/hcountern are also WARL registers similar to mcountern. > Only set the bits for the available counters during the write to > preserve the WARL behavior. > > Signed-off-by: Atish Patra <atishp@rivosinc.com> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Alistair > --- > target/riscv/csr.c | 12 ++++++++++-- > 1 file changed, 10 insertions(+), 2 deletions(-) > > diff --git a/target/riscv/csr.c b/target/riscv/csr.c > index 68ca31aff47d..a01911541d67 100644 > --- a/target/riscv/csr.c > +++ b/target/riscv/csr.c > @@ -2843,7 +2843,11 @@ static RISCVException read_scounteren(CPURISCVState *env, int csrno, > static RISCVException write_scounteren(CPURISCVState *env, int csrno, > target_ulong val) > { > - env->scounteren = val; > + RISCVCPU *cpu = env_archcpu(env); > + > + /* WARL register - disable unavailable counters */ > + env->scounteren = val & (cpu->pmu_avail_ctrs | COUNTEREN_CY | COUNTEREN_TM | > + COUNTEREN_IR); > return RISCV_EXCP_NONE; > } > > @@ -3475,7 +3479,11 @@ static RISCVException read_hcounteren(CPURISCVState *env, int csrno, > static RISCVException write_hcounteren(CPURISCVState *env, int csrno, > target_ulong val) > { > - env->hcounteren = val; > + RISCVCPU *cpu = env_archcpu(env); > + > + /* WARL register - disable unavailable counters */ > + env->hcounteren = val & (cpu->pmu_avail_ctrs | COUNTEREN_CY | COUNTEREN_TM | > + COUNTEREN_IR); > return RISCV_EXCP_NONE; > } > > > -- > 2.34.1 > >
diff --git a/target/riscv/csr.c b/target/riscv/csr.c index 68ca31aff47d..a01911541d67 100644 --- a/target/riscv/csr.c +++ b/target/riscv/csr.c @@ -2843,7 +2843,11 @@ static RISCVException read_scounteren(CPURISCVState *env, int csrno, static RISCVException write_scounteren(CPURISCVState *env, int csrno, target_ulong val) { - env->scounteren = val; + RISCVCPU *cpu = env_archcpu(env); + + /* WARL register - disable unavailable counters */ + env->scounteren = val & (cpu->pmu_avail_ctrs | COUNTEREN_CY | COUNTEREN_TM | + COUNTEREN_IR); return RISCV_EXCP_NONE; } @@ -3475,7 +3479,11 @@ static RISCVException read_hcounteren(CPURISCVState *env, int csrno, static RISCVException write_hcounteren(CPURISCVState *env, int csrno, target_ulong val) { - env->hcounteren = val; + RISCVCPU *cpu = env_archcpu(env); + + /* WARL register - disable unavailable counters */ + env->hcounteren = val & (cpu->pmu_avail_ctrs | COUNTEREN_CY | COUNTEREN_TM | + COUNTEREN_IR); return RISCV_EXCP_NONE; }
scounteren/hcountern are also WARL registers similar to mcountern. Only set the bits for the available counters during the write to preserve the WARL behavior. Signed-off-by: Atish Patra <atishp@rivosinc.com> --- target/riscv/csr.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)