aboutsummaryrefslogtreecommitdiff
path: root/lib/sbi/sbi_emulate_csr.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sbi/sbi_emulate_csr.c')
-rw-r--r--lib/sbi/sbi_emulate_csr.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/lib/sbi/sbi_emulate_csr.c b/lib/sbi/sbi_emulate_csr.c
index bee7761..dbb1755 100644
--- a/lib/sbi/sbi_emulate_csr.c
+++ b/lib/sbi/sbi_emulate_csr.c
@@ -21,14 +21,23 @@
static bool hpm_allowed(int hpm_num, ulong prev_mode, bool virt)
{
ulong cen = -1UL;
+ struct sbi_scratch *scratch = sbi_scratch_thishart_ptr();
if (prev_mode <= PRV_S) {
- cen &= csr_read(CSR_MCOUNTEREN);
- if (virt)
- cen &= csr_read(CSR_HCOUNTEREN);
+ if (sbi_hart_has_feature(scratch, SBI_HART_HAS_MCOUNTEREN)) {
+ cen &= csr_read(CSR_MCOUNTEREN);
+ if (virt)
+ cen &= csr_read(CSR_HCOUNTEREN);
+ } else {
+ cen = 0;
+ }
+ }
+ if (prev_mode == PRV_U) {
+ if (sbi_hart_has_feature(scratch, SBI_HART_HAS_SCOUNTEREN))
+ cen &= csr_read(CSR_SCOUNTEREN);
+ else
+ cen = 0;
}
- if (prev_mode == PRV_U)
- cen &= csr_read(CSR_SCOUNTEREN);
return ((cen >> hpm_num) & 1) ? TRUE : FALSE;
}