[PATCH 1/1] lib: sbi: illegal CSR 0x306 access in hpm_allowed()

Xiang W wxjstz at 126.com
Fri Mar 19 08:29:16 GMT 2021


在 2021-03-19五的 07:19 +0000,Heinrich Schuchardt写道:
> The trap handler sbi_emulate_csr_read() invokes hpm_allowed() which
> reads
> CSR 0x306. 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.
> 
> Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
> ---
>  lib/sbi/sbi_emulate_csr.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/lib/sbi/sbi_emulate_csr.c b/lib/sbi/sbi_emulate_csr.c
> index bee7761..14c8875 100644
> --- a/lib/sbi/sbi_emulate_csr.c
> +++ b/lib/sbi/sbi_emulate_csr.c
> @@ -21,6 +21,10 @@
>  static bool hpm_allowed(int hpm_num, ulong prev_mode, bool virt)
>  {
>  	ulong cen = -1UL;
> +	struct sbi_scratch *scratch = sbi_scratch_thishart_ptr();
> +
> +	if (!sbi_hart_has_feature(scratch, SBI_HART_HAS_MCOUNTEREN))
> +		return FALSE;
It may be inappropriate to return FALSE directly. K210 does not have
cycle, time, instret registers?
> 
>  	if (prev_mode <= PRV_S) {
>  		cen &= csr_read(CSR_MCOUNTEREN);
> --
> 2.30.2
> 
> 




More information about the opensbi mailing list