[U-Boot] [PATCH v2 5/5] x86: Switch to using generic global_data setup

Bin Meng bmeng.cn at gmail.com
Tue Aug 11 08:28:48 CEST 2015


On Tue, Aug 11, 2015 at 10:44 AM, Simon Glass <sjg at chromium.org> wrote:
> 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 <sjg at 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 */
> --

Reviewed-by: Bin Meng <bmeng.cn at gmail.com>


More information about the U-Boot mailing list