diff options
Diffstat (limited to 'lib/sbi/sbi_emulate_csr.c')
-rw-r--r-- | lib/sbi/sbi_emulate_csr.c | 19 |
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; } |