[PATCH v3 1/1] lib: sbi: illegal CSR 0x306 access in hpm_allowed()
Anup Patel
Anup.Patel at wdc.com
Mon Mar 22 04:01:10 GMT 2021
> -----Original Message-----
> From: Heinrich Schuchardt <xypron.glpk at gmx.de>
> Sent: 19 March 2021 15:35
> To: Atish Patra <Atish.Patra at wdc.com>
> Cc: Anup Patel <Anup.Patel at wdc.com>; Xiang W <wxjstz at 126.com>;
> OpenSBI <opensbi at lists.infradead.org>; Heinrich Schuchardt
> <xypron.glpk at gmx.de>
> Subject: [PATCH v3 1/1] lib: sbi: illegal CSR 0x306 access in hpm_allowed()
>
> The trap handler sbi_emulate_csr_read() invokes hpm_allowed() which
> reads CSR 0x306 (mcounteren). The K210 does not support CSR 0x306. While
> trying to handle a trap occurring in S-mode code this creates an additional
> trap in M-mode. This results in failure to redirect to S-mode and the system
> hanging in sbi_hart_hang().
>
> In hart_detect_features() we have already determined if CSR 0x306 is
> available and stored that information in the scratch area. We can use this
> information to decide if CSR 0x306 shall be accessed in hpm_allowed() and
> thus avoid the M-mode trap.
>
> Likewise if CSR scounteren is not available we have to avoid reading CSR
> 0x106.
>
> Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
Looks good to me.
Reviewed-by: Anup Patel <anup.patel at wdc.com>
Applied this patch to the riscv/opensbi repo.
Thanks,
Anup
> ---
> v3:
> remove NOT for SBI_HART_HAS_SCOUNTEREN
> v2:
> consider scounteren (Xiang W)
> ---
> lib/sbi/sbi_emulate_csr.c | 19 ++++++++++++++-----
> 1 file changed, 14 insertions(+), 5 deletions(-)
>
> diff --git a/lib/sbi/sbi_emulate_csr.c b/lib/sbi/sbi_emulate_csr.c index
> bee7761..c66b5d3 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; }
> --
> 2.30.2
More information about the opensbi
mailing list