board_init_f_mem(): Don't require memset()
authorSimon Glass <sjg@chromium.org>
Mon, 19 Oct 2015 12:49:57 +0000 (06:49 -0600)
committerTom Rini <trini@konsulko.com>
Sat, 24 Oct 2015 17:50:35 +0000 (13:50 -0400)
Unfortunately memset() is not always available, so provide a substitute when
needed.

Signed-off-by: Simon Glass <sjg@chromium.org>
common/init/board_init.c

index e7ebca70c4f62e98552a88db02862fb324b92769..1c6126d8ce55a08c85f8e0d576672fdf7f16f8bf 100644 (file)
 
 DECLARE_GLOBAL_DATA_PTR;
 
+/*
+ * It isn't trivial to figure out whether memcpy() exists. The arch-specific
+ * memcpy() is not normally available in SPL due to code size.
+ */
+#if !defined(CONFIG_SPL_BUILD) || \
+               (defined(CONFIG_SPL_LIBGENERIC_SUPPORT) && \
+               !defined(CONFIG_USE_ARCH_MEMSET))
+#define _USE_MEMCPY
+#endif
+
 /* Unfortunately x86 can't compile this code as gd cannot be assigned */
 #ifndef CONFIG_X86
 __weak void arch_setup_gd(struct global_data *gd_ptr)
@@ -22,6 +32,9 @@ __weak void arch_setup_gd(struct global_data *gd_ptr)
 ulong board_init_f_mem(ulong top)
 {
        struct global_data *gd_ptr;
+#ifndef _USE_MEMCPY
+       int *ptr;
+#endif
 
        /* Leave space for the stack we are running with now */
        top -= 0x40;
@@ -29,7 +42,12 @@ ulong board_init_f_mem(ulong top)
        top -= sizeof(struct global_data);
        top = ALIGN(top, 16);
        gd_ptr = (struct global_data *)top;
+#ifdef _USE_MEMCPY
        memset(gd_ptr, '\0', sizeof(*gd));
+#else
+       for (ptr = (int *)gd_ptr; ptr < (int *)(gd_ptr + 1); )
+               *ptr++ = 0;
+#endif
        arch_setup_gd(gd_ptr);
 
 #if defined(CONFIG_SYS_MALLOC_F)