mirror of https://github.com/xemu-project/xemu.git
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)
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
CPUState *cs = env_cpu(env);
|
CPUState *cs = env_cpu(env);
|
||||||
RISCVCPU *cpu = RISCV_CPU(cs);
|
RISCVCPU *cpu = RISCV_CPU(cs);
|
||||||
|
int ctr_index;
|
||||||
|
|
||||||
if (!cpu->cfg.ext_counters) {
|
if (!cpu->cfg.ext_counters) {
|
||||||
/* The Counters extensions is not enabled */
|
/* The Counters extensions is not enabled */
|
||||||
|
@ -99,8 +100,9 @@ static RISCVException ctr(CPURISCVState *env, int csrno)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CSR_HPMCOUNTER3...CSR_HPMCOUNTER31:
|
case CSR_HPMCOUNTER3...CSR_HPMCOUNTER31:
|
||||||
if (!get_field(env->hcounteren, 1 << (csrno - CSR_HPMCOUNTER3)) &&
|
ctr_index = csrno - CSR_CYCLE;
|
||||||
get_field(env->mcounteren, 1 << (csrno - CSR_HPMCOUNTER3))) {
|
if (!get_field(env->hcounteren, 1 << ctr_index) &&
|
||||||
|
get_field(env->mcounteren, 1 << ctr_index)) {
|
||||||
return RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
|
return RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -126,8 +128,9 @@ static RISCVException ctr(CPURISCVState *env, int csrno)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CSR_HPMCOUNTER3H...CSR_HPMCOUNTER31H:
|
case CSR_HPMCOUNTER3H...CSR_HPMCOUNTER31H:
|
||||||
if (!get_field(env->hcounteren, 1 << (csrno - CSR_HPMCOUNTER3H)) &&
|
ctr_index = csrno - CSR_CYCLEH;
|
||||||
get_field(env->mcounteren, 1 << (csrno - CSR_HPMCOUNTER3H))) {
|
if (!get_field(env->hcounteren, 1 << ctr_index) &&
|
||||||
|
get_field(env->mcounteren, 1 << ctr_index)) {
|
||||||
return RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
|
return RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue