[PATCH v2 2/2] lib: sbi: Fix compile errors using -Os option

Anup Patel anup.patel at wdc.com
Thu Dec 2 00:34:40 PST 2021


When building with -Os option along with -ffreestanding, both GCC
and clang will add implicit calls to memcpy() and memcpy() for stack
variables initialized in declaration.

The C standard as per Clause 4, the compiler cannot necessarily
assume that anything beyond:

 * float.h
 * iso646.h
 * limits.h
 * stdalign.h
 * stdarg.h
 * stdbool.h
 * stddef.h
 * stdint.h
 * stdnoreturn.h
 * fenv.h
 * math.h
 * and the numeric conversion functions of stdlib.h.

This patch avoids implicit calls to memcpy() and memset() by
explicitly initializing stack variables.

Signed-off-by: Anup Patel <anup.patel at wdc.com>
---
 include/sbi/sbi_trap.h |  9 +++++++++
 lib/sbi/riscv_asm.c    |  3 ++-
 lib/sbi/sbi_ecall.c    |  4 +++-
 lib/sbi/sbi_hart.c     | 12 +++++++++---
 4 files changed, 23 insertions(+), 5 deletions(-)

diff --git a/include/sbi/sbi_trap.h b/include/sbi/sbi_trap.h
index d205056..7edf15b 100644
--- a/include/sbi/sbi_trap.h
+++ b/include/sbi/sbi_trap.h
@@ -202,6 +202,15 @@ struct sbi_trap_info {
 	unsigned long tinst;
 };
 
+#define sbi_trap_info_init(__tinfo)	\
+do { \
+	(__tinfo)->epc = 0; \
+	(__tinfo)->cause = 0; \
+	(__tinfo)->tval = 0; \
+	(__tinfo)->tval2 = 0; \
+	(__tinfo)->tinst = 0; \
+} while (0)
+
 int sbi_trap_redirect(struct sbi_trap_regs *regs,
 		      struct sbi_trap_info *trap);
 
diff --git a/lib/sbi/riscv_asm.c b/lib/sbi/riscv_asm.c
index 2e2e148..b7122b9 100644
--- a/lib/sbi/riscv_asm.c
+++ b/lib/sbi/riscv_asm.c
@@ -50,10 +50,11 @@ int misa_xlen(void)
 	return r ? r : -1;
 }
 
+static const char valid_isa_order[] = "iemafdqclbjtpvnsuhkorwxyzg";
+
 void misa_string(int xlen, char *out, unsigned int out_sz)
 {
 	unsigned int i, pos = 0;
-	const char valid_isa_order[] = "iemafdqclbjtpvnsuhkorwxyzg";
 
 	if (!out)
 		return;
diff --git a/lib/sbi/sbi_ecall.c b/lib/sbi/sbi_ecall.c
index ce021eb..f006463 100644
--- a/lib/sbi/sbi_ecall.c
+++ b/lib/sbi/sbi_ecall.c
@@ -98,10 +98,12 @@ int sbi_ecall_handler(struct sbi_trap_regs *regs)
 	struct sbi_ecall_extension *ext;
 	unsigned long extension_id = regs->a7;
 	unsigned long func_id = regs->a6;
-	struct sbi_trap_info trap = {0};
+	struct sbi_trap_info trap;
 	unsigned long out_val = 0;
 	bool is_0_1_spec = 0;
 
+	sbi_trap_info_init(&trap);
+
 	ext = sbi_ecall_find_extension(extension_id);
 	if (ext && ext->handle) {
 		ret = ext->handle(extension_id, func_id,
diff --git a/lib/sbi/sbi_hart.c b/lib/sbi/sbi_hart.c
index d9a15d9..90c6a93 100644
--- a/lib/sbi/sbi_hart.c
+++ b/lib/sbi/sbi_hart.c
@@ -336,7 +336,9 @@ done:
 static unsigned long hart_pmp_get_allowed_addr(void)
 {
 	unsigned long val = 0;
-	struct sbi_trap_info trap = {0};
+	struct sbi_trap_info trap;
+
+	sbi_trap_info_init(&trap);
 
 	csr_write_allowed(CSR_PMPCFG0, (ulong)&trap, 0);
 	if (trap.cause)
@@ -355,9 +357,11 @@ static unsigned long hart_pmp_get_allowed_addr(void)
 static int hart_pmu_get_allowed_bits(void)
 {
 	unsigned long val = ~(0UL);
-	struct sbi_trap_info trap = {0};
+	struct sbi_trap_info trap;
 	int num_bits = 0;
 
+	sbi_trap_info_init(&trap);
+
 	/**
 	 * It is assumed that platforms will implement same number of bits for
 	 * all the performance counters including mcycle/minstret.
@@ -385,10 +389,12 @@ static int hart_pmu_get_allowed_bits(void)
 
 static void hart_detect_features(struct sbi_scratch *scratch)
 {
-	struct sbi_trap_info trap = {0};
+	struct sbi_trap_info trap;
 	struct hart_features *hfeatures;
 	unsigned long val;
 
+	sbi_trap_info_init(&trap);
+
 	/* Reset hart features */
 	hfeatures = sbi_scratch_offset_ptr(scratch, hart_features_offset);
 	hfeatures->features = 0;
-- 
2.25.1




More information about the opensbi mailing list