[Skiboot] [PATCH v4] Fix array-bound compilation warnings

Abhishek Singh Tomar abhishek at linux.ibm.com
Tue Feb 1 22:50:26 AEDT 2022


Resolves : the warray bounds warning during compilation

/build/libc/include/string.h:34:16: warning: '__builtin_memset' offset [0, 2097151] is out of the bounds [0, 0] [-Warray-bounds]
34 | #define memset __builtin_memset
hw/fsp/fsp.c:1855:9: note: in expansion of macro 'memset'
1855 | memset(fsp_tce_table, 0, PSI_TCE_TABLE_SIZE);

use skiboot.lds.S to link constant address of pointer

Signed-off-by: Abhishek Singh Tomar <abhishek at linux.ibm.com>
---

Error:
 After patch merged compilation failed with error 
[LD]  skiboot.tmp.elf
powerpc64-linux-gnu-ld: Heap collision with image
make: *** [/home/abhishekTomar/project/sourceCode/opal/opalAbhishekRepo/skiboot/Makefile.main:345: skiboot.tmp.elf] Error 1

---
 core/console.c     |  4 ++--
 core/fast-reboot.c |  6 ++++--
 core/init.c        |  6 +++++-
 core/opal-dump.c   |  8 ++++----
 hdata/spira.c      |  4 +++-
 hw/fsp/fsp.c       |  4 ++--
 skiboot.lds.S      | 11 ++++++++++-
 7 files changed, 30 insertions(+), 13 deletions(-)

diff --git a/core/console.c b/core/console.c
index 2a150902..c91c7501 100644
--- a/core/console.c
+++ b/core/console.c
@@ -14,8 +14,8 @@
 #include <device.h>
 #include <processor.h>
 #include <cpu.h>
-
-static char *con_buf = (char *)INMEM_CON_START;
+extern char inmem_con_start[INMEM_CON_LEN];
+static char *con_buf = inmem_con_start;
 static size_t con_in;
 static size_t con_out;
 static bool con_wrapped;
diff --git a/core/fast-reboot.c b/core/fast-reboot.c
index fedfa88c..f3f3f5ad 100644
--- a/core/fast-reboot.c
+++ b/core/fast-reboot.c
@@ -303,6 +303,8 @@ static void cleanup_cpu_state(void)
 
 /* Entry from asm after a fast reset */
 void __noreturn fast_reboot_entry(void);
+extern char kernel_load_base[KERNEL_LOAD_SIZE];
+extern char initramfs_load_base[INITRAMFS_LOAD_SIZE];
 
 void __noreturn fast_reboot_entry(void)
 {
@@ -425,8 +427,8 @@ void __noreturn fast_reboot_entry(void)
 		 * Mambo may have embedded payload here, so don't clear
 		 * it at all.
 		 */
-		memset(KERNEL_LOAD_BASE, 0, KERNEL_LOAD_SIZE);
-		memset(INITRAMFS_LOAD_BASE, 0, INITRAMFS_LOAD_SIZE);
+		memset(kernel_load_base, 0, KERNEL_LOAD_SIZE);
+		memset(initramfs_load_base, 0, INITRAMFS_LOAD_SIZE);
 	}
 
 	/* Start preloading kernel and ramdisk */
diff --git a/core/init.c b/core/init.c
index b4d33518..c2bbc88e 100644
--- a/core/init.c
+++ b/core/init.c
@@ -869,7 +869,11 @@ void copy_exception_vectors(void)
 	 * this is the boot flag used by CPUs still potentially entering
 	 * skiboot.
 	 */
-	memcpy((void *)0x100, (void *)(SKIBOOT_BASE + 0x100),
+
+	extern char exception_vectors_start_addr[EXCEPTION_VECTORS_END - 0x100];
+	extern char copy_exceptio_vector_dst[EXCEPTION_VECTORS_END - 0x100];
+
+	memcpy(copy_exceptio_vector_dst, exception_vectors_start_addr,
 			EXCEPTION_VECTORS_END - 0x100);
 	sync_icache();
 }
