[PATCH v2 3/4] lib: sbi: fwft: Fix error return value for feature > 32 bits

Clément Léger cleger at rivosinc.com
Tue Feb 11 02:42:27 PST 2025



On 11/02/2025 04:37, Xiang W wrote:
> 在 2025-01-24五的 17:51 +0100,Clément Léger写道:
>> Based on the spec, invalid feature should return SBI_ERR_INVALID_PARAM.
>> This was not the case with the current implementation since the upper 32
>> bits were not considered when checking the feature thus returning
>> SBI_ERR_DENIED. Fix that by passing the raw unsigned long rather than
>> the enum to be sure we are passing the full 64 bits and then check for
>> upper bits to be cleared.
>>
>> Signed-off-by: Clément Léger <cleger at rivosinc.com>
>> ---
>>  include/sbi/sbi_fwft.h |  4 ++--
>>  lib/sbi/sbi_fwft.c     | 10 +++++++---
>>  2 files changed, 9 insertions(+), 5 deletions(-)
>>
>> diff --git a/include/sbi/sbi_fwft.h b/include/sbi/sbi_fwft.h
>> index 2148820e..a9caa863 100644
>> --- a/include/sbi/sbi_fwft.h
>> +++ b/include/sbi/sbi_fwft.h
>> @@ -14,9 +14,9 @@
>>  
>>  struct sbi_scratch;
>>  
>> -int sbi_fwft_set(enum sbi_fwft_feature_t feature, unsigned long value,
>> +int sbi_fwft_set(unsigned long feature, unsigned long value,
>>  		 unsigned long flags);
>> -int sbi_fwft_get(enum sbi_fwft_feature_t feature, unsigned long *out_val);
>> +int sbi_fwft_get(unsigned long feature, unsigned long *out_val);
>>  
>>  int sbi_fwft_init(struct sbi_scratch *scratch, bool cold_boot);
>>  
>> diff --git a/lib/sbi/sbi_fwft.c b/lib/sbi/sbi_fwft.c
>> index c46006d4..85f8a638 100644
>> --- a/lib/sbi/sbi_fwft.c
>> +++ b/lib/sbi/sbi_fwft.c
>> @@ -287,12 +287,16 @@ static struct fwft_config* get_feature_config(enum sbi_fwft_feature_t feature)
>>  	return NULL;
>>  }
>>  
>> -static int fwft_get_feature(enum sbi_fwft_feature_t feature,
>> +static int fwft_get_feature(unsigned long feature,
>>  			    struct fwft_config **conf)
>>  {
>>  	int ret;
>>  	struct fwft_config *tconf;
>>  
>> +	/* Feature are defined as 32 bits identifiers */
>> +	if (feature & ~(BIT_ULL(32) - 1))
>> +		return SBI_EINVAL;
>> +
> We can specify the type of enumeration at the time of definition in the 
> following way
> 
> enum sbi_fwft_feature_t : long {

TIL !:) After searching a bit, it seems like this is only available
since C23. Is this something we allow in OpenSBI ?

Thanks,

Clément

> 
> In this way we don't need to change the declaration of the function, 
> and we don't need the extra detection of the high 32 bits, because 
> get_feature_config would return a null pointer because it couldn't
> find the
> 
> Regards,
> Xiang W
>>  	tconf = get_feature_config(feature);
>>  	if (!tconf) {
>>  		if (fwft_is_defined_feature(feature))
>> @@ -323,7 +327,7 @@ static void fwft_clear_config_lock(enum sbi_fwft_feature_t feature)
>>  	conf->flags &= ~SBI_FWFT_SET_FLAG_LOCK;
>>  }
>>  
>> -int sbi_fwft_set(enum sbi_fwft_feature_t feature, unsigned long value,
>> +int sbi_fwft_set(unsigned long feature, unsigned long value,
>>  		 unsigned long flags)
>>  {
>>  	int ret;
>> @@ -348,7 +352,7 @@ int sbi_fwft_set(enum sbi_fwft_feature_t feature, unsigned long value,
>>  	return SBI_OK;
>>  }
>>  
>> -int sbi_fwft_get(enum sbi_fwft_feature_t feature, unsigned long *out_val)
>> +int sbi_fwft_get(unsigned long feature, unsigned long *out_val)
>>  {
>>  	int ret;
>>  	struct fwft_config *conf;
> 




More information about the opensbi mailing list