target/riscv: Fix PMU CSR predicate function
The predicate function calculates the counter index incorrectly for
hpmcounterx. Fix the counter index to reflect correct CSR number.
Fixes: e39a8320b0
("target/riscv: Support the Virtual Instruction fault")
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Signed-off-by: Atish Patra <atish.patra@wdc.com>
Signed-off-by: Atish Patra <atishp@rivosinc.com>
Message-Id: <20220620231603.2547260-2-atishp@rivosinc.com>
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
parent
2e98339918
commit
562009e47c
@ -72,6 +72,7 @@ static RISCVException ctr(CPURISCVState *env, int csrno)
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
CPUState *cs = env_cpu(env);
|
||||
RISCVCPU *cpu = RISCV_CPU(cs);
|
||||
int ctr_index;
|
||||
|
||||
if (!cpu->cfg.ext_counters) {
|
||||
/* The Counters extensions is not enabled */
|
||||
@ -99,8 +100,9 @@ static RISCVException ctr(CPURISCVState *env, int csrno)
|
||||
}
|
||||
break;
|
||||
case CSR_HPMCOUNTER3...CSR_HPMCOUNTER31:
|
||||
if (!get_field(env->hcounteren, 1 << (csrno - CSR_HPMCOUNTER3)) &&
|
||||
get_field(env->mcounteren, 1 << (csrno - CSR_HPMCOUNTER3))) {
|
||||
ctr_index = csrno - CSR_CYCLE;
|
||||
if (!get_field(env->hcounteren, 1 << ctr_index) &&
|
||||
get_field(env->mcounteren, 1 << ctr_index)) {
|
||||
return RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
|
||||
}
|
||||
break;
|
||||
@ -126,8 +128,9 @@ static RISCVException ctr(CPURISCVState *env, int csrno)
|
||||
}
|
||||
break;
|
||||
case CSR_HPMCOUNTER3H...CSR_HPMCOUNTER31H:
|
||||
if (!get_field(env->hcounteren, 1 << (csrno - CSR_HPMCOUNTER3H)) &&
|
||||
get_field(env->mcounteren, 1 << (csrno - CSR_HPMCOUNTER3H))) {
|
||||
ctr_index = csrno - CSR_CYCLEH;
|
||||
if (!get_field(env->hcounteren, 1 << ctr_index) &&
|
||||
get_field(env->mcounteren, 1 << ctr_index)) {
|
||||
return RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
|
||||
}
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user