diff --git a/core/opal-dump.c b/core/opal-dump.c
index 4f54a3ef..2aab9474 100644
--- a/core/opal-dump.c
+++ b/core/opal-dump.c
@@ -301,7 +301,7 @@ static int64_t opal_mpipl_update(enum opal_mpipl_ops ops,
 				 u64 src, u64 dest, u64 size)
 {
 	int rc;
-
+	extern char mdrt_table_base_addr[MDRT_TABLE_SIZE];
 	switch (ops) {
 	case OPAL_MPIPL_ADD_RANGE:
 		rc = payload_mpipl_register(src, dest, size);
@@ -330,7 +330,7 @@ static int64_t opal_mpipl_update(enum opal_mpipl_ops ops,
 		free(opal_mpipl_cpu_data);
 		opal_mpipl_cpu_data = NULL;
 		/* Clear MDRT table */
-		memset((void *)MDRT_TABLE_BASE, 0, MDRT_TABLE_SIZE);
+		memset(mdrt_table_base_addr, 0, MDRT_TABLE_SIZE);
 		/* Set MDRT count to max allocated count */
 		ntuple_mdrt->act_cnt = cpu_to_be16(MDRT_TABLE_SIZE / sizeof(struct mdrt_table));
 		rc = OPAL_SUCCESS;
@@ -529,8 +529,8 @@ bool is_mpipl_enabled(void)
 
 void opal_mpipl_init(void)
 {
-	void *mdst_base = (void *)MDST_TABLE_BASE;
-	void *mddt_base = (void *)MDDT_TABLE_BASE;
+	extern char mdst_base[MDST_TABLE_SIZE];
+	extern char mddt_base[MDDT_TABLE_SIZE];
 	struct dt_node *dump_node;
 
 	dump_node = dt_find_by_path(opal_node, "dump");
diff --git a/hdata/spira.c b/hdata/spira.c
index 1a351462..de2eed66 100644
--- a/hdata/spira.c
+++ b/hdata/spira.c
@@ -1784,7 +1784,9 @@ static void add_npus(void)
 static void fixup_spira(void)
 {
 #if !defined(TEST)
-	spiras = (struct spiras *)SPIRA_HEAP_BASE;
+	extern char spira_heap_base[SPIRA_HEAP_SIZE];
+
+	spiras = (struct spiras *) spira_heap_base;
 #endif
 
 	/* Validate SPIRA-S signature */
diff --git a/hw/fsp/fsp.c b/hw/fsp/fsp.c
index 2c5f9d71..b4ac7765 100644
--- a/hw/fsp/fsp.c
+++ b/hw/fsp/fsp.c
@@ -91,7 +91,7 @@ static enum ipl_state ipl_state = ipl_initial;
 static struct fsp *first_fsp;
 static struct fsp *active_fsp;
 static u16 fsp_curseq = 0x8000;
-static __be64 *fsp_tce_table;
+static __be64 fsp_tce_table[PSI_TCE_TABLE_SIZE/sizeof(__be64)];
 
 #define FSP_INBOUND_SIZE	0x00100000UL
 static void *fsp_inbound_buf = NULL;
@@ -1850,7 +1850,7 @@ static int fsp_init_mbox(struct fsp *fsp)
 /* We use a single fixed TCE table for all PSI interfaces */
 static void fsp_init_tce_table(void)
 {
-	fsp_tce_table = (__be64 *)PSI_TCE_TABLE_BASE;
+//	fsp_tce_table = (__be64 *)PSI_TCE_TABLE_BASE;
 
 	memset(fsp_tce_table, 0, PSI_TCE_TABLE_SIZE);
 }
diff --git a/skiboot.lds.S b/skiboot.lds.S
index 058848fa..a982df31 100644
--- a/skiboot.lds.S
+++ b/skiboot.lds.S
@@ -250,7 +250,16 @@ SECTIONS
 	}
 
 	DEBUG_SECTIONS
-
+	kernel_load_base = 0x20000000;
+	initramfs_load_base =0x20000000 + 0x08000000;
+	inmem_con_start = INMEM_CON_START;
+	exception_vectors_start_addr = (SKIBOOT_BASE + 0x100);
+	mdrt_table_base_addr = MDRT_TABLE_BASE;
+	mdst_base = (SKIBOOT_BASE + MDST_TABLE_OFF);
+	mddt_base =  (SKIBOOT_BASE + MDDT_TABLE_OFF);
+	fsp_tce_table	= PSI_TCE_TABLE_BASE;
+	spira_heap_base = SPIRA_HEAP_BASE;
+	copy_exceptio_vector_dst = 0x100;
 	/* Discards */
 	/DISCARD/ : {
 		*(.note.GNU-stack)
-- 
2.31.1



More information about the Skiboot mailing list