[PATCH 1/2] lib: sbi: hart: Detect existence of cycle and instret CSRs for Zicntr

Yao Zi ziyao at disroot.org
Tue Feb 25 23:04:28 PST 2025


On Wed, Feb 26, 2025 at 02:26:50PM +0800, Xiang W wrote:
> 在 2025-02-25二的 15:41 +0000,Yao Zi写道:
> > Zicntr extension specifies three RO CSRs, time, cycle and instret. It
> remove 'R0'

It's RO (read only), not R0. Did you misread it?

For reference,

> RISC-V ISAs provide a set of up to thirty-two 64-bit performance
> counters and timers that are accessible via unprivileged XLEN-bit
> read-only CSR registers 0xC00–0xC1F (when XLEN=32, the upper 32 bits
> are accessed via CSR registers 0xC80–0xC9F). These counters are
> divided between the "Zicntr" and "Zihpm" extensions.[1]

Anyway, I could fix the commit message to prevent possible confusion.

> Regards,
> Xiang W

Best regards,
Yao Zi

[1]: The RISC-V Instruction Set, Manual Volume I:
     Unprivileged Architecture (Version 2024041) Chapter 8

> > isn't precise to report Zicntr is fully supported with only time CSR
> > detected.
> > 
> > Since CSR emulating code only cares about the availablity of time CSR,
> > add additional definitions to represent the existance of cycle and
> > instret CSRs.
> > 
> > Signed-off-by: Yao Zi <ziyao at disroot.org>
> > ---
> >  include/sbi/sbi_hart.h |  8 ++++++--
> >  lib/sbi/sbi_hart.c     | 30 ++++++++++++++++++++++--------
> >  lib/sbi/sbi_timer.c    |  2 +-
> >  3 files changed, 29 insertions(+), 11 deletions(-)
> > 
> > diff --git a/include/sbi/sbi_hart.h b/include/sbi/sbi_hart.h
> > index 4c36c77..0a740cf 100644
> > --- a/include/sbi/sbi_hart.h
> > +++ b/include/sbi/sbi_hart.h
> > @@ -37,8 +37,12 @@ enum sbi_hart_extensions {
> >  	SBI_HART_EXT_SSCOFPMF,
> >  	/** HART has Sstc extension */
> >  	SBI_HART_EXT_SSTC,
> > -	/** HART has Zicntr extension (i.e. HW cycle, time & instret CSRs) */
> > -	SBI_HART_EXT_ZICNTR,
> > +	/** HART has HW time CSR, as specified in Zicntr extension */
> > +	SBI_HART_EXT_ZICNTR_TIME,
> > +	/** HART has HW cycle CSR, as specified in Zicntr extension */
> > +	SBI_HART_EXT_ZICNTR_CYCLE,
> > +	/** HART has HW instret CSR, as specified in Zicntr extension */
> > +	SBI_HART_EXT_ZICNTR_INSTRET,
> >  	/** HART has Zihpm extension */
> >  	SBI_HART_EXT_ZIHPM,
> >  	/** HART has Zkr extension */
> > diff --git a/lib/sbi/sbi_hart.c b/lib/sbi/sbi_hart.c
> > index 8e2979b..e1d630d 100644
> > --- a/lib/sbi/sbi_hart.c
> > +++ b/lib/sbi/sbi_hart.c
> > @@ -669,7 +669,9 @@ const struct sbi_hart_ext_data sbi_hart_ext[] = {
> >  	__SBI_HART_EXT_DATA(smstateen, SBI_HART_EXT_SMSTATEEN),
> >  	__SBI_HART_EXT_DATA(sscofpmf, SBI_HART_EXT_SSCOFPMF),
> >  	__SBI_HART_EXT_DATA(sstc, SBI_HART_EXT_SSTC),
> > -	__SBI_HART_EXT_DATA(zicntr, SBI_HART_EXT_ZICNTR),
> > +	__SBI_HART_EXT_DATA(zicntr_time, SBI_HART_EXT_ZICNTR_TIME),
> > +	__SBI_HART_EXT_DATA(zicntr_cycle, SBI_HART_EXT_ZICNTR_CYCLE),
> > +	__SBI_HART_EXT_DATA(zicntr_instret, SBI_HART_EXT_ZICNTR_INSTRET),
> >  	__SBI_HART_EXT_DATA(zihpm, SBI_HART_EXT_ZIHPM),
> >  	__SBI_HART_EXT_DATA(zkr, SBI_HART_EXT_ZKR),
> >  	__SBI_HART_EXT_DATA(smcntrpmf, SBI_HART_EXT_SMCNTRPMF),
> > @@ -782,7 +784,7 @@ static int hart_detect_features(struct sbi_scratch *scratch)
> >  	struct sbi_hart_features *hfeatures =
> >  		sbi_scratch_offset_ptr(scratch, hart_features_offset);
> >  	unsigned long val, oldval;
> > -	bool has_zicntr = false;
> > +	bool has_time = false, has_cycle = false, has_instret = false;
> >  	int rc;
> >  
> >  	/* If hart features already detected then do nothing */
> > @@ -919,7 +921,13 @@ __pmp_skip:
> >  			CSR_SCOUNTOVF, SBI_HART_EXT_SSCOFPMF);
> >  	/* Detect if hart supports time CSR */
> >  	__check_ext_csr(SBI_HART_PRIV_VER_UNKNOWN,
> > -			CSR_TIME, SBI_HART_EXT_ZICNTR);
> > +			CSR_TIME, SBI_HART_EXT_ZICNTR_TIME);
> > +	/* Detect if hart supports cycle CSR */
> > +	__check_ext_csr(SBI_HART_PRIV_VER_UNKNOWN,
> > +			CSR_CYCLE, SBI_HART_EXT_ZICNTR_CYCLE);
> > +	/* Detect if hart supports instret CSR */
> > +	__check_ext_csr(SBI_HART_PRIV_VER_UNKNOWN,
> > +			CSR_INSTRET, SBI_HART_EXT_ZICNTR_INSTRET);
> >  	/* Detect if hart has AIA local interrupt CSRs */
> >  	__check_ext_csr(SBI_HART_PRIV_VER_UNKNOWN,
> >  			CSR_MTOPI, SBI_HART_EXT_SMAIA);
> > @@ -938,8 +946,10 @@ __pmp_skip:
> >  
> >  #undef __check_ext_csr
> >  
> > -	/* Save trap based detection of Zicntr */
> > -	has_zicntr = sbi_hart_has_extension(scratch, SBI_HART_EXT_ZICNTR);
> > +	/* Save trap based detection of Zicntr CSRs */
> > +	has_time = sbi_hart_has_extension(scratch, SBI_HART_EXT_ZICNTR_TIME);
> > +	has_cycle = sbi_hart_has_extension(scratch, SBI_HART_EXT_ZICNTR_CYCLE);
> > +	has_instret = sbi_hart_has_extension(scratch, SBI_HART_EXT_ZICNTR_INSTRET);
> >  
> >  	/* Let platform populate extensions */
> >  	rc = sbi_platform_extensions_init(sbi_platform_thishart_ptr(),
> > @@ -947,9 +957,13 @@ __pmp_skip:
> >  	if (rc)
> >  		return rc;
> >  
> > -	/* Zicntr should only be detected using traps */
> > -	__sbi_hart_update_extension(hfeatures, SBI_HART_EXT_ZICNTR,
> > -				    has_zicntr);
> > +	/* Zicntr CSRs should only be detected using traps */
> > +	__sbi_hart_update_extension(hfeatures, SBI_HART_EXT_ZICNTR_TIME,
> > +				    has_time);
> > +	__sbi_hart_update_extension(hfeatures, SBI_HART_EXT_ZICNTR_CYCLE,
> > +				    has_cycle);
> > +	__sbi_hart_update_extension(hfeatures, SBI_HART_EXT_ZICNTR_INSTRET,
> > +				    has_instret);
> >  
> >  	/* Extensions implied by other extensions and features */
> >  	if (hfeatures->mhpm_mask)
> > diff --git a/lib/sbi/sbi_timer.c b/lib/sbi/sbi_timer.c
> > index 86e0db5..b4db4ca 100644
> > --- a/lib/sbi/sbi_timer.c
> > +++ b/lib/sbi/sbi_timer.c
> > @@ -190,7 +190,7 @@ int sbi_timer_init(struct sbi_scratch *scratch, bool cold_boot)
> >  		if (!time_delta_off)
> >  			return SBI_ENOMEM;
> >  
> > -		if (sbi_hart_has_extension(scratch, SBI_HART_EXT_ZICNTR))
> > +		if (sbi_hart_has_extension(scratch, SBI_HART_EXT_ZICNTR_TIME))
> >  			get_time_val = get_ticks;
> >  
> >  		ret = sbi_platform_timer_init(plat);
> > -- 
> > 2.48.1
> > 
> > 
> 



More information about the opensbi mailing list