[PATCH] riscv: enable TIME CSR in U mode

Gary Guo gary at garyguo.net
Tue Mar 16 06:24:26 GMT 2021


I don't think we should let the firmware to decide which performance counter CSRs can be used by the userspace. No counter should be allowed unless there is a reason to allow it, like the timer CSR. Also, OpenSBI is not the only SBI implementation,; there could be no SBIs at all (i.e. M mode) or have other SBIs that have different defaults.

Best,
Gary

-----Original Message-----
From: Nick Kossifidis <mick at ics.forth.gr> 
Sent: Thursday, March 4, 2021 5:35 PM
To: Gary Guo <gary at garyguo.net>
Cc: linux-riscv at lists.infradead.org
Subject: Re: [PATCH] riscv: enable TIME CSR in U mode

Στις 2021-02-17 00:12, Gary Guo έγραψε:
> After ad5d112 we let the user mode to use rdtime directly for time 
> access. This works if the hardware does not implement the TIME CSR and 
> traps to the firmware. The spec however does allow a hardware 
> implementation to redirect the CSR access to the memory-mapped MTIME 
> CSR, and if this is performed it will check {M,S}COUNTEREN CSR to see 
> if it is allowed.
> 
> To prevent unhandled illegal instruction fault on these platforms, we 
> can request these CSRs to be enabled in U-mode. For platforms that 
> does not support the TIME CSR to MTIME CSR conversion, they will 
> hardwire corresponding bit in COUNTEREN to zero and this would be a 
> no-op.
> 
> Signed-off-by: Gary Guo <gary at garyguo.net>
> ---
>  arch/riscv/kernel/head.S | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/arch/riscv/kernel/head.S b/arch/riscv/kernel/head.S index 
> 0a4e81b8dc79..5a7a62190342 100644
> --- a/arch/riscv/kernel/head.S
> +++ b/arch/riscv/kernel/head.S
> @@ -190,6 +190,9 @@ ENTRY(_start_kernel)  .align 2
>  pmp_done:
> 
> +	/* Allow user-mode to access time CSR */
> +	csrw, CSR_MCOUNTEREN, 2
> +
>  	/*
>  	 * The hartid in a0 is expected later on, and we have no firmware
>  	 * to hand it to us.
> @@ -197,6 +200,9 @@ pmp_done:
>  	csrr a0, CSR_MHARTID
>  #endif /* CONFIG_RISCV_M_MODE */
> 
> +	/* Allow user-mode to access time CSR */
> +	csrw CSR_SCOUNTEREN, 2
> +
>  	/* Load the global pointer */
>  .option push
>  .option norelax

Shouldn't we use csrrs here to preserve current settings from the firmware ? Also OpenSBI at this point sets both MCOUNTEREN/SCOUNTEREN to -1, does anyone else modify that value ?

Regards,
Nick


More information about the linux-riscv mailing list