]> git.sur5r.net Git - u-boot/blobdiff - common/spl/spl.c
arm: move gd handling outside of C code
[u-boot] / common / spl / spl.c
index 6e6dee7ec9b1d9b8ccd2cee17239557c88a28250..e5167bf73e4c3181ef7c74b7736431e0df121668 100644 (file)
@@ -431,8 +431,13 @@ void preloader_console_init(void)
  * more stack space for things like the MMC sub-system.
  *
  * This function calculates the stack position, copies the global_data into
- * place and returns the new stack position. The caller is responsible for
- * setting up the sp register.
+ * place, sets the new gd (except for ARM, for which setting GD within a C
+ * function may not always work) and returns the new stack position. The
+ * caller is responsible for setting up the sp register and, in the case
+ * of ARM, setting up gd.
+ *
+ * All of this is done using the same layout and alignments as done in
+ * board_init_f_init_reserve() / board_init_f_alloc_reserve().
  *
  * @return new stack location, or 0 to use the same stack
  */
@@ -440,14 +445,7 @@ ulong spl_relocate_stack_gd(void)
 {
 #ifdef CONFIG_SPL_STACK_R
        gd_t *new_gd;
-       ulong ptr;
-
-       /* Get stack position: use 8-byte alignment for ABI compliance */
-       ptr = CONFIG_SPL_STACK_R_ADDR - sizeof(gd_t);
-       ptr &= ~7;
-       new_gd = (gd_t *)ptr;
-       memcpy(new_gd, (void *)gd, sizeof(gd_t));
-       gd = new_gd;
+       ulong ptr = CONFIG_SPL_STACK_R_ADDR;
 
 #ifdef CONFIG_SPL_SYS_MALLOC_SIMPLE
        if (CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN) {
@@ -460,7 +458,13 @@ ulong spl_relocate_stack_gd(void)
                gd->malloc_ptr = 0;
        }
 #endif
-
+       /* Get stack position: use 8-byte alignment for ABI compliance */
+       ptr = CONFIG_SPL_STACK_R_ADDR - roundup(sizeof(gd_t),16);
+       new_gd = (gd_t *)ptr;
+       memcpy(new_gd, (void *)gd, sizeof(gd_t));
+#if !defined(CONFIG_ARM)
+       gd = new_gd;
+#endif
        return ptr;
 #else
        return 0;