There is quite a bit of assembler code that can be removed if we use the
generic global_data setup. Less arch-specific code makes it easier to add
new features and maintain the start-up code.

Drop the unneeded code and adjust the hooks in board_f.c to cope.

Signed-off-by: Simon Glass <s...@chromium.org>
---

Changes in v2:
- Don't rely on value of %edx from board_init_f_mem()

 arch/x86/cpu/cpu.c   |  4 ++-
 arch/x86/cpu/start.S | 95 +++++++---------------------------------------------
 common/board_f.c     |  3 +-
 3 files changed, 18 insertions(+), 84 deletions(-)

diff --git a/arch/x86/cpu/cpu.c b/arch/x86/cpu/cpu.c
index 4f57145..1b76ca1 100644
--- a/arch/x86/cpu/cpu.c
+++ b/arch/x86/cpu/cpu.c
@@ -136,8 +136,10 @@ static void load_gdt(const u64 *boot_gdt, u16 num_entries)
        asm volatile("lgdtl %0\n" : : "m" (gdt));
 }
 
-void setup_gdt(gd_t *new_gd, u64 *gdt_addr)
+void arch_setup_gd(gd_t *new_gd)
 {
+       u64 *gdt_addr;
+
        gdt_addr = new_gd->arch.gdt;
 
        /* CS: code, read/execute, 4 GB, base 0 */
diff --git a/arch/x86/cpu/start.S b/arch/x86/cpu/start.S
index 313fa3f..e94ddc4 100644
--- a/arch/x86/cpu/start.S
+++ b/arch/x86/cpu/start.S
@@ -104,8 +104,7 @@ car_init_ret:
         *
         * top-> CONFIG_SYS_CAR_ADDR + CONFIG_SYS_CAR_SIZE
         *      MRC area
-        *      global_data
-        *      x86 global descriptor table
+        *      global_data with x86 global descriptor table
         *      early malloc area
         *      stack
         * bottom-> CONFIG_SYS_CAR_ADDR
@@ -120,13 +119,10 @@ car_init_ret:
         * and esi holds the HOB list address returned by the FSP.
         */
 #endif
-
-       /* Reserve space on stack for global data */
-       subl    $GENERATED_GBL_DATA_SIZE, %esp
-
-       /* Align global data to 16-byte boundary */
-       andl    $0xfffffff0, %esp
-       post_code(POST_START_STACK)
+       /* Set up global data */
+       mov     %esp, %eax
+       call    board_init_f_mem
+       mov     %eax, %esp
 
        /*
         * Debug UART is available here although it may not be plumbed out
@@ -137,56 +133,21 @@ car_init_ret:
         * call  printch
         */
 
-       /* Zero the global data since it won't happen later */
-       xorl    %eax, %eax
-       movl    $GENERATED_GBL_DATA_SIZE, %ecx
-       movl    %esp, %edi
-       rep     stosb
-
+       /* Get address of global_data */
+       mov     %fs:0, %edx
 #ifdef CONFIG_HAVE_FSP
+       /* Store the HOB list if we have one */
        test    %esi, %esi
        jz      skip_hob
-
-       /* Store HOB list */
-       movl    %esp, %edx
-       addl    $GD_HOB_LIST, %edx
-       movl    %esi, (%edx)
+       movl    %esi, GD_HOB_LIST(%edx)
 
 skip_hob:
 #else
        /* Store table pointer */
-       movl    %esp, %edx
-       addl    $GD_TABLE, %edx
-       movl    %esi, (%edx)
+       movl    %esi, GD_TABLE(%edx)
 #endif
-
-       /* Setup first parameter to setup_gdt, pointer to global_data */
-       movl    %esp, %eax
-
-       /* Reserve space for global descriptor table */
-       subl    $X86_GDT_SIZE, %esp
-
-       /* Align temporary global descriptor table to 16-byte boundary */
-       andl    $0xfffffff0, %esp
-       movl    %esp, %ecx
-
-#if defined(CONFIG_SYS_MALLOC_F_LEN)
-       /* Set up the pre-relocation malloc pool */
-       subl    $CONFIG_SYS_MALLOC_F_LEN, %esp
-       movl    %eax, %edx
-       addl    $GD_MALLOC_BASE, %edx
-       movl    %esp, (%edx)
-#endif
-       /* Store BIST into global_data */
-       movl    %eax, %edx
-       addl    $GD_BIST, %edx
-       movl    %ebp, (%edx)
-
-       /* Set second parameter to setup_gdt() */
-       movl    %ecx, %edx
-
-       /* Setup global descriptor table so gd->xyz works */
-       call    setup_gdt
+       /* Store BIST */
+       movl    %ebp, GD_BIST(%edx)
 
        /* Set parameter to board_init_f() to boot flags */
        post_code(POST_START_DONE)
@@ -213,37 +174,7 @@ board_init_f_r_trampoline:
        /* Stack grows down from top of SDRAM */
        movl    %eax, %esp
 
-       /* Reserve space on stack for global data */
-       subl    $GENERATED_GBL_DATA_SIZE, %esp
-
-       /* Align global data to 16-byte boundary */
-       andl    $0xfffffff0, %esp
-
-       /* Setup first parameter to memcpy() and setup_gdt() */
-       movl    %esp, %eax
-
-       /* Setup second parameter to memcpy() */
-       fs movl 0, %edx
-
-       /* Set third parameter to memcpy() */
-       movl    $GENERATED_GBL_DATA_SIZE, %ecx
-
-       /* Copy global data from CAR to SDRAM stack */
-       call    memcpy
-
-       /* Reserve space for global descriptor table */
-       subl    $X86_GDT_SIZE, %esp
-
-       /* Align global descriptor table to 16-byte boundary */
-       andl    $0xfffffff0, %esp
-
-       /* Set second parameter to setup_gdt() */
-       movl    %esp, %edx
-
-       /* Setup global descriptor table so gd->xyz works */
-       call    setup_gdt
-
-       /* Set if we need to disable CAR */
+       /* See if we need to disable CAR */
 .weak  car_uninit
        movl    $car_uninit, %eax
        cmpl    $0, %eax
diff --git a/common/board_f.c b/common/board_f.c
index 37b7bf5..c959774 100644
--- a/common/board_f.c
+++ b/common/board_f.c
@@ -715,6 +715,7 @@ static int jump_to_copy(void)
         * with the stack in SDRAM and Global Data in temporary memory
         * (CPU cache)
         */
+       arch_setup_gd(gd->new_gd);
        board_init_f_r_trampoline(gd->start_addr_sp);
 #else
        relocate_code(gd->start_addr_sp, gd->new_gd, gd->relocaddr);
@@ -1033,6 +1034,7 @@ __weak void arch_setup_gd(struct global_data *gd_ptr)
 {
        gd = gd_ptr;
 }
+#endif /* !CONFIG_X86 */
 
 ulong board_init_f_mem(ulong top)
 {
@@ -1054,4 +1056,3 @@ ulong board_init_f_mem(ulong top)
 
        return top;
 }
-#endif /* !CONFIG_X86 */
-- 
2.5.0.rc2.392.g76e840b

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to