From 49841832b85bbcc8ae99dc2b808175a1a8650ff3 Mon Sep 17 00:00:00 2001 From: Anup Patel Date: Sun, 10 May 2020 11:36:14 +0530 Subject: [PATCH] lib: sbi: Improve get_feature_str() implementation and usage We do following improvements for get_feature_str(): 1. We should return "none" from get_feature_str() no features available instead of sbi_boot_prints() explicitly handling failure. 2. We don't need to return failure (just like misa_xlen()) because we are returning "none" for no features and we are truncating output when space is not available. 3. Based on 1 and 2, the sbi_boot_prints() can be further simplified. 4. No need for two char[] in sbi_boot_prints() Signed-off-by: Anup Patel Reviewed-by: Atish Patra --- include/sbi/sbi_hart.h | 2 +- include/sbi/sbi_platform.h | 5 ++--- lib/sbi/sbi_hart.c | 18 +++++++++++------- lib/sbi/sbi_init.c | 27 ++++++++------------------- lib/sbi/sbi_platform.c | 38 ++++++++++++-------------------------- 5 files changed, 34 insertions(+), 56 deletions(-) diff --git a/include/sbi/sbi_hart.h b/include/sbi/sbi_hart.h index cdcd865..a624dfd 100644 --- a/include/sbi/sbi_hart.h +++ b/include/sbi/sbi_hart.h @@ -43,7 +43,7 @@ int sbi_hart_pmp_check_addr(struct sbi_scratch *scratch, unsigned long daddr, unsigned long attr); bool sbi_hart_has_feature(u32 hartid, unsigned long feature); unsigned long sbi_hart_get_features(u32 hartid); -int sbi_hart_get_features_str(u32 hartid, char *features_str, int nfstr); +void sbi_hart_get_features_str(u32 hartid, char *features_str, int nfstr); void __attribute__((noreturn)) sbi_hart_hang(void); diff --git a/include/sbi/sbi_platform.h b/include/sbi/sbi_platform.h index dd25aa1..8087148 100644 --- a/include/sbi/sbi_platform.h +++ b/include/sbi/sbi_platform.h @@ -244,10 +244,9 @@ u32 sbi_platform_hart_index(const struct sbi_platform *plat, u32 hartid); * updated * @param nfstr length of the features_str. The feature string will be truncated * if nfstr is not long enough. - * @return the features value currently set for the given platform */ -int sbi_platform_get_features_str(const struct sbi_platform *plat, - char *features_str, int nfstr); +void sbi_platform_get_features_str(const struct sbi_platform *plat, + char *features_str, int nfstr); /** * Get name of the platform diff --git a/lib/sbi/sbi_hart.c b/lib/sbi/sbi_hart.c index 2a284fd..f101395 100644 --- a/lib/sbi/sbi_hart.c +++ b/lib/sbi/sbi_hart.c @@ -270,18 +270,20 @@ static inline char *sbi_hart_feature_id2string(unsigned long feature) * updated * @param nfstr length of the features_str. The feature string will be truncated * if nfstr is not long enough. - * @return the features value currently set for the given platform */ -int sbi_hart_get_features_str(u32 hartid, char *features_str, int nfstr) +void sbi_hart_get_features_str(u32 hartid, char *features_str, int nfstr) { unsigned long features, feat = 1UL; char *temp; int offset = 0; - if (!features_str || !nfstr) - return SBI_EINVAL; + if (!features_str || nfstr <= 0) + return; + sbi_memset(features_str, 0, nfstr); features = sbi_hart_get_features(hartid); + if (!features) + goto done; do { if (features & feat) { @@ -295,9 +297,11 @@ int sbi_hart_get_features_str(u32 hartid, char *features_str, int nfstr) feat = feat << 1; } while (feat <= SBI_HART_HAS_LAST_FEATURE); - features_str[offset - 1] = '\0'; - - return 0; +done: + if (offset) + features_str[offset - 1] = '\0'; + else + sbi_strncpy(features_str, "none", nfstr); } static void sbi_hart_set_feature(u32 hartid, unsigned long feature) diff --git a/lib/sbi/sbi_init.c b/lib/sbi/sbi_init.c index f892582..bbf9ac1 100644 --- a/lib/sbi/sbi_init.c +++ b/lib/sbi/sbi_init.c @@ -35,10 +35,8 @@ static void sbi_boot_prints(struct sbi_scratch *scratch, u32 hartid) { - int xlen, ret; - char str[64]; - int max_fstr_len = 128; - char features[128]; + int xlen; + char str[128]; const struct sbi_platform *plat = sbi_platform_ptr(scratch); #ifdef OPENSBI_VERSION_GIT @@ -56,35 +54,26 @@ static void sbi_boot_prints(struct sbi_scratch *scratch, u32 hartid) sbi_printf("Error %d getting MISA XLEN\n", xlen); sbi_hart_hang(); } - misa_string(xlen, str, sizeof(str)); /* Platform details */ sbi_printf("Platform Name : %s\n", sbi_platform_name(plat)); sbi_printf("Platform HART Count : %u\n", sbi_platform_hart_count(plat)); - - sbi_memset(features, 0, max_fstr_len); - ret = sbi_platform_get_features_str(plat, features, max_fstr_len); - if (!ret) - sbi_printf("Platform Features : %s\n", features); - else - sbi_printf("Platform Features : %s\n", "none"); + sbi_platform_get_features_str(plat, str, sizeof(str)); + sbi_printf("Platform Features : %s\n", str); /* Boot HART details */ sbi_printf("Boot HART ID : %u\n", hartid); + misa_string(xlen, str, sizeof(str)); sbi_printf("Boot HART ISA : %s\n", str); - - sbi_memset(features, 0, max_fstr_len); - ret = sbi_hart_get_features_str(hartid, features, max_fstr_len); - if (!ret) - sbi_printf("BOOT HART Features : %s\n", features); - else - sbi_printf("BOOT HART Features : %s\n", "none"); + sbi_hart_get_features_str(hartid, str, sizeof(str)); + sbi_printf("BOOT HART Features : %s\n", str); /* Firmware details */ sbi_printf("Firmware Base : 0x%lx\n", scratch->fw_start); sbi_printf("Firmware Size : %d KB\n", (u32)(scratch->fw_size / 1024)); + /* Generic details */ sbi_printf("Runtime SBI Version : %d.%d\n", sbi_ecall_version_major(), sbi_ecall_version_minor()); diff --git a/lib/sbi/sbi_platform.c b/lib/sbi/sbi_platform.c index 1912512..568d956 100644 --- a/lib/sbi/sbi_platform.c +++ b/lib/sbi/sbi_platform.c @@ -38,27 +38,20 @@ static inline char *sbi_platform_feature_id2string(unsigned long feature) return fstr; } -/** - * Get the platform features in string format - * - * @param plat pointer to struct sbi_platform - * @param features_str pointer to a char array where the features string will be - * updated - * @param nfstr length of the features_str. The feature string will be truncated - * if nfstr is not long enough. - * @return the features value currently set for the given platform - */ -int sbi_platform_get_features_str(const struct sbi_platform *plat, - char *features_str, int nfstr) +void sbi_platform_get_features_str(const struct sbi_platform *plat, + char *features_str, int nfstr) { unsigned long features, feat = 1UL; char *temp; int offset = 0; if (!plat || !features_str || !nfstr) - return SBI_EINVAL; + return; + sbi_memset(features_str, 0, nfstr); features = sbi_platform_get_features(plat); + if (!features) + goto done; do { if (features & feat) { @@ -72,21 +65,14 @@ int sbi_platform_get_features_str(const struct sbi_platform *plat, feat = feat << 1; } while (feat <= SBI_PLATFORM_HAS_LAST_FEATURE); - features_str[offset - 1] = '\0'; - - return 0; +done: + if (offset) + features_str[offset - 1] = '\0'; + else + sbi_strncpy(features_str, "none", nfstr); } -/** - * Get HART index for the given HART - * - * @param plat pointer to struct sbi_platform - * @param hartid HART ID - * - * @return 0 <= value < hart_count for valid HART otherwise -1U - */ -u32 sbi_platform_hart_index(const struct sbi_platform *plat, - u32 hartid) +u32 sbi_platform_hart_index(const struct sbi_platform *plat, u32 hartid) { u32 i; -- 2.7.